Regixo docs
🔧 For the engineer·Step 7 of 7 — Keep it current·see the whole journey ↗

Keep it current

Schemas drift, so your data catalog has to keep up. This page shows how to re-scan on a schedule, read exactly what changed, and never let the map go stale in silence. If you also keep the optional EU compliance record, the same loop flags what needs re-signing and pulls your compliance team's work back home — that part is under its own marked section at the end.

▤ In the portal

Two screens keep you oriented. What changed is a dated timeline of what moved; when a signed record has drifted it shows a gold Review & re-sign → banner. Settings → Keep it current lists each source's last-scanned age and hands you a copy-ready GitHub Actions snippet, with a cron fallback below it. A tour: the free portal tour.

The portal can help you schedule regixo watch, but it can't run a scan itself — a scan is a command: your coding agent runs it in the project shell, or you do, or CI does.

✦ A connected assistant

A different surface. An assistant registered against the read-only regixo mcp server reads the change log (get_changes) and how stale each source is (get_provenance). To have an agent run the re-scan, ask your coding agent — that is regixo watch, below. See Use an AI agent.

The portal gathers all of this on one screen. Settings runs down a section nav — Mode · Connections · DORA scope · Keep it current · Moving machines · About this install — and Keep it current is the one that matters here: every source with the age of its last scan, a copy-ready GitHub Actions recipe pre-filled with the env vars your regixo.yml names, and — folded under it — a cron one-liner for when there is no CI. It is honest about what it is: Regixo can't schedule itself.

what you’ll see — Settings › Keep it current: the last-scan age of every source (3 of 10 here), the CI recipe, and the cron fallback under it
Regixo data catalog · free & local

Settings

Keep it current

Regixo can’t schedule itself — your scheduler runs regixo watch, which re-scans your sources, updates the map, the record and the change log, then exits.

app-dbPostgres · last scanned 28h ago
bigqueryBigQuery · last scanned 28h ago
ecommerce-loyaltyManual import · last scanned 4 days ago
Recommended

Scheduled CI

A scheduled CI job re-scans every weekday morning, whether or not this machine is on. Add this workflow to your repository:

name: regixo watch
on:
  schedule:
    - cron: '0 6 * * 1-5' # weekday mornings — tune to your change rate
jobs:
  watch:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
      - run: npx regixo watch
        env: # from your regixo.yml — set these as repository secrets
          DATABASE_URL: ${{ secrets.DATABASE_URL }}
          BIGQUERY_URL: ${{ secrets.BIGQUERY_URL }}
          HUBSPOT_TOKEN: ${{ secrets.HUBSPOT_TOKEN }}
          MYSQL_URL: ${{ secrets.MYSQL_URL }}
          SNOWFLAKE_URL: ${{ secrets.SNOWFLAKE_URL }}
          SQLSERVER_URL: ${{ secrets.SQLSERVER_URL }}
          STRIPE_API_KEY: ${{ secrets.STRIPE_API_KEY }}

The full recipe ships in the Regixo repo: examples/github-actions/regixo-watch.yml — it adds the change summary and the re-sign warning.

No CI? Run it from this machine

One line in your crontab (crontab -e):

say

“Schedule Regixo to re-scan my data automatically and tell me when something changes.”

Show the commandHide the commandShow the sentenceHide the sentence
run

Runs only while this machine is awake.

Re-scan on demand — regixo watch

One run re-scans your sources, appends the change log, re-drafts the RoPA (and the DORA register, if it's in scope), and reports which sources are getting stale.

say

“Re-scan my data with Regixo and tell me what changed since last time.”

Show the commandHide the commandShow the sentenceHide the sentence
run
$ regixo watch
then

It re-scans once, then exits. regixo watch is not a daemon — it does not keep running in the background, and nothing schedules it for you. It updates the map, the paperwork and the change log, and stops.

Check it worked: it prints what moved — added, removed, reclassified. If a core field of a signed activity moved, it says so, and that record needs re-signing by a person. To have it run on a schedule you need CI or cron; the recipe is below.

Show what it prints in the terminalHide the terminal outputShow what your agent reportsHide what your agent reports
example output
▸ This checks for changes ONCE and then stops — it does not keep running in the background.
12 change(s): 3 column(s) added, 1 removed; appended to the change log.
review suggested for: Billing & payments (core fields changed; sign in the portal to make it official).
↳ re-draft written · view the changes:  regixo log
Not a daemon regixo watch checks once and exits — it does not run in the background. To keep the map current you run it again, which is what a schedule is for (below). This keeps it safe to call from CI or cron with no lingering process.

Procedure A · Schedule the re-scan

A one-off regixo watch keeps the map current only until the next schema change. The whole point of Procedure A is that you never have to remember to run it. Four steps, once:

Step 1 — pick cron or CI

Two ways to run it on a schedule. They do the same job; pick by where your team already automates:

Pick…When it fitsRuns even if your laptop is off?
Scheduled CI recommendedYou already have GitHub Actions (or any CI) and the sources are reachable from it. It writes a change summary into the CI step summary and exits 3 on a core-field change, so the step can fail the build.Yes — it runs on the CI runner.
cronNo CI, or a source only your machine can reach. One line in your crontab.No — only while this machine is awake.

Step 2 — add the exact recipe

CI. Add --ci and the run prints a markdown summary to stdout (pipe it into a CI step summary) and signals a core-field change through its exit code, so a pipeline can block or warn on a merge. There's a ready-made recipe at examples/github-actions/regixo-watch.yml; the load-bearing step is:

.github/workflows/regixo-watch.yml (excerpt)
- 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"
    fi

cron. No CI? A crontab entry does the same job — hourly here:

crontab -e (hourly)
0 * * * *  cd /path/to/your/app && regixo watch

Step 3 — confirm it runs

Don't wait for a real change to find out the job works. Trigger a run by hand — the scheduled command is exactly the one from Re-scan on demand. On a quiet day it prints that nothing moved and exits 0:

example output — regixo watch --ci, nothing changed
## Regixo watch — no changes

_As of 2026-07-17T14:13:51.404Z._

Nothing moved since the last scan — the map is current.

Exit 0 and a one-line summary mean the schedule is wired correctly. Exit 1 means a paired cloud push failed — the local re-scan still finished, and the table below says so.

Step 4 — confirm --ci flags a core-field change

The exit code is the contract — this is the signal a pipeline blocks or warns on. Exit 3 is the one that matters: it fires only under --ci, when a moved core field would make a signed record need re-signing:

ExitMeaningWhen
0Clean — re-scan finished.Both modes.
1A paired cloud sync failed (the local re-scan still completed).Both modes.
3A core RoPA field changed — a signed record would need re-signing.Only under --ci.

Plain regixo watch keeps the historic 0/1 contract, so an existing cron job never breaks. Exit 3 exists only under --ci, where a script is watching for it.

Optional — notify another system on every run

To tell a webhook whenever the map moves, POST the change summary to a URL. The egress is announced first and honestly scoped — dataset and column names plus change kinds only, never row values — and a delivery failure is a warning that never fails the local run:

say

“When Regixo re-scans, post what changed to our webhook.”

Show the commandHide the commandShow the sentenceHide the sentence
run
$ regixo watch --webhook https://hooks.example.com/regixo

--json works on every mode for machine-readable output.

Read the change log — regixo log

The change log is append-only — a dated record of what moved in the map, and when. It's part of your evidence trail. Newest first:

say

“Show me what’s changed in my Regixo catalog over time.”

Show the commandHide the commandShow the sentenceHide the sentence
run
$ regixo log
then

The running history of your data — what changed, when, and what kind of change it was.

Check it worked: this is the feed you hand an auditor, so it is worth a look after any big migration. Nothing here is inferred — every row is something a scan actually observed.

Show what it prints in the terminalHide the terminal outputShow what your agent reportsHide what your agent reports
example output
Change log (4 most recent, last watched 2 hours ago):
  2 hours ago       added              column:app-db/public/orders.refund_reason
  2 hours ago       core-field-changed activity:billing  retention: 24 months → 36 months
  yesterday         removed            column:app-db/public/users.legacy_ip
  3 days ago        metadata-refresh   activity:analytics

Narrow the window with --since (an ISO timestamp) and cap the rows with --limit:

say

“Show me the 20 most recent changes Regixo recorded since the 1st of July.”

Show the commandHide the commandShow the sentenceHide the sentence
run
$ regixo log --since 2026-07-01T00:00:00Z --limit 20

The same history renders in the browser at /ui/changes, grouped by date.


Optional · EU compliance — from here on Everything below is only for EU companies that keep a signed GDPR RoPA or DORA record. If you use Regixo purely as a data catalog, you are done above — with the schedule in place, each run refreshes the map.

Procedure B · Respond to a re-sign (your side)

When a re-scan moves a core field of a signed activity, that signature no longer holds. Your side of putting it right is four moves, in order — and none of them is signing, which only a named person on the compliance team can do, on the portal:

  1. Re-scan, or let CI do it. A moved core field of a signed activity is flagged in the regixo watch output itself — Re-scan on demand, above.
  2. Read exactly what changed — which fields moved, and whether any was a core field that breaks a signature. What counts as a change ↓
  3. Let the compliance side learn. A paired push carries the changed draft to the portal, stamps a heartbeat, and their re-sign alert goes out — pairing is the step that makes this automatic. Pair this machine ↓
  4. Bring their signed work home once they've re-signed on the portal. pull & seal pull ↓

The sections below are those four moves in full. They only ever run when a signed record has drifted; a metadata-only change crosses no seam and needs nothing from you.

Move 2 · What counts as a change — and when you re-sign

Not every schema edit invalidates a signature. Regixo splits changes into two kinds:

The seven core fields that trigger a re-sign flag:

Regixo never re-signs for you A moved core field is flagged, never re-signed automatically — re-signing is a human act in the portal (Hard Rule #4). A metadata-only change is not a re-sign at all: the signature stands and the change just lands in the log. The full re-sign flow, and what the compliance team sees, is in Unlock, sign & maintain.
The re-sign seam — your side, then theirs

You do: re-scan, or let CI do it. If a core field of a signed activity moved, that activity's signature no longer holds — regixo watch flags it, and a paired push carries the change to the portal. They then do: your compliance team is emailed that an activity changed since they signed and needs re-signing (that alert is on by default), and they re-sign on the portal — the one place a signature can be made. A metadata-only change crosses no seam: the signature stands and the change just lands in the log. Regixo re-signs for no one (Hard Rule #4). Their side of this seam is Unlock, sign & maintain.

Move 3 · Keep the forwarded record current — pair this machine

Re-scanning keeps your local map fresh. If you forwarded a record to your compliance team, one more step keeps the hosted copy fresh too: pair this machine, so a re-scan also pushes the refreshed draft to the portal. Three commands send once this machine is paired: regixo watch, regixo start, and regixo push — which sends the record as it stands with no re-scan at all, so it still works when a source is unreachable or still waiting on a credential. Pairing is one env var, and it has three states:

StateWhat you setWhat gets sent
PairedREGIXO_SYNC_TOKEN and REGIXO_PORTAL_URL pointing at the portal you run. The address defaults to app.regixo.com, so the token alone will pair once that host is switched on — it is not yet.The refreshed metadata-only draft, every run, so the hosted record tracks your schema.
Half-pairedREGIXO_PORTAL_URL set (self-host or ngrok) but no token yet.Nothing — the push can't authenticate, so it exits 1 and cron or CI notices instead of failing in silence.
Local-onlyNo token — or REGIXO_PORTAL_URL=off to stay fully local.Nothing leaves the machine. The re-scan just refreshes the local map, record and change log.

A push carries the same metadata-only payload an invite does — table paths that look personal and the kinds of personal data in them, plus the drafted record. Never a row value, a column name, or a credential.

The machine token is yours to set — and it stays out of any chat

Your compliance admin generates an ingest-only machine token on the claim page under Connect a machine, and you set it on this machine as REGIXO_SYNC_TOKEN. The free portal's Connect a machine panel writes it to your own .env (file perms 0600) on localhost, or you add it there by hand. It lives in .env only — never in regixo.yml, never echoed back on screen — and, because it is a secret, you never paste it into a chat with an agent to have the setup done for you. The token can only push metadata — it can never unlock, sign or download — and the admin can revoke it per machine at any time.

Send now, without a re-scan — regixo push

A re-scan sends as a side effect. When you have only changed the record — answered one of your three Article 30 fields, corrected a personal-data flag, asserted a data flow — there is nothing to re-scan, and regixo push is the direct way to send it:

$ regixo push
✓ hosted record updated → https://app.regixo.com
  This sent what is already on this machine. To pick up schema changes first, run:  regixo watch

It touches no database, so it works when a source is unreachable or still waiting on a credential — the case where a re-scan cannot get far enough to send anything. Unpaired, it says so and exits 1 rather than failing quietly:

$ regixo push
Not sent: this machine isn’t paired with the hosted record, so it cannot update it.
  Pair it: whoever claimed the record generates a machine token on the claim page (“Connect a machine”).
  Then set it as REGIXO_SYNC_TOKEN here, or paste it in  regixo open → Settings.

Commands that change the record but do not send on their own (classify, lineage) say so in their own output and name this command.

How your compliance team knows the map is still moving

A paired push is more than a data update — it is a heartbeat. Each regixo watch run stamps the token's last-seen time on the portal, and the hosted record shows when it last synced. So the compliance side never has to ask whether your re-scan ran; the record says so on its own face.

If a paired machine goes quiet, the portal does not wait for someone to notice a stale date. After a 7-day grace window with no sync, it flags the record as going stale.

That warning always shows on the record and in the audit trail. The email to the record's admins is on by default; each person can turn it off in their notification preferences.

The usual causes are plain:

Move 4 · Bring the team's work home — pull & seal pull

The handoff is a round trip. Your compliance team fills legal and DORA fields on the forwarded claim link, and signs there. Two commands bring their work back to your machine. In both, the claim token is the capability — the same secret your regixo invite link carried.

Pull the filled-in fields

Prefer buttons? The free portal’s record page shows a banner the moment answers are waiting and brings them in with one click — the same merge as the command. regixo pull fetches the RoPA legal fields and DORA cells your team entered and merges them with eyes — a per-field diff, and it skips a field where your local answer is newer (never a blind overwrite). A field your compliance team deleted is removed here too — but only ever a row they filled: an answer you typed yourself is never removed by a pull, whatever arrives on the wire. Preview with --dry-run; take the claim side on a conflict with --force:

say

“Pull the answers our compliance team filled in on the forwarded link back into my local Regixo catalog.”

Show the commandHide the commandShow the sentenceHide the sentence
run
$ regixo pull clm_7f3a9c2e4b1d8056
then

The answers your compliance team filled in on the forwarded link, merged into your local draft. A field they confirmed is carried as confirmed — never re-derived, never fabricated.

Check it worked: it reports how many merged and how many were skipped (already merged, or your local copy is newer). If it says anything else — or nothing — check for yourself with regixo dora status.

Show what it prints in the terminalHide the terminal outputShow what your agent reportsHide what your agent reports
example output
 merged 5 fills from claim clm_7f3a9c2e4b1d8056 · 2 skipped (already merged or local is newer).
↳ see them:  regixo dora status   ·   regixo annotate list

A field your team confirmed is carried as confirmed, never fabricated — that was a human approver's decision on the portal, and the pull only transports it (Hard Rule #4).

Pull the signed seal

Once the team has signed and sealed, regixo seal pull checks the claim's status and, when it's sealed, downloads the official artifacts — the PDF, the record JSON, the attestation and the offline verifier — into <data-dir>/remote-seal/, so you hold the evidence locally:

Signed again? A re-signature is a new seal. regixo status then says “signed again on the portal — this machine holds the earlier seal” and names the command; the record page offers the same as a button. Re-run regixo seal pull to collect it.

say

“Pull our signed, sealed record from the portal onto this machine.”

Show the commandHide the commandShow the sentenceHide the sentence
run
$ regixo seal pull clm_7f3a9c2e4b1d8056
then

The sealed record comes home: the official PDF, the record, and the attestation, so the proof lives next to the source it describes.

Check it worked: it names who signed it and when. Not signed yet? It says so, and changes nothing — that is not a failure, it means your compliance team hasn't got there.

Show what it prints in the terminalHide the terminal outputShow what your agent reportsHide what your agent reports
example output
 pulled 4 of 4 sealed artifacts → .regixo/remote-seal
  signed & sealed by Dana Kessler (Data Protection Officer, Acme Europe BV) on 2026-07-03 · valid until 2027-07-03
  verify offline:  node .regixo/remote-seal/verify-attestation.mjs

If the record isn't signed yet, the command says so plainly and exits without error — "not yet" is a normal answer. Nothing is ever overwritten blindly.

How you know you're done

Procedure A is done when the schedule is proven, not just written:

Procedure B only ever runs when a signed record drifts — and it is done when the loop closes:

REGIXO — documentation · a core-field change is flagged, never re-signed for you · Command reference