SKILLFLIRT ← Home

Privacy & Security

The technical detail of how we secure your account and data, for users who want to actually verify it.

Passwords

Stored as scrypt hashes with a per-user salt (server-generated, 16 random bytes). Verification is timing-safe (crypto.timingSafeEqual). We never see or store plaintext passwords. Minimum length 10 characters; maximum 128.

After 5 failed login attempts, the account is locked for 15 minutes. After 10, it's locked for an hour. Combined with per-IP and per-email rate limits, brute-forcing one account is effectively impossible.

Sessions

Two parallel mechanisms:

Sessions older than 90 days are auto-invalidated; you'll need to log in again.

Data at rest

Data in transit

Uploads

Every uploaded photo and voice clip is fetched server-side after upload, the first 16 bytes are sniffed for magic numbers, and anything that isn't a valid image or audio file is deleted and the carrier message rewritten to a placeholder. This closes stored-XSS via image upload.

Payments

Card data never touches our servers. Stripe Checkout handles the entire payment flow on Stripe's PCI-DSS Level 1 certified infrastructure. We store a Stripe customer id and the last 4 digits of your card; the rest stays with Stripe.

Admin access

Every admin account requires TOTP-based 2FA. Admin sessions are 12-hour scoped tokens prefixed with as_ — distinct from user tokens, so a compromised user session can never escalate.

Audit trail

Every privileged operation — bans, refunds, coin grants, account deletes, admin enrollments — writes an immutable auditEvents row with actor, subject, timestamp, and metadata. Audit logs are retained 90 days for normal review and indefinitely if linked to an investigation.

Reporting a vulnerability

We follow coordinated disclosure. Email security@skillflirt.com with reproduction steps. We aim to triage within 24 hours and fix critical issues within 7 days. We publicly credit researchers in the next changelog and send swag.

Out of scope: social engineering of our staff, physical attacks, and findings against third-party services we use (Stripe, Convex, Firebase) — report those upstream.

Past audits

We run automated security audits via a published methodology; the full report for the latest pass is in our repository at APP_SECURITY_AUDIT.md. Last full audit: May 2026 — 4 passes, 9 findings, all remediated.


Related: Privacy Policy · Privacy Tips