Security
Effective May 11, 2026
We take security seriously. This page summarises how Raeven Reader protects your data, and how you can responsibly disclose vulnerabilities to us.
Architecture summary
- Authentication via Supabase Auth (PKCE flow, JWT-based sessions, refresh-token rotation).
- Authorisation enforced by Postgres Row-Level Security on every table — even a stolen anon key cannot read another user's data.
- Privileged code paths live in a
privateschema and run asSECURITY DEFINERwith emptysearch_path. - Admin claims are stored in
app_metadata(server-managed), never inuser_metadata(user-editable). - Storage buckets are private by default and namespaced by user UUID.
- Local Poison Guard sanitises every parsed document before it ever reaches an LLM, stripping hidden Unicode tags, zero-width characters, BiDi overrides and direct-injection phrases.
- Transport: TLS 1.2+ everywhere; HSTS, X-Frame-Options, X-Content-Type-Options, and Referrer-Policy are set on all responses.
Data retention
See our privacy policy for full retention windows. In short: account data persists while your account is active, full IPs are kept for 30 days for abuse follow-up, and you can delete everything on request.
Reporting a vulnerability
We welcome reports from the security community. Please email emorylebo@gmail.com with:
- A description of the issue and its impact.
- Steps to reproduce, ideally with a proof-of-concept.
- Any relevant logs, requests, or screenshots.
We commit to acknowledging reports within 3 business days, providing a substantive update within 14 days, and (where applicable) crediting the reporter in the changelog. Please:
- Give us a reasonable time to fix issues before public disclosure.
- Avoid privacy violations, data destruction, or service degradation while testing.
- Not test against accounts or data that are not your own.
Out of scope
- Reports on third-party services we depend on (please report those upstream first).
- Theoretical issues without a working proof-of-concept.
- Missing security headers on non-content endpoints (e.g. static assets).
- Self-XSS, clickjacking on pages without sensitive actions, missing rate limits on public endpoints already rate-limited at the edge.