Dev / CodingAI-generated

YieldRunner: een investing dashboard bouwen zonder fulltime developer te zijn

YieldRunner: een investing dashboard bouwen zonder fulltime developer te zijn

Ik ben geen developer. Ik ben iemand die dividend-aandelen bijhoudt in spreadsheets, een beetje te veel nadenkt over ex-dividend datums, en af en toe een webapp bouwt als het probleem groot genoeg is. YieldRunner is zo'n project.

Het begon eenvoudig: ik wilde weten welke aandelen in mijn watchlist binnenkort ex-dividend gaan, wat de yield-on-cost is op mijn posities, en of er kansen zijn om snel in en uit te stappen rondom ex-dividend datums — dividend capture trading. Een Excel-sheet kon dat niet netjes bijhouden. Bestaande apps deden precies niet wat ik wilde. Dus bouwde ik het zelf.


Wat YieldRunner moet worden

Het kernidee is een dashboard dat mijn IBKR-portfolio combineert met dividend-data en me vertelt waar kansen liggen. Niet alleen "dit aandeel geeft dividend", maar wanneer de ex-date is, wat de historische koersdaling na ex-date is, wat de belastingdruk is, en of de risk/reward gunstig uitvalt.

Op de lange termijn wil ik dit uitbouwen tot een kleine SaaS. Niet groot — als het 1.500 euro per jaar oplevert voor andere dividend-investeerders met hetzelfde probleem, ben ik tevreden. Bescheiden genoeg om realistisch te zijn, groot genoeg om er serieus aan te werken.


De tech-keuzes

Stack: Next.js met de App Router, TypeScript, Tailwind, Prisma. Data komt uit twee bronnen: de IBKR Flex API voor live portfolio-posities en externe dividend-databases voor historische data en komende ex-dates.

Waarom Next.js? Omdat ik ermee werk in mijn andere projecten en de App Router begrijp. Vibecoding werkt het beste als je al weet hoe de fundamenten in elkaar zitten. Dan kan Claude Code de implementatie schrijven terwijl jij de structuur bewaakt. Als je de stack niet kent, gooit Claude soms correcte code neer die op de verkeerde plek zit, en dan weet je dat niet.

TypeScript is een bewuste keus. In eerdere projecten heb ik het opruimen van any-types uitgesteld, en dat wrekt altijd. Bij YieldRunner zit TypeScript er van het begin in, inclusief type-veilige API responses. Dat kost iets meer tijd upfront, maar Claude Code genereert betere code als de types al duidelijk zijn.

IBKR Flex is de meest betrouwbare bron van waarheid voor mijn portfolio. Snowball miste posities en had verkeerde aantallen — niet bruikbaar. Via de Flex XML API haal ik exacte posities, transacties en rendement op. Dat is backend-werk: een cron-job die dagelijks de Flex-data fetcht, parseert en in Prisma opslaat. Dat stuk heeft onverwacht veel randgevallen. IBKR XML heeft zijn eigen eigenaardigheden.


Vibecoding op projectschaal

Kleine scripts bouwen met Claude Code is relaxed. Je typt wat je wilt, het werkt, klaar. Een serieus project met meerdere API-integraties, database-schema, frontend-logica en businessregels is anders. Daar merkte ik dat vibecoding een discipline vereist, geen magie.

Wat werkt goed: Claude Code inzetten als pair programmer voor implementatie. Ik beschrijf de structuur, de interface, de edge cases die ik zie — Claude schrijft de code. Dat gaat snel. Voor API-integraties, component-logica en type-definities bespaar ik zeker 60 tot 70 procent van het typwerk op de rechttoe-rechtaan onderdelen.

Wat minder werkt is grote architectuurbeslissingen delegeren. De keer dat ik vroeg hoe Claude de dividend-data zou modelleren in Prisma, kreeg ik een correct antwoord, maar niet het juiste antwoord voor mijn situatie. De specifieke vragen die ik later zou stellen, de joins die ik nodig zou hebben, de manier waarop ik queries wil schrijven — dat wist Claude niet. Ik moest zelf een schets op papier zetten, de afwegingen begrijpen, en dan pas Claude vragen het uit te werken.

Architectuur kun je niet insourcen. Implementatie grotendeels wel.


Wat meer tijd kostte dan verwacht

Eerlijk zijn over dit punt: de IBKR Flex-integratie. IBKR is een professioneel systeem gebouwd voor institutionele gebruikers, niet voor hobbyisten met een Next.js app. De Flex Query moet je handmatig configureren in de IBKR-portal, het XML-formaat is uitgebreid en niet altijd gedocumenteerd, en er zijn rate limits die je pas ontdekt als je ze raakt.

Claude kon me helpen met het parsen van de XML en het omzetten naar TypeScript-types, maar de IBKR-specifieke logica — hoe transactietypen samenhangen, hoe corporate actions worden gerepresenteerd — moest ik zelf uitzoeken. Dat was handmatig lezen van IBKR-documentatie en trial-and-error met echte data.

De tweede verrassing was de dividend-data. Er is geen perfecte, goedkope API die historische ex-dates, uitkeringshistorie en voorspelde toekomstige dividenden combineert voor een redelijke prijs. Ik heb meerdere opties vergeleken en getest, uiteindelijk een keuze gemaakt die goed genoeg is voor nu, maar dit blijft een kwetsbaar punt in de architectuur.

De derde uitdaging was de businesslogica voor dividend capture, die niet triviaal bleek. Het gaat niet alleen om kopen voor ex-date en daarna verkopen. Je hebt te maken met de koersdaling op ex-date (die gemiddeld gelijk is aan het dividend), belasting op dividenden versus koerswinst, bid-ask spreads en timing. Dat uitwerken in code vereist dat je het zelf goed begrijpt. Claude implementeert de logica die je beschrijft, maar verifieert niet of de businesslogica klopt.


Wat vibecoding me leert over mijn eigen denkproces

Een onverwachte bijvangst: samenwerken met Claude Code dwingt me scherper te formuleren wat ik wil. Als mijn prompt vaag is, krijg ik vage code. Als ik precies beschrijf wat een component moet doen, welke data het krijgt en wat de edge cases zijn, is de output goed bruikbaar.

Dat scherpte-effect heeft me geholpen om YieldRunner beter te ontwerpen. De discipline om een feature-verzoek aan Claude te schrijven is ook de discipline om de feature zelf goed door te denken. Een bijwerking die ik niet had verwacht.


Waar het nu staat

YieldRunner heeft een werkende portfolio-sync vanuit IBKR, een basis-dashboard met posities en yield-on-cost, en een eerste versie van het ex-dividend kalenderoverzicht. De dividend capture scoring — het hart van de app — is in ontwikkeling. Dat is de logica die per aandeel berekent of een capture-trade interessant is op basis van historische patronen.

Daarna volgt een eerste gesloten beta met een handvol gebruikers. Geen grote launch, geen marketingcampagne. Gewoon kijken of iemand anders het nuttig vindt voordat ik verder bouw.


De les tot nu toe

Vibecoding werkt voor serieuze projecten, maar het vraagt dat je zelf de domeinkennis en architectuurkeuzes voor je rekening neemt. Claude Code is een uitstekende implementatiepartner, geen productmanager.

De volgende stap voor YieldRunner is concreet: de dividend capture scoring afronden en testen op echte historische data. Als de output klopt met wat ik handmatig zou berekenen, is de logica goed. Dan pas heeft de app bestaansrecht.