Features
Pick any table — it doesn't matter which
The ping exists to make Postgres do something, not to fetch data that means anything.
Any table in your project that the anon role can reach keeps the database awake, whether
that's your busiest table or one you haven't touched in months. There's no "right" table
to find, so the setup app doesn't ask you to find one — type any name you recognize from
your own schema.
A link beside the field ("see your tables ↗") opens your project's table editor in a new
tab, so checking a name takes a copy-paste, not a lookup. Manual entry is also more
reliable than it sounds: a table with Row Level Security on and no policy for the anon
role still returns 200 with an empty list — the request reaches Postgres, which is the
whole point — and only a table that doesn't exist at all returns 404. In practice,
almost any real table name works.
Table discovery runs quietly in the background and stays out of the way. If your
project still lets an anon/publishable key list its tables — most current Supabase
projects don't — the setup app picks that up and offers the results as autocomplete
suggestions on the table field. You won't see a message either way: no toast when it
finds something, none when it doesn't. It's a shortcut when it fires, never something
you need to notice or respond to. The key it uses is never stored.
Real ping test, not a guess
Before a project is added, the setup app fires the exact request the workflow will make —
same headers, same endpoint — and shows the real result.
- A real HTTP status that isn't 2xx blocks adding the project, with the specific
reason (a 404 means the table genuinely doesn't exist).
- A request that fails with no status at all — a CORS rejection, being offline, a
restrictive proxy — is a different situation: that's a property of your browser's
network path, not evidence the project is broken. The setup app warns rather than
blocking outright, and lets you add the project anyway. This mirrors how the workflow
itself treats unused secrets: reported, never treated as a hard failure on its own.
This is what makes typing any table name safe rather than risky: nothing gets added until
the exact ping the workflow will run has already succeeded once.
Failures that say what to do about them
A ping can fail for reasons that look identical in a status code and demand completely
different responses. A rotated key, a dropped table, a paused project and a Supabase
outage are four different problems, and "failed" describes all of them equally badly.
Every failure is sorted into one of two verdicts, stated in one line at the top of the job
summary before any detail:
- Action required — something in your repository or your project needs changing. A
rejected key, a table that no longer exists, a missing secret, a paused project, a
billing restriction, a URL that doesn't resolve.
- Outage — Supabase is not answering and nothing you own is misconfigured. The next
scheduled run will try again on its own.
Both fail the run, because a database you're trying to keep awake being unreachable is
worth a notification either way. The difference is that you can tell from the first line
whether to open your dashboard or ignore it.
Each failed project then gets its own section carrying four things: what happened, what
Supabase itself said, what to do about it, and a log of each attempt with its status and
timing. The response body is read rather than discarded, so when PostgREST says
relation "public.leaderboard" does not exist, that is the sentence you see — not a bare
404.
Platform-specific codes are decoded, not passed through. Supabase uses 540 for a
paused project, 402 for a project restricted under the Fair Use Policy, and 544 for a
gateway timeout. None of these mean anything without a lookup, so the summary explains
them in place.
Transport failures are diagnosed too. A request that never gets an HTTP response
carries curl's exit code, which is often more informative than a status would have been —
a DNS failure means the project was deleted or the URL has a typo, and says so, rather
than reporting a meaningless 000.
Retries apply only where they can help. A project answering 503 gets three attempts
across about a minute, since a service restarting underneath the gateway often clears in
seconds. A rejected key or a missing table is not retried at all, because it will answer
identically however long you wait.
One thing worth knowing: Supalive cannot revive a project that has already been paused.
A paused project is refused at the gateway, so the ping never reaches Postgres. If you
ever see the paused verdict, the pings had been failing for some time beforehand — the
earlier runs will show it.
Resume link and import
Two different ways to move your project list between machines or browser sessions:
- Resume link encodes your current list (names, URLs, endpoints, secret names — never
keys) into a URL. Open it anywhere to restore the list.
- Import accepts a pasted
projects.json, for when you already have one — a fresh
clone of your repo, or a machine that lost its browser storage. Duplicates are skipped.
Your project list is also saved to the browser's local storage automatically, so closing
the tab doesn't lose it.
Personalized ZIP packaging
"Download ZIP" assembles a complete, ready-to-push package: the workflow file, your
projects.json, a README naming your exact secrets, and a personalized AI-SETUP.md
listing your specific projects. Everything is generated in the browser — nothing is
uploaded anywhere.
No server, no account
The setup app has no backend. Everything — verifying a project, building your ZIP — runs
in your browser, so there is no server for your details to be stored on and no account to
create. The only network request it makes is to your own Supabase project, to check the
table you picked actually answers.
Built-in help
A ? button in the top corner opens a short overview — what Supalive does, the four
steps from adding a project to it running on its own, and a plain answer to "is this
safe?". It opens automatically the first time you visit and stays out of the way after
that; reopen it anytime from the same button. Nothing about using this page assumes
you've read the docs first.