Profile and account
The two rows created when you sign up, which fields are public, where avatars are stored, and how the credit balance moves.
Signing up creates two rows keyed to your Supabase auth user id: one in users
for the account, one in profiles for how you appear. Both are written by a
database trigger on the auth table at the moment the account is created, so a
signed-up account always has both.
Your password and OAuth identity are held by Supabase Auth and never copied into either table.
users
The account row. Only you can read it, and only you can update it.
| Column | What it holds |
|---|---|
email | Copied from the auth record at signup. |
username | The username you gave at signup, or the part of your email before the @. |
credits_usd | Your AI credit balance. New accounts start at $5.00. |
created_at, updated_at | Timestamps. |
api_key, tokens_used, favorite_colors, playstyle and experience_level
are older columns that nothing in the app writes today.
The balance only moves through two database functions, deduct_credits after an
AI action and credit_balance after a Stripe purchase or a refund. Neither the
browser nor a server action writes credits_usd directly. Every movement leaves
a matching row in token_usage, described on the
conversations page.
profiles
How you appear in the app.
| Column | What it holds |
|---|---|
display_name | Up to 50 characters, and unique across accounts. |
bio | Up to 280 characters. |
avatar_url, avatar_type | Your avatar, and where it came from. |
theme | light, dark or system. |
favorite_colors | Any of W, U, B, R and G. |
favorite_card_ids | Up to five cards. |
created_at, updated_at | Timestamps. |
avatar_type records which of five paths produced the current avatar:
upload for a file you uploaded, card for a card's art, preset for one of
the built-in images, oauth for the picture your Google or Discord account came
with, and default when you have none.
Uploads and card art go into the avatars storage bucket under a folder named
with your user id, and are served from a public URL. Presets are static files
already in the app, so choosing one stores a path and uploads nothing.
What other people can see
profiles carries a policy that grants read access to everyone. Explore uses
it: a public deck is listed with its author's display name, which it reads from
the deck owner's profile row. The policy covers the whole row rather than the
display fields, so treat everything in the table above as public. Your bio, your
chosen theme, and your favorite cards and colors are all readable by anyone who
can query the table.
Your email sits on users, which no one but you can read.
Deleting your data
Removing a card from a deck or from your collection deletes the row. The deck keeps a history entry recording the removal, described on the decks page.
Deleting a whole deck, a conversation, or the account itself has no self-serve path today, so any of those means asking us to do it.