{"id":52106935,"url":"https://github.com/amalshaji/opendrop","last_synced_at":"2026-08-04T19:00:46.896Z","repository":{"id":370670037,"uuid":"1294071845","full_name":"amalshaji/opendrop","owner":"amalshaji","description":"Open-source TypeScript app and CLI for publishing static HTML drops with validation, versioned previews, and review annotations.","archived":false,"fork":false,"pushed_at":"2026-07-10T05:48:58.000Z","size":2174,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-10T07:15:44.373Z","etag":null,"topics":["annotations","bun","cli","cloudflare","d1","hono","previews","r2","react","self-hosted","static-site","typescript","vite"],"latest_commit_sha":null,"homepage":null,"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/amalshaji.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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":null,"dco":null,"cla":null}},"created_at":"2026-07-08T18:50:46.000Z","updated_at":"2026-07-10T05:49:01.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/amalshaji/opendrop","commit_stats":null,"previous_names":["amalshaji/opendrop"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/amalshaji/opendrop","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amalshaji%2Fopendrop","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amalshaji%2Fopendrop/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amalshaji%2Fopendrop/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amalshaji%2Fopendrop/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/amalshaji","download_url":"https://codeload.github.com/amalshaji/opendrop/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amalshaji%2Fopendrop/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":36286158,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-08-04T02:00:06.901Z","response_time":57,"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":["annotations","bun","cli","cloudflare","d1","hono","previews","r2","react","self-hosted","static-site","typescript","vite"],"created_at":"2026-08-04T19:00:46.150Z","updated_at":"2026-08-04T19:00:46.891Z","avatar_url":"https://github.com/amalshaji.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./apps/web/public/opendrop-logo.svg\" alt=\"OpenDrop logo\" width=\"56\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./docs/public/readme-demo.gif\" alt=\"OpenDrop demo: publish static previews and collect review comments\" width=\"100%\"\u003e\n\u003c/p\u003e\n\n# OpenDrop\n\nOpenDrop is an open-source TypeScript app for publishing static HTML drops with validation, versioned URLs, public/private previews, and review annotations.\n\nIt accepts a folder or zip, validates the artifact, stores immutable versions, renders the uploaded site from object storage, and keeps review comments attached to the exact version and page.\n\n## Product Tour\n\n### Publish a static drop\n\nUpload a build folder or zip, review the server checks, choose a namespace and visibility, then publish an immutable preview.\n\n![Publish a static drop](./docs/public/screenshots/publish-static-drop.png)\n\n### Review in context\n\nLeave point comments or text highlights directly on a preview, reply in threads, and resolve feedback without losing version context.\n\n![Review comments in context](./docs/public/screenshots/review-comments.png)\n\n## CLI Quick Start\n\nAuthenticate, upload a static build, then fetch review context:\n\n```bash\nnpx opendrop login --server https://drops.example.com\nnpx opendrop upload ./dist --slug homepage\nnpx opendrop annotations amal/homepage --path /\nnpx opendrop fetch amal/homepage --include html,annotations --path /\n```\n\nThe published CLI runs on Node 20+ and does not require Bun on the user's machine. See [CLI basics](docs/01-cli-basics.md) for install, auth, upload, namespace, and annotation commands.\n\n## Docs\n\nStart here:\n\n1. [CLI basics](docs/01-cli-basics.md) - auth, upload, and getting annotations.\n2. [How OpenDrop works](docs/02-how-it-works.md) - upload validation, rendering, versions, and visibility.\n3. [Authentication](docs/03-authentication.md) - OAuth, trusted headers, users, namespaces, and CLI tokens.\n4. [Self-hosting](docs/04-self-hosting.md) - Bun, SQLite/PostgreSQL, and S3-compatible storage.\n5. [Cloudflare deployment](docs/05-cloudflare.md) - Workers, D1, R2, assets, and Access headers.\n6. [Storage model](docs/06-storage.md) - metadata, artifact objects, and immutable versions.\n7. [Annotations](docs/07-annotations.md) - point comments, highlights, replies, and version context.\n8. [Agent skills](docs/08-skills.md) - repo-hosted skills for upload and review workflows.\n9. [Trusted header auth](docs/09-trusted-headers.md) - reverse proxy requirements and examples.\n\n## What OpenDrop Supports\n\nV1 supports:\n\n- self-hosted Bun server with SQLite or PostgreSQL metadata storage\n- S3-compatible object storage for self-hosted deployments, with MinIO as the default local target\n- Cloudflare deployment with D1 and R2 from the same server app\n- browser uploads and the `opendrop` npm CLI\n- Better Auth OAuth or trusted-header auth for VPN/reverse-proxy deployments\n- public previews and private previews for users authenticated to that OpenDrop instance\n- point comments, text highlights, nested replies, and resolved review threads\n- repo-hosted agent skills installable with `npx skills add`\n\n## Repository Layout\n\n- `apps/server`: Bun-native Hono server, Better Auth integration, self-hosted and Cloudflare entrypoints.\n- `apps/web`: React/Vite app for uploads, the full-screen review room, settings, and device login.\n- `apps/cli`: Node-compatible CLI published as `opendrop`.\n- `packages/shared`: validation, auth helpers, repository interfaces, database adapters, and storage adapters.\n- `skills`: repo-hosted skills for upload, annotation, and review-page workflows.\n- `docs`: plain Markdown docs linked from this README.\n- `tests`: unit, integration, and Playwright E2E coverage.\n\n## Local Development\n\n```bash\nbun install\ncp .env.example .env\ndocker compose up -d minio\ndocker compose up createbuckets\nbun run dev\n```\n\n`bun run dev` starts the Bun server on `http://localhost:3000` and the Vite React dev server on `http://localhost:5173`.\n\nFor clone-and-run Docker development with SQLite plus MinIO:\n\n```bash\ndocker compose -f docker-compose.dev.yml up --build dev\n# or\nmake dev-docker\n```\n\n## Testing\n\n```bash\nbun run test\nbun run test:skills\nbun run test:e2e\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famalshaji%2Fopendrop","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Famalshaji%2Fopendrop","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famalshaji%2Fopendrop/lists"}