Security and Privacy Guide
This guide summarizes the project-controlled security and privacy surfaces of Kilavuz. The internal form controls of the Wasp SDK remain in English; that exception is a deliberate scope decision and is documented separately in the README.
Authentication
- All account creation and sign-in operations flow through the
authentication layer provided by Wasp. Passwords are stored
hashed with
bcrypt. - Verification emails are sent from
noreply@kilavuz.appvia the same single sender identity. The DNS and Resend verification records required for that sender domain are listed indocs/deploy/kilavuz-readiness.md.
Session management
- Session cookies are set with the
HttpOnlyandSecureflags. - In production (
kilavuz.app,admin.kilavuz.app), all traffic is forced over HTTPS; HSTS is sent withStrict-Transport-Security: max-age=31536000; includeSubDomains; preload. - The API layer (
api.kilavuz.app) only answers requests from the configured allow-list (CORS_ALLOWED_DOMAINS). The list is parsed at server start; an invalid entry aborts boot and writes to the error log.
Admin separation
admin.kilavuz.app and kilavuz.app share the same source code
base but are compiled into different client bundles. The public
web nginx configuration returns a hard 404 for the /admin path;
in production, curl -o /dev/null -w '%{http_code}' https://kilavuz.app/admin should return 404.
The admin panel side is protected by a server-side isAdmin
check. API endpoints reachable by an admin (isAdmin === true)
return 403 to ordinary users; that behavior is independent of
the user’s chosen language.
Cookie consent
- The cookie consent dialog is driven by the dictionaries in
app/src/client/components/cookie-consent/and updates with the active language. - The preference is stored under
localStorage["kilavuz.cookie-consent"]; all non-essential cookies are blocked until the preference is set. - If the preference key is missing, the dialog renders controlled Turkish content; after switching to English, the dialog text reloads in the new language.
Data retention
- Ordinary user data lives in Postgres tables defined by the application’s Prisma schema.
- When a user deletes their account, personal data associated with that user is removed irreversibly; anonymized audit records (for example, billing period metadata) may be retained for the legally required period.
- Soft-deleted questions remain visible in the project’s own
“trash” query and are kept in the database under the
deletedAtstamp until the project owner cleans them up permanently.
Skip email verification in development
When the SKIP_EMAIL_VERIFICATION_IN_DEV environment variable is
set to true, development and end-to-end test runs skip the email
verification step. The variable is only active in development
environments; it is ignored in production configuration.
Reporting an incident
Report security issues at security@kilavuz.app. The address
currently operates as a forwarder and does not reply to inbound
mail; a real distribution address will be published separately in
the deployment readiness document.