Customer addresses and orders are readable by anyone
WhereSupabase: public.profiles, public.orders, public.addresses
What's wrong
Supabase protects each table with rules that say who can see which rows. On three tables those rules are switched off, so the database answers any request that carries the public key, and the public key is in your website for anyone to copy.
Why it matters
Anyone can download every customer's name, phone number, home address and order history in one request. That's a data breach you would likely have to report in the UK and EU, and the kind of thing that ends up on social media.
Evidence
-- Supabase SQL editor
select tablename, rowsecurity
from pg_tables where schemaname = 'public';
tablename | rowsecurity
-------------+------------
profiles | false
orders | false
addresses | false
meal_plans | true
-- From any laptop, with the key from the site's JavaScript:
-- curl "https://<project>.supabase.co/rest/v1/addresses?select=*" \
-- -H "apikey: <anon key>"
-- → 1,240 rows, every customer's addressThe fix
Turn the rules on for all three tables and add one rule per table: a customer can see and change only their own rows. Then test as two different customers to prove neither can see the other.
For your developer
Enable row level security on each table, then a policy per table: for all using (auth.uid() = user_id) with check (auth.uid() = user_id). profiles keys on id, not user_id. Check the admin dashboard still works: it should go through an edge function (see MB-02), not the anon client.