A GitHub-style code forge for the Radicle peer-to-peer network, built to be served from Swarm — with everything routed through the user's own node. No servers, no hosted gateways.
Canopy is a dApp for Freedom Browser:
- Reads use plain
fetch('rad:<rid>/…')— Freedom Browser resolves therad:scheme against the localradicle-httpd(repo-scoped, GET-only). - Actions (seeding, issues, comments) use the
window.radicleprovider API — consent-gated, signed with the user's Radicle identity.
- Repository browsing: file tree, blobs with syntax highlighting, README rendering, delegates & seeding info
- Commit history with full structured diffs
- Issues: list, detail, discussion threads (read-only in v1)
- Patches: list, revisions, reviews, discussions (read-only in v1)
Canopy is developed against a real local Radicle node — never a public gateway. Two terminals:
npm install
npm run dev:node # isolated radicle-node + httpd (.dev/rad), seeds fixtures
npm run dev # vite on http://localhost:5173 (proxies /rad/* to the node)The dev node needs the Radicle binaries from a freedom-browser checkout
sitting next to this repo (or set RADICLE_BIN).
npm test # vitest: unit + integration (integration needs the dev node)
npm run build # production build (dist/)src/lib/rad-api.js— data layer; auto-detectsrad:fetchability and falls back to the vite dev proxy. All responses come from radicle-httpd's/api/v1/repos/<rid>/…surface.- Hash-based routing: canopy is served from content-addressed origins
(
bzz://…) that can't rewrite paths. - Styling: Tailwind 4 with GitHub-Primer-inspired tokens, auto light/dark.