[{"data":1,"prerenderedAt":216},["ShallowReactive",2],{"kaizen-nl":3},{"id":4,"title":5,"body":6,"description":208,"extension":209,"meta":210,"navigation":211,"path":212,"seo":213,"stem":214,"__hash__":215},"kaizen_nl\u002Fnl\u002Fkaizen.md","Hoe Kaizen gebouwd is",{"type":7,"value":8,"toc":194},"minimark",[9,14,18,21,25,28,31,35,51,54,58,61,64,68,76,79,83,90,93,97,100,104,107,117,121,124,128,131,135,158],[10,11,13],"h2",{"id":12},"hoe-het-begon","Hoe het begon",[15,16,17],"p",{},"In 2022 ging ik meehelpen met de Discord-community van Cajun Koi Academy, het studiekanaal van YouTubers Mike en Matty. Een jaar later bouwde ik Cody, een bot voor die server met een Pomodoro-timer, studietijd bijhouden en ranglijsten. Je zag dat mensen beter focusten als er iemand anders bij was, en uit dat idee kwamen de Focus Rooms van Kaizen voort.",[15,19,20],{},"Toen de oprichters van de community er in 2025 mee stopten, droegen ze de community aan mij over, en ik gaf die de naam Kaizen. In september 2025 begon ik aan de app, met een hackathon in mijn minor als laatste duwtje. De eerste Android-alpha ging op 26 september naar testers, in november volgden testers op de iPhone, en versie 3.0 verscheen op 2 januari 2026 in Google Play. Op die eerste dag meldden zich zo’n 350 mensen aan.",[10,22,24],{"id":23},"eén-codebase-vier-platforms","Eén codebase, vier platforms",[15,26,27],{},"Kaizen is één Expo-app: React Native 0.86, React 19 en TypeScript in strict mode. Dezelfde code draait native op iOS en Android, en via React Native for Web als installeerbare webapp. De Windows-versie verpakt die webbuild in Tauri 2, een kleine Rust-shell die een tray-icoon, systeemmeldingen en onthouden vensterposities toevoegt, als MSIX voor de Microsoft Store.",[15,29,30],{},"Een uitnodigingslink naar een room opent op elk platform de geïnstalleerde app: via universal links op iOS, app links op Android en een App URI Handler op Windows. Wie de app niet heeft, komt in de webapp terecht.",[10,32,34],{"id":33},"focus-rooms-zonder-camera","Focus Rooms, zonder camera",[15,36,37,38,50],{},"Veel tools voor body doubling zetten je op video. Een enquête uit 2024 onder 220 mensen, de meesten neurodivergent, merkt op dat videogesprekken sociale angst kunnen oproepen.",[39,40,41],"sup",{},[42,43,49],"a",{"href":44,"ariaDescribedBy":45,"dataFootnoteRef":47,"id":48},"#user-content-fn-eagle",[46],"footnote-label","","user-content-fnref-eagle","1"," Focus Rooms houden de aanwezigheid en laten de camera weg: je ziet wie er focust, wie pauze heeft en wie even weg is, plus het label waaronder iemand werkt.",[15,52,53],{},"Aanwezigheid wordt elke 15 seconden opgehaald. Er is geen realtime kanaal. De timer van elk lid loopt op het apparaat zelf af vanaf een eindtijd die aan de serverklok vastzit. Zo blijft hij tussen twee updates soepel lopen zonder uit de pas te raken, en wie langer dan 45 seconden niets van zich laat horen, staat op Afwezig. In versie 4.0 heb ik de rooms herschreven, omdat mensen er per ongeluk uit vlogen: een telefoon op de achtergrond houdt zijn plek nu 15 minuten vast, eerst was dat 2.",[10,55,57],{"id":56},"apps-blokkeren-native-geschreven","Apps blokkeren, native geschreven",[15,59,60],{},"Voor het blokkeren van afleidende apps heb je functies van het besturingssysteem nodig die geen bestaande library goed afdekt. De kandidaten die ik vond, waren een paar maanden oud met één maintainer, vroegen toestemming om alle geïnstalleerde apps te zien, of zaten vast op een oude Expo-versie. Dus schreef ik een eigen Expo-module met twee native helften.",[15,62,63],{},"Op Android leest een engine in Kotlin via gebruikstoegang welke app op de voorgrond staat en tekent daar een blokscherm overheen. Hij gebruikt nooit de toegankelijkheidsservice of de toestemming om alle geïnstalleerde apps op te vragen. Op de iPhone gebruikt de module Schermtijd van Apple: je kiest apps in Apples eigen kiezer en Kaizen krijgt alleen een token terug dat het zelf niet kan lezen, dus de app kan niet zien wat je koos. Drie app-extensies houden de blokkade gelijk over vier processen. Op beide platforms blijft de lijst met geblokkeerde apps op de telefoon.",[10,65,67],{"id":66},"een-fout-versie-4100","Een fout: versie 4.10.0",[15,69,70,71,75],{},"Apps blokkeren kwam uit in 4.10.0, op 17 september 2026, en op Android blokkeerde het helemaal niets. Releasebuilds worden met R8 verkleind, en zonder een ",[72,73,74],"code",{},"@OptimizedRecord","-annotatie kon Expo de instellingen voor de native module niet meer omzetten. Elke debugbuild werkte. Alleen de releasebuild faalde, en dan ook nog zonder foutmelding.",[15,77,78],{},"De fix, 4.10.1, was dezelfde dag klaar. Daarin zitten ook een R8-keep-regel als vangnet en een logregel die een lege configuratie meldt. Google Play deed er zo’n 24 uur over om die goed te keuren, dus een volle dag lang deed de functie waarvoor Android-gebruikers net hadden geüpdatet het niet. Expo heeft de onderliggende oorzaak inmiddels opgelost in expo-modules-core 58.",[10,80,82],{"id":81},"synchronisatie-die-offline-werkt","Synchronisatie die offline werkt",[15,84,85,86,89],{},"Elke wijziging komt eerst op het apparaat terecht en synchroniseert op de achtergrond met Supabase. Items krijgen hun ID op het apparaat, bij een conflict wint de nieuwste ",[72,87,88],{},"updated_at",", en verwijderingen worden vastgelegd als tombstones, zodat een ander apparaat een verwijderde taak niet terug kan halen. Tussen volledige synchronisaties door haalt een apparaat alleen op wat er sinds het laatste controlepunt veranderd is.",[15,91,92],{},"Afgevinkte gewoontes krijgen een ID dat is afgeleid van de gewoonte en de dag. Twee telefoons die offline dezelfde gewoonte afvinken, eindigen zo met één record in plaats van twee.",[10,94,96],{"id":95},"testen","Testen",[15,98,99],{},"De app heeft honderden testbestanden. Pure logica, zoals het samenvoegen bij synchronisatie en de statistieken, krijgt naast gewone voorbeelden ook property-based tests met fast-check. Daarna past Stryker die code op kleine punten aan en controleert of de tests dat opmerken. De CI faalt als die mutation score onder de 80 procent zakt. Typechecks, linting, opmaak, de testsuite en een controle van de handtekening van elk npm-pakket draaien bij elke push naar de hoofdbranches.",[10,101,103],{"id":102},"rond-de-app","Rond de app",[15,105,106],{},"Naast de app draait een beheerpaneel: een Vue 3-app met TanStack Query die aanmeldingen, retentiecohorten en een markering voor elke grotere release in de grafieken laat zien. Nieuwe timerachtergronden worden in de browser met WebAssembly naar WebP omgezet, en videoloops worden met WebCodecs gecontroleerd voordat ze worden geüpload.",[15,108,109,110,116],{},"De storepagina’s voor drie stores in zeven talen staan in een eigen repository, met scripts die elke veldlimiet bewaken en nagaan of elke vertaling dezelfde opbouw heeft als het Engelse origineel. De website, ",[42,111,115],{"href":112,"rel":113},"https:\u002F\u002Fmy-kaizen.com",[114],"nofollow","my-kaizen.com",", is gebouwd met Nuxt 4 en heeft uitgebreide artikelen met bronvermelding. En de Discord-server, met zo’n 30.000 leden, heeft forums voor bugmeldingen en ideeën.",[10,118,120],{"id":119},"wat-de-cijfers-zeggen","Wat de cijfers zeggen",[15,122,123],{},"September 2026 was de grootste maand van Kaizen tot nu toe:",[125,126],"stat-row",{":items":127},"[{\"value\":\"1.500\",\"label\":\"nieuwe aanmeldingen, een kwart van het totaal\"},{\"value\":\"750\",\"label\":\"mensen actief die maand, zo’n 350 per week\"},{\"value\":\"6.200\",\"label\":\"uur focus in die ene maand\"}]",[15,129,130],{},"Twee beslissingen springen eruit. Toen taken en het meedoen aan openbare rooms in maart gratis werden, verdubbelde het aantal aanmeldingen per week ongeveer. Met de lancering in zeven talen in april steeg daarna het deel van de nieuwe gebruikers dat de app echt ging gebruiken, dat voorjaar van zo’n 23 naar zo’n 43 procent. Van het voorjaar tot september is het aantal nieuwe gebruikers dat elke week echt begint ongeveer verdrievoudigd. De volgende uitdaging is de tweede week: ongeveer een op de zeven nieuwe gebruikers komt terug.",[10,132,134],{"id":133},"wat-ik-anders-zou-doen","Wat ik anders zou doen",[136,137,138,146,152],"ul",{},[139,140,141,145],"li",{},[142,143,144],"strong",{},"Meteen vertalen."," De activatie sprong omhoog toen er zeven talen bij kwamen, drie maanden na de lancering.",[139,147,148,151],{},[142,149,150],{},"Eerder een library voor serverstate."," Het ophalen van data in de synchronisatielaag is zelfgebouwd, en TanStack Query staat gepland als vervanger.",[139,153,154,157],{},[142,155,156],{},"De releasebuild op een echte telefoon testen voordat hij uitgaat."," Bij 4.10.0 werkte elke debugbuild; alleen de releasebuild was stuk.",[159,160,163,168],"section",{"className":161,"dataFootnotes":47},[162],"footnotes",[10,164,167],{"className":165,"id":46},[166],"sr-only","Footnotes",[169,170,171],"ol",{},[139,172,174,175,180,181,186,187],{"id":173},"user-content-fn-eagle","Eagle, T., Baltaxe-Admony, L. B. en Ringland, K. E. (2024). ",[176,177,179],"span",{"lang":178},"en","“It Was Something I Naturally Found Worked and Heard About Later”: An Investigation of Body Doubling with Neurodivergent Participants."," ACM Transactions on Accessible Computing, 17(3). ",[42,182,185],{"href":183,"rel":184},"https:\u002F\u002Fdoi.org\u002F10.1145\u002F3689648",[114],"doi.org\u002F10.1145\u002F3689648"," ",[42,188,193],{"href":189,"ariaLabel":190,"className":191,"dataFootnoteBackref":47},"#user-content-fnref-eagle","Back to reference 1",[192],"data-footnote-backref","↩",{"title":47,"searchDepth":195,"depth":195,"links":196},2,[197,198,199,200,201,202,203,204,205,206,207],{"id":12,"depth":195,"text":13},{"id":23,"depth":195,"text":24},{"id":33,"depth":195,"text":34},{"id":56,"depth":195,"text":57},{"id":66,"depth":195,"text":67},{"id":81,"depth":195,"text":82},{"id":95,"depth":195,"text":96},{"id":102,"depth":195,"text":103},{"id":119,"depth":195,"text":120},{"id":133,"depth":195,"text":134},{"id":46,"depth":195,"text":167},"Kaizen is een Pomodoro-timer met Focus Rooms zonder camera, voor iOS, Android, het web en Windows, gebouwd en beheerd door één developer. Hoe het in elkaar zit, inclusief een release die misging.","md",{},true,"\u002Fnl\u002Fkaizen",{"title":5,"description":208},"nl\u002Fkaizen","m5uYEZv_v1tY0NF5SH98pp7og_atRnZ87MAF_4H98sQ",1791315487489]