Adapted from the black-candle-technologies/revyme-builder repository docs.
Self-hosted visual website builder derived from revyme-web/builder. Design websites with pixel-perfect control; ship real code you own.
License: AGPL-3.0 with notice-preservation term. Keep LICENSE, NOTICE, and FORK_NOTICE.md in every redistribution. The Revyme name and logo are trademarks; forks need their own branding. Commercial licensing available from the upstream project.
Every edit writes real source: an ordinary Next.js project (app/, components/, cms/). Deploy to Vercel, Netlify, your own server, anywhere. No proprietary file format, no lock-in.
.tsx into a node map, renders it, and every edit rewrites that JSX.postMessage bridge.npm ci
npm run dev # starts three Vite servers; open http://localhost:3333
| Port | Serves |
|---|---|
| 3333 | the editor |
| 5174 | canvas sandbox iframe |
| 5175 | preview sandbox |
Work saves to localStorage in local mode. No account, no backend, no network required.
Per docs/self-hosted-vps.md: compose.yml runs four internal-only services on the Docker proxy network:
revyme-editor → builder.lanebucher.comrevyme-canvas → canvas.builder.lanebucher.comrevyme-preview → preview.builder.lanebucher.comrevyme-storage → only via the editor's /api/selfhosted/ proxyCaddy is the only public listener and imports Authelia before every builder origin. No published host ports, no Docker socket. The storage service's only writable mount is /data/projects → /srv/websites/revyme-projects.
cd /srv/apps/revyme-builder
docker compose up -d
docker compose ps
docker compose logs -f --tail=100 editor canvas preview storage
Projects persist as normal source trees under /srv/websites/revyme-projects/<slug>/; assets in public/uploads/. The storage API accepts only lowercase slugs and managed relative paths; it rejects traversal, symlinks, and reserved paths, and never touches .git, .env*, node_modules, or .next.
After rebuilding, run ./scripts/verify-vite-hosts.sh to prove each Vite process accepts its intended Host header and refuses unlisted hosts.
npx tsc --noEmit
npx vitest run
VITE_REVYME_CLOUD= npx playwright test
See CONTRIBUTING.md. CLAUDE.md has the full architecture guide.