Run your own CRRT.
CRRT is OSS-first. crrt.ai is the easy path, but the same code runs on your own infra in under twenty minutes if you'd rather own the stack.
Hosted vs self-host
apiBase on the widget.What you'll need
- Postgres for the data layer. Any provider works; we recommend Supabase so you get auth + storage in the same place — that's what the hosted instance runs on.
- A runtime that can serve the Vercel-style serverless functions in
api/plus the static builds inapps/landing/andapps/dashboard/. We deploy to Vercel; Fly, Render, Cloudflare Workers, or a Node container all work. - Bun ≥ 1.1 for the build commands (
bun install,bun run build).
1. Clone and install
2. Configure environment
Copy .env.example to .env and fill in the required values. The dashboard includes the public SUPABASE_KEY in its browser bundle at build time. Keep SUPABASE_SERVICE_ROLE_KEY server-only.
3. Apply the schema
The Drizzle schema lives in db/schema.ts; migrations are committed under db/migrations/. Run them once before your first deploy.
deploy-build runs db:migrate automatically on each deploy, so subsequent schema bumps apply themselves.
4. Deploy
On Vercel
vercel.json sets buildCommand to bun run deploy-build, which typechecks, builds the landing app and dashboard into one output, and applies pending migrations.
On another runtime
The relevant outputs are:
apps/landing/dist/— static landing page.apps/landing/dist/dashboard/— static dashboard SPA (build withbun run build:dashboard).api/— Vercel-style serverless handlers using@vercel/node. Adapt them to your platform if needed.
5. Smoke test
You should get a JSON response. If you ran bun db:seed, a demo-project row already exists for testing the widget end-to-end.
Updates and versioning
crrt.ai runs whatever is on trunk. If you self-host, you can pin to a release tag (git checkout v0.x.y) for stability. We aim to keep the public API surface backward-compatible across minor versions. The Drizzle migrations are idempotent, so re-running bun run db:migrate after a fetch is safe.
Going further
Custom branding — replace the assets in apps/landing/public/ and tweak branding/crrt/tokens.css if you want to white-label.
Custom auth — the dashboard uses Supabase Auth out of the box. Swap apps/dashboard/lib/supabase.ts and api/_lib/auth.ts if you need a different provider.
Issues, questions, contributions — open them on the GitHub repo. We track every one.