Security sheet

Security & data protection

How Flitt encrypts your data, manages access tokens and complies with the GDPR — across the backend (api.flitt.me), the website (flitt.me), the self-hosted Edge SDK and the addons running on your game servers.

Last updated: 21 September 2026

1. Scope and architecture

Flitt is made of four components. Each one has a precise role and only sees the data it needs.

Backend (api.flitt.me)
Fastify (Node.js) API behind an nginx reverse proxy, PostgreSQL database, Redis for cache, job queues and short-lived state (2FA, link codes). Hosted by Qoriz Hosting, Paris (see imprint).
Frontend (flitt.me)
Next.js. The browser never talks to the API directly: calls go through Next server routes that carry the session (httpOnly cookie) and forward to the backend as a Bearer token.
Edge SDK (self-hosted, Go)
A binary you run on your own machine to store logs and player history locally. The backend then only keeps aggregates; raw data stays with you, encrypted.
Addons (Lua GMod / FiveM, Java Minecraft plugin)
Open source and readable below. They only send game events (joins, chat, stats) to the backend or your Edge, and run the commands you trigger from the dashboard, the API or the bot.

2. Encryption in transit

TLS everywhere
flitt.me and api.flitt.me are served over HTTPS only (TLS 1.2+). HSTS is enabled in production (1 year, includeSubDomains, preload): a browser that has visited once refuses any unencrypted connection.
Security headers
Content-Security-Policy, X-Frame-Options, Referrer-Policy and X-Content-Type-Options are set by the backend (helmet). API responses are marked noindex.
Session cookies
httpOnly, Secure, SameSite=Lax. Page JavaScript cannot read the token; cross-site requests do not send it. An additional CSRF check applies to cookie-authenticated mutations.
Real time
Live dashboard updates go through secure WebSocket (wss://), authenticated with the same token and scoped per server: a client only receives events for servers it can access.
Game server → Flitt
Addons call api.flitt.me over HTTPS with the server key in the X-API-Key header (never in the URL, so never in proxy logs).
Edge SDK ↔ backend
The Edge reaches the backend over HTTPS with certificate verification (tls_verify: true by default). The backend only contacts the Edge on the public address you declare; private, loopback and cloud-metadata addresses are rejected. The Edge can serve HTTPS itself (tls_cert / tls_key) or sit behind a TLS reverse proxy.
Outgoing webhooks
Every webhook Flitt sends is signed HMAC-SHA256 (timestamp + nonce + body) so you can verify the origin and reject replays. Private destinations are refused (SSRF protection).

3. Encryption and hashing at rest

No secret is stored in clear. Depending on the need (verify vs. reuse), it is hashed or encrypted.

Passwords
Flitt stores none: authentication goes through Discord (OAuth2) or Google (OIDC). We never receive your password.
2FA secrets (TOTP)
Encrypted AES-256-GCM with a dedicated key (MFA_ENCRYPTION_KEY), separate from the session signing key.
Refresh tokens
Only the SHA-256 digest is kept. A database leak does not allow replaying a session.
Public API keys
bcrypt hashed (cost 10) + peppered HMAC-SHA256 fingerprint for lookup. The key is shown once, at creation.
Server API keys (addons)
Peppered HMAC-SHA256 fingerprint, never the raw value. Regenerable at any time from the dashboard.
Edge tokens
HMAC-SHA256 fingerprint for verification; an AES-256-GCM encrypted copy only so the backend can call your Edge. Constant-time comparison.
Edge SDK — your data
Every document (log, player, stat) is encrypted AES-256-GCM before being written, whatever the driver (file, MySQL/MariaDB, PostgreSQL). Per-document keys are derived with HKDF-SHA256 from a master key generated locally (./data/.edge_encryption_key, mode 0600) or provided by you. Flitt does not hold that key.
Edge SDK updates
Each binary is Ed25519-signed and shipped with a SHA-256 checksum. The Edge verifies both before replacing the executable; an unsigned update is rejected.
Uploaded images (banners, logos)
Re-encoded server side (sharp): EXIF metadata and any active content are stripped.

4. Token and access management

Sessions
15-minute JWT access token, 30-day refresh token rotated on every use and revoked on logout. Sessions are invalidated when the account is deleted.
Two-factor authentication
TOTP (Google Authenticator, Authy…). The MFA session allows 5 attempts then is invalidated; account deletion requires a 2FA code when enabled.
Rate limiting
Login, refresh, 2FA, Edge registration, Discord linking and the public API are limited per IP address (resolved reliably behind the proxy) and, for the public API, per key and per plan.
Server roles
OWNER, ADMIN, EDITOR. Actions that change the game server state (RCON console, bans, kicks, rank changes) require ADMIN or OWNER, whether the order comes from the dashboard, the public API or the Discord bot.
Audit log
Every remote command (RCON, ban, kick, set_group) is written to the server Audit log with its author, source (dashboard, API, bot) and content.
Edge registration
Single-use 72-bit registration code valid 48 h. The Edge token can be rotated on every heartbeat.
Discord bot
The bot talks to the backend with a dedicated internal token; administration features are locked to Flitt's official Discord server. Discord ↔ player linking uses a temporary code typed in game.
Production secrets
Kept out of the code, never versioned (.env excluded from the repository), separate keys per purpose (sessions, 2FA, API pepper, Edge). Session and API keys can be rotated without downtime.

5. GDPR compliance

Data controller
For your account data: Flitt's publisher (see imprint). For your server's player data, you are the controller and Flitt acts as processor, on your instructions (addon installation, module activation).
Data collected — account
Discord or Google ID, username, avatar and e-mail; billing data processed by Stripe (Flitt stores no card number).
Data collected — servers
Public server IP:port (public by nature), name, description, attendance statistics.
Data collected — players
Sent by your addon: nickname, game identifier (SteamID, FiveM licence, Minecraft UUID), chat messages if the module is enabled, and IP address for country geolocation and VPN detection (optional module). With an Edge SDK, this data is stored on your side.
Retention
Game logs: 7 days. Attendance and uptime samples: 90 days. On an Edge SDK: configurable (retention_days) and on-demand purge from the dashboard. Account: until deletion.
Your rights
Delete your account and all associated data directly from the dashboard (2FA protected). Access, rectification, portability or objection: through support, answered within 30 days. You may lodge a complaint with your supervisory authority (CNIL in France).
Hosting and transfers
Data hosted in France (Qoriz Hosting, Paris). Sub-processors: Stripe (payments), Discord and Google (authentication). No transfer outside the EU initiated by Flitt beyond these providers, covered by their standard contractual clauses.
Minimisation
Addon modules can be disabled individually (logs, chat, anti-VPN). A disabled module sends nothing.

6. Process and disclosure

Security review
Regular internal code review of the backend, frontend, Edge SDK and addons; fixes are deployed with priority and documented.
Report a vulnerability
Reach us through support or Discord with reproduction steps. We acknowledge within 48 h and do not pursue good-faith researchers.

The code running on your server

The GMod and FiveM addons update themselves by downloading their code from Flitt. You can read line by line exactly what gets executed, including the loaders and optional modules.

View the addon source code

A security question?

Our team answers technical questions, GDPR requests and vulnerability reports.