Security
Dagur stores a builder's working memory — threads, decisions, notes, todos. That's sensitive. This page is the technical companion to our privacy policy: where your data lives, who can reach it, and what we'd have to do to recover or export it.
Three storage tiers
Widgets, notes, todos, captures, layouts, backgrounds — everything — live in your browser's localStorage and IndexedDB. Nothing is transmitted to any server. Clearing browser data deletes it permanently. You can export and import layouts at any time from Settings.
When you sign in, a defined set of data syncs to Supabase (EU-hosted Postgres) under your user ID. AI threads and messages sync here too, so memory travels across your devices. The source of truth is Supabase; your browser is a cache.
If you provide your own Anthropic API key, AI requests go directly from your browser to api.anthropic.com. Our servers never see the request, the response, or the key. The key is stored in your browser's localStorage under mmdb:api-keys.
AI memory architecture
Tables
| Table | Contents | Access |
|---|---|---|
ai_threads | Thread id, title, surface, metadata, summary | Owner only via RLS |
ai_thread_messages | User and assistant turns, content, model, tokens | Owner only via RLS |
subscriptions | Tier, Stripe IDs, period end | Server reads via service key; you read your own row |
google_oauth_tokens | Encrypted refresh tokens for connected Google accounts | Server-write only; owner-read |
Row-Level Security (RLS)
Every user-data table has RLS enabled. The policy is identical across tables:
CREATE POLICY "own_rows_only" ON <table> FOR ALL USING (auth.uid() = user_id) WITH CHECK (auth.uid() = user_id);
This is enforced at the database level, not the application level. Even if our server code had a bug that tried to read someone else's row, Postgres would refuse.
Encryption
- In transit — TLS 1.2+ end-to-end (browser → Vercel → Supabase → AI providers)
- At rest — Supabase encrypts the database with AES-256. Vercel logs retain only short-lived edge metadata, not request bodies
- API keys (BYOK) — stored in browser
localStorage. Browser isolation is the security boundary. Anyone with physical access to your machine can read them, the same as any API key in any SaaS app - OAuth tokens — Google refresh tokens are encrypted server-side and never exposed to the client
Long-thread summarization
When a thread outgrows the model's context window, our server uses a small Claude model to roll older turns into a compact summary stored on the thread row. The summary is derived from your messages; your messages are never sent to anyone other than our AI inference providers. We do not use your data to train models.
What we can and can't do
Things we can do (with your permission)
- Export your data — email hello@dagur.co and we'll send a JSON export of your threads, messages, subscription, and synced settings within 7 days
- Delete your account — Settings → Account, or email us. Cascade deletes remove threads, messages, and tokens within 30 days
- Pause data processing — sign out. Cloud sync stops immediately; local data stays in your browser
Things we can't do
- Read your threads without impersonating you — RLS blocks even our own admins from reading user rows with the anon key. Service-key access exists for maintenance, but every service-key read is logged and operationally rare
- Recover deleted local-only data — Free-tier data lives in your browser. If you clear it, it's gone. We never had a copy
- See your BYOK key — it never leaves your browser
Sub-processors
We use a small, deliberate set of vendors. Each is named in the Privacy Policy with links to their compliance pages.
- Supabase — database and auth. SOC 2 Type II. EU-hosted
- Vercel — hosting and serverless functions. SOC 2 Type II
- Anthropic — AI inference. Data is not used for training under default API terms
- OpenAI — secondary AI inference. Data is not used for training under default API terms
- Stripe — payments. PCI DSS Level 1
- PostHog — anonymous product analytics, EU-hosted
Reporting a vulnerability
Email security@dagur.co (or hello@dagur.co if that bounces). We acknowledge within 2 business days and coordinate disclosure. No paid bug-bounty program yet — serious reports get a credit on this page and a personal thank-you.