πŸ”’ All measures listed here are live in production

Security at STEMIND

Every measure listed below is currently active in production. We don't list aspirational security β€” only what's actually implemented and verified.

πŸ”

Row Level Security (RLS)

βœ“ Verified in production
Database

All 31 database tables in our Supabase PostgreSQL instance have RLS explicitly enabled and forced β€” including alembic_version, papers, users, labs, library_items, and all research tables. Even if someone obtained raw database credentials, they would be blocked at the row level.

πŸ”‘

JWT Authentication

βœ“ Verified in production
Auth

Every API request requires a signed JWT token (HS256, 2-hour expiry). Tokens are injected via HTTP interceptors. On expiry, users are automatically redirected to the login flow. Session cookies are removed on logout.

🌐

SSRF Protection on PDF Proxy

βœ“ Verified in production
API Security

Our PDF proxy endpoint validates all outbound URLs before making any request. It blocks: localhost/127.x.x.x, 169.254.x.x (link-local), RFC 1918 private ranges (10.x.x.x, 172.16-31.x.x, 192.168.x.x), and non-HTTP/HTTPS protocols. This prevents internal network scanning.

⚑

File Upload Limits (15MB)

βœ“ Verified in production
DoS Protection

All PDF uploads are capped at 15MB on both the frontend (client-side) and backend (server-side). Requests exceeding this return HTTP 413. This prevents memory-based DoS attacks from oversized files.

πŸ“§

Email Invitation Rate Limiting

βœ“ Verified in production
Rate Limiting

Lab member invitations are rate-limited to 20 per user per 24-hour window, enforced via Redis-backed counters. Exceeding the limit returns HTTP 429 with a clear error message. This prevents email quota abuse and spam.

πŸ›‘οΈ

Supabase PostgreSQL

βœ“ Verified in production
Infrastructure

Our database runs on Supabase's managed PostgreSQL infrastructure. Supabase provides: automatic daily backups, TLS encryption in transit, at-rest encryption (AES-256), and SOC 2 Type II certification. We connect via the PgBouncer connection pooler on port 6543.

🌍

GDPR-aligned Data Handling

βœ“ Verified in production
Privacy

We collect only the data needed to run the service. Users can delete their account at any time via the settings page. We do not sell or share personal data with third parties. AI features send only anonymized research text to OpenAI APIs.

πŸ”’

TLS for All Traffic

βœ“ Verified in production
Transport

All API and web traffic is served over HTTPS/TLS. HTTP connections are automatically redirected. PDF files fetched from external sources are proxied through our backend β€” external servers never see your IP address.

⚠️ What we don't claim (yet)

  • Β·SOC 2 Type II β€” We use Supabase which is SOC 2 certified, but STEMIND itself has not undergone a formal audit. We plan to pursue this as we grow.
  • Β·Penetration Testing β€” We have not yet engaged an external security firm for pentesting. We rely on code reviews and automated scanning.
  • Β·Bug Bounty Program β€” No formal program yet, but we respond to all responsible disclosures and credit reporters in our changelog.

Responsible Disclosure

Found a vulnerability? Please report it to us before making it public. We commit to:

  • βœ“Acknowledge your report within 24 hours
  • βœ“Provide a remediation timeline within 72 hours for critical issues
  • βœ“Credit you in the changelog (with your consent)
  • βœ“Never pursue legal action for good-faith security research
Security disclosures:security@stemind.io
Privacy / GDPR:privacy@stemind.io