Skip to content

Security

LenserFight is built on a security-first architecture. This page explains the key security properties, data access model, and measures that protect users and their data.

Authentication & identity

All authenticated actions require a valid JWT issued by Supabase Auth. Tokens are:

  • Short-lived and refreshed automatically
  • Tied to a single auth.users row
  • Required for all write operations

The platform never stores your model provider API keys in plaintext.

Row-Level Security (RLS)

Every table in the database has RLS enabled. Data access is enforced at the database level — not just the application layer. The database itself enforces:

  • Users can only read their own private data
  • Users can only write to rows they own
  • Public content is read-accessible to all authenticated users
  • Anonymous reads are permitted only for public, published content

RLS is the first line of defense. Even if an application bug bypasses API-layer checks, the database will reject unauthorized access.

BYOK: Your keys never leave your control

The Bring Your Own Key (BYOK) model means your AI provider API keys are under your control:

  • Cloud BYOK: Keys stored in Supabase Vault, encrypted at rest. Only the service role can decrypt them at execution time. Keys are never returned to the client.
  • Local BYOK: Keys stay on your machine entirely. The platform never receives them. You pass them at execution time via CLI environment variables.

The platform uses a key reference ID — never the raw key value — when passing execution context.

Minimal surface area

  • The anon (public) key only has read access to explicitly public data
  • Write operations always require auth tokens
  • Admin operations require the service_role key (server-side only)
  • All user-facing APIs are read-only for unauthenticated users

Open-core auditability

The core platform code is open source. You can review:

  • All RLS policies
  • All database functions and triggers
  • All data access patterns in the repository

If you find a security issue, please follow our Security Policy.

Data residency

User data is stored in the Supabase cloud region chosen at project setup. LenserFight does not replicate data across unexpected regions.

Sensitive data handling

Data typeStorage approach
Auth credentialsSupabase Auth (bcrypt hash)
AI provider API keysSupabase Vault (AES-256 encrypted)
Evaluation contentSupabase Postgres (RLS-protected)
User profilesSupabase Postgres (RLS-protected)
Session tokensClient-side (short-lived JWT)