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.