
You can't recover today's data.
Coding agents rewrite the lines that record events to your Supabase tables as a side effect of every feature. Skene catches the break on the pull request, while the data is still recoverable.
The problem
Analytics is not retroactive.
Product, growth, and pricing decisions run on event data. Funnels, retention, attribution. Those charts come from rows your app writes into Supabase, one insert per event, sitting in your code. When one of those writes breaks, the table does not error. It just stops filling, and the dashboard keeps drawing from data that is quietly missing.
That is the part that does not heal. A bug in a feature, you fix and redeploy. A metric you never recorded is gone for good. You cannot backfill an event that did not fire. Broken tracking is not a bug you handle later, it is a permanent hole in your history.
Skene reads every event your app writes to Supabase.
Every insert into an event table, indexed by file, line, table, and payload shape.
Skene parses the codebase the way a linter does. It finds every write that records an event into your database, builds an index of which table each one lands in and what columns it sets, and reads your Supabase schema as the contract. That pairing is the baseline every PR gets checked against.
This may take a few minutes. Stay on this page to see live pipeline updates.
| SIGNAL | TYPE | FOUND AT | STATUS |
|---|---|---|---|
| Account Created | Supabase | public.accounts | Can be tracked (DB) |
| Signup Page Viewed | GitHub | app/admin/(auth)/login/page.tsx | Recommended |
| Signup Form Submitted | GitHub | app/admin/(auth)/login/page.tsx | Recommended |
| Auth User Created | Supabase | auth.users | Can be tracked (DB) |
| auth.users.insert | GitHub | – | Can be tracked (DB) |
| user creates an account record | GitHub | – | Can be tracked (DB) |
Analytics diff detected
Drop one insert. Your table stops filling for three sprints.
Removed writes. Renamed or dropped columns. Wrong types. Payloads your schema cannot store. Conditional writes that no longer run.
When a PR changes a file that writes events, Skene compares the new state against the index and your schema. Missing inserts, renamed columns, type mismatches, and conditional writes that no longer fire all show up as a comment on the PR. Caught on review, not on a table that has been empty since a refactor weeks ago.
The event fired. Did it land?
Skene checks every event against the Supabase table and columns it maps to.
Tracking that compiles is not tracking that works. A renamed column or a payload your schema cannot store will pass tests and still never reach the table it was meant to fill. Skene treats your Supabase schema as the contract. When an event stops matching the table it lands in, the mismatch shows up on the PR, with the event, the column, and what stops being recorded.
Schema mismatch detected
From install to a clean instrumentation surface.
A baseline of every event write you already have, drift caught on the PR that introduced it, and an instrumentation surface that stays consistent as the codebase grows.
Four ways to plug Skene in.
MCP server for your coding agent. GitHub Action for CI. Cloud API for custom runs. One-time repo audit.
Install the MCP server into Cursor or Claude Code and Skene runs before the agent commits. Add the GitHub Action and it runs on every PR. Hit the cloud API directly from any script. Or run a one-time audit of your current instrumentation surface before you adopt anything else.
Separation of duties
The agent writes the tracking. It should not grade its own work.
Skene does not write code, and it does not compete with Cursor, Claude Code, Codex, or Devin. It runs alongside them. An agent checking the instrumentation it just wrote is the conflict of interest the check exists to remove. The gate has to sit outside the tool that made the change.
It is also not a product analytics tool, an instrumentation library, or a customer data platform. It validates that the events your app writes to Supabase still fire and still match your schema after the next PR. That position, the independent gate in the pull request and the record of what every event is supposed to do, is the point. It is the seat, not the data.
Built in the open,
with our design partners.
See what your last 10 PRs quietly broke.
Install in a minute. The first repo audit runs in about as long as your CI does.
Pay for cloud validation runs.
1.5M monthly tokens
- Local MCP server
- GitHub Action with PR comments
- Cloud validation API
- 1.5M monthly tokens