Supabase
Cost
Performance
Stability
Releases
Security & compliance
Realtime & cost
Subscriptions and queries that bill by the row.
Overview
Reads your Realtime subscriptions and query shapes for patterns that scale egress and compute faster than usage: unfiltered channels, channels never torn down, and polling loops sitting next to a Realtime channel that would have done the job.
What it looks for
- Realtime subscriptions with no filter, broadcasting every mutation
- Channels never unsubscribed on unmount
- Polling loops on short intervals where Realtime applies
- select('*') fetching every column on the wire
- Tables subscribed to but missing from the supabase_realtime publication
Why it matters
An unfiltered subscription delivers every mutation on the table to every connected client, so cost grows with users multiplied by writes. A channel that is never unsubscribed leaks a connection per mount, which surfaces as a connection ceiling long before it surfaces as a bill.
Rules in this check
| What it reports | Fix path |
|---|---|
| Unfiltered Realtime subscription broadcasts every mutation | Pull request |
| Realtime channel never unsubscribed — connection leak | Pull request |
| Polling loop queries Supabase on a short interval — use Realtime instead | Guide |
| select('*') fetches every column — unnecessary egress | Pull request |
| Table subscribed via Realtime but absent from the supabase_realtime publication | Pull request |
How the fixes arrive
Pull requestLow-risk changes arrive as a pull request on a lumioguard branch, with a breakage analysis attached. You review and merge it.
GuideChanges only you can make safely arrive as a step-by-step guide you can follow yourself or hand to your coding agent.
Run them all on your app
Connect your repo and your live services with read-only scopes. The first scan is free, and nothing changes without your approval.