Fluera

Architectuur

Hoe Fluera je notitieboek beschermt.

Deze pagina beschrijft het beveiligingsmodel op het niveau dat een technisch lezer — security officer, CISO van een universiteit, nieuwsgierige dev — verwacht. Voor de niet-technische samenvatting: begin op /nl/security.

Threat model

We gaan uit van diefstal van het apparaat, netwerkonderschepping en accidentele blootstelling via backup of cloud sync. We gaan ervan uit dat gebruikersgegevens gecompromitteerd kunnen raken. We gaan niet uit van statelijke tegenstanders met fysieke toegang tot ontgrendelde apparaten — Fluera is geen geheimhoudingstool, het is een studietool.

Binnen dat model gelden drie garanties:

  • Lokale data zijn onleesbaar zonder de sleutel. Een gestolen apparaat levert een versleutelde blob op.
  • Gesynchroniseerde data zijn versleuteld in transit en in rust op EU-infrastructuur. Cloud sync is niet end-to-end versleuteld: als verwerkingsverantwoordelijke kan Fluera de gesynchroniseerde inhoud benaderen. We verkopen je inhoud nooit en gebruiken die nooit voor advertenties.
  • Telemetrie is consensueel en gedeïdentificeerd. De analytics kunnen een gebruiker zelfs bij een volledige breach niet aan zijn content koppelen.

In rust: SQLCipher, AES-256

Elk Fluera-notitieboek leeft in een lokale SQLite-database, versleuteld met SQLCipher — een breed geaudit ed extensie die elke pagina van de database transparant versleutelt met AES-256-CBC en HMAC-SHA512-integriteitscontroles per pagina.

De sleutelafleiding gebruikt PBKDF2 met SHA-256, 256.000 iteraties (conform OWASP). De passphrase wordt bewaard in de keychain van het platform — Keychain op iOS/macOS, Keystore op Android, DPAPI op Windows, libsecret op Linux. Het wordt nooit naar onze servers gestuurd.

In transit: TLS 1.3

Al het netwerkverkeer is TLS 1.3 met moderne cipher suites, voor vertrouwelijkheid en integriteit tussen de client en onze infrastructuur.

Synchronisatie tussen apparaten

Cloud sync, indien ingeschakeld, slaat je notitieboeken op bij Supabase (EU-regio, eu-north-1). De gegevens zijn versleuteld in transit (TLS) en in rust op infrastructuurniveau. Cloud sync is niet end-to-end versleuteld: als verwerkingsverantwoordelijke kan Fluera de gesynchroniseerde inhoud benaderen. We verkopen die nooit en gebruiken die nooit voor advertenties. De synchronisatie is opt-in per notitieboek — je kunt sommige alleen lokaal houden terwijl je andere synchroniseert.

Wil je dat alleen jij toegang hebt tot je werk? Een lokale .fluera-export is versleuteld met AES-256-GCM, en je lokale database op het apparaat is in rust versleuteld met SQLCipher — beide blijven onleesbaar zonder jouw sleutel.

P2P-samenwerking: direct, versleuteld

Realtime samenwerking gebruikt WebRTC DataChannel met DTLS-SRTP-versleuteling. Supabase Realtime fungeert alleen als signaling-broker — voor het opzetten van de verbinding — niet als relay van het werkelijke canvasverkeer. Na de handshake stromen canvasbewerkingen peer-to-peer. De server ziet ze niet.

Bij restrictieve NAT's gaan we via TURN; in dat geval ziet de relay alleen versleutelde DTLS-pakketten die hij niet kan ontsleutelen.

AI-aanroepen: via proxy, nooit direct

Aanroepen naar Google Gemini-modellen (Socratic Mode, Ghost Map, LaTeX OCR, Exam Session) worden geserveerd via Google Vertex AI en verwerkt in de EU (europe-west4 NL / europe-west1 BE). Ze lopen via een proxy die de inloggegevens op de server bewaart. Cliënt-apparaten zien de sleutel nooit. De proxy past rate limiting toe per plan en logt de duur van de calls voor accounting — nooit de inhoud van het canvas.

Als je de AI-functies uitschakelt in Instellingen → Privacy, wordt geen canvasinhoud naar de AI gestuurd, ook niet als fallback voor on-device OCR.

Telemetrie: opt-in, gehasht, allowlisted

Productanalytics staan standaard uit. Wanneer ze ingeschakeld zijn, zijn de events beperkt tot een server-side whitelist (sessie start/einde, aanroep van een functie, duur van AI-call — nooit inhoud). De gebruikers-ID wordt op het apparaat met SHA-256 gehasht; de plaintext-ID verlaat de client nooit. Events worden 180 dagen bewaard, daarna geaggregeerd of verwijderd.

Audittrail (institutionele accounts)

Elke toegang tot gedeelde notitieboeken — wie, vanaf welk apparaat, wanneer — wordt geschreven naar een append-only audittrail. Beheerders kunnen de trail exporteren als CSV of JSON voor compliance-controles. De trail is write-once: verwijderen vereist een gedocumenteerde motivatie en wordt zelf ook gelogd.

Recovery en sleutelverlies

Als je je passphrase verliest, worden de versleutelde data onherstelbaar. Dat is opzettelijk — het alternatief zou een herstelpad zijn dat het versleutelingsmodel noodzakelijkerwijs zou verzwakken. Voor institutionele accounts kan een optionele recovery-sleutel worden geconfigureerd die de beheerder bewaart; het is een gedocumenteerde trade-off die de instelling bewust kiest.

Responsible disclosure

Beveiligingsonderzoekers zijn welkom. Meld kwetsbaarheden aan lorenco@fluera.dev met PGP-versleuteling (sleutel gepubliceerd op het GitHub-profiel). We reageren binnen 24 uur, patchen kritieke issues binnen 72 uur, en crediteren melders in de hall of fame, tenzij om anonimiteit wordt gevraagd.

Scope: de Fluera-app (alle platformen), de sync-service, de AI-proxy en deze marketingsite. Buiten scope: third-party services (Supabase, Google, Apple, Sentry, RevenueCat) — meld die bij de betreffende vendors.

Externe audits

Fluera heeft op dit moment geen SOC 2- of ISO 27001-certificering. Beide staan op de enterprise roadmap en worden publiekelijk aangekondigd zodra ze afgerond zijn. We verklaren liever geen controles die we niet onafhankelijk hebben geverifieerd.

De lijst met subverwerkers is openbaar en up-to-date. De Data Processing Agreement is op aanvraag beschikbaar via lorenco@fluera.dev.