- Content-assemblage-engine: targeting op segmenten (functie/afdeling/team/locatie) stelt automatisch een persoonlijk, gefaseerd traject samen — generiek en functie-specifiek zonder duplicatie
- Type-gedreven, versie-gebonden content (JSON): documenten met bijlagen, visuele flowcharts (React Flow), checklists, contactkaarten, video en links, elk met eigen authoring en weergave
- Compliance-audittrail: append-only akkoorden met timestamp en IP; bij herpublicatie vraagt het platform automatisch opnieuw om akkoord
- Kennischecks per module met slaagdrempel; vragen gaan zonder de juiste antwoorden naar de browser en de server kijkt na — een stap is pas af als akkoord én quiz gehaald zijn
- Interactieve checklists en planning op maand·week·dag, afgeleid van een offset per stap in plaats van vaste fases
- Multi-tenant met rol-gebaseerde rechten (platform-beheerder > org-admin/HR > manager > medewerker) en een rang-regel: je beheert alleen rollen strikt onder die van jezelf
- Per-tenant branding (accentkleur en merknaam, live toegepast) en een volledig tweetalige interface (NL/EN), tot en met tweetalige modules, quizzen en trajectnamen
- Veilige bestands-uploads (PDF en afbeeldingen) met MIME-allowlist; de SPA haalt bestanden als geauthenticeerde blob op en toont ze inline
- Architectuur naar EdgeForge-model: FastAPI + SQLite met genummerde migraties en repository-pattern (klaar voor Postgres), React + TanStack Query + Zustand
- Deployment als één Docker-image (Node-build → Python serveert API en SPA) op een Raspberry Pi, naar buiten via een Cloudflare Tunnel, met automatische deploys
Projecten
Werk waar ik trots op ben
Een greep uit wat ik bouw — daar waar industriële besturing en moderne software samenkomen.
Eigen SaaS-product · live demo
OnboardForge
OnboardForge is een multi-tenant SaaS-platform voor persoonlijke, functie-gebaseerde onboarding en kennisbeheer. In plaats van één generieke handleiding stelt het platform per medewerker automatisch een traject samen: een content-assemblage-engine combineert herbruikbare modules op basis van segmenten (functie, afdeling, team, locatie), zodat generieke en functie-specifieke informatie naast elkaar staan — zonder duplicatie.
De inhoud is type-gedreven: documenten met PDF- en afbeeldingsbijlagen, visuele workflows (flowcharts), afvinkbare checklists, contactkaarten, video's en links. Een traject loopt op maand·week·dag-planning; medewerkers vinken stappen af, geven per versie een 'gelezen en begrepen'-akkoord en maken kennischecks. HR en managers zien de voortgang live.
OnboardForge is een verkoopbaar product van Haan Software Solutions: elke klant is een eigen tenant met eigen accounts, rollen en branding (accentkleur, merknaam) en de volledige interface is tweetalig (NL/EN). Onder de motorkap deelt het de beproefde architectuur van EdgeForge — FastAPI met een rol-gebaseerd rechtenmodel en een append-only audittrail. De publieke demo logt je automatisch in als medewerker en reset elk uur.
De uitdaging
Nieuwe medewerkers krijgen vaak één dik, generiek inwerkdocument waarin het meeste niet over hun functie gaat. Tegelijk moet een organisatie kunnen aantonen dát — en welke versie — iemand heeft gelezen; lastig met losse PDF's en mailtjes.
De aanpak
Eén engine die per profiel een persoonlijk, gefaseerd traject samenstelt uit herbruikbare, gepubliceerde modules — met personalisatievariabelen in de tekst. Akkoorden worden versie-gebonden vastgelegd; wijzigt de inhoud, dan vraagt het platform automatisch opnieuw om akkoord.
Het resultaat
Aantoonbare, persoonlijke onboarding die meeschaalt over meerdere klanten: elke medewerker ziet precies wat voor hem relevant is, HR houdt grip via rapportage en een complete audittrail, en hetzelfde platform bedient elke tenant met eigen branding en taal.
Onder de motorkap
Technische highlights
Eigen platform · live demo
TwinForge
Een digital twin van een industrieel proces, helemaal in de browser. TwinForge simuleert een batch meng-/verwarmtank met échte besturing: twee PID-regelaars (niveau en temperatuur), een batchsequentie met vergrendelingen en een SCADA-achtige bedieningsinterface. Schuif aan de setpoints, start de batch en injecteer storingen — en zie de regeling live reageren.
TwinForge is de ontbrekende schakel in de Forge-familie: waar EdgeForge data verzamelt en InsightForge data analyseert, laat TwinForge de besturingskant zien — precies waar mijn industriële achtergrond (PLC, regeltechniek, HMI/SCADA) en moderne software samenkomen. Dezelfde tags die de simulator produceert worden ook via een ingebouwde OPC UA-server gepubliceerd, klaar om door EdgeForge te worden ingelezen. Zo is de hele keten zichtbaar: simuleren → verzamelen → analyseren.
De server draait een vaste-scan regellus (zoals een PLC) en streamt de proceswaarden via een WebSocket naar de browser. Draait als losse FastAPI-backend met een React-frontend — 24/7 gehost op een Raspberry Pi 5 met Docker en een Cloudflare Tunnel.
De uitdaging
Besturing en regeltechniek zijn lastig te laten zien: je hebt er normaal een machine, PLC en HMI voor nodig. Voor een opdrachtgever of in een portfolio blijft die kant daardoor onzichtbaar.
De aanpak
Het proces én de besturing in software nabouwen: een vaste-scan regellus met PID-loops en een batch-toestandsmachine, bediend via een live SCADA-interface in de browser — en de proceswaarden ontsloten via OPC UA.
Het resultaat
Iedereen kan met een echt regelsysteem spelen — setpoints verschuiven, een batch draaien, storingen injecteren — en de keten zien doorlopen naar EdgeForge en InsightForge. Besturing, dataverzameling en analyse in één verhaal.
Onder de motorkap
Technische highlights
- Vaste-scan regellus (10 Hz) zoals een PLC, met twee PID-regelaars (niveau en temperatuur) inclusief begrenzing en anti-windup
- Batchsequentie als toestandsmachine (vullen → verwarmen → mengen → aftappen) met vergrendelingen, plus analoge én discrete besturing in één model
- Fysica-simulatie van niveau en temperatuur (flow-balans en warmtebalans), stabiel op de scan-interval
- Storingen injecteren (sensor vastgelopen, klep klem, pomp uitgevallen, verwarming defect) met direct zichtbaar effect en alarmering
- Live SCADA-HMI: geanimeerde tank-mimic (SVG), trendgrafiek met dubbele as (ECharts) en bediening met setpoints en modus auto/handmatig
- Realtime via WebSocket: de server pusht proces-snapshots, de browser herverbindt automatisch bij uitval
- Ingebouwde OPC UA-server (asyncua) die dezelfde tags publiceert — de brug naar EdgeForge, zodat de Forge-keten end-to-end werkt
- Demo-vriendelijk: bediening is gelimiteerd tegen misbruik en de simulatie reset zichzelf automatisch wanneer het stil is
- Uitbreidbaar via een proces-registry: een nieuw proces is één module die zichzelf registreert; engine, OPC UA en frontend blijven generiek
- Tweetalige interface (NL/EN) en deployment zonder publiek IP: FastAPI-backend in Docker op een Raspberry Pi 5, naar buiten via een Cloudflare Tunnel
Eigen platform · live demo
EdgeForge
Een industrieel edge-dataplatform dat realtime data verzamelt uit uiteenlopende machines en protocollen, opslaat in een tijdreeksdatabase en toont in live dashboards — met crash-safe opslag zodat er bij netwerk- of serveruitval geen meetdata verloren gaat.
Helemaal zelf ontworpen en gebouwd: van de protocol-drivers en de opslag-pipeline tot de webinterface met dashboards, data-viewer, alarmering, gebruikersbeheer en back-ups. Eén commando met Docker en het hele platform draait — op een industriële pc, server of in de cloud.
In één webinterface werken operators en engineers samen: live dashboards met realtime tegels, een interactieve data-viewer om historie te analyseren, node-analytics met statistieken en limietoverschrijdingen, en een system monitor die de complete datastroom — van machine tot database — live bewaakt.
Betrouwbaarheid staat voorop: elke verbinding herstelt zichzelf automatisch na uitval, metingen worden lokaal gebufferd tot de tijdreeksdatabase weer bereikbaar is, en rolgebaseerde toegang scheidt meekijken van configureren. Back-ups van configuratie én meetdata draaien volgens schema, zodat een installatie lang onbeheerd kan doordraaien.
De uitdaging
Industriële data zit verspreid over machines met elk hun eigen protocol. Eén betrouwbaar, centraal overzicht ontbreekt vaak — en bij uitval mag er geen meetdata verloren gaan.
De aanpak
Meerdere protocollen tegelijk uitlezen met persistente verbindingen en automatische reconnect; elke waarde op zijn eigen interval wegschrijven naar InfluxDB; lokaal bufferen tijdens uitval.
Het resultaat
Geen meetdata gaat meer verloren bij uitval. Operators zien alles in live dashboards met alarmering — één overzicht in plaats van losse machines — analyseren en exporteren historie, en draaien het hele platform met één commando via Docker.
Onder de motorkap
Technische highlights
- Multi-protocol acquisitie (OPC UA, EtherNet/IP, S7-1500, Modbus TCP, MQTT, REST) met per-server reconnect-backoff
- Crash-safe store-and-forward — SQLite-buffer vangt schrijfacties op bij InfluxDB-uitval en flusht automatisch
- Live dashboards met realtime tegels en een full-screen data-viewer (ECharts): lijn/vlak/staaf/scatter/histogram/heatmap, meerdere assen, limietlijnen en annotaties
- Node-analytics: statistieken (gemiddelde, min/max, standaarddeviatie, trend), limietoverschrijdingen, time-of-day-breakdown en node-vergelijking — met CSV/Excel/JSON-export
- Alarm-engine met high/low-limieten, deadband en lifecycle (getriggerd → bevestigd → gewist), inclusief notificatiekanalen en -regels
- Hiërarchische indeling in locaties en groepen, plus herbruikbare machine-templates voor snelle uitrol
- Authenticatie & RBAC: viewer/engineer/admin-rollen, JWT, bcrypt, audit-log
- Security: CSP-headers, rate limiting, en PLC-credentials versleuteld opgeslagen (Fernet + PBKDF2)
- Back-up & herstel van zowel configuratie als tijdreeksen, met geplande dagelijkse back-ups
- Volledige deployment met Docker Compose (platform + nginx + InfluxDB) en een deploy-wizard voor installatie op locatie
Eigen platform · live demo
SignalForge
Een ML-laag bovenop de OT-data die EdgeForge verzamelt: robuuste anomaliedetectie, forecasting en één verklaarbare asset-health-score per installatie. SignalForge is het sluitstuk van de keten — simuleren (TwinForge) → verzamelen (EdgeForge) → analyseren (SignalForge).
Onder de motorkap draait een ensemble van detectoren op gedetrende residuen, aangevuld met zware modellen (STL-residu, CUSUM, multivariate Isolation Forest) die alleen op een periodieke refit draaien. Daarbovenop: correlatie- en lead-lag-analyse voor root-cause, en forecasting met een tijd-tot-grenswaarde. Alles vat samen in één begrijpelijke gezondheidsscore (0–100) met uitleg per factor.
De demo draait live op de échte EdgeForge-data (InfluxDB), met een curated scenario-showcase ernaast zodat er altijd iets te zien is. De analyse is puur statistisch; een optionele, standaard uitgeschakelde AI-laag kan een anomalie of health-score in gewone taal toelichten.
Draait als losse FastAPI-backend met een React-frontend — 24/7 gehost op een Raspberry Pi 5 met Docker en een Cloudflare Tunnel, naast EdgeForge en TwinForge op dezelfde machine.
De uitdaging
Ruwe OT-data wordt zelden echt geanalyseerd. Sluipende drift, ongebruikelijke signaalcombinaties en naderende grensoverschrijdingen blijven onzichtbaar tot er een storing of stilstand is.
De aanpak
Een ML-laag bovenop EdgeForge: lichte detectoren elke cyclus, zware modellen op de refit, correlatie/lead-lag en forecasting — samengevat in één verklaarbare health-score in plaats van een berg losse grafieken.
Het resultaat
Per installatie één begrijpelijke score (0–100) met uitleg, een live anomalie-feed, forecasting met tijd-tot-grenswaarde en root-cause-hints — draaiend op de echte EdgeForge-data, met curated scenario's ernaast.
Onder de motorkap
Technische highlights
- Drie lichte detectoren (robuuste z-score/MAD, EWMA-controlekaart, IQR/Hampel) op gedetrende residuen, met ensemble-merge zodat hetzelfde event niet dubbel telt
- Drie zware detectoren (STL-residu, CUSUM change-point, multivariate Isolation Forest) die alleen op de periodieke refit draaien — zo blijft de hot-loop licht op de Pi
- Verklaarbare asset-health-score (0–100) uit vijf gewogen factoren (anomalie-tempo, baseline-afwijking, trend, grensnabijheid, signaalkoppeling), elk met NL/EN-uitleg én historie
- Forecasting (Holt-Winters met lineaire-trend-fallback) met betrouwbaarheidsband en time-to-threshold: wanneer kruist een signaal naar verwachting zijn alarmgrens
- Correlatie & root-cause: Pearson-heatmap plus lead-lag-kruiscorrelatie ("X loopt N s voor op Y"); koppelingsdrift voedt de signaalkoppeling-factor van de health-score
- Refresh-worker pullt elk venster → detecteert → scoort → broadcast een compacte snapshot over WebSocket; on-demand endpoints (forecast/correlatie) zijn gecachet en draaien nooit in de hot-loop
- Databron-adapter met drie backends achter één interface (InfluxDB-direct, EdgeForge-REST, synthetisch met geplante anomalieën) met graceful fallback; een live overlay toont een curated scenario-showcase náást de echte assets
- Curated storingsscenario's (spike, drift, ramp-naar-grens, seizoensbreuk, correlatie-breuk) met auto-rotatie en idle-revert, zodat de demo 24/7 levendig blijft
- Optionele, standaard uitgeschakelde AI-uitleglaag (klein Claude-model) die een anomalie of health-score in NL/EN toelicht — de publieke demo blijft puur statistisch
- Tweetalig (NL/EN), light/dark en in de huisstijl; FastAPI + React/Vite/TypeScript in Docker op een Raspberry Pi 5, naar buiten via een Cloudflare Tunnel
Eigen platform · live demo
InsightForge
Stel je data een vraag in gewone taal en krijg een antwoord plus de juiste grafiek terug. InsightForge is een AI-laag bovenop tijdreeks- en tabeldata — je hoeft geen querytaal te kennen. Een taalmodel naar keuze — Claude of een open model (Qwen, DeepSeek, Llama) — vertaalt je vraag via tool use naar een veilige, alleen-lezen query, draait die tegen de gekozen databron en kiest er passende grafieken bij.
InsightForge hoort samen met EdgeForge bij de Forge-familie: dezelfde industriële domeinkennis, nu gericht op het ontsluiten van data. De databron kies je in de demo zelf — van demo-data (DuckDB/CSV) en SQLite tot industriële tijdreeksen in InfluxDB (1.x, 2.x en 3) — en de AI verkent eerst zelf de structuur van de bron voordat hij de query schrijft. Naast de vraagbalk maakt InsightForge ook een dagelijkse AI-samenvatting per bron: in de demo genereer je die op aanvraag, self-hosted draait hij op een timer. De volgende stap maakt de kern open source. Het einddoel: een open-core product waarmee het MKB zonder datakennis inzicht uit eigen data haalt.
Alles blijft transparant: de demo toont live welke query het model schrijft, streamt het antwoord woord voor woord en rendert de grafieken in de huisstijl. Draait als losse FastAPI-backend met een React-frontend — 24/7 gehost op een Raspberry Pi 5 met Docker en een Cloudflare Tunnel, die zichzelf automatisch bijwerkt vanaf de repository.
De uitdaging
Waardevolle data zit in databases en CSV's, maar de inzichten zitten op slot achter querytalen en dashboards die je eerst moet bouwen. Niet-technische gebruikers komen er niet bij.
De aanpak
Een taalmodel als veilige tussenlaag: het vertaalt een vraag in gewone taal naar een alleen-lezen, geparametriseerde query (via tool use — geen vrije SQL in tekst), draait die en stelt er passende grafieken bij voor.
Het resultaat
Iedereen stelt z'n data een vraag en krijgt direct een onderbouwd antwoord mét grafiek — tweetalig (NL/EN), met de uitgevoerde query zichtbaar voor wie wil controleren.
Onder de motorkap
Technische highlights
- Vraag → query via tool use: alleen-lezen, geparametriseerde queries (geen vrije SQL) met een read-only-validator per databron en querytaal
- Streaming-ervaring: live voortgang (vertalen → uitvoeren → grafiek → schrijven) en het antwoord woord voor woord via Server-Sent Events
- Automatische grafiekkeuze: het model stelt één of meer grafieken voor (lijn/vlak/staaf/scatter/taart/heatmap, dubbele assen en combinaties), gerenderd met ECharts
- Meerdere databronnen met bronkiezer in de UI: DuckDB (CSV/Parquet), SQLite en InfluxDB in drie smaken — 2.x (Flux), 1.x (InfluxQL) en 3 (SQL); een nieuwe bron is één adapter + registry-regel
- Zelf-verkennende AI: het model krijgt een automatisch opgebouwde catalogus van de bron en mag eerst alleen-lezen verkennen voordat het de definitieve query schrijft — de structuur van de database maakt niet meer uit
- Dagelijkse AI-samenvatting per bron (“Daily insight”-kaart): een korte samenvatting van de opvallende recente veranderingen met grafiek — in de demo op aanvraag te genereren (gemeterd op hetzelfde gratis tegoed), self-hosted op een dagelijkse timer
- Gesprek met context: een vervolgvraag wordt beantwoord met de vorige vraag-en-antwoord-beurten erbij, zodat je kunt doorvragen op een eerder resultaat
- Export: elk resultaat is als CSV te downloaden en elke grafiek als PNG-afbeelding
- Tweetalige interface (NL/EN) en antwoorden in de taal van de vraag
- Modelkeuze in de UI: Claude (Haiku, Sonnet, Opus) of goedkope open modellen (Qwen3-Coder, DeepSeek, Llama 4) via OpenRouter — de tool-use-loop is provider-onafhankelijk
- Bring-your-own-key: een gedeeld gratis tegoed in credits, gewogen naar modelprijs (per IP + dagcap), of plak je eigen Anthropic- of OpenRouter-sleutel — die blijft in de browser en gaat rechtstreeks naar de provider
- Transparant: de uitgevoerde query's en de ruwe data zijn altijd in te zien naast het antwoord
- Deployment zonder publiek IP: FastAPI-backend in Docker op een Raspberry Pi 5 (24/7, zuinig), naar buiten via een Cloudflare Tunnel en automatisch bijgewerkt vanaf de repository; frontend als Cloudflare Worker (static assets)
- Testsuite en CI: pytest en vitest dekken de validator, rate limiter, tool-use-loop en chartbuilder; GitHub Actions draait alle checks bij elke push
- Open-core op de roadmap: een open source kern (MIT) en een betaalde hosted/Pro-tier
Maatwerk-applicatie
PlannerTool
Een complete planning- en capaciteitstool voor een engineeringafdeling, die een verouderd Excel/Access-systeem vervangt. Engineers, taken en projecten komen samen in één overzicht dat automatisch de beschikbare uren per persoon per week berekent — rekening houdend met verlof, feestdagen en intern werk.
Helemaal zelf ontworpen en gebouwd: een Python-backend met een React-frontend, samengebundeld tot één Windows-installatie. Meerdere pc's werken realtime samen op één gedeelde database — zonder centrale server of IT-beheer. Plannen gebeurt visueel met slepen, afhankelijkheden tussen taken, kritieke-pad-analyse en kant-en-klare rapportages.
De uitdaging
Planning van een engineeringafdeling zat verspreid in fragiele Excel- en Access-bestanden: foutgevoelig, lastig te delen en zonder zicht op wie er écht ruimte heeft in de planning.
De aanpak
Eén applicatie die de capaciteit per engineer automatisch berekent en taken visueel laat plannen, met afhankelijkheden en templates — gebouwd als moderne webinterface, maar gebundeld als gewone desktop-app op een gedeelde database.
Het resultaat
Het hele team plant realtime in hetzelfde overzicht, ziet direct over- en onderbezetting, en haalt er rapportages, PDF's en Excel-exports zo uit — zonder centrale server of IT-beheer.
Onder de motorkap
Technische highlights
- Capaciteits-gewogen urenverdeling: taakuren worden naar rato van de netto-beschikbaarheid over de weken verdeeld, zodat verlofweken automatisch worden overgeslagen
- Interactief planning-grid: slepen om te herplannen, duur aanpassen met live load-preview en multi-select voor bulkacties
- Taak-afhankelijkheden (FS/SS/FF/SF) met automatische doorrekening en kritieke-pad-analyse (CPM)
- Herbruikbare projecttemplates: hele reeksen taken met afhankelijkheden in één keer uitrollen op een project
- Rapportages en analytics met interactieve grafieken (capaciteit, betrouwbaarheid, KPI's) en snapshots om plannen in de tijd te vergelijken
- Gedeelde SQLite-database (WAL) op een netwerkschijf: meerdere gebruikers tegelijk, met retry-logica tegen lock-conflicten
- Export naar PDF (server-side gerenderd met Playwright) en Excel (openpyxl), met behoud van opmaak en kleurcodering
- Type-veilig van voor tot achter: Pydantic-schema's in de backend gespiegeld door TypeScript-types in de frontend
- Eén-klik distributie: de hele app (Python-runtime, server en webinterface) gebundeld tot één Windows-installer met PyInstaller en NSIS — installeerbaar zonder adminrechten
- Database-migraties draaien automatisch bij het opstarten, zodat alle gebruikers altijd hetzelfde schema delen
Iets soortgelijks nodig?
Van besturing tot dashboard — in één hand.
Een machine die uitgelezen moet worden, data die ergens samen moet komen, of een applicatie op maat? Laten we kijken naar de beste aanpak.
Plan een vrijblijvende kennismaking