Self-hostChronos Gateway · beta
Add agents to your product. Keep your Postgres.
The gateway sits in front of the Postgres your product already runs. Each agent run gets a world with one customer’s rows; what it changes is written back checked, or waits for your team or the customer to say yes. Your app doesn’t change.
- 0
- Postgres credentials given to agents
- 1
- customer’s rows per run
- 12–18
- Postgres versions, plus Supabase and Neon
- 6
- webhooks, one per outcome
Gateway or DB
Two products. Pick by whose agents they are.
The gateway is for agents your customers use, on the Postgres you keep. Chronos DB is the database your own agents work in.
You are here
Chronos Gateway
Agents in your product, on the Postgres you keep.
- The agents work for
- Chronos DBYour team: Claude Code, Cursor, your own scripts and jobs.
- GatewayYour customers: the AI features inside your product.
- Your data lives
- Chronos DBIn Chronos, or beside the Postgres you run (attach).
- GatewayIn your Postgres, exactly where it is now.
- Agents connect with
- Chronos DBPostgres wire or MCP, as a role with a token.
- GatewayA run token, through the gateway only. Never a Postgres credential.
- One run sees
- Chronos DBThe whole database, in a world of its own.
- GatewayOne customer’s rows: the tenant the run is for.
- What’s held waits for
- Chronos DBYou, in reviews, with the reasons.
- GatewayYour team, or the end user in a widget in your app.
- You drive it with
- Chronos DBSQL: create world, diff, merge, undo.
- GatewayAn HTTP API, Python and TypeScript clients, webhooks.
- Run it
- Chronos DBOne line, on macOS or Linux.
- GatewayA Docker image, a Linux service, or a Helm chart.
- Hosted by us
- Chronos DBChronos Cloud: soon.
- GatewayHosted Gateway: soon.
One run, on the wire
From your backend to a yes, and back.
Five parties, nine messages. The agent only ever talks to the gateway.
- Your backend to Gateway: POST /v1/runs {tenant: 42}
a world opens with tenant 42’s rows only
- Gateway to Agent: run token · SQL or MCP
an hour long; no Postgres credential in it
- Agent to Gateway: reads and writes its world
- Your backend to Gateway: POST /v1/runs/:id/propose
- Gateway to Postgres: within the rules: one checked transaction
every row locked and compared; a row changed meanwhile stops the write
- Gateway to End user: a rule broken: <chronos-approve>
“Change the owner of lead Acme from Bo to Ada”
- End user to Gateway: Approve
- Gateway to Postgres: written, checked
- Gateway to Your backend: webhook · merge.landed
In your code
A few lines in your backend. One tag in your app.
from chronos_gateway import Gatewaygw = Gateway("http://localhost:7400", key=KEY)# one run, one customer: the agent sees this org's rows and nothing elsewith gw.run(tenant=user.org_id, intent="reassign Bo's open leads to Ada", end_user=user.id) as run: # MCP clients: run.mcp_server() tool-use loops: run.openai_tools(), run.call_tool(name, args) my_agent(run) result = run.propose()if result.held: # a rule wants a person link = gw.approval(run.id, end_user=user.id) # in your page: <script src="{link.script}"></script> {link.html}<chronos-approve> · in your app
Your assistant wants to make a change
Change the owner of lead “Acme” from Bo to Ada?
webhook · to your backend
merge.landed
tenant 42 · 1 row updated · checked
TypeScript: npm install @chronosdb/gateway
What it does
Safe by default. Every default yours to change.
Out of the box: no deletes, at most 500 rows a run and 5,000 an hour per customer, reads checked, runs end after 15 minutes.
One customer’s rows
A run is for one tenant. The agent can’t read, guess or join its way to anyone else’s data.
POST /v1/runs {"tenant": "42"}No credential to leak
Agents get an hour-long run token. Your Postgres password never leaves the gateway.
run token · 1 hChecked write-back
Changes inside the rules land in one transaction. Every row is locked and compared; a row changed meanwhile stops the write.
merge.landed · merge.conflictThe customer says yes
What breaks a rule can go to the end user, in a widget inside your app.
<chronos-approve run="…">Words, not rows
Label your tables and columns once. Reviews read “Change the owner of lead Acme from Bo to Ada”.
PUT /v1/labelsWebhooks for every outcome
Landed, held, conflict, rejected, expired, refused. Your backend hears each one, signed.
merge.landedLimits on everything
Runs an hour, statements a minute, proposals a minute, rows a run. Set per gateway.
GATEWAY_RUN_MAX_ROWS=1000Checks before it connects
It tells you what your Postgres needs and hands you the role SQL. Nothing is created for you.
POST /v1/connect/checkIn your network
A Docker image, a Linux service or a Helm chart. Linked to Chronos Cloud by one outbound TLS connection, no inbound port; share diffs or only counts.
GATEWAY_CLOUD_SHARE=countsRun it
Yours to run today. Ours to run soon.
Self-hosted · available
The gateway in your network
Docker, a Linux service, or Helm. Every release signed. Postgres 12–18, Supabase and Neon tested.
docker run -p 7400:7400 ghcr.io/abhishekxdg/chronos-gatewaycurl -fsSL https://github.com/Abhishekxdg/chronos-gateway-releases/releases/latest/download/install.sh | sudo sh -s -- --serviceHosted · soon
Hosted Gateway
The same gateway, run by us. Nothing to install in your network.