PolyLLM handles the most sensitive thing a developer owns: API keys with a billing account attached. This page describes the actual implementation — every statement below is checked against the source code, not a policy document. When something is a trade-off, we say so.
Passwords are hashed with Argon2id at the OWASP-recommended parameters: 19 MiB memory, 2 iterations, parallelism 1 (the argon2 native library, configured in Better Auth). Minimum 10 and maximum 128 characters. The password itself is never stored.
Sessions live in Better Auth cookies prefixed polyllm: HttpOnly (not readable by JavaScript), SameSite=Lax, and Secure in production. Sessions last 30 days and are refreshed daily; a 5-minute cookie cache avoids a database round-trip on every request. Nothing sensitive is kept in localStorage.
E-mail verification is mandatory before the first sign-in (links valid 24 h). Password reset links expire after 60 minutes and every other session is revoked when the password changes. Changing your e-mail or deleting the account requires a confirmation link sent to the current address. Auth requests are only accepted from the app's own origin.
next.config.ts. The site cannot be framed, scripts and connections are restricted to our own origin, and HTTPS is enforced for a year with HSTS. The X-Powered-By header is removed.
>
}
/>
Trade-off, stated plainly: script-src and style-src include 'unsafe-inline' because Next.js hydration and Radix components inject inline scripts and style attributes. There are no third-party scripts on the site, so the practical exposure is small, but nonces would be stricter and are on the list.
[redacted]. Prompts and answers are not logged.
What we deliberately do not do
Write to{" "} contact@spboucher.ai . Responsible disclosure is welcome; please give us a reasonable window before publishing.