noda

Rol

Solo end-to-end ⁠— gebruikersonderzoek, productstrategie, merk en visueel ontwerp, Figma-designsysteem, Python data-engineering (ETL), FastAPI backend, React + Vite frontend, graph-visualisatie, DevOps

Klant

Zelf-geïnitieerd product

Disciplines

Product Design · UX Research · Designsystemen · Data & Analytics · Informatiearchitectuur

Jaar

2025–2026

Een gratis open-data-tool om EU-onderzoeksconsortia samen te stellen. Hij zet twee publieke datasets ⁠— OpenAlex en CORDIS ⁠— om in gerangschikte shortlists van partners en begeleidt de coördinator daarna door de rest van het werk: de call, de subsidieregels, de hiaten, de vergelijking en de eerste contacten. Voorheen Open Science Collaboration Network

Probleem
Partners zoeken voor EU Horizon-consortia gebeurt via persoonlijke netwerken en Google: twee tot vier weken, gestuurd door nabijheid, zonder bewijs dat een partner past
Inzicht
Een ruwe publicatieranking zet Harvard en MIT bij elk thema bovenaan. Pas als je EU-projecthistoriek en netwerkpositie meeweegt, komen de instellingen boven die echt in consortia stappen
Oplossing
Een open-data-platform dat ik solo en end-to-end bouwde: een Partner Fit Score van 0–⁠100 op zes signalen, een netwerkkaart, een hiatenanalyse tegen de Horizon-regels, live calls, vergelijken, een pipeline met conceptberichten, semantisch zoeken en AI-briefings
Resultaat
Live als noda op noda.science: 6 thema’s, 8.400+ gescoorde instellingen, 740.000+ samenwerkingsverbindingen, €0 per maand. WCAG 2.2 AA met 0 axe-fouten op 24 schermen

Partners zoeken voor Horizon Europe verloopt via persoonlijke netwerken ⁠— en dat merk je

EU Horizon Europe-subsidies (€95,5 miljard over 2021–⁠2027) vereisen bijna altijd een consortium uit meerdere landen met minstens drie partners. De samenstelling van het consortium is een beoordelingscriterium en een veelvoorkomende reden voor afwijzing. De officiële tool ⁠— Partners Search op het EU Funding Portal ⁠— geeft een ongerangschikte lijst namen, zonder publicatiegegevens, zonder netwerkcontext en zonder score. In tien jaar is ze nauwelijks veranderd.

Vier semigestructureerde interviews met onderzoekers die Horizon-aanvragen hadden ingediend, toonden telkens hetzelfde werkproces: de organisaties oplijsten die de PI al kent van congressen, affiliaties zoeken op Google Scholar, CORDIS met de hand doorzoeken, rondvragen op mailinglijsten. Nabijheid domineert: een organisatie buiten het netwerk van de PI had bijna geen kans op de shortlist, hoe goed ze ook paste. En hiaten in het consortium ⁠— de ontbrekende beleidsinstantie, de afwezige ngo ⁠— kwamen pas tijdens het schrijven boven, wanneer ze duur zijn om op te lossen.

Het probleem is geen gebrek aan data ⁠— OpenAlex en CORDIS zijn openbaar, volledig en gratis. Geen enkele tool had ze samengebracht in een vorm die past bij hoe partners echt gezocht worden

Partner Shortlist: instellingen gerangschikt op Partner Fit Score, te filteren op land, type en score

Vier pijnpunten ⁠— en één scherm dat niet in de oorspronkelijke specificatie stond

Het onderzoek combineerde vier methoden: vier stakeholderinterviews van 45 minuten, een analyse van 12 gefinancierde Horizon-projectbeschrijvingen op CORDIS, een concurrentieanalyse van het EU Funding Portal, ResearchGate en ERAPortal, en een technische spike om de dekking en datakwaliteit van OpenAlex en CORDIS te controleren.

Pijnpunt 1: zoeken hangt volledig af van het eigen netwerk. Pijnpunt 2: er is geen meetbaar signaal voor een goede match; partners worden gekozen op reputatie en vertrouwen. Pijnpunt 3: hiaten in het consortium worden laat ontdekt, tijdens het schrijven. Pijnpunt 4: CORDIS is onbruikbaar zonder tooling; alle vier de geïnterviewden kenden het, niemand gebruikte het geregeld.

Het scherm met consortiumhiaten kwam rechtstreeks uit pijnpunt 3. Het is het scherm dat het product het duidelijkst onderscheidt van een rangschikking van instellingen

Een ruwe publicatieranking zet Harvard bij elk thema bovenaan ⁠— en daar heb je niets aan

De Partner Fit Score is een gewogen score van 0 tot 100 op zes signalen: thematische relevantie (30%), publicatieactiviteit (20%), deelname aan EU-projecten (20%), netwerkcentraliteit (15%), landendiversiteit (10%) en recente activiteit (5%). Elk signaal wordt genormaliseerd via de percentielrang binnen het cohort van het thema, niet gedeeld door het maximum. Dat was de fout van de eerste versie: delen door het maximum duwde ongeveer 86% van de instellingen onder 30 en liet er per thema één of twee boven 70.

Elke score wordt bewaard met de bijdrage van elk signaal, zodat een onderzoeker precies ziet waarom een instelling op haar plaats staat: in het voorbeeld bij een rij in de shortlist, in de balken op het profiel en in de scorering, die één signaal toont terwijl je naar de rij ervan wijst. Onder de score toont het profiel het bewijs: de EU-projecten van de instelling die strikt over het thema gaan, haar rol in elk ervan, de partners waarmee ze het vaakst samenwerkt en een track record uit CORDIS.

Profiel: scorering, opsplitsing in zes signalen, bewijs

Track record: resultaten van de projecten waaraan de instelling deelnam

De koppeling is bewust voorzichtig. CORDIS en OpenAlex delen geen identificatienummer, dus organisaties worden binnen een land op naam gekoppeld. Een naamovereenkomst van 75–⁠90 telt nu alleen mee als het Research Organization Registry ze bevestigt. Een proefrun toonde dat dit ongeveer 56% van de deelnames schrapt, vaak universiteiten die gekoppeld waren aan ziekenhuizen met dezelfde naam. De aantallen EU-projecten vallen eerder te laag dan te hoog uit, en de methodepagina zegt dat ook.

Van shortlist naar consortium

De eerste versie stopte bij de shortlist. Daarna besteden coördinatoren weken aan alles wat volgt: de call kiezen, de regels nakijken, partners vergelijken die bijna gelijk scoren en opvolgen wie ze contacteerden. Geen gratis tool dekt dat stuk, dus het product groeide om het te dekken, met enkel open data.

Netwerkkaart: clusters, centraliteit, de sterkste verbindingen

Consortiumhiaten: rollen, de Horizon-regel, landen tegenover gefinancierde consortia

Hiaten worden getoetst aan bewijs, niet aan een sjabloon. Rollen zijn gekoppeld aan ROR-organisatietypes, en de pagina zegt dat dit een indicatie is. De subsidiabiliteitscheck dekt de algemene regel voor Research & Innovation Actions: drie partners in drie lidstaten of geassocieerde landen, minstens één in een EU-lidstaat. Je landen worden vergeleken met de consortia die op het thema effectief gefinancierd werden; voor Climate adaptation zijn dat 192 projecten uit meerdere landen, met een mediaan van zeven landen. Widening-landen worden gemarkeerd, omdat beoordelaars ze vaak graag zien.

Live Horizon-calls gekoppeld aan het thema, elk met een deadlinebanner

2–⁠4 partners vergelijken: verschillen eerst, identieke rijen ingeklapt

Pipeline: van shortlist tot partner, met de administratieve checklist

Conceptbericht op basis van echt bewijs, nooit verzonnen

AI-briefing: gegenereerd in de wekelijkse batch, nooit op het moment van een verzoek

Semantisch zoeken in de publicaties van het thema

noda.science — live-voorbeeld
Live-demo
noda.science
Openen

Live ⁠— zes onderzoeksthema’s, 8.400+ gescoorde instellingen, 740.000+ samenwerkingsverbindingen

Een tool voor ontwikkelaars wordt een product dat mensen vertrouwen

Het werkende product zag eruit als een tool voor ontwikkelaars: een donkerblauw dashboard zonder voordeur en met een naam die te lang was om hardop te zeggen. Het herontwerp gaf het een naam, noda, van “node”; een landingspagina die het product uitlegt voor ze om een klik vraagt; en één beeld: instellingen zijn kralen, samenwerkingen de draden ertussen. Het logo, de graph en de illustratie op de landingspagina komen allemaal daaruit voort.

Ik testte vijf paletten op dezelfde echte schermen, niet op stalen. Het gekozen palet heeft een lavendelgrijze pagina, inktkleurige tekst, een kobaltblauw accent en een limoengroene markeerstift die één keer per pagina terugkomt. Felle kleuren zoals limoen en lila halen als knopen op een lichte achtergrond geen contrast van 3:1, dus elke knoop kreeg een inktkleurige rand. Dat werd pas zichtbaar in de echte graph.

Daarna volgde een grafische audit, want het product slaagde voor elke automatische test en zag er toch onaf uit. Knoppen in één rij waren verschillend hoog, iconen stonden een pixel of twee naast hun label, twee derde van de tekst was 11–⁠13 px en de labels op de netwerkkaart waren onleesbaar. De ondergrens voor tekst ging naar 13 px voor bijschriften en 15 px voor interfacetekst. Bedieningselementen in een rij hebben nu één hoogte. De uitlijning van iconen werd gemeten tegen de hoofdletterhoogte van het label in plaats van op het oog: de correctie keert van teken tussen lopende tekst en knoppen. De kaart toont de 280 sterkste verbindingen en geeft enkel de 18 meest centrale instellingen een label; labels verdwijnen liever dan te krimpen.

Daarna beweging, en de details die je pas ziet bij gebruik. De hero op de landingspagina is een loop die ik in Cavalry bouwde: de vier knooppunten zijn kralen met de letters n·o·d·a, verbonden als consortium, terwijl partnerkralen van hun draad glijden, wegdrijven en weer worden opgevangen. Hij draait als transparante video, HEVC met alfakanaal voor Safari en elke iOS-browser en VP9 voor de rest, met een pauzeknop; buiten beeld en bij minder beweging staat hij stil. Korte woorden blijven niet meer aan het eind van een regel hangen: een script bindt 256 interfaceteksten, en een kleine pass doet hetzelfde voor namen die uit de data komen, zoals “de la Recherche”. En niets beweegt meer vanzelf. Wisselen van tab liet de pagina 7 px opzij springen doordat de scrollbalk flikkerde, twee tabs verlieten de gedeelde kolom, en de hero verschoof zodra het webfont binnenkwam. Elk probleem is gemeten, opgelost en opnieuw gemeten.

De hero van de landingspagina, gemaakt in Cavalry: n·o·d·a blijven staan terwijl partners komen en gaan

De 404-pagina kreeg hetzelfde idee in plaats van een standaardillustratie. Onbekende links toonden eerst de landingspagina met een 404-status; nu krijgen ze een eigen pagina, waar 4·0·4 hangen als een wieg van Newton met de kralen uit het product. Om de paar seconden zwaait de buitenste 4 tegen de 0, de draad van de 0 knapt, hij valt en rolt weg, en een draad zakt omlaag om hem terug te halen. Het wordt live op een canvas getekend in plaats van als video afgespeeld, zodat het elk scherm vult, en bezoekers kunnen een kraal vastpakken en wegslingeren. Niets komt ooit over de tekst, en bij beperkte beweging is het een stilstaand beeld met de 0 op de grond.

De 404-pagina: een wieg van 4·0·4-kralen, en de 0 verliest steeds zijn draad

De landingspagina op een telefoon

De kaart op een telefoon: labels verschijnen bij inzoomen

Het Figma-bestand is één designsysteem met twee modi, Wireframe en Hi-Fi, op gedeelde tokens. Na de audit mat ik elk live scherm met Playwright en bouwde ik opnieuw wat was afgeweken, tot en met de netwerkkaart, die in Figma de echte graph is: posities, groottes en kleuren overgenomen van de live site. Die synchronisatie vond drie echte bugs die de tests hadden gemist. Widening-landen werden nooit gemarkeerd, omdat een CSS-regel die later stond de markering overschreef. De rondleiding tekende een focusrand rond het hele dialoogvenster. En telefoons toonden labels van 7 px in de graph: Cytoscape rondt de zoom af naar boven, op een macht van twee, voor het beslist of een label te klein is.

Batch eerst: elke zware berekening gebeurt in de ETL, dus de API leest enkel en kost €0

De belangrijkste architectuurkeuze is onzichtbaar voor gebruikers: alle berekeningen ⁠— graphmetrieken, koppeling van organisaties, scores, embeddings, AI-briefings ⁠— gebeuren in een wekelijkse batchjob. De productie-API is een dunne leeslaag op vooraf berekende Postgres-tabellen, zonder LLM-oproep op het pad van een verzoek. Alles draait als één Docker-container op een bestaande Coolify/Hetzner-host, met de wekelijkse ETL als planner binnen het proces, dus de extra kost is €0.

Het moeilijkste technische probleem was het koppelen van organisaties tussen CORDIS en OpenAlex: geen gedeeld identificatienummer, enkel namen en landen. De pipeline groepeert eerst per land, wat de zoekruimte met ongeveer 95% verkleint, doet dan een rapidfuzz token-set match en raadpleegt het ROR-register alleen voor de twijfelzone van 75–⁠90. ROR bevragen voor elke organisatie, het oorspronkelijke ontwerp, liet de ETL vastlopen; eerst fuzzy matchen verminderde het aantal ROR-oproepen ongeveer honderdvoudig. Als ROR onbereikbaar is, houdt een thema de data van vorige week in plaats van fouten als afwijzingen te tellen.

De briefings hangen af van gratis LLM-diensten, die modellen zonder waarschuwing stopzetten. Eén zo’n stopzetting bevroor de briefings wekenlang zonder dat iemand het zag, dus de job kiest nu een model dat de aanbieder nog levert, valt terug op Google Gemini en faalt luid. De beveiliging kwam als laatste: zelf gehoste lettertypes zodat geen IP-adres van bezoekers bij Google belandt, een Content-Security-Policy zonder inline stijlen, rate limits op basis van een adres dat een vervalste header niet kan kiezen, en Dependabot op elke dependency.

Het ontwerp dat vastliep, de normalisatie die de scores brak, en de cijfers die ik kleiner maakte

Het oorspronkelijke ontwerp voor de koppeling bevroeg de ROR-API voor elke organisatie. Dat was niet alleen traag, het liet de ETL vastlopen. De herbouw zet drie lagen in een bewuste volgorde ⁠— per land groeperen, fuzzy matchen, ROR enkel voor de twijfelzone ⁠— en die volgorde is waarom de pipeline überhaupt afloopt.

De eerste scoreversie deelde elk signaal door het maximum van het cohort, en dat was fout op een manier die pas op schaal zichtbaar werd: ongeveer 86% van de instellingen viel onder 30, dus de shortlist maakte geen onderscheid meer tussen de instellingen waartussen een onderzoeker echt kiest. De percentielrang binnen het thema verving dat. Een scoremodel is niet af wanneer de formule zinnig oogt, pas wanneer de verdeling van de uitkomst bruikbaar is voor de beslissing.

De meeste correcties in de latere rondes lieten het product minder beweren. Onbevestigde naamovereenkomsten tellen niet meer mee, dus de aantallen EU-projecten halveren ongeveer. Een project telt alleen als thematisch met een themawoord in de titel of twee in de samenvatting, nadat één verdwaald woord een VR-project voor film in Climate adaptation had getrokken. “Data as of” telt alleen volledige dataruns, geen vernieuwde briefing. Elke wijziging maakte een cijfer kleiner en beter te verdedigen.

Live, gemeten, eerlijk over de grenzen

Stand oktober 2026: zes onderzoeksthema’s live, 8.400+ gescoorde instellingen, 740.000+ samenwerkingsverbindingen. axe meldt voor WCAG 2.2 AA 0 fouten op 24 schermen, op desktop en op een telefoon, zonder horizontaal scrollen van 320 tot 2560 px. Extra infrastructuurkost: €0. Bouwtijd: van november 2025 tot de MVP in mei 2026, daarna de consortiumworkflow, het herontwerp als noda en de grafische audit in oktober 2026, alles solo.

Wat ik anders zou doen: de nauwkeurigheid van de koppeling vroeger valideren. Ik bouwde de volledige pipeline voor ik de precisie mat; een spike van twee dagen op 200 CORDIS-organisaties had het probleem weken eerder blootgelegd. En vroeger als ontwerper naar het product kijken, niet pas wanneer de tests slagen: de bugs die dit jaar het zwaarst wogen, waren de bugs die alleen iemand zag die naar het scherm keek.

Het moeilijke deel was nooit de interface. Het was ervoor zorgen dat ik elk cijfer op het scherm regel per regel kon verdedigen

Bronnen

Volgend project
Climatique