Tempo security guide
How to secure a Supabase app you build with Tempo
Review every pull request a Tempo agent opens for SQL migrations, and reject any that create a table without enabling RLS. Tempo's desktop app has no Supabase integration, so the database rules live in your repo and your Supabase project. If you built the app with Tempo's legacy web editor, audit the generated schema's RLS now.
Last updated
Does Tempo connect to Supabase today?
No. The current Tempo product is a local desktop app that runs Claude or Codex agents on your repository, and its docs do not mention Supabase. The earlier web editor had a Supabase integration: you authorized your Supabase account, picked a project, and Tempo generated the schema, typed data handlers and real-time updates. Tempo's migration guide says the web editor was wound down.
What should I look for in a Tempo pull request?
- A create table with no enable row level security in the same migration.
- An update policy with using but no with check.
- A new view without security_invoker.
- A secret or service_role key in client code or a client-exposed variable.
- verify_jwt = false on an Edge Function.
# Show the RLS-related lines a branch adds to Supabase migrations.
git diff origin/main...HEAD -- supabase/migrations/ \
| grep -inE "create table|enable row level security|create policy|security_invoker"How do I audit an app from Tempo's legacy web editor?
Run these in the Supabase SQL editor. The first lists tables without RLS. The second lists policies that let every row through.
-- Tables in public without RLS. This must return no rows.
select c.relname
from pg_class c
join pg_namespace n on n.oid = c.relnamespace
where n.nspname = 'public' and c.relkind = 'r' and not c.relrowsecurity;-- Policies that pass for every row.
select tablename, policyname, cmd, roles
from pg_policies
where schemaname = 'public'
and (qual = 'true' or with_check = 'true');alter table public.events enable row level security;
create policy "events: owner reads" on public.events
for select to authenticated
using ((select auth.uid()) = user_id);
create policy "events: owner inserts" on public.events
for insert to authenticated
with check ((select auth.uid()) = user_id);
create policy "events: owner updates" on public.events
for update to authenticated
using ((select auth.uid()) = user_id)
with check ((select auth.uid()) = user_id);How do I keep secret keys out of the client?
Search the source and the build output for a secret key on every branch an agent touches. A publishable key in client code is expected. A secret key there is a leak to rotate.
# Look for a secret key before you deploy. This must print nothing.
grep -rnE "sb_secret_|service_role" --exclude-dir=node_modules --exclude-dir=.git . 2>/dev/nullWhat should I run after merging a Tempo pull request?
- Apply the migration to a development project first.
- Run the RLS query above. It must return no rows.
- Run the Supabase Security Advisor.
- Let Supahound's daily posture scan confirm no newly exposed tables reached production.
Frequently asked questions
- Is Tempo's web editor still available?
- No. Tempo's migration guide says the web editor was wound down, and the current product is a desktop agent app that works on your own repository.
- Did Tempo's Supabase integration set up RLS?
- No Tempo doc says it did. Supabase's partner page describes the integration generating the database structure, typed data handlers and real-time updates, with no mention of policies.
- Which agents does Tempo run?
- Claude or Codex, locally, against your repository. They turn issues and specs into pull requests, so your review of each pull request is where database security gets checked.