{"id":35196455,"url":"https://github.com/ivanli-cn/paste-preset","last_synced_at":"2026-06-27T19:01:16.008Z","repository":{"id":327225285,"uuid":"1106549553","full_name":"IvanLi-CN/paste-preset","owner":"IvanLi-CN","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-08T13:50:57.000Z","size":2583,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-08T15:28:39.979Z","etag":null,"topics":["clipboard","image-compressor","image-editor","image-processing","image-resizer","offline-first","privacy","react","screenshot","typescript","vite"],"latest_commit_sha":null,"homepage":"https://paste-preset.ivanli.cc","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/IvanLi-CN.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-11-29T13:28:22.000Z","updated_at":"2026-06-08T13:48:10.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/IvanLi-CN/paste-preset","commit_stats":null,"previous_names":["ivanli-cn/paste-preset"],"tags_count":21,"template":false,"template_full_name":null,"purl":"pkg:github/IvanLi-CN/paste-preset","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IvanLi-CN%2Fpaste-preset","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IvanLi-CN%2Fpaste-preset/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IvanLi-CN%2Fpaste-preset/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IvanLi-CN%2Fpaste-preset/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/IvanLi-CN","download_url":"https://codeload.github.com/IvanLi-CN/paste-preset/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IvanLi-CN%2Fpaste-preset/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34864431,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-27T02:00:06.362Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clipboard","image-compressor","image-editor","image-processing","image-resizer","offline-first","privacy","react","screenshot","typescript","vite"],"created_at":"2025-12-29T07:36:27.307Z","updated_at":"2026-06-27T19:01:15.979Z","avatar_url":"https://github.com/IvanLi-CN.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"public/brand/paste-preset-icon-d-master.png\" alt=\"PastePreset icon\" width=\"96\" /\u003e\n\u003c/p\u003e\n\n# PastePreset\n\n[![Release](https://img.shields.io/github/v/release/IvanLi-CN/paste-preset?logo=github)](https://github.com/IvanLi-CN/paste-preset/releases)\n[![CI Pipeline](https://github.com/IvanLi-CN/paste-preset/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/IvanLi-CN/paste-preset/actions/workflows/ci.yml)\n[![Bun](https://img.shields.io/badge/Bun-1.x-000000?logo=bun\u0026logoColor=white)](https://bun.sh/)\n[![React](https://img.shields.io/badge/React-19.x-61DAFB?logo=react\u0026logoColor=black)](https://react.dev/)\n[![Vite](https://img.shields.io/badge/Vite-7.x-646CFF?logo=vite\u0026logoColor=white)](vite.config.ts)\n[![Tailwind CSS](https://img.shields.io/badge/Tailwind_CSS-4.x-06B6D4?logo=tailwindcss\u0026logoColor=white)](https://tailwindcss.com/)\n[![DaisyUI](https://img.shields.io/badge/DaisyUI-5.x-ec4899)](https://daisyui.com/)\n\nPastePreset is a browser-based single-page application for quickly processing screenshots and mobile photos. It lets you crop, resize, transcode, and strip metadata entirely in the browser, then either copy the result to the clipboard or download it locally. No image data ever leaves your machine.\n\nThe production app is deployed at the root path\n[paste-preset.ivanli.cc](https://paste-preset.ivanli.cc/) and is installable as\na PWA. After at least one successful online visit, the cached app shell can be\nrevisited offline for the core import -\u003e process -\u003e download flow. Heavy codec\nsupport such as HEIC and animated-format helpers now warms in the background, so\nreturn visits can show the shell immediately while advanced offline formats\nbecome available once warmup finishes.\n\n![PastePreset main UI](docs/assets/app-screenshot.png)\n\n## Features\n\n- 100% client-side image processing (no backend server)\n- Crop and resize images\n- Format conversion (including HEIC/HEIF to more common formats)\n- Animated image conversion (GIF / animated WebP / APNG)\n- Control over output quality and size\n- Metadata stripping (EXIF, GPS, etc.)\n- Copy processed image to clipboard\n- Download processed image as a file\n\n## Tech Stack\n\n- React + TypeScript + Vite SPA (dev server on port `25119`)\n- Tailwind CSS v4 + DaisyUI for UI components and theming\n- Bun (\u003e= 1.0) as runtime and package manager\n- Biome for formatting, linting, and unified `check` workflow  \n  (replaces ESLint + Prettier)\n\n## Prerequisites\n\n- Bun \u003e= 1.0 installed on your machine\n\n## Development\n\n```bash\nbun install\nbun run dev\n```\n\nThe dev server runs at `http://localhost:25119/` by default.\n\n## Scripts (via Bun)\n\n- `bun run dev` – Start the Vite development server.\n- `bun run build` – Type-check and build for production into `dist/`.\n- `bun run preview` – Preview the production build locally.\n- `bun run lint` – Run `biome lint .` for static analysis only (no file changes).\n- `bun run format` – Run `biome format --write .` to format code in place.\n- `bun run check` – Run `biome check .` for combined formatting, import sorting, and lint checks.\n\n## Release\n\nThis repo uses a PR-label-driven release flow. Every PR targeting `main` must carry:\n\n- Exactly one `type:*` label:\n  - `type:patch` – Release and bump patch.\n  - `type:minor` – Release and bump minor.\n  - `type:major` – Release and bump major.\n  - `type:docs` – No release.\n  - `type:skip` – No release.\n- Exactly one `channel:*` label:\n  - `channel:stable` – Stable release.\n  - `channel:rc` – Prerelease (RC).\n\nOn a successful merge to `main`, CI will create a tag + GitHub Release when `type:patch|minor|major` is set:\n\n- Stable: `vX.Y.Z`\n- RC: `vX.Y.Z-rc.{sha7}` (marked as a GitHub prerelease)\n\n## Deployment\n\nSee `docs/deploy-github-pages.md` for the root-path GitHub Pages/custom-domain\ndeployment contract used by production.\n\n## License\n\nThis project is distributed under the MIT License. See `LICENSE` for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fivanli-cn%2Fpaste-preset","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fivanli-cn%2Fpaste-preset","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fivanli-cn%2Fpaste-preset/lists"}