Annotated Canvas is a Chrome side panel and web client for clipping exact moments from web media, adding commentary, and publishing public annotations that always link back to the original source.
This project was sunset on 2026-05-02. It reached a deployed MVP, but it is not a complete bounty submission because production sign-in was never configured end to end. The production Cloudflare deploy gate is disabled with CLOUDFLARE_DEPLOY_ENABLED=false, and the remaining Cloudflare resources are inventoried for owner-controlled archive or teardown.
Read the shutdown documents before reviving or deleting anything:
docs/project-sunset-postmortem.mddocs/cloudflare-sunset.md
The product is based on the Annotated bounty context captured in this repository. The MVP intentionally stores third-party clips by reference, not by re-hosting third-party media bytes.
- Public web:
https://annotated-canvas.pages.dev - Public API health:
https://annotated-canvas-api.jaybhagat841.workers.dev/api/health - Approved public smoke annotation:
https://annotated-canvas.pages.dev/a/ann_d586ad40-058a-42c1-b6d7-8e0e691cfae4 - Cloudflare deploy-from-main is proven by GitHub Actions run
25212955639; issue #22 is closed. - The current MVP is live, source-linked, and smoke-tested at the API/web level. It is not yet a full bounty-complete claim.
- Remaining bounty blockers are real Google/X OAuth and extension handoff (#24), production extension p95 proof for exact selected text/media timing and >90-second no-network rejection (#23/#30), durable recorded-audio storage and owned-media 240p/sub-480p policy (#26), the reviewer journey/Krug pass before filming (#38), and the final external submission decision (#28).
- Chrome MV3 side panel extension for capture from the current tab.
- Public web client for feed, profiles, annotation permalinks, and claim filing.
- REST API server/router that sends requests to the correct Cloudflare-backed service.
- Cloudflare service layer for auth, annotations, feed, claims, engagement, media references, and async jobs.
- Every published annotation must include
source_url. - Third-party media is clipped by reference with text selection or timestamp offsets.
- OAuth is X or Google only for MVP.
- Published annotations have a public permalink and a
File a claimworkflow. - Queue consumers must be idempotent because background delivery can happen more than once.
original-design.mdcontains the structured bounty and domain model.design-inpso.mdcontains the visual/product direction.mocks.mdcontains a UI and API mockup.bounty.txtcontains the source bounty thread text captured locally.apps/webcontains the React web client scaffold.apps/extensioncontains the Chrome MV3 side-panel scaffold.apps/apicontains the Cloudflare Worker API/router scaffold.packages/contractscontains executable Zod contracts and fixtures.packages/uicontains shared UI components and design tokens.docs/api-contracts.mddefines the first REST contract draft.docs/cloudflare-architecture.mddefines the first system architecture draft.docs/cloudflare-cli.mddefines Cloudflare CLI setup and resource commands.docs/testing-strategy.mddefines the testing trophy strategy with P50/P95 coverage.docs/issue-learning-loop.mddefines how issues should document learning, pitfalls, and roadblocks.docs/bounty-gap-audit.mdanddocs/submission-packet.mddefine the current bounty readiness packet, including live URLs, known limitations, and open issue gates.
npm install
npm run dev
npm run dev:api
npm run build
npm testThe Chrome extension build is emitted to dist/extension and can be loaded unpacked in Chrome.
Use Node 24 for local development; the repo includes .nvmrc because the system Node 25 path can force native dependencies onto source builds.
- Frontend UI scaffold: web client pages, extension side panel, shared design tokens, reusable clip/source components.
- Core API contracts: OpenAPI-style resources for clips, annotations, feed, follows, engagement, auth, and claims.
- Cloudflare architecture: router Worker, internal service bindings, D1 schema, KV cache/session usage, Queues, Durable Objects, R2/Stream policy, and observability.
- Chrome side panel API: https://developer.chrome.com/docs/extensions/reference/api/sidePanel
- Cloudflare Workers Static Assets: https://developers.cloudflare.com/workers/static-assets/
- Cloudflare Service bindings: https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings/
- Cloudflare D1: https://developers.cloudflare.com/d1/
- Cloudflare Queues delivery guarantees: https://developers.cloudflare.com/queues/reference/delivery-guarantees/