Geen statische CV-pagina maar een systeem: Notion is de bron, drie Python-scripts bouwen de site, en elke ochtend publiceert hij zichzelf. Je kijkt er nu naar.
Een portfolio veroudert vanaf de dag dat je het publiceert. De cijfers lopen achter, het logboek stopt, het laatste project is van drie maanden geleden. Niet omdat het werk stilligt, maar omdat bijwerken handwerk is.
Dus bouwde ik een portfolio dat zichzelf bijhoudt. De projecten, het logboek, de groeigrafiek en de cijfers bovenaan de site: geen daarvan staat vast in de pagina getypt. Alles komt uit twee Notion-databases die ik toch al dagelijks gebruik, en de site bouwt en publiceert zichzelf elke ochtend opnieuw.
"Ik bouw AI-systemen" is een goedkope claim geworden. Iedereen zet hem op zijn profiel. Het verschil zit niet in de claim, maar of je hem kunt aanklikken. Ik wilde een portfolio dat zelf het bewijs is: een site die laat zien wat er draait, doordat hij er zelf op draait.
Het praktische probleem was klassiek. Elke keer dat er iets af was, moest ik de site openen, HTML aanpassen, bestanden uploaden. Dat gebeurt twee keer, en daarna nooit meer. De administratie die ik wél bijhield leefde in Notion, waar mijn taken en projecten toch al staan. De oplossing lag voor de hand: laat de site uit die administratie ontstaan, in plaats van er een kopie naast te onderhouden.
Wijzig de bron, nooit de output.
Elke projectkaart, logboek-regel en gereedschap-tegel op de homepage is een rij in een Notion-database, met een handvol velden die het gedrag bepalen: in welke sectie het landt, of het gepubliceerd is, en in welke volgorde. Een nieuw project toevoegen is een database-rij aanmaken. De HTML raak ik niet aan.
build_portfolio.py zet de content-database om in projecten, logboek, gereedschap en werkwijze op de site, in twee talen tegelijk.build_timeline.py leest mijn takenbord en bouwt daar de groeigrafiek uit, week voor week.update_hero.py ververst de cijfers bovenaan de site, rechtstreeks uit dezelfde bron.De scripts schrijven hun resultaat tussen vaste markeringen in de pagina:
Die regel dwingt discipline af: er is precies één plek waar content leeft, en dat is niet de website. Alles tussen de markeringen wordt bij de volgende bouw overschreven. De scripts zijn bovendien voorspelbaar: een tweede run zonder database-wijzigingen verandert niets, en een ingebouwde telling stopt de bouw als er onderweg items verdwijnen. Een halflege sectie gaat nooit stilletjes live.
Publiceren is sinds de laatste verbouwing geen handeling meer. Elke ochtend om kwart over acht draait de volledige pijplijn vanzelf: content verversen, en alleen als er echt iets veranderd is wordt de site opnieuw gepubliceerd. Geen wijziging betekent geen publicatie. De server accepteert daarbij uitsluitend bestanden die op een vaste lijst staan, zodat een per ongeluk meegestuurd intern bestand nooit openbaar kan worden. Het faalt veilig: een vergeten bestand verschijnt gewoon niet, in plaats van dat het verkeerde bestand lekt.
Het sterkste argument van deze opzet is dat je er nu naar kijkt. De groeigrafiek op de homepage toont honderden afgeronde taken, week voor week, verdeeld over veertien vaardigheids-domeinen. Die data komt uit hetzelfde takenbord waarmee ik dagelijks werk. De grafiek kan niet liegen zonder dat mijn eigen administratie meeliegt.
Elke ochtend een verse bouw; publicatie alleen als er iets veranderd is.
De site is intussen doorgegroeid van één pagina naar een klein stelsel: projectpagina's per systeem, een artikelenreeks die uit losse tekstbestanden wordt gebouwd, en een tweetalige variant die uit dezelfde databases komt. De pijplijn bleef hetzelfde; er kwamen alleen bronnen bij.
De techniek bleek het makkelijke deel. Het lastige deel is redactie. Een systeem dat alles publiceert wat af is, publiceert ook dingen die een bezoeker niets zeggen. Daarom gaat niets live zonder een bewuste keuze: elke kaart heeft een status, en alleen wat ik op "gepubliceerd" zet komt op de site. De AI schrijft mee aan teksten, maar een pagina gaat pas live nadat ik de echte, gerenderde versie heb gelezen. Die menselijke poort is geen zwakte van het systeem, hij is er het belangrijkste onderdeel van.
En er is een tweede valkuil: sleutelen aan het systeem is verslavender dan content maken. Een avond aan de pijplijn schaven voelt productief, maar een bezoeker ziet er niets van. De vuistregel die ik mezelf heb opgelegd: het systeem is af zodra het saai is, en de aandacht hoort bij wat het toont.
De eerste taalknop vertaalde alleen de knoppen, niet de inhoud. Resultaat: een "Engelse" site die grotendeels Nederlands toonde. Dat systeem is er volledig uitgegaan en pas teruggekomen toen de hele contentpijplijn tweetalig was, met per kaart een Engels titel- en tekstveld in de database.
Een versie-update van een tool is intern relevant, maar zegt een bezoeker niets. De filter voor het logboek: iets wat een buitenstaander begrijpt én iets zegt over wat ik kan. De rest blijft in de administratie.
De grootste fouten kwamen uit aannames over hoe data stroomt: een bestand dat niet bleek te laden, een structuur die platter was dan gedacht. Sindsdien bewijs ik eerst wat er op het ontvangende punt echt binnenkomt, en bouw ik daarna pas. En andersom werkt het ook: menselijk meedenken haalt een AI regelmatig uit een doodlopende oplos-lus. De AI kijkt scherp naar zijn eigen stukje, de mens overziet het geheel.
De opzet is niet aan mijn tools gebonden. Alles wat je nodig hebt is één plek waar je werk al wordt bijgehouden (een takenlijst, een spreadsheet, een database) en de afspraak dat de site dááruit ontstaat. Laat een AI je eigen variant uittekenen met de prompt hieronder.
Ik wil dat mijn portfolio-site zichzelf bijhoudt, in plaats van dat ik hem handmatig bijwerk. Mijn situatie: - Mijn werk houd ik nu bij in: [bijvoorbeeld: Notion, een spreadsheet, Trello] - Mijn site draait op: [bijvoorbeeld: een statische site, WordPress, geen site nog] - Ik wil tonen: [bijvoorbeeld: projecten, een logboek van wat af is, cijfers] Interview me eerst kort over wat er in mijn administratie staat en hoe technisch ik ben. Stel daarna een opzet voor met: 1. Welke bron de enige plek van waarheid wordt, en welke velden die nodig heeft. 2. Hoe de site uit die bron gebouwd wordt, zo simpel mogelijk. 3. Een veilige publicatiestap, waarbij ik bepaal wat zichtbaar wordt. 4. De eerste stap die ik dit weekend kan zetten. Wees eerlijk over wat ik beter níet kan automatiseren.
Dit portfolio is zelf één van de systemen die het toont. De databases waar de site uit bouwt worden grotendeels bijgehouden door Kai, mijn AI-assistent, en de kennis achter de projecten leeft in mijn tweede brein. Wat je hier leest is dus geen beschrijving van een werkwijze, het is de werkwijze zelf, in productie.
Alle projecten die deze site toont staan op de homepage, live uit de bron.
Een voorbeeld van wat er door deze pijplijn stroomt: het volledige bouwverhaal van Wire Spine, een AI-conceptalbum.