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
no Postgres credential, everClaude Agent SDKLangChainAny MCP clienttenant 42tenant 7tenant 19Chronos Gatewaya world per runYour Postgresstays where it is12–18 · Supabase · NeonYour apptalks to it as todayYour product's agentschecked writemerge.landedAsks the end userChange the owner of lead “Acme”from Bo to Ada?ApproveTurn down

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.

The other one

Chronos DB

The database your own agents work in.

See Chronos DB

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.

  1. Your backend to Gateway: POST /v1/runs {tenant: 42}

    a world opens with tenant 42’s rows only

  2. Gateway to Agent: run token · SQL or MCP

    an hour long; no Postgres credential in it

  3. Agent to Gateway: reads and writes its world
  4. Your backend to Gateway: POST /v1/runs/:id/propose
  5. Gateway to Postgres: within the rules: one checked transaction

    every row locked and compared; a row changed meanwhile stops the write

  6. Gateway to End user: a rule broken: <chronos-approve>

    “Change the owner of lead Acme from Bo to Ada”

  7. End user to Gateway: Approve
  8. Gateway to Postgres: written, checked
  9. Gateway to Your backend: webhook · merge.landed

In your code

A few lines in your backend. One tag in your app.

python · pip install chronos-gateway
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?

ApproveTurn down

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 h

Checked 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.conflict

The 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/labels

Webhooks for every outcome

Landed, held, conflict, rejected, expired, refused. Your backend hears each one, signed.

merge.landed

Limits on everything

Runs an hour, statements a minute, proposals a minute, rows a run. Set per gateway.

GATEWAY_RUN_MAX_ROWS=1000

Checks before it connects

It tells you what your Postgres needs and hands you the role SQL. Nothing is created for you.

POST /v1/connect/check

In 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=counts

Run 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-gateway
curl -fsSL https://github.com/Abhishekxdg/chronos-gateway-releases/releases/latest/download/install.sh | sudo sh -s -- --service

Hosted · soon

Hosted Gateway

The same gateway, run by us. Nothing to install in your network.

Tell me when these open

One email when it opens. Nothing else.

Ship the agent. Keep the database.

Chronos Gateway · Chronos