# continuum-backend Cloud control plane for Continuum. Bun + ElysiaJS, PostgreSQL (via pgCat/PgBouncer, with pgvector for frame embeddings), Redis Streams, and Cloudflare R2 storage. ## Run ```sh bun install cp .env.example .env # fill in DATABASE_URL, REDIS_URL, R2_*, SUPABASE_JWT_SECRET bun run db:generate && bun run db:migrate bun run dev ``` ## Layout - `src/db/` — Drizzle schema (`printers`, `farms`, `print_jobs`, `frame_embeddings`) and client, pointed at pgCat. `src/db/validators.ts` derives Elysia/TypeBox request validators straight from the Drizzle tables via `drizzle-typebox`, so the Postgres schema and the API validators come from one definition instead of two hand-synced ones. - `src/s3/` — R2 presigned URL helpers (`PUT` for client uploads, `GET` for the edge proxy). - `src/queue/` — Redis client + `XADD` helper pushing onto `stream:camera_frames` for `continuum-ai-worker`. - `src/routes/` — `/auth`, `/farms`, `/printers`, `/jobs`, and the edge-gateway WebSocket at `/ws/edge/v1`. `frame_embeddings.embedding` requires the `vector` extension: `CREATE EXTENSION IF NOT EXISTS vector;`