Skip to content

Docs

Quickstart

From nothing to a live endpoint in four steps. This is a starter, enough to get an operation running; the full reference lives in the console.

Four steps to a live operation

  1. 1Create your workspace

    Register to get a workspace and an API token. Your first tenant is created with it.

  2. 2Declare a strategy

    Set a manifest in the console. This booking strategy is enough to take appointments with deposits:

    booking.strategy
    strategy:booking
    resource:practitioner// what gets reserved
    granularity:30m
    horizon:60d
    timezone:from_location// DST-correct per site
    buffers:{ before: 0m, after: 10m }
    exclusivity:postgres_gist// double-booking is impossible
    deposit:25%// captured at booking
    notify:
    confirm
    remind @ -24h
    remind @ -2h
  3. 3Call your new API

    The strategy exposes real endpoints immediately. Check availability, then book:

    GET · availability
    curl https://api.prowork.dev/booking/availability \
      -H "Authorization: Bearer $PROWORK_TOKEN" \
      -G --data-urlencode "resource=practitioner" \
         --data-urlencode "date=2026-08-25"
    POST · create appointment
    curl -X POST https://api.prowork.dev/booking/appointments \
      -H "Authorization: Bearer $PROWORK_TOKEN" \
      -H "content-type: application/json" \
      -d '{
        "resourceId": "prac_ava",
        "start": "2026-08-25T09:30:00-05:00",
        "client": { "name": "Sam Lee", "email": "sam@example.com" }
      }'
  4. 4Run the console

    Everything you just did is visible and editable in the console: the calendar, records, payments, and workflow runs.

Concepts

Workspace
Your account's top-level container. Everything you configure and every tenant lives inside it.
Tenant
An isolated slice of data, one per customer, location, or brand. Row-level security keeps tenants from ever seeing each other's rows.
Strategy
The unit you switch on: booking, storefront, records, subscriptions, forms, or workflow. Each stands up its own API and console surfaces.
Collection
A typed set of records with fields, relations, and policies. Records read and write across tiers atomically, with no N+1 hydration.
Workflow
Declarative automation run by a durable executor: it parks on events, fires timers, recovers from crashes, and compensates idempotently.
Manifest
The human-readable declaration of a strategy. Change it and the running backend changes, with no rebuild or redeploy.

Tenant isolation

Every request runs inside a transaction that binds app.tenant_id before it touches data. Row-level security is FORCED on every tenant table, and the app connects as a non-owner role, so a query for one tenant can never read another's rows, on the primary or a replica.

every transaction
BEGIN;
SET LOCAL app.tenant_id = 'tenant_b';
-- your reads and writes, scoped to tenant_b only
COMMIT;

Deploy

Run the whole kernel as one container next to Postgres and Redis, or package modules as AWS Lambdas behind API Gateway with RDS Proxy. Same configuration, either way.

docker-compose.yml
services:
  prowork:
    image: ghcr.io/sirfitz/prowork:latest
    environment:
      DATABASE_URL: postgres://prowork@db/prowork
      REDIS_URL: redis://cache:6379
    ports: ["3000:3000"]

Next

Explore the other strategies on the product page, or create your workspace and declare your first one.