Security
The Claude API key
- Stored only on the server, encrypted with AES-256-GCM using a key derived from
APP_SECRET. - Never returned by any API; at most a masked hint like
sk-ant-…a1b2is shown. - Never logged. AI errors shown to users are rewritten so request details cannot leak.
- The browser never talks to Anthropic directly; every AI request goes through the Go backend.
Accounts
- Passwords are hashed with bcrypt.
- Sessions use random tokens in
httpOnly,SameSite=Laxcookies (Secureover HTTPS); only a hash is stored. - OAuth uses state and PKCE, and links accounts only by verified email.
- Sign-in endpoints are rate limited.
- State-changing requests from other sites are rejected.
User-generated sites
Previews and published sites are served with a Content-Security-Policy sandbox. They run in an isolated origin, so their scripts cannot read the studio's cookies or call its API as the signed-in user. Preview links are signed and expire.
Limits
Per-file and per-project size limits, request size limits, a per-user request rate limit, one AI run per project at a time, and an optional daily token limit per user.