Security & privacy
Plain-language answers about how Triplet protects your account and data. No legal maze — if something here is unclear, that's a bug too.
Your account
- Passwords are hashed with Argon2id. Accounts created before that use PBKDF2 and are upgraded automatically the next time you log in — no reset, nothing to do.
- Sessions use httpOnly cookies, so scripts in the browser cannot read your login token.
- Refresh tokens are stored only as hashes, rotate on every use, and are revoked server-side when you log out.
- State-changing requests carry a CSRF token, so another site cannot act as you using your cookies.
- Password resets and email confirmations use single-use links that expire. Both are stored only as hashes, so a database copy does not yield working links.
- Confirming your email address is what lets Triplet send fare alerts to it. Until then, a watch on that address asks the address itself to confirm.
Your data
- Your travel profile — airports, budget, preferences — personalizes Triplet's search, ranking and watch behavior.
- Triplet stores observed flight prices, not your browsing history.
- Alert emails include one-click manage and unsubscribe links; those tokens are stored only as hashes.
- Triplet does not sell your data, and loads no advertising or affiliate-tracking scripts. Affiliate attribution is carried in the outbound booking link itself.
- Logs are redacted before they are written: credentials, tokens and anything credential-shaped are stripped, including inside stack traces.
The AI layer
- The AI never sees your password or payment details. It receives your request and a compact summary of the preferences needed to search.
- The AI cannot invent prices or book anything. It can only call a small, fixed set of internal search tools.
- Every fare comes from a deterministic backend search, never from the model, and is labeled with how it was obtained and when it was observed.
- AI usage is capped per account and in total per day, so a runaway loop cannot spend without limit.
Payments
- When paid plans are enabled, subscriptions are processed by Stripe. Card numbers never touch Triplet's servers.
- Triplet never charges you for flights — it does not sell or book them.
Engineering practices
- Every endpoint validates its input, and rate limits are applied by cost: cheap lookups, searches, AI calls, authentication and alert creation each have their own ceiling.
- Rate limiting is shared across instances through Redis. If Redis becomes unreachable it falls back to per-process limits rather than failing open, and retries.
- Provider API keys live only in backend environment variables, never in the browser.
- Production refuses to start with genuinely unsafe configuration — a development secret, insecure cookies, or a non-HTTPS URL.
- Errors return structured responses without stack traces in production.
- Every push runs the test suite, a dependency vulnerability audit, and a scan for committed secrets or database files.
Found a security issue? Email us — responsible disclosure is always welcome.