Roll it out across teams & environments
Getting from one engineer's laptop to an org-wide, always-current catalog is mostly
about committing config and scheduling a re-scan — Regixo is a command you run, not a daemon you
host. This page is that rollout as four steps, in order, then the branches a real estate hits: multiple
repos and environments, an honest account of what multi-entity does not do yet, and the one failure —
SYNC_UNAUTHORIZED — with its fix.
- Commit the config — one
regixo.yml, so every machine scans the same estate. (how ↓) - Make it re-scan without anyone remembering — an unattended
watch --cifrom cron or CI. (the recipe ↓) - Feed the hosted record — set
REGIXO_SYNC_TOKENso the same run pushes to the portal. (how ↓) - Prove the pipeline is really wired — confirm with
regixo doctorthat the pairing works, and read which state you're in. (the check + the paired-state walk ↓)
Roll one estate out, all the way through (the worked example)
Before the reference, take one estate from a laptop to a fed, hosted record. Aurelia
Payments already has the committed regixo.yml from
the last page, and Maija has claimed the record. Here is each
step for it:
| Step | For Aurelia | The engineer does |
|---|---|---|
| 1 · Commit | The regixo.yml already carries the sources, intent, DORA scope, region/role and PII policy — no secrets. | Git-commit it. Teammates and the CI runner now scan the same estate. |
| 2 · Schedule | Every pull request should report what changed in the data, and a signed activity that drifts should be flagged. | Copy examples/github-actions/regixo-watch.yml, set the source secrets as Actions secrets. A scheduled run posts its summary and exits 3 (a warning) on a core-field change. |
| 3 · Feed the record | Maija's record must stay current without anyone re-forwarding a draft. | Set REGIXO_SYNC_TOKEN (minted on the claim page under “Connect a machine”) as an Actions secret. The same watch now pushes the metadata-only draft to the portal. |
| 4 · Verify | Confirm the pairing actually works before trusting it. | regixo doctor shows the portal reachable and reports the paired state; the claim page's “last updated” time refreshes. |
The four sections below are that same rollout, walked in full.
Step 1 · Commit the config
The move from a personal run to a repeatable org run is three commits:
- Commit
regixo.yml. With sources (by env-var name), intent, DORA scope and PII policy in the file, any machine — a colleague's or a CI runner — scans the same estate. Secrets stay in the environment. - Make it run headless. Off a TTY, in CI, or with
--yes, every command runs non-interactively: it takes answers from flags, env andregixo.ymland never prompts. A committed config plus--yesis a fully unattended refresh. - Seed the shared standards. Commit a house glossary and PII policy once, then bring them
in on each machine with
regixo catalog import regixo-catalog.json(merge-only — it never downgrades a confirmed answer).
regixo command, including setup, is agent-drivable: a missing required input is a
coded error naming the flag or env var to supply — never a blocking prompt. That's what lets the same
config run in a pipeline as cleanly as on a laptop.Step 2 · Make it re-scan without anyone remembering
The goal: the map refreshes on a schedule, whether or not your laptop is on.
regixo watch is a one-shot re-scan you schedule — from cron or CI — not a
hosted daemon that sits running. Each run re-scans, updates the map, appends the change-log, and
flags any signed activity whose core fields moved for re-sign.
“Set up a scheduled Regixo re-scan in our CI that warns us when a signed record’s core fields change.”
Your agent writes the workflow and names the source secrets — you set their values as Actions secrets yourself.
Show the commandHide the commandShow the sentenceHide the sentence
$ regixo watch --ci >> "$GITHUB_STEP_SUMMARY"
What your agent will do. It should write .github/workflows/regixo-watch.yml,
wire the step to regixo watch --ci >> "$GITHUB_STEP_SUMMARY", and handle
exit code 3 so a core-field change raises a build warning rather than failing the job. Check the
file it writes against the step in the terminal recipe below.
A ready-made GitHub Actions workflow ships in the repo at
examples/github-actions/regixo-watch.yml. The source is AGPL-3.0 but not public yet, so
until it is, copy the step from the terminal recipe below. Set your source secrets as Actions secrets,
and a scheduled run writes its summary to the job's step summary and raises a build warning (exit 3) on
a core-field change — it does not fail the job, and it does not comment on pull requests.
How to check it worked. Trigger the workflow once by hand. A green run with a change summary in the job's step summary means the schedule works; exit 3 (shown as a warning, not a failure) means a core RoPA field moved and a signed activity needs re-signing. Confirm the exit code is wired as a warning, not a hard fail, so a real change never blocks a merge.
Prefer the terminal? The full recipe, step by stepHide the terminal recipe
1 · The two flags for running watch in CI
- --ci
- Prints the change summary as markdown to stdout (pipe it into
$GITHUB_STEP_SUMMARY) and signals a core-field change with exit code 3 — plainwatchkeeps the historic 0/1, so existing scripts are unaffected. - --webhook <url>
- POSTs the change report to a URL. The egress is announced first and carries names and change kinds only — never row values.
2 · The workflow step, in full
Copy this into .github/workflows/regixo-watch.yml and set the env var(s) your
regixo.yml names as Actions secrets. It is the load-bearing step of the ready-made
recipe at examples/github-actions/regixo-watch.yml:
- name: Re-scan and summarise what changed
env:
DATABASE_URL: ${{ secrets.DATABASE_URL }} # the env var(s) your regixo.yml names
run: |
set +e
npx regixo watch --ci >> "$GITHUB_STEP_SUMMARY"
code=$?
set -e
if [ "$code" -eq 3 ]; then
echo "::warning::Core RoPA fields changed — review and re-sign if the record is sealed."
elif [ "$code" -ne 0 ]; then
exit "$code"
fi3 · Confirm it runs
Trigger the workflow by hand once — don't wait for a real change to find out the job works. A green run with a change summary in the step summary is the proof. No CI, or a source only one machine can reach? The cron route does the same job; both are walked in Keep it current.
The re-sign side of a scheduled change is walked in Keep it current.
Step 3 · Feed the hosted record
Once a compliance lead has claimed a record on the portal, a paired regixo watch
keeps it fed. Pairing is one thing: the engineer sets REGIXO_SYNC_TOKEN (the
ingest-only token an admin minted, handed over the safe way — see
Roles & governance, Step 5) in the machine's
environment. The portal address defaults to app.regixo.com, so on the Regixo cloud the
token alone is the whole pairing; point it elsewhere with REGIXO_PORTAL_URL. With the
token set, the same scheduled run pushes the refreshed, metadata-only draft to the portal:
“Keep the record we forwarded to our compliance team in sync from CI.”
Your agent fills in everything except the token — you put that in .env yourself.
Show the commandHide the commandShow the sentenceHide the sentence
$ export REGIXO_SYNC_TOKEN='rgx_sync_…' $ regixo watch --ci
The push goes to POST /api/v1/sync authenticated by the token. It carries metadata
only, and the token can only ingest — never unlock, sign or export. The record's “what changed” feed
updates so the compliance team sees the estate moved without anyone re-forwarding a draft.
That is the whole of step 3: one env var, and the scheduled run you already have does the rest. Step 4 is confirming it worked.
Step 4 · Prove the pipeline is really wired
The goal: evidence — not assumption — that the sources resolve and the portal pairing is
live, before you trust tonight's scheduled run. regixo doctor checks the setup end to end
and names the fix for anything wrong.
“One of my sources won’t connect — find out why and fix it.”
Your agent acts on the fixes it can: it fills in every non-secret value and leaves <PASTE-YOUR-TOKEN-HERE> for you — you put the token in .env yourself.
Show the commandHide the commandShow the sentenceHide the sentence
$ regixo doctorOne ✓ or ✗ per check, and every ✗ carries the exact fix: Node, the parsed
regixo.yml with its source count and DORA scope, one line per source, and the local
map. On Aurelia's machine, with Stripe and Snowflake still awaiting their env vars, it names each
issue honestly rather than reporting a clean setup.
Check it worked: the portal-pairing line described below, plus a
fresh “last updated” time on the claim page after the next scheduled watch.
A ✗ your agent cannot clear is a hand-back, not a failure — a secret is yours to paste into
.env, and a source on a network your agent isn't on will never connect from here.
Show what it prints in the terminalHide the terminal outputShow what your agent reportsHide what your agent reports
✓ node: Node 24.4.0 ✓ config: ./regixo.yml parsed, 4 source(s) · DORA scope ON ✓ source:app-db: connection from DATABASE_URL resolved · connects ✓ ✗ source:stripe: the connection variable STRIPE_URL isn't set yet — there's nothing to read fix: Set it to your real connection string, then re-run: export STRIPE_URL='<PASTE-YOUR-TOKEN-HERE>' ✗ source:snowflake-dwh: the connection variable SNOWFLAKE_URL isn't set yet — there's nothing to read fix: Set it to your real connection string, then re-run: export SNOWFLAKE_URL='<PASTE-YOUR-TOKEN-HERE>' ✓ map: catalog present at ./index.db regixo doctor: 2 issue(s) — see fixes above.
Once REGIXO_SYNC_TOKEN is set and the portal is reachable, doctor adds a
portal-pairing check — ✓ portal-pairing: machine token accepted at https://app.regixo.com
— pushes will update the claim. It authenticates the token itself, so a revoked or
wrong-record token fails here rather than on tonight's scheduled push. That line, plus a fresh
“last updated” time on the claim page after the next scheduled watch,
is your proof the pairing works and the record is being fed.
Which paired state am I in — the walk
A machine is in exactly one of three states; the difference is only which env vars are set.
doctor reports it, and the walk tells you what to do:
| State | The signal | What to do |
|---|---|---|
| Purely local | No REGIXO_SYNC_TOKEN — nothing is pushed; doctor shows no portal check. | Nothing. The default, and fine for a team not yet on the portal. |
| Paired to the cloud | Token set, no REGIXO_PORTAL_URL — ✓ portal-pairing: machine token accepted; every watch pushes to app.regixo.com. | Nothing. The token alone is the whole pairing. |
| Paired, but broken | A revoked token fails loudly with SYNC_UNAUTHORIZED; a claim that was superseded or removed (a fresh invite mints a new claim) fails with CLAIM_NOT_SYNCABLE. | Revoked token: mint a fresh one under “Connect a machine” and reset REGIXO_SYNC_TOKEN. Superseded claim: re-run regixo invite, then pair again on the new claim. It fails loud, never drops silently. |
SYNC_UNAUTHORIZED · CLAIM_NOT_SYNCABLE
A paired push authenticates with the machine token. A revoked or mistyped token returns
SYNC_UNAUTHORIZED — an admin generates a fresh token on the record's “Connect a
machine” card and the engineer resets REGIXO_SYNC_TOKEN. A claim that was
superseded (someone re-sent the invite — a new invite mints a new claim) or removed returns
CLAIM_NOT_SYNCABLE — re-run regixo invite for a fresh claim, then pair
again with a token generated on the new claim. Either way the record freezes loudly rather than
drifting silently; regixo status shows the last push outcome so you can confirm the
reset landed.Branch · multiple repos, environments & networks
Real estates aren't one flat database. Three patterns:
- Multi-repo / multi-service — give each repo its own committed
regixo.ymlscoped to the sources that team owns. Each produces its own map; you decide whether to run them as separate records or merge the maps. - Prod vs staging — keep them as distinct sources (distinct
ids andconnectionRefs). Scanning staging is a safe way to preview a schema change before it reaches production and trips a re-sign. - Inside-network map-merge — when a database can't be reached from where you'd normally
run, run
regixo starton a machine inside that network and merge the maps. It's the same “bring Regixo inside” route the coverage meter points to in Architect your catalog.
Branch · honest limits: multi-entity is not built yet
There is no organisation-level account that groups several records under one company today. The portal's “Your records” view unifies records by the signed-in email — not by organisation — and each record is its own tenant with its own licence. A person who signs multiple records sees them together; two colleagues do not automatically share a company view.
The Enterprise tier (from €18,000, published) is the answer for multi-entity groups
and self-host — but the grouping feature and the self-host regixo serve command
are not built; multi-entity pricing and company-account grouping are on the roadmap, not shipped. And the hosted
portal is not yet hosted — per-tenant DB isolation, EU residency, live Stripe and the real-IdP
SSO run are all launch gates still ahead. Plan around what ships today; treat the rest as roadmap.
The four steps have landed when: git diff regixo.yml shows the committed estate a
colleague can clone and reproduce; a scheduled watch --ci run posts its change summary
(and exits 3, as a warning, on a core-field change); regixo doctor shows
✓ portal-pairing: machine token accepted; and the claim page's “last updated” time refreshes after each
scheduled run, with no SYNC_UNAUTHORIZED in regixo status.