Zes apps · Één kwartaal Six apps · One quarter

Bouwen met AI
als co-piloot
Building with AI
as co-pilot

Bouwen met Claude voelde alsof ik gereedschap gebruikte dat ik nog niet helemaal begreep — maar dat wél deed wat ik nodig had. Iets maken terwijl je het maken zelf nog aan het ontdekken bent. Building with Claude felt like using a tool I didn't fully understand yet — but one that did exactly what I needed. Making something while still figuring out how to make it.

Er zijn periodes waarin dingen ineens sneller gaan dan verwacht. Dit was er zo één. There are periods when things move faster than expected. This was one of them.

In een paar maanden bouwde ik zes apps. Niet vanuit een plan, maar telkens vanuit een concrete vraag. De rode lijn zag ik pas achteraf. In a few months I built six apps. Not from a plan, but always from a concrete question. The common thread only became clear afterwards.

Ik ben data-analist. Geen programmeur. Dit is geen developer-portfolio — het is een verslag van wat er gebeurt als je AI inzet als co-piloot en ondertussen zelf blijft nadenken over wat je eigenlijk probeert te maken. I'm a data analyst. Not a programmer. This isn't a developer portfolio — it's an account of what happens when you use AI as co-pilot and keep thinking for yourself about what you're actually trying to make.

De vraag waarmee het begon: The question it started with:

Kan ik met Claude iets werkends bouwen, zonder zelf te kunnen programmeren? Can I build something that works with Claude, without knowing how to code?

Taakmanager · React · Supabase Task Manager · React · Supabase

Glim

Glim taakmanager

Glim begon als experiment. Niet omdat ik een nieuwe taken-app nodig had, maar omdat ik wilde weten of het überhaupt zou lukken.

Het idee was simpel: een taakmanager die rust geeft in plaats van druk. Geen notificaties, geen badges, geen gevoel dat je achterloopt. Gewoon taken, rustig vormgegeven.

Mobile-first, Supabase als backend, Google-authenticatie. In het begin was het vooral "kijken wat er gebeurt als ik dit vraag aan Claude". Gaandeweg kwamen dingen erbij — licht- en donkermodus, drag-and-drop, undo.

Het werkte. Niet perfect, en niet altijd voorspelbaar. Maar werkend.

Glim started as an experiment. Not because I needed a new task app, but because I wanted to know whether it would work at all.

The idea was simple: a task manager that gives calm instead of pressure. No notifications, no badges, no sense of falling behind. Just tasks, quietly designed.

Mobile-first, Supabase as backend, Google authentication. At first it was mostly "see what happens when I ask Claude this". Things got added along the way — light and dark mode, drag-and-drop, undo.

It worked. Not perfectly, and not always predictably. But it worked.

HTML/CSSJavaScriptSupabaseGoogle AuthCSS Tokens
Wat goed werkte What worked well

Door de code achteraf te lezen begon ik langzaam te begrijpen wat er écht gebeurde. Wat CSS-variabelen doen. Hoe een backend zich gedraagt. Waarom iets kapot gaat.

By reading the code afterwards I slowly began to understand what was actually happening. What CSS variables do. How a backend behaves. Why something breaks.

Wat de volgende stap verder zou brengen What the next step would add Alles zat nog in één HTML-bestand — prima voor een prototype, maar een structuur die zijn grenzen laat zien zodra een app complexer wordt. Everything was still in a single HTML file — fine for a prototype, but a structure that shows its limits as an app grows more complex.
Bekijk projectpagina View project page
Datavisualisatie · SVG · React Data Visualization · SVG · React

The Weekly Pulse

Weekly Pulse interactieve demo

Weekly Pulse begon met een andere vraag: hoe ziet een week er eigenlijk uit — niet als agenda, maar als patroon? Niet "wat doe ik om 14:00". Maar: waar gaat mijn aandacht naartoe?

Dat werd een interactieve visualisatie: een wiel van zeven segmenten, één per dag. Activiteiten ingekleurd per categorie, breedte is tijdsduur, hoogte is energieniveau. Daarnaast een tijdlijnweergave. Beide volledig in SVG, opgebouwd vanuit boogpaden en polaire coördinaten.

Technisch een stap verder dan Glim: werken met SVG, boogberekeningen, polaire coördinaten — dingen die ik eerder nooit zelf had gebouwd.

Weekly Pulse started with a different question: what does a week actually look like — not as a schedule, but as a pattern? Not "what do I have at 14:00". But: where does my attention go?

That became an interactive visualisation: a wheel of seven segments, one per day. Activities colour-coded by category, width is duration, height is energy level. A timeline view alongside it. Both fully SVG, built from arc paths and polar coordinates.

Technically a step beyond Glim: working with SVG, arc calculations, polar coordinates — things I had never built before.

ReactViteSVGSupabaseNetlify
Wat goed werkte What worked well

Dit was het moment waarop iets verschoof. Minder "kijken of het lukt", meer "dit wil ik maken". De visualisaties waar ik al jaren naar keek — ik kon ze nu zelf bouwen. Niet omdat ik alles begreep, maar omdat ik er dichtbij genoeg voor kwam.

This was the moment something shifted. Less "let's see if this works", more "this is what I want to make". The visualisations I had been looking at for years — I could now build them myself. Not because I understood everything, but because I was close enough.

Bekijk projectpagina View project page
Woordenschattrainer · Spaced Repetition Vocabulary Trainer · Spaced Repetition

Lexum

Lexum woordenschattrainer

Lexum ontstond thuis. Mijn zoon moest Frans leren voor school, en de beschikbare apps sloten niet aan op wat hij nodig had. Dus bouwde ik er één.

Een woordenschattrainer met flashcards en spaced repetition — simpel in gebruik, maar flexibel in content. De slimste keuze zat ergens anders: de woordenlijsten worden beheerd via een Google Spreadsheet. Als ouder bepaal je zelf wat erin staat — geen database om te beheren, geen admin-interface om te bouwen. Gewoon de lijst aanpassen, en de app volgt.

Om die spreadsheet te vullen stuurde ik een foto van een bladzijde uit het schoolboek naar AI. De woordenlijst was gevuld.

Dat voelde ergens absurd. Maar ook gewoon logisch.

Na Frans is ook Engels toegevoegd — de Google Sheets-structuur maakt het eenvoudig om nieuwe talen te pluggen zonder de app zelf aan te passen.

Lexum came out of a concrete problem at home. My son needed to learn French for school, and the available apps didn't match what he actually needed. So I built one.

A vocabulary trainer with flashcards and spaced repetition — simple to use, but flexible in content. The smartest choice was elsewhere: word lists are managed via a Google Spreadsheet. As a parent you decide what's in it — no database to manage, no admin interface to build. Just update the list, and the app follows.

To fill the spreadsheet, I sent a photo of a school book page to AI. The word list was done.

That felt somehow absurd. But also just logical.

After French, English was added — the Google Sheets structure makes it easy to plug in new languages without touching the app itself.

HTML/CSSJavaScriptGoogle Sheets APICSS Tokens
Wat goed werkte What worked well

De Google Sheets-aanpak was verrassend elegant voor een ouder die snel nieuwe woorden wil toevoegen. En de visuele taal — scherper, helderder dan Glim — paste beter bij een kind dat moet leren.

The Google Sheets approach was surprisingly elegant for a parent who wants to add words quickly. And the visual language — sharper, clearer than Glim — suited a child who needs to learn.

Bekijk projectpagina View project page
Japan Frasengids · Next.js · OpenAI Japan Phrase Guide · Next.js · OpenAI

PhraseKit

PhraseKit Japan frasengids

Voor een geplande reis naar Japan ontstond een concreet probleem: hoe red je je in situaties waar je de taal niet spreekt?

PhraseKit werd geen vertaalapp, maar een frasengids per situatie. Restaurant, station, dokter, noodgevallen. Per frase een fonetische uitspraak in romaji, een toelichting, en een favorietenlijst voor de zinnen die je het vaakst nodig hebt.

De "Vraag het nu"-functie is volledig live: je typt een Nederlandse zin, en OpenAI vertaalt die naar natuurlijk Japans — inclusief romaji-uitspraak, uitleg, een kortere variant en een beleefder alternatief. De API draait server-side via Next.js, zodat de sleutel nooit bij de gebruiker terechtkomt.

A trip to Japan was planned. PhraseKit is the tool built for that. Not a translation app, not a language learning app — a phrase guide sorted by situation. Restaurant, station, doctor, emergencies. Each phrase with a phonetic pronunciation in romaji, an explanation, and a favourites list for the phrases you need most.

The "Ask now" feature is fully live: you type a sentence, and OpenAI translates it into natural Japanese — including romaji pronunciation, explanation, a shorter variant and a more polite alternative. The API runs server-side via Next.js, so the key never reaches the user.

Next.js 15TypeScriptTailwind CSS v4FirebaseOpenAINetlify
Wat goed werkte What worked well

Dit was de eerste app die voelde als een echt product. Iets dat je daadwerkelijk gebruikt op het moment dat het nodig is. Het ontwerp werd daar ook op aangepast: grotere knoppen, rustigere kleuren, focus op gebruik in stressvolle situaties. Audio-uitspraak via tekst-naar-spraak is inmiddels geïntegreerd.

This was the first app that felt like a real product. Something you actually use at the moment you need it. The design followed: bigger buttons, calmer colours, focus on use in stressful situations. Audio pronunciation via text-to-speech has since been integrated.

Bekijk projectpagina View project page
Reisplanning · SvelteKit · Leaflet Travel Planning · SvelteKit · Leaflet

Roamly

Roamly reisplanning

Tijdens het plannen van dezelfde reis groeide een andere vraag: hoe houd je overzicht over een route met veel stops?

Roamly toont de reis op twee manieren tegelijk: als gekleurde segmenten op een tijdlijn én als interactieve kaart via Leaflet. Je ziet de route in zowel tijd als ruimte. Je ziet meteen of je planning logisch is — of dat je jezelf onnodig heen en weer laat reizen.

Per dag kun je activiteiten invullen, en een ingebouwde AI-reisassistent — gekoppeld aan OpenAI — geeft per activiteit praktisch advies.

Hier werkte ik voor het eerst met SvelteKit. Anders dan React, dichter op de browser. Voelde in het begin vreemd. Daarna juist lichter.

While planning the same trip, another question grew: how do you keep an overview of a route with many stops?

Roamly shows the trip two ways at once: as coloured segments on a timeline and as an interactive map via Leaflet. You see the route in both time and space. You can immediately see whether your planning is logical — or whether you're unnecessarily travelling back and forth.

For each day you can fill in activities, and a built-in AI travel assistant — connected to OpenAI — gives practical advice per activity.

This was the first time I worked with SvelteKit. Different from React, closer to the browser. Felt strange at first. Then lighter.

SvelteKitTypeScriptFirestoreLeafletOpenAINetlify
Wat goed werkte What worked well

De combinatie van tijdlijn en kaart gaf een inzicht dat geen van beide alleen had kunnen bieden. Je ziet in één oogopslag of je reisroute geografisch logisch is — of dat je jezelf onnodig heen en weer laat reizen.

The combination of timeline and map gave insight that neither could provide alone. At a glance you can see whether your route is geographically logical.

Bekijk projectpagina View project page
Beloningssysteem · React · Firebase Reward System · React · Firebase

PowerUp

PowerUp beloningssysteem

Het laatste project begon niet met bouwen, maar met nadenken.

Mijn zoon had een beloningssysteem nodig — niet een sticker op de koelkast, maar iets dat op zijn telefoon stond, bijhield welke gewoontes hij goed deed, en ons samen een moment gaf aan het einde van de week om terug te kijken.

Ik begon bewust niet met Claude, maar met ChatGPT. Eerst het concept scherp krijgen: welke gewoontes zijn zinvol, wat is de juiste beloningsfrequentie, hoe voorkom je dat het averechts werkt. Pas toen het concept stond, begon de bouw.

De routing is volledig uitgesplitst: het kind heeft eigen pagina's, de ouder heeft eigen beheerpagina's. State wordt centraal beheerd via een Context, navigatie loopt via React Router.

The last project didn't start with building. It started with thinking.

My son needed a reward system — not a sticker on the fridge, but something on his phone that tracked which habits he was doing well and gave us a shared moment at the end of the week to look back together.

I deliberately started with ChatGPT, not Claude. Get the concept right first: which habits are worth rewarding, what is the right frequency, how do you prevent it from backfiring. Only when the concept was set did the build begin.

The routing is fully split: the child has their own pages, the parent has their own management pages. State is centrally managed via a Context, navigation runs via React Router.

ReactViteFirebaseContext APIReact Router
Wat goed werkte What worked well

Dit was het eerste project waarbij de inhoud leidend was, en niet de techniek. Niet "wat wil ik bouwen" als eerste vraag, maar "wat wil ik bereiken".

This was the first project where the content came first, not the technology. Not "what do I want to build" as the first question, but "what do I want to achieve".

Bekijk projectpagina View project page

Wat zes apps leren What six apps teach you

Als ik terugkijk, zie ik drie fases. Looking back, I see three phases.

01

Noodzaak & nieuwsgierigheid Necessity & curiosity

Kan dit überhaupt? Glim was het antwoord. Can this even work? Glim was the answer.

02

Eigen stem Own voice

Met Weekly Pulse verschoof het. Wat wil ik eigenlijk maken? Dat was het omslagpunt. With Weekly Pulse something shifted. What do I actually want to make? That was the turning point.

03

Bouwen voor anderen Building for others

Met PhraseKit, Roamly en PowerUp werd het concreter en praktischer. Voor wie bouw ik dit? With PhraseKit, Roamly and PowerUp it became more concrete and practical. Who am I building this for?

De technologie volgde vanzelf. Van één HTML-bestand naar React, Next.js en SvelteKit. Van hardcoded data naar Google Sheets, Supabase en Firebase. Die progressie was niet gepland — het was het gevolg van steeds net iets verder willen gaan. The technology followed naturally. From a single HTML file to React, Next.js and SvelteKit. From hardcoded data to Google Sheets, Supabase and Firebase. That progression wasn't planned — it was the result of always wanting to go just a little further.

Wat niet veranderde: ik bepaalde wat ik wilde maken. AI hielp me het te bouwen. En door de code achteraf te bestuderen leerde ik meer over softwareontwikkeling dan in jaren van tutorials. What didn't change: I decided what I wanted to make. AI helped me build it. And by studying the code afterwards I learned more about software development than in years of tutorials.

AI als co-piloot werkt niet als je het het stuur laat overnemen.
Het werkt als je zelf weet waar je naartoe wilt.
AI as co-pilot only works if you keep deciding where to go.
It works when you know where you want to go.