Quick Start

Five minutes, one config file, and you’ll know the next time a model your app calls changes. First download RadarModel and put radarmodel-ai and radarmodel-schema on your PATH. This page starts with RadarModel AI; RadarModel Schema follows.

1. Write a config

radarmodel-ai init

That writes radarmodel.json in the current folder. Open it and put the models your app actually calls under watch, as provider:model. Remove the providers you don’t use.

{
  "interval": "1h",
  "providers": [
    {"type": "openai"},
    {"type": "openrouter"}
  ],
  "watch": [
    "openai:gpt-4o",
    "openrouter:anthropic/*"
  ]
}

A * matches anything, slashes included, so openrouter:anthropic/* watches every Anthropic model on OpenRouter.

2. Set the keys

export OPENAI_API_KEY=...
export ANTHROPIC_API_KEY=...   # if you watch Anthropic
export GEMINI_API_KEY=...      # if you watch Google

OpenRouter’s list is public and needs no key. Keys go only to each provider’s own host, in a header, and never into files, errors or alerts.

3. Take the baseline

$ radarmodel-ai check
2026-10-17T19:30:11Z  RadarModel AI: no changes
openai      baseline  3 items recorded; changes are reported from the next scan
openrouter  baseline  2 items recorded; changes are reported from the next scan

The first run records what each provider lists today. Snapshots go into .radarmodel/ next to the config file.

4. Check again, later

$ radarmodel-ai check
2026-10-17T19:30:11Z  RadarModel AI: no changes
openai      ok  no changes (3 items)
openrouter  ok  no changes (2 items)

Say a provider then drops gpt-4o and raises a price. The next check warns about both. The * marks a model you watch:

$ radarmodel-ai check
2026-10-17T19:30:11Z  RadarModel AI: 2 warnings
openai      WARNING  gpt-4o *  gone (missing from this scan; breaking if the next scan misses it too)
openai               1 more below warning
openrouter  WARNING  anthropic/claude-sonnet-4.5 *  input_price 0.000003 -> 0.0000035

A removal isn’t called breaking on one scan. If the next one misses gpt-4o too, it is, and check exits 1:

$ radarmodel-ai check
2026-10-17T19:30:11Z  RadarModel AI: 1 breaking
openai      BREAKING  gpt-4o *  gone (confirmed by a second scan)
openrouter  ok        no changes (2 items)
$ echo $?
1

-min info shows the minor changes too, such as new models. radarmodel-ai show openai lists what’s stored for a provider.

5. Run it on a schedule

Pick one.

Cron, hourly:

0 * * * * cd /srv/radar && radarmodel-ai check >> radar.log 2>&1

Watch mode scans every interval until you stop it:

radarmodel-ai watch

CI, as a gate. A GitHub Actions job that fails when a watched model breaks. It keeps the snapshots between runs with the cache:

- uses: actions/cache@v4
  with:
    path: .radarmodel
    key: radarmodel-${{ github.run_id }}
    restore-keys: radarmodel-
- run: radarmodel-ai check
  env:
    OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}

6. Get alerts where you look

Add an alerts block. Secrets come from environment variables:

"alerts": {
  "min_severity": "warning",
  "slack": {"url_env": "SLACK_WEBHOOK_URL"}
}

Webhooks get the report as JSON, Slack and email get a short text. The reference has every setting.

RadarModel Schema

The same five minutes for a database. RadarModel Schema needs no migration tool: the first scan records what’s there and later scans report what changed.

Write a config

radarmodel-schema init

That writes radarmodel-schema.json with one database of each kind. Keep the ones you have. Connection strings come from environment variables, never from the file:

{
  "databases": [
    {"name": "prod", "driver": "postgres", "dsn_env": "PROD_DATABASE_URL"},
    {"name": "local", "driver": "sqlite", "path": "app.db"}
  ]
}
export PROD_DATABASE_URL='postgres://[email protected]/app?sslmode=require'

On Postgres any role that can connect will do. On MySQL or MariaDB, give the user SELECT, SHOW VIEW and TRIGGER on the database. The reference says why.

Take the baseline and check

The runs below are the released 0.2.0 binary on a small SQLite database:

$ radarmodel-schema check
2026-10-17T21:06:17Z  RadarModel Schema: no changes
local  baseline  12 items recorded; changes are reported from the next scan
$ radarmodel-schema check
2026-10-17T21:06:18Z  RadarModel Schema: no changes
local  ok  no changes (12 items)

Then someone drops a column, adds another and drops an index by hand. The next check reports all three, and exits 1 because a dropped column is breaking:

$ radarmodel-schema check
2026-10-17T21:06:19Z  RadarModel Schema: 1 breaking, 2 warnings, 2 info
local  BREAKING  column main.customers.name       gone
local  WARNING   column main.customers.phone      new
local  WARNING   index main.orders.orders_status  gone
local            2 more below warning
$ echo $?
1

The two info lines are a column that moved up a position and the table’s CREATE statement; -min info shows them.

Pick a baseline mode

By default each scan is compared with the one before, so a change is reported once. To keep reporting drift until someone looks at it, set "baseline": "pinned" on the database; radarmodel-schema accept local then takes the schema as it is now as the new baseline. To compare two databases right now, such as staging against production:

radarmodel-schema diff prod staging

Schedules, CI and alerts work as for RadarModel AI above, with radarmodel-schema in place of radarmodel-ai.