How we hold your data
A board is only useful if you bring it the decision you would not put in a group chat. So this page is the mechanics, not the reassurance: what is stored, which table it sits in, who can read it, how long it lives, and the exact database trigger that deletes it when you take a table off the record.
194 of 194 tables with row-level securitystored in the EU (eu-west-1)no card details ever reach us
The binding documents are the Privacy Policy, Terms and Security pages. This one explains how they are actually implemented.
Application code that forgets a WHERE user_id = … is the single most common way one customer sees another’s data. So the check does not live in application code. Every table in the public schema has row-level security switched on, and the policies on your content all have the same one-line shape.
194 of 194 tables · 359 policies · counted against production on 22 July 2026
CREATE POLICY "Users can view own sessions"
ON sessions FOR SELECT
USING (auth.uid() = user_id);The same predicate guards your memories, your decisions, your credits and your tool connections. The privileged functions that search across your world model are declared SECURITY DEFINER with an explicit search_path, and execute permission is revoked from anon and authenticated — only our server can call them, and only ever with your own user id.
Some decisions should not join the record — the ones about people, or about whether to keep going at all. You can run any table off the record. That guarantee is enforced in two independent layers, and neither of them is application code you have to trust us to have written correctly.
The search function that feeds every grounded answer filters off-record sessions out of its candidate set before scoring anything. There is no ranking threshold to tune and no prompt to jailbreak — the rows are not in the result.
AND NOT EXISTS (
SELECT 1 FROM sessions s
WHERE s.id = sm.source_session_id
AND s.wm_scope = 'off_record'
)Marking a session off the record fires a trigger that deletes its decisions, memos, board artifacts and derived facts from the brain index outright. And the scope locks once a session is underway — the API refuses the change with a 409 — so “off the record” is a decision you make going in, never a scrub applied after the argument went somewhere you did not like.
CREATE OR REPLACE FUNCTION purge_offrecord_brain_rows()
RETURNS trigger LANGUAGE plpgsql SECURITY DEFINER SET search_path TO 'public', 'extensions'
AS $$
BEGIN
IF NEW.wm_scope = 'off_record' AND COALESCE(OLD.wm_scope, '') <> 'off_record' THEN
DELETE FROM session_memory
WHERE source_session_id = NEW.id
AND memory_type IN ('decision', 'memo', 'board_artifact', 'wm_fact');
END IF;
RETURN NEW;
END;
$$;
DROP TRIGGER IF EXISTS trg_purge_offrecord_brain ON sessions;
CREATE TRIGGER trg_purge_offrecord_brain
AFTER UPDATE OF wm_scope ON sessions
FOR EACH ROW WHEN (NEW.wm_scope = 'off_record')
EXECUTE FUNCTION purge_offrecord_brain_rows();Keeping logs forever is not caution, it is negligence with extra steps. Scheduled jobs purge the 90-day logs on the clock; the API and MCP audit trail is retained for twelve months, and backups roll on a fixed window.
| Record | Kept for | Why |
|---|---|---|
| Sessions, memos, world-model facts | While your account exists | They are the thing you paid for; a board that forgets is not a board. |
| Tool-call events | 90 days | Long enough to reconcile billing and investigate an incident. Connect and disconnect events are kept for the life of the account — those are account-security records. |
| Model-call audit log | 90 days | One row per model call. Ninety days covers the longest realistic postmortem window. |
| API and MCP call log | 12 months | Tool name, PII-scrubbed parameters, status, correlation id, caller IP. Kept longer than the other logs because it is the security audit trail for programmatic access. Visible to you under Developers → Usage. |
| Database backups | 90 days | Disaster recovery. A deletion propagates out of backups as they roll. |
People mean six different things by “delete it”. Here is what each one actually does — including the two answers that are a “no, and here is why”, stated plainly rather than buried.
SynthBoard runs on Vercel with a managed PostgreSQL database in the EU. Your prompts and session content go to the frontier model providers that run the seats — they process under their own terms, and the current list is in the privacy policy. Payments go through a merchant of record, so card details never reach our servers. Email is delivered by a transactional provider. The 62 tool connections are brokered by an integration provider that holds the OAuth tokens on your behalf — we store a connection id and the granted scopes, nothing that could be replayed.
We do not sell your data, and a session is private until you explicitly share it. A shared link can carry a password and can be revoked at any time.