Continuous is an open source business platform for SMBs to hire, manage, govern, budget, evaluate, and coordinate human, AI, and robot workers.
The first runtime slice is Continuous Core: a persisted headless operating layer for entity, workforce, payroll, filings, compliance, payments, AI operations, generated UI, and evidence. Revenue workflows remain the first customer-facing worker demo, but they sit on top of this broader core.
- Next.js 16 + React 19 + TypeScript
- Postgres + Drizzle ORM/migrations
- Docker Compose with Next.js, Postgres, and Caddy
- GitHub Actions CI for lint, typecheck, tests, and build
- DigitalOcean droplet deployment through
doctl, SSH, and Compose
bun install
bun run checkIf Docker is running locally:
docker compose up -d db
bun run db:migrate
bun run db:seed
bun run devThen open http://localhost:3000.
/healthreports Postgres-backed readiness checks./corereturns persisted core counts, active tasks, and recent events for tokened operators;POST /coreaccepts structured core commands:task.create,task.transition,object.upsert,adapter.upsert,connection.upsert,connection.health.record,entity.setup.record,worker.upsert,worker.transition,worker.run.start,worker.run.complete,event.ingest,evidence.attach,document.create,packet.prepare,document.packet.prepare,decision.record,approval.request,adapter.intent.record,rule.change.record,obligation.scan,capability.grant,budget.reserve,budget.charge,budget.release,ai.infer,object.link,view.publish,customer_signal.record,payroll.preview.record,payroll.preview.packet.prepare,external_action.record,control_plane.token_rotation.attest,control_plane.credential.upsert,control_plane.credential.revoke, andcontrol_plane.session.review. Core read views usePOST /corewithview,core, andconfig. Core mutation requests accept onlycommand,core,idempotencyKey, andconfigas top-level fields.ai.inferis the deterministic Core AI gateway: route selection, redaction, budget reservation/charge, inference, usage, audit, and evidence are written through one reusable command while live provider execution remains blocked./approvalis the shared approval control-plane API. UsePOST /approvalwithview,approval, andconfigfor inbox reads; usePOST /approvalwithcommand: "approval.decide", structuredapproval, top-levelidempotencyKey, andconfigfor decisions. Approval requests accept only the read or command envelope fields as top-level fields./workeris the canonical worker control-plane API. UsePOST /workerwithview,worker, andconfigfor read views; usePOST /workerwithcommand,worker,idempotencyKeywhen required, andconfigfor side-effecting worker commands. Worker requests accept only the read or command envelope fields as top-level fields;workeris limited to role, id, and tenant selectors, and every operation-specific input lives underconfig. Revenue operations runs can first callPOST /workerwithcommand: "lead.read",config.source, andconfig.records[]to persist Core lead source snapshots, then callcommand: "lead.classify",command: "response.draft",command: "quote.prepare", or the fullcommand: "run"with the returnedconfig.intakeselector. The split classify, draft, and quote-preparation commands write worker run, inference, usage, event, evidence, approval/view, and audit proof while external send remains blocked. Internal workflow handlers can still use exact Core row ids;config.leadPacketremains a direct operator/test fallback. Revenue command schemas reject unknown top-levelconfigfields, so known controls such as scheduler provenance and blockedexternalSendare named explicitly, while source, provider, policy, receipt, and rollback details live in documented nested payloads rather than route-shaped fields. The route validates roles, commands, idempotency, tenant requirements, and external-execution posture through the worker command registry. Worker contract metadata also carriesapiRoute: "/worker"so new roles inherit the route from the registry instead of creating a role-specific URL. Worker schema discovery exposesapiShape, a machine-readable contract for the canonical route, command/view envelope fields, worker selector fields, app-server tool names, andconfigpaths so new clients do not infer API shape from the first Revenue role.- Dispatch schedule proposals use the same shape:
POST /workerwithworker.role: "dispatch_operations",command: "schedule.propose", handoff ids inconfig.sourceRefs, and schedule requirements inconfig.constraints; the first slice writes only dry-run calendar receipts and approval records. /workflowis the canonical workflow control-plane API. UsePOST /workflowwithview,workflow, andconfigfor overview and approval reads; usePOST /workflowwithcommand: "start",command: "transition",command: "steps.execute", orcommand: "approval.decide". Queued workflow execution can now prepare durable Core packets from packet-backed step kinds without adding packet-specific business-process routes. Workflow mutation requests accept only the read or command envelope fields as top-level fields.worker-scheduleris the internal production drain for queued platform work. It posts the same/workflowsteps.executeenvelope, polls active lead source connections withPOST /workerpayloads usingcommand: "lead.read", hands returned selectors tocommand: "run", then drains/workeradapter retry/reconcile envelopes on a cadence; it does not introduce worker-family URLs or enable external execution. Worker-specific HTTP routes and local family-specific mutation shortcuts are intentionally absent; new worker families extend/workerand genericworker:tool/ app-server surfaces by registering commands, views, and structured payload fields. App-server dynamic tools now exposecontinuous.core.*,continuous.worker.*,continuous.workflow.*, andcontinuous.approval.*surfaces, so agents can inspect Core, write Core primitives, inspect worker registries, run workers, inspect workflow state, and decide shared approvals without adding route-shaped worker-family tool names. The HTTP, app-server, and local worker read/command surfaces reject stray top-level operation fields so operation inputs stay underconfig.
- Core platform
- Open workflows
- Agent build path
- Revenue Operations Worker expansion
- Revenue Operations Worker V1 contract
- Worker expansion map
- Worker execution roadmap
- Worker readiness matrix
- Worker handoff contracts
- Owner Chief-of-Staff Worker V1 contract
- Dispatch Operations Worker V1 contract
- Finance Operations Worker V1 contract
- Workforce Operations Worker V1 contract
- Compliance Operations Worker V1 contract
- Systems Operations Worker V1 contract
- Local development
- DigitalOcean deployment
- Infrastructure notes
The production host is a DigitalOcean droplet. Deploy to the configured domains:
./scripts/create-droplet.sh
HOST=45.55.53.92 ./scripts/deploy.shcreate-droplet.sh enables DigitalOcean managed backups by default and verifies
the backup policy plus any available backup images before provisioning continues.
After DNS changes, refresh the Caddy site hosts without a full app deploy:
HOST=45.55.53.92 SITE_HOSTS="continuoushq.com, getcontinuous.app" ./scripts/configure-domain.shCaddy issues and renews the HTTPS certificates automatically for
continuoushq.com and getcontinuous.app.
Before treating the droplet as customer-data ready, run the strict production readiness gate after backup scheduling, alerting, recovery-drill evidence, token rotation, and non-root host access are in place:
HOST=45.55.53.92 bun run ops:non-root-access
HOST=45.55.53.92 bun run ops:production-readiness-checkApache-2.0. See LICENSE.