Security
Career OS treats resume JSON and conversion keys as candidate data. MCP and the editor run as the signed-in user, not as a shared service role.
Account and resume storage
- Supabase Auth issues the JWT. MCP and
/api/accountverify that JWT. - The
resumestable is keyed byuser_id(unique). RLS: a user can only select/insert/update/delete their own row. - Admin authorization uses
app_metadataorADMIN_EMAILS, never client-editableuser_metadata. - Hosted THEA and env-key PDF conversion require a verified session JWT and daily quotas. Meter limits are read from the
subscriptionsrow, not from the client. - RLS migrations live in
supabase/migrations/. Apply them to the linked project before treating isolation as guaranteed. - Enable Auth leaked-password protection (HaveIBeenPwned) in the Supabase dashboard. That toggle is not available over SQL and typically needs a Pro plan.
iLovePDF keys
- Allowed: server env
ILOVEPDF_*, or per-requestx-ilovepdf-*headers. - Not allowed: storing user keys, key pooling, exporting keys to a sheet, or a public
/api/keyscollector.
Local browser API
The root Playwright control API is not a public product. It binds to loopback (127.0.0.1 by default).
Non-health routes require BROWSER_API_SECRET. Do not map VNC (5900) by default; never run passwordless VNC.
MCP OAuth
- Remote MCP uses OAuth 2.1 + PKCE. Tokens are sealed with
MCP_OAUTH_SECRET. Redirects are allowlisted per client (Claude, ChatGPT, VS Code, Cursor, loopback). - Tools never receive another user’s resume. The access token is that user’s Career OS session.
Legal
Privacy, terms, and subprocessor notes live in the Legal hub. Candidate documents remain the candidate’s IP under the Terms of Service.