Planning App
Een planner voor dagen die niet altijd volgens plan lopen
Een planning maken is niet zo moeilijk. Een planning maken die ik ook daadwerkelijk blijf gebruiken, bleek een ander verhaal.
Er was meer nodig dan een plek voor taken en afspraken. De app moest overzicht geven, helpen om te beginnen en genoeg motivatie bieden om door te gaan. Ook op dagen waarop er te veel staat ingepland of de planning halverwege alweer uit elkaar valt.
Bestaande tools kwamen in de buurt, maar misten steeds net de combinatie van rust, flexibiliteit en voortgang die voor mij werkte.
Dus bouwde ik hem zelf.

Mijn eerste planning stond in Notes. Dat werkte prima, totdat de lijst langer werd en het overzicht alsnog verdween.
Daarna Notion, met Make, Google Calendar en een lokaal AI-model voor plannings. Het werkte, maar steeds meer tijd ging zitten in het bijhouden van het systeem zelf.
Bestaande apps waren het steeds nét niet. De ene werkte goed voor habits, de andere voor projecten of afspraken. Ergens miste altijd iets.
Ook bestaande planning apps waren het steeds nét niet. De ene werkte goed voor habits, de andere voor projecten of afspraken. Ergens miste altijd iets.
Het probleem was dus niet alleen waar ik mijn planning neerzette.
Ik had een systeem nodig dat niet alleen vertelt wat er moet gebeuren, maar ook helpt om eraan te beginnen, overzicht te houden en na een mindere dag weer verder te gaan.
Hoe maak je een planner die structuur geeft en motiveert, ruimte overlaat voor imperfectie en die imperfecties ook nog eens inzichtelijk maakt?
Een lijst die tijdens het werken korter wordt
De eerste vraag was dus niet: waar zet ik al mijn taken neer?
De vraag was: hoe zorg ik dat een planning overzicht houdt terwijl ik ermee bezig ben?
De homepage begint daarom bij vandaag.
Daar staan habits, afspraken en taken. Niet alles wat deze maand nog moet gebeuren, maar wat op dat moment relevant is.
Die onderdelen blijven bewust van elkaar gescheiden. Een afspraak hoort meestal bij een bepaald tijdstip en locatie. Een habit draait om herhaling en een taak vraagt om een concrete handeling. Ze horen bij dezelfde dag, maar werken niet op dezelfde manier.
Taken kunnen daarnaast per project worden gegroepeerd. Zodra alle taken binnen een groep zijn afgerond, klapt die groep in. De lijst wordt tijdens het werken dus korter.
Dat verlaagt de cognitieve belasting. Een lange lijst vraagt voortdurend aandacht voor alles wat nog openstaat. Door informatie in kleinere groepen te verdelen, hoeft iemand minder tegelijk te overzien.
Tegelijk loopt het voortgangspercentage op. De app laat daardoor niet alleen zien wat nog moet gebeuren, maar geeft ook direct feedback op wat al is afgerond.
Naarmate een doel dichterbij komt, neemt de motivatie om het af te maken vaak toe. Dat wordt het goal gradient effect genoemd. Een korter wordende lijst, oplopend percentage en vollere progress bar maken die vooruitgang zichtbaar.
Voortgang die je niet wilt verliezen
Habits verschijnen in een jaarlijks grid, vergelijkbaar met de contribution graph van GitHub.
Iedere afgeronde dag voegt een groen vakje toe. Na verloop van tijd ontstaat daardoor een zichtbaar patroon. Een volgende dag voelt niet meer als één los vinkje, maar als een aanvulling op iets wat al is opgebouwd.
Hetzelfde principe zit achter de streak bovenaan het dashboard.
Mensen zijn vaak sterker gemotiveerd om bestaande voortgang niet te verliezen dan om opnieuw bij nul te beginnen. Dat sluit aan op verliesaversie: iets kwijtraken wat al van ons voelt, weegt zwaarder dan een vergelijkbare winst.
Apps als Duolingo gebruiken dat principe niet voor niets. Op dag één stelt een streak weinig voor. Op dag 471 is stoppen ineens een stuk lastiger. Dat is mijn streak op het moment dat ik dit schrijf.
Ja, ze hebben me.
Alleen mocht dat niet betekenen dat één moeilijke dag alle voortgang direct wist.
Motiveren zonder onrechtvaardig te straffen
Ik had ooit via Samsung Health een bewegingsstreak van meer dan een maand. Toen kwam er één dag iets tussen waardoor bewegen echt niet mogelijk was.
Als het had gekund, had ik het gedaan. Het kon alleen écht niet.
Toch verdween de volledige streak. Dat voelde niet alsof ik hem zelf had verbroken, maar alsof de app hem van me afpakte.
Technisch gezien registreerde de app correct dat ik mijn doel niet had gehaald. Psychologisch werkte het averechts. De motivatie om de reeks te behouden was verdwenen, omdat de uitkomst niet rechtvaardig voelde.
Daarom maakt mijn planner onderscheid tussen overslaan en niet kunnen.
Met ‘sleep mode’ kan een specifiek item voor die dag worden gepauzeerd. Het wordt niet groen, want het is ook niet afgerond. In het overzicht krijgt het een roze status toegewezen, in plaats van de groene. Zo wordt de gebruiker wordt niet alsnog beloond, maar ook niet buitenproportioneel afgestraft.
Daarnaast gebruikt de app een systeem met hartjes. Door een streak vol te houden, kunnen levens worden verdiend waarmee een gemiste dag wordt opgevangen.
Voor periodes waarin de normale routine bewust niet geldt, is er een vakantiemodus. De streak blijft dan behouden en een gekoppelde paklijst verschijnt drie dagen voor vertrek automatisch in beeld.
Het doel is niet om ieder vakje koste wat kost groen te maken.
Het doel is dat één afwijkende dag niet alle motivatie voor de volgende wegneemt.
Niet alles hoeft vandaag
Een normale takenlijst maakt weinig onderscheid tussen iets dat echt moet en iets dat ik graag zou willen doen.
Daardoor kan een hobby, een klein idee of iets wat eventueel handig zou zijn al snel dezelfde druk krijgen als een deadline.
Taken kunnen in de app daarom verplicht of optioneel zijn.
Een optionele taak heeft geen gevolgen als die niet wordt afgerond. Lukt het wel, dan levert die bonuspunten op waarmee een nieuw hartje kan worden verdiend.
Zo blijft de taak zichtbaar en krijgt extra inzet een beloning, zonder dat iedere activiteit direct een verplichting wordt.
Voor mij voorkomt dat dat iets leuks langzaam verandert in huiswerk.
Grote projecten beginnen met één concrete stap
Een project als 'portfolio afronden' klinkt duidelijk, maar is eigenlijk geen uitvoerbare taak.
Er zitten nog allerlei beslissingen in verstopt. Welke pagina moet eerst? Welke beelden ontbreken? Welke copy moet worden herschreven? En wanneer is het eigenlijk af?
Die onduidelijkheid maakt grote taken overweldigend. Voordat iemand kan beginnen, moet diegene eerst bepalen waar te beginnen.
Binnen de app wordt een project daarom opgedeeld in kleinere, concrete taken. Niet 'portfolio afronden', maar bijvoorbeeld 'beelden voor de Charlie case selecteren' of 'mobiele navigatie testen'.
Dat verlaagt de drempel om te starten. De volgende handeling staat al vast, waardoor er op dat moment minder beslissingen nodig zijn.
De app gebruikt daarbij een vorm van progressive disclosure. Op projectniveau staat het grotere doel met de totale voortgang. Binnen het project staan de afzonderlijke stappen. Op het dagoverzicht verschijnt alleen de taak die nu relevant is.
De volledige complexiteit blijft beschikbaar, maar wordt niet overal tegelijk getoond.
Een groot project blijft groot.
Het voelt alleen niet meer alsof alles tegelijk moet.
Morgen mag zich vandaag al even melden
Belangrijke afspraken en taken verschijnen een dag van tevoren bovenaan het dashboard.
Even een seintje dat er morgen iets aankomt waar vandaag misschien al rekening mee moet worden gehouden.
Projectdeadlines werken op een vergelijkbare manier. Op de homepage staat hoeveel dagen er nog over zijn. Naarmate de deadline dichterbij komt, verandert de kleur van groen naar geel en uiteindelijk rood.
Na de deadline loopt de teller door als negatief getal.
Subtiel is anders. Wel duidelijk.
Voor een volledig maandoverzicht gebruik ik Google Calendar. Ik kon natuurlijk ook zelf nog een kalender bouwen, maar Google had er al een.
Daarom synchroniseren afspraken en taken in beide richtingen. Voeg ik iets toe of verwijder ik het, dan wordt die wijziging ook in Google Calendar verwerkt.
Zo kan iedere interface doen waar die goed in is, zonder dat ik dezelfde planning op meerdere plekken hoef bij te houden.
Een taak toevoegen hoeft geen taak te worden
Via het menu kan ik een taak, afspraak of habit uitgebreid instellen.
Denk aan een datum, tijd, locatie, herhaling, prioriteit, status en gekoppeld project.
Het is fijn dat het kan, maar niet ieder idee heeft direct al die informatie nodig
Daarom is er ook een braindump. Daar kan iets snel worden opgeslagen zonder eerst een datum, project of categorie te kiezen. Het plannen komt later wel.
Voor grotere planningen bouwde ik een importfunctie. Daarmee kan ik bijvoorbeeld meerdere weken aan taken in één keer toevoegen, zonder ieder item los in te voeren.
Via de widgets kunnen taken bovendien worden afgevinkt of toegevoegd zonder eerst de volledige app te openen.
Hoe lager de drempel om iets snel in te voeren, hoe kleiner de kans dat een goed idee eindigt in een optimistisch "dat onthoud ik zo wel"moment. Niet dus.
Tien taken af. Van de twintig.
Alleen het aantal afgeronde taken tonen geeft een vertekend beeld.
Tien afgeronde taken klinkt productief. Wanneer er oorspronkelijk twintig waren ingepland, vertelt dat een ander verhaal.
Daarom bouwde ik de ‘plan ratio’.
Die vergelijkt hoeveel er voor een week of maand is gepland met hoeveel daarvan daadwerkelijk wordt afgerond. Twintig items gepland en tien afgerond levert een ratio van 50% op.
De score beoordeelt niet hoe hard iemand heeft gewerkt. Hij laat zien hoe realistisch de planning vooraf was.
Dat helpt tegen de planning fallacy: de neiging om te onderschatten hoeveel tijd en moeite iets kost. Door verwachtingen steeds naast de uitkomst te leggen, ontstaat over tijd een realistischer beeld van wat er werkelijk in een dag of week past.
Het archief laat per dag, maand en project zien wat is afgerond en wat is blijven liggen. Daardoor wordt niet alleen output zichtbaar, maar ook hoe jij je eigen tijd inschat.
De groene vakjes geven motivatie.
De plan ratio houdt de planning realistisch.
De gebruiker bleef om nieuwe functies vragen
Veel functies ontstonden niet omdat ik vooraf een perfecte productvisie had.
Ze ontstonden omdat ik de app zelf iedere dag gebruikte en steeds ergens tegenaan liep.
De eerste versie was kleiner. Tijdens het dagelijkse gebruik liep ik steeds ergens tegenaan.
Mijn planningen bleken te optimistisch, dus kwam er een plan ratio. Niet iedere taak voelde verplicht, dus maakte ik optionele taken. Ik miste een maandoverzicht, dus bouwde ik synchronisatie met Google Calendar. Snel iets toevoegen kostte soms te veel stappen, dus kwamen er widgets en een braindump.
Bijna iedere functie begon met dezelfde constatering:
Dit werkt nog niet zoals ik het nodig heb.
Daardoor is de app volledig afgestemd op mijn manier van plannen. Dat was ook precies het doel. Ik bouwde hem niet als generieke productiviteitstool of met een openbare release in gedachten.
Mensen die hem zagen, gaven wel aan dat ze hem ook zouden willen gebruiken. Een mooi compliment, maar de belangrijkste gebruiker blijft voorlopig degene die hem heeft gebouwd.
Dezelfde planning. Vier verschillende interfaces.
Een planner helpt weinig als hij alleen beschikbaar is op het apparaat dat net niet in de buurt ligt.
De app werkt in de browser, als Android app en via widgets op Android en macOS. Overal staat dezelfde planning. Wanneer een taak in de macOS widget wordt afgevinkt, verandert die status ook in de browser en op Android. Nieuwe items verschijnen direct op alle apparaten terug.
Firebase houdt de data op één plek bij. Daardoor is alles gesynct.
Maar dezelfde planning op vier plekken betekende niet dat iedere interface een kleinere kopie van de vorige moest worden.
In de browser is ruimte voor projecten, statistieken, archieven, lijsten en instellingen. Een widget moet binnen een paar seconden antwoord geven op twee vragen: wat moet er vandaag nog gebeuren en wat kan ik direct afvinken?
Voor de Android widgets werkte ik met Kotlin. De macOS widgets bouwde ik met Swift. Beide waren best nieuw voor me en widgets bleken al snel niet gewoon kleine webpagina's. Ze hebben andere beperkingen, verversen anders en bieden nauwelijks ruimte voor interactie.
Bouwen voor meerdere platformen dwong me hetzelfde product steeds opnieuw terug te brengen tot zijn kern.
Een nuttige oefening voor een app die ondertussen zelf steeds uitgebreider werd.
Techniek
Firebase · Google Calendar API · Kotlin · Swift · Android · macOS widgets · PWA
Van losse lijstjes naar één systeem
Het eindresultaat is een planning app waarin taken, afspraken, habits en projecten samenkomen.
- dagelijks dashboard met taken, afspraken en habits
- projecten met subtaken, deadlines en voortgang
- referentielijsten voor paklijsten en losse collecties
- streaks, hartjes en sleep mode
- verplichte en optionele taken
- planratio en habitgrid
- braindump en importfunctie
- bulk select om meerdere items tegelijk te bewerken
- archief, filters en statistieken
- Google Calendar synchronisatie
- locaties op taken, gekoppeld aan Google Maps
- webapp en Android app via Capacitor, gebouwd vanuit dezelfde codebase
- drie Android widgets via Jetpack Glance en drie macOS widgets via SwiftUI en WidgetKit
- realtime synchronisatie via Cloud Firestore, dagelijkse reset via Cloud Functions
Het belangrijkste resultaat is niet dat alles nu in één app staat.
De app helpt om overzicht te houden, grote projecten kleiner te maken en voortgang zichtbaar te maken. Hij motiveert genoeg om door te gaan, maar laat ook ruimte voor dagen waarop dat even niet lukt.
Precies dat miste ik in de systemen die ik eerder gebruikte.
Af. Op een paar taken na
De app is inmiddels onderdeel van mijn dagelijkse routine.
Daardoor kom ik nog steeds dingen tegen die ik wil aanpassen, verbeteren of toevoegen. Ironisch genoeg staan er in de planning app dus ook nog taken open voor de planning app.
Maar ik weet in ieder geval precies waar ze staan.
En wie weet komt daar ooit nog één taak bij: de app uitbrengen.