
Configuration
Drop a skene.config.json at the repo root. Skene reads it on every run.
Minimal config
{
"tables": ["events", "analytics_events"],
"include": ["src/**/*.ts", "src/**/*.tsx"],
"ignore": ["**/*.test.ts", "**/*.spec.ts"]
}
tables: which Supabase event tables to track. Defaults to every table your code writes to.include: glob patterns Skene scans. Defaults to common source globs.ignore: glob patterns Skene skips. Defaults to test and build outputs.
Accept an intentional change
Sometimes you mean to rename an event. The next run still flags it. Acknowledge once and Skene updates the baseline on merge.
{
"accepted_changes": [
{
"from": "checkout_completed",
"to": "checkoutCompleted",
"reason": "renamed to match the new naming convention (2026-05-22)"
}
]
}
Once merged, the new event becomes the baseline. Future PRs only flag drift from there.
Environment-specific rules
Different rules per environment. Skene picks the block matching SKENE_ENV at run time.
{
"environments": {
"production": {
"ignore": ["src/dev/**", "src/scripts/**"]
},
"staging": {
"ignore": []
}
}
}
Ignoring a single call
When a specific call is intentionally excluded from validation (debug logging, internal tooling), inline-comment it.
// skene-ignore: internal debug logging
await supabase.from('events').insert({ name: 'dev_debug' })
Skene skips the line and notes the reason on the run.
What is next
- Install Skene: pick a surface
- What Skene catches: the five failure modes
- What Skene reads: the Supabase writes Skene tracks