Privacybeleid — Duimstok
Dit is een conceptversie. Het definitieve beleid, juridisch getoetst en met contactgegevens, volgt vóór de app in de winkel staat.
Dit beleid beschrijft wat Duimstok doet met gegevens van de vakman die de app gebruikt en van diens klant, wiens gesprek wordt opgenomen.
Rollen
De precieze verdeling van verwerkingsverantwoordelijkheid is een juridische afweging, geen feit dat uit de code volgt; het antwoord volgt nog. De praktische situatie is:
- De vakman voert het gesprek met zijn klant, vraagt vooraf toestemming voor de opname en vult de klantgegevens in. Voor die opname en die klantgegevens wordt de vakman behandeld als verwerkingsverantwoordelijke.
- De exploitant van Duimstok verwerkt die gegevens namens de vakman (transcriptie, extractie, prijsberekening, opslag) en is verwerkingsverantwoordelijke voor het account van de vakman zelf (e-mailadres, bedrijfsgegevens, prijzenboek).
Welke gegevens
Accountgegevens van de vakman — e-mailadres (uit Firebase Auth), bedrijfsnaam, KvK-nummer, btw-nummer, adres, telefoonnummer en het eigen uurtarief.
Klantgegevens — naam, adres, e-mailadres, telefoonnummer en notities van de klant bij wie de vakman een offerte opstelt, ingevuld door de vakman zelf.
De geluidsopname van het gesprek — de stem van de klant en alles wat in het gesprek gezegd wordt. Dit zijn gegevens van iemand die zelf geen gebruiker van de app is en vooraf om toestemming is gevraagd.
Wat uit de opname wordt afgeleid — het uitgetypte transcript, de daaruit geëxtraheerde werkomschrijving en hoeveelheden, de berekende offerte en de offerte-pdf.
De offerte op de klantpagina — de offerte gaat naar de klant als een link met een lange willekeurige code erin. Op die pagina ziet hij de omschrijving van het werk, de hoeveelheden, de prijzen per eenheid, de btw, het totaalbedrag, tot wanneer de offerte geldig is, de bedrijfsgegevens van de vakman en zijn eigen naam en adres zoals de vakman die heeft ingevuld. Hij ziet daar niet de geluidsopname, de uitgetypte tekst of de citaten uit het gesprek waar de offerteregels op rusten. Geeft hij akkoord of wijst hij de offerte af, dan worden zijn naam en het moment daarvan vastgelegd. Het moment waarop hij de offerte voor het eerst opent wordt één keer vastgelegd en daarna niet meer bijgewerkt; er wordt geen teller van latere keren bekeken bijgehouden.
Technische gegevens — crashmeldingen (Firebase Crashlytics), App Check/Play Integrity-signalen die verifiëren dat een verzoek van de echte app komt, het pushnotificatie-registratietoken van het apparaat van de vakman zelf (zodat de server weet waar hij een seintje naartoe moet sturen zodra de offerte klaarstaat) en per verwerkingsstap een registratie van het gebruikte model, het aantal tokens, de kosten en de duur. Die laatste registratie bevat geen gespreksinhoud. Om te voorkomen dat iemand geldige offertelinks kan raden, telt de server hoeveel verzoeken er bij het openen van een offerte binnenkomen. Die teller staat onder een onomkeerbare hash van het IP-adres van de bezoeker en van de link zelf — het adres en de link staan er niet leesbaar bij, en bij een IPv6-adres wordt alleen het netwerkdeel gehasht. Er hangt geen naam, account of klus aan zo'n teller, en hij vervalt een uur nadat hij begon en wordt daarna automatisch verwijderd.
Gegevens van een geïnteresseerde — het e-mailadres dat iemand op de website invult om een seintje te krijgen zodra de app beschikbaar is, het moment van versturen en waar het formulier stond. Alleen gebruikt om dat ene bericht te sturen, verder nergens voor. Hoe lang dit bewaard blijft, volgt nog.
Doelen en grondslag
De gegevens worden verwerkt om een offerteconcept op te stellen die de vakman controleert voordat hij hem verstuurt. De klant wordt vóór de opname mondeling om toestemming gevraagd door de vakman zelf — de app dwingt dat af met een schakelaar in het opnamescherm, en de server weigert een opname zonder bevestigde toestemming. Naam en moment van akkoord op de klantpagina worden vastgelegd om te kunnen aantonen dát en wanneer de klant akkoord ging; het eerste-open-moment zodat de vakman weet dat de offerte is aangekomen. Verder wordt er niets mee gedaan — geen profiel, geen bezoekersstatistiek. Crashmeldingen worden verwerkt om de app werkend te houden. Welke AVG-grondslag per verwerking precies geldt (toestemming van de klant voor de opname, uitvoering van de overeenkomst voor het account, gerechtvaardigd belang voor crashmeldingen) is een juridische afweging; het antwoord volgt nog.
Verwerkers en doorgifte
| Verwerker | Wat | Waar |
|---|---|---|
| Google/Firebase — Firestore, Storage, Cloud Functions | Account, klantgegevens, opname, transcript, offerte | EU (België) |
| Google/Firebase — Auth, Crashlytics, App Check | E-mailadres en account-ID, crashmeldingen, integriteitssignalen van het apparaat | Google's wereldwijde infrastructuur, niet regio-gebonden — verwerking buiten de EU is mogelijk |
| OpenAI | Transcriptie van de opname | Verenigde Staten, via subverwerkers |
| Anthropic | Extractie van werkomschrijving en hoeveelheden uit het transcript | Waarschijnlijk Verenigde Staten, via subverwerkers — nog niet nagekeken |
| GitHub | De foutmelding van een productiefout (functienaam en logboodschap), automatisch aangemaakt als issue bij herhaalde of ernstige fouten — nooit een opname, transcript of offerte | Verenigde Staten |
Met OpenAI en Anthropic zijn de verwerkersovereenkomsten geaccepteerd. Bij beide is dat meegegaan met de voorwaarden bij het API-account zelf — geen los ondertekend document. Volgens het projectplan gebruikt geen van beide de API-invoer om modellen te trainen. Dat is onze eigen aanname: de tekst van de verwerkersovereenkomsten is niet nagelezen, en of die toezegging daar staat of in het API-beleid van de verwerker, is nog te bevestigen. Nog open: een zero-retention-aanvraag bij OpenAI (nooit automatisch, apart aan te vragen via support/sales).
Verwerking uitsluitend binnen de EU is niet gegarandeerd: voor een klant in de EER of Zwitserland wordt de overeenkomst met OpenAI aangegaan met OpenAI Ireland Ltd. in plaats van het Amerikaanse OpenAI OpCo, LLC, maar die contractpartij schakelt zelf subverwerkers in — waaronder Amerikaanse, zoals OpenAI OpCo, LLC zelf — die de daadwerkelijke verwerking mogen uitvoeren. Voor Anthropic is die vraag nog niet nagekeken: de Verenigde Staten in de tabel hierboven is daar een nog te bevestigen aanname en geen vastgesteld feit.
Welk mechanisme de doorgifte naar de Verenigde Staten dekt, verschilt per verwerker. Voor Anthropic noemt de verwerkersovereenkomst standaardcontractbepalingen (SCC's). Voor OpenAI is dat mechanisme niet bekend: de geaccepteerde voorwaarden noemen alleen de contractpartij, niet het doorgiftemechanisme. Wat er per verwerker geldt, volgt nog.
De EU-regio staat alleen vast voor de servers, de database en de opslag. Firebase Auth, Crashlytics en App Check zijn niet aan een regio gebonden en draaien op Google's wereldwijde infrastructuur, dus ook mogelijk buiten de EU. De grondslag voor die doorgifte volgt nog.
Bewaartermijnen
De geluidsopname wordt na 90 dagen automatisch verwijderd — dat is de opslagregel — en de daadwerkelijke verwijdering door Cloud Storage kan tot ongeveer een dag later plaatsvinden. Het transcript, de extractie en de offerte worden na diezelfde 90 dagen, gerekend vanaf het gesprek, automatisch verwijderd door een dagelijkse opruimtaak — zo blijft elke offerteregel herleidbaar naar het gesprek zolang die zelf nog bestaat, en verdwijnt hij op hetzelfde moment als de opname waarnaar hij verwijst. Wat bewaard blijft: de klantgegevens, de notities van de vakman, de offerte-pdf die daadwerkelijk verstuurd is, de verstuurde offerteversie, het akkoord van de klant met zijn naam en het moment daarvan, het moment waarop hij de offerte voor het eerst opende, de foto's en de registratie van modelgebruik en kosten zonder gespreksinhoud. Deze gegevens vallen onder de administratie van de vakman en blijven daarom bewaard, net als de verstuurde pdf — dezelfde belofte die de app de klant zelf al doet. De 90 dagen blijven gelden voor de opname, het transcript, de extractie en de werkkopie van de offerte. Een verstuurde versie is daarmee een bevroren kopie van de offerteregels inclusief het korte citaat uit het gesprek waar elke regel op rust, en dat citaat blijft dus langer bewaard dan de 90 dagen die voor het transcript gelden; of dat zo moet blijven is een juridische afweging.
Rechten
De vakman en zijn klant hebben recht op inzage, correctie, verwijdering, bezwaar en dataportabiliteit. In de app kan de vakman een losse job — met opname, transcript, offerte en de verstuurde offerteversies — verwijderen via de verwijderknop bij een klus, of zijn hele account inclusief alle opnames verwijderen via de verwijderknop bij zijn account. Play vereist dat accountverwijdering ook buiten de app kan worden aangevraagd, via een webadres; dat webadres is /account-verwijderen (https://duimstok.web.app/account-verwijderen na een uitrol).
Beveiliging
Status, transcript, extractie en de eerste offerte kunnen alleen door onze servers worden geschreven, nooit door de app zelf; de toegangsregels van de opslag dwingen dat af. Elk verzoek van de app aan de servers wordt met App Check gecontroleerd, zodat alleen de echte app iets kan vragen. API-sleutels staan uitsluitend op de server (Firebase Secret Manager) en komen nooit in de app terecht. De link naar de klantpagina bevat een willekeurige code die niet te raden is en vervalt na de geldigheidsdatum van de offerte; wie de link heeft kan de offerte bekijken, de klant heeft zelf geen account en komt niet bij de onderliggende database. Koppelt de vakman zijn boekhoudpakket — Moneybird, e-Boekhouden.nl, Jortt of straks SnelStart — dan worden de toegangssleutels van die koppeling uitsluitend op de server bewaard. Ze komen nooit op zijn telefoon terecht, ook niet als hij zelf is ingelogd, en worden gewist zodra hij zijn account verwijdert.
Contact
Vragen en klachten over dit beleid, en verzoeken om inzage, correctie of verwijdering, gaan naar support@duimstok.app; dat is ook het adres voor vragen over de app. Wie formeel verwerkingsverantwoordelijke is en welk postadres daarbij hoort, volgt nog. Een klacht kan ook worden ingediend bij de Autoriteit Persoonsgegevens.
Versie
Conceptversie van 30 augustus 2026.
Waar dit op gebaseerd is
- Privacybeleid — DRAFT — deze tekst is geschreven vanuit de repository en is niet juridisch getoetst; de publieke pagina wordt gegenereerd door tool/build-privacy-page.mjs naar website/public/privacy.html
- Rollen —
TODO (eigenaar/jurist) - Welke gegevens — sendQuote schrijft quoteVersions met shareToken en validUntil; de link volgt het pad /offerte/; de klantpagina zelf komt uit de reeks #561 t/m #568 en is nog in aanbouw
- Welke gegevens — rate-limit.ts telt in publicQuoteRateLimits, met een SHA-256-hash als document-id en een venster van RATE_LIMIT_WINDOW_MS; expireAt is het TTL-veld uit firestore.indexes.json
- Welke gegevens —
TODO (eigenaar/jurist) - Welke gegevens —
interestSignups, geschreven doorregisterInterest - Doelen en grondslag —
createJob - Doelen en grondslag —
TODO (eigenaar/jurist) - Verwerkers en doorgifte — europe-west1
- Verwerkers en doorgifte — issue #57, 2026-08-28
- Verwerkers en doorgifte — docs/PROJECTPLAN.md, "AVG — concrete acties"
- Verwerkers en doorgifte —
TODO (eigenaar/jurist) - Verwerkers en doorgifte — issue #57, comment 2026-08-28
- Verwerkers en doorgifte —
TODO (eigenaar/jurist) - Verwerkers en doorgifte — issue #57, 2026-08-16
- Verwerkers en doorgifte —
TODO (eigenaar/jurist) - Verwerkers en doorgifte —
europe-west1, gezet infunctions/src/index.ts - Verwerkers en doorgifte —
TODO (eigenaar/jurist) - Bewaartermijnen —
storage.lifecycle.json - Bewaartermijnen —
purgeExpiredJobContent - Bewaartermijnen — recordConsentScriptBody
- Bewaartermijnen —
TODO (eigenaar/jurist) - Bewaartermijnen — purgeExpiredJobContent raakt quoteVersions niet
- Rechten —
deleteJobdoet een recursieve verwijdering van het job-document - Rechten —
deleteAccount - Beveiliging — mintShareToken met randomBytes 32 en validUntil; quoteVersions is alleen leesbaar voor de eigenaar
- Beveiliging — integrationSecrets is voor elke client gesloten, lezen noch schrijven; account verwijderen ruimt de hele subboom onder users/uid mee op, inclusief die geheimen
- Contact —
TODO (eigenaar/jurist) - Versie — opgesteld voor issue #137, gecorrigeerd voor issue #183 — de EU-claim gold ten onrechte ook voor Auth, Crashlytics en App Check — taalkundig gecorrigeerd voor issue #454, aangevuld voor issue #486 — het contactadres, aangevuld voor issue #568 — de klantpagina, aangevuld voor issue #601 — de snelheidsbegrenzing, aangevuld voor issue #631 — de boekhoudkoppeling, bijgewerkt voor issue #57 — de verwerkersovereenkomsten met OpenAI en Anthropic, gecorrigeerd voor issue #832 op 2026-08-30 — de verwerkingslocatie van Anthropic en het doorgiftemechanisme, gecorrigeerd voor issue #833 op 2026-08-30 — de onbewezen bewering over de inhoud van die overeenkomsten, gecorrigeerd voor issue #543 op 2026-08-30 — het contactadres is
duimstok.appgeworden, nietduimstok.nl