[{"data":1,"prerenderedAt":310},["ShallowReactive",2],{"profile":3,"projects":133,"devlog-2026-11-09-spraakketen-gesprek-printer":175,"devlog-all":293,"devlog":306},{"id":4,"about":5,"aboutTitle":6,"availability":7,"availabilityShort":8,"contact":9,"dummy":12,"education":13,"email":25,"extension":26,"focus":27,"links":28,"meta":31,"name":32,"portrait":33,"qualities":34,"site":47,"skills":50,"stem":107,"study":108,"tagline":109,"taglineHighlights":110,"terminal":113,"work":116,"__hash__":132},"profile\u002Fprofile.yml","Ik ben Jesse, tweedejaars HBO-ICT-student aan de Hogeschool van Amsterdam met de specialisatie Software Engineering. Ik ben gemotiveerd, leergierig en ondernemend: naast mijn studie bouw ik aan een eigen SaaS-product voor vakmensen. Sportief ben ik ook: ik gaf een seizoen ski- en snowboardles in Oostenrijk. Ik werk het best in een team, waar ideeën scherper worden omdat je ze deelt.\n","Ik leer het snelst door te bouwen, liefst samen met anderen.","Stage vanaf februari 2027","feb 2027",{"title":10,"text":11},"Op zoek naar een stagiair met energie?","Ik zoek een stage vanaf februari 2027. Stuur gerust een bericht.",true,[14,19],{"period":15,"current":12,"title":16,"org":17,"text":18},"2024 – heden","Bachelor HBO-ICT · Software Engineering","Hogeschool van Amsterdam","Focus op backend en AI, scrum en werken in projectteams.",{"period":20,"current":21,"title":22,"org":23,"text":24},"2018 – 2023",false,"Havo","Bonhoeffer College, Castricum","Dubbelprofiel: Natuur & Techniek en Natuur & Gezondheid.","Wilffertjesse@gmail.com","yml","Full-stack · backend & AI",{"linkedin":29,"github":30},"https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fjesse-wilffert-1410b0448\u002F","https:\u002F\u002Fgithub.com\u002Fjessewilf1209",{},"Jesse Wilffert","Portrait.jpg",[35,38,41,44],{"title":36,"text":37},"Energiek","Ik breng tempo en zin in een project.",{"title":39,"text":40},"Samenwerken","Ik deel wat ik weet en vraag actief om feedback.",{"title":42,"text":43},"Loyaliteit","Ik maak af waar ik aan begin, ook als het lastig wordt.",{"title":45,"text":46},"Flexibel","Ik schakel snel tussen taken, rollen en tools.",{"version":48,"updated":49},"1.1.1","9 nov 2026",[51,67,82,95],{"group":52,"items":53},"Programmeertalen",[54,57,59,62,64],{"name":55,"note":56},"Java","2 jr",{"name":58,"note":56},"JavaScript",{"name":60,"note":61},"TypeScript","1 jr",{"name":63,"note":56},"SQL",{"name":65,"note":66},"HTML & CSS","3 jr",{"group":68,"items":69},"Frameworks",[70,73,76,79],{"name":71,"note":72},"Spring Boot","backend",{"name":74,"note":75},"Vue.js","frontend",{"name":77,"note":78},"Pinia","state",{"name":80,"note":81},"Tailwind CSS","styling",{"group":83,"items":84},"Tools",[85,87,89,91,93],{"name":86},"Git",{"name":88},"GitLab & GitHub",{"name":90},"Vercel",{"name":92},"Docker",{"name":94},"Claude Code",{"group":96,"items":97},"Talen",[98,101,104],{"name":99,"note":100},"Nederlands","moedertaal",{"name":102,"note":103},"Engels","vloeiend",{"name":105,"note":106},"Duits","basis","profile","HBO-ICT · Software Engineering, HvA","Software engineering-student die bouwt wat echt gebruikt wordt, van Java- en Python-backend tot AI-toepassing in Next.js.",[111,112],"Java- en Python-backend","AI-toepassing in Next.js",{"whoami":114,"stack":115},"jesse wilffert · student software engineering @ HvA","java  python  typescript  next.js  vue",[117,122,127],{"period":118,"current":12,"title":119,"org":120,"text":121},"2022 – heden","Keukenmedewerker","Cafetaria Family, Uitgeest","Snel en nauwkeurig werken onder tijdsdruk in een klein team.",{"period":123,"current":21,"title":124,"org":125,"text":126},"2022 – 2023","Ski- en snowboardleraar","Leverreizen, Oostenrijk","Les gegeven aan groepen van verschillende niveaus.",{"period":128,"current":21,"title":129,"org":130,"text":131},"2020 – 2022","Vakkenvuller","Albert Heijn","Eerste bijbaan: zelfstandig werken en verantwoordelijkheid nemen.","jw6i42pGEeH8DW__j6MrFUtKXp_mA51RIq34MFRkiGI",[134,150,162],{"slug":135,"title":136,"order":137,"year":138,"status":139,"statusLabel":140,"summary":141,"tags":142,"terminalStack":149},"offerte-agent","Offerte-Agent",1,"2026","wip","In ontwikkeling · eigen project","AI-chatwidget die hoveniers op hun eigen website plaatsen. De widget voert het intakegesprek met een potentiële klant, verzamelt alles voor een offerte (ook foto’s van de tuin) en geeft elke aanvraag een leadscore in een eigen dashboard.",[60,143,144,145,146,147,148],"Next.js","React","Supabase","PostgreSQL","Amazon Bedrock","Zod","nextjs · supabase · bedrock",{"slug":151,"title":152,"order":153,"year":138,"status":139,"statusLabel":154,"summary":155,"tags":156,"terminalStack":161},"ai-profile","AI Profile",2,"In ontwikkeling · schoolproject","Interactieve AI-booth die eruitziet als een vriendelijke chatbot, maar ongemerkt een profiel van de bezoeker opbouwt en dat aan het einde laat zien en uitprint. Voor de opdracht GenAI Exposed van het Lectoraat Responsible IT (HvA).",[157,158,60,144,80,159,160],"Python","FastAPI","Ollama","Claude API","python · fastapi · ollama",{"slug":163,"title":164,"order":165,"year":138,"status":166,"statusLabel":167,"summary":168,"tags":169,"terminalStack":174},"its-never-too-late","It’s Never Too Late",3,"done","Afgerond en live · eigen project","Volledig herbouwde website voor een spreker en ervaringsdeskundige, als eigen WordPress child theme. De site vertelt zijn verhaal, toont zijn diensten en referenties, en heeft een voorinschrijvingspagina voor zijn aankomende boek.",[170,171,58,172,173],"PHP","WordPress","CSS","HTML","wordpress · php · vanilla js",{"id":176,"title":177,"body":178,"date":283,"description":284,"dummy":21,"extension":285,"hash":286,"meta":287,"navigation":12,"path":288,"project":151,"seo":289,"stem":290,"type":291,"__hash__":292},"devlog\u002Fdevlog\u002F2026-11-09-spraakketen-gesprek-printer.md","Bouwen, koppelen en printen",{"type":179,"value":180,"toc":276},"minimark",[181,185,190,193,196,199,203,206,209,212,222,225,228,232,235,242,248,254,257,263,267,270,273],[182,183,184],"p",{},"In deze week kwam alles samen.",[186,187,189],"h2",{"id":188},"de-spraakketen","De spraakketen",[182,191,192],{},"Ik heb de onderdelen aan elkaar geknoopt: microfoon, Whisper, antwoord, Piper, speaker. Opnemen gaat met een knop (push-to-talk). Automatisch detecteren wanneer iemand praat klinkt mooier, maar op een drukke expo is een knop veel betrouwbaarder. Als eerste test gaf de booth gewoon je eigen zin terug. Je drukte op de knop, praatte, en hoorde jezelf terug in de stem van de robot.",[182,194,195],{},"Daarna heb ik foutafhandeling toegevoegd en een reset die op elk moment werkt. Op een expo loopt iemand gewoon weg midden in een zin, en de volgende bezoeker moet dan schoon kunnen beginnen.",[182,197,198],{},"Ook liep ik tegen een privacyprobleem aan. Twee bibliotheken die we gebruiken (Piper en de WebSocket-verbinding) schreven op het gedetailleerde logniveau wel tekst weg. Daar zou dus kunnen staan wat een bezoeker zei. Ik heb dat dichtgezet en tests geschreven die bij elk gesprek controleren dat er niets naar schijf gaat en dat er geen tekst van bezoekers in de logs staat.",[186,200,202],{"id":201},"een-gesprek-zonder-taalmodel","Een gesprek zonder taalmodel",[182,204,205],{},"Welk taalmodel we gaan gebruiken lag nog open. Ik wilde daar niet op wachten, dus ik heb eerst een gescript gesprek gebouwd. Mijn team had per persona de vragensets geschreven, en ook de rest van de vragen. Ik heb die in de backend geïmplementeerd. Alle teksten staan in één bestand: de begroeting, de vragen en een lijst thema's met trefwoorden. Zo kan het team de teksten aanpassen zonder dat iemand de code hoeft aan te raken. Noemt een bezoeker \"voetbal\", dan vraagt de AI daarop door en komt \"Sport: voetbal\" op het profiel, met aannames die vooraf geschreven zijn.",[182,207,208],{},"Het gesprek en het profiel heb ik bewust gescheiden. De chat blijft onschuldig en vriendelijk, een aparte profiler bouwt op de achtergrond het profiel op. Precies zoals de installatie het straks ook moet laten zien. Later kan het taalmodel de plek van het script innemen, achter dezelfde interface. Het script is dus eigenlijk de fake van het taalmodel.",[182,210,211],{},"Twee keuzes die ik interessant vond:",[213,214,215,219],"ul",{},[216,217,218],"li",{},"Op het profiel staan alleen woorden uit ons eigen script, nooit wat de bezoeker letterlijk zei. Zegt iemand \"ik voetbal bij VV Diemen sinds mijn achtste\", dan komt er alleen \"Sport: voetbal\" op.",[216,220,221],{},"De trefwoorden snappen geen ontkenning. \"Ik haat sport\" zet ook Sport op je profiel. Dat hebben we zo gelaten, want het laat goed zien hoe snel een AI conclusies trekt.",[182,223,224],{},"Sommige vragensets van het team beginnen met een ja-nee-vraag. Dat sluit aan bij wat de testpersoon in de guerrilla test zei. Ik heb het zo gebouwd dat de AI bij een nee de rest van die set overslaat.",[182,226,227],{},"Daarna heb ik de frontend van de creative technologists aan de backend gekoppeld. De robot praat, de tekstballon loopt gelijk met de stem, en bij de onthulling van het profiel wordt het gezicht rood.",[186,229,231],{"id":230},"de-printer-het-lastigste-stukje","De printer: het lastigste stukje",[182,233,234],{},"Mijn teamgenoot had de bonnenprinter al los getest. Mijn taak was hem aan de applicatie te koppelen, zodat het profiel na het gesprek automatisch uitgeprint wordt. Dat bleek lastiger dan ik dacht, door drie dingen.",[182,236,237,241],{},[238,239,240],"strong",{},"1. Het ontwerp van de bon paste niet bij de data."," Op het voorbeeld van de bon stonden naam, leeftijd en opleiding. Maar daar vraagt de AI niet naar. Ik heb die velden niet verzonnen, maar weggelaten of vervangen door iets wat we wel weten, zoals het aantal besproken onderwerpen.",[182,243,244,247],{},[238,245,246],{},"2. Het logo werd een zwart blok."," Het logo heeft een donkere sterrenhemel als achtergrond. Een thermische printer kent alleen zwart en wit, dus dat werd een groot zwart vlak. De backend maakt die achtergrond nu wit voordat hij print.",[182,249,250,253],{},[238,251,252],{},"3. Hoe praat je met de printer?"," De normale manier is via de printwachtrij van Windows. Maar die schrijft elke printopdracht even naar de harde schijf, en op een bon staat iemands profiel. Dat botst met onze regel dat er niets van bezoekers wordt opgeslagen. Er bestaat ook een manier met een andere driver (Zadig), maar dan werkt de printer niet meer als gewone Windows-printer. Uiteindelijk schrijft de backend nu rechtstreeks naar de USB-printpoort van Windows. Geen wachtrij, geen extra driver. Het nadeel is dat dit alleen op Windows werkt, maar de booth draait toch op Windows.",[182,255,256],{},"Daarnaast heb ik de opmaak van de bon losgehaald van het printen zelf. Zo kan ik de bon testen en bekijken in de terminal zonder dat er een printer aan hangt. Staat de printer uit, dan krijgt het scherm een foutmelding en loopt het gesprek gewoon door. Opnieuw printen kan, maar alleen na een fout en alleen voor dezelfde bezoeker. Zo komt er nooit een extra kopie van iemands profiel uit.",[182,258,259,262],{},[238,260,261],{},"Wat ik leerde:"," hardware aansluiten is meer dan \"werkt het of niet\". Elke keuze, zelfs welke route je naar de printer neemt, heeft gevolgen voor privacy.",[186,264,266],{"id":265},"sprint-review-en-society-50","Sprint review en Society 5.0",[182,268,269],{},"Op 6 november lieten we alles zien aan onze product owner. De spraak, het gesprek, het profiel en de bon werkten. De image recognition van mijn teamgenoot werkte als losse demo, maar is nog niet gekoppeld. Ook hebben we het op Society 5.0 getest met echte bezoekers.",[182,271,272],{},"Daar zag ik iets wat ik met mijn metingen op de laptop niet had gezien. Bij veel achtergrondgeluid had de spraakherkenning af en toe nog moeite. En soms dacht Whisper dat iemand Engels sprak terwijl diegene Nederlands praatte. Mijn metingen had ik gedaan met rustige opnames. Een expo is iets heel anders.",[182,274,275],{},"De feedback van de PO was eerlijk. Technisch zit het goed. Maar de persona's die we hadden toegevoegd, waren volgens haar een beetje afgedwaald van de kern. Ze miste de ruwe testdata van Society 5.0 en wat we daarmee doen. Ook wil ze een Nederlandse en een Engelse modus, zodat iedereen mee kan doen en niet alleen mensen die Nederlands spreken. En de belangrijkste vraag: waarom zou iemand überhaupt met de installatie gaan praten? Die vraag hoorden we op Society 5.0 ook van bezoekers.",{"title":277,"searchDepth":153,"depth":153,"links":278},"",[279,280,281,282],{"id":188,"depth":153,"text":189},{"id":201,"depth":153,"text":202},{"id":230,"depth":153,"text":231},{"id":265,"depth":153,"text":266},"2026-11-09","De spraakketen werkt van microfoon tot speaker, een gescript gesprek bouwt op de achtergrond het profiel op en de bonnenprinter print het uit zonder dat er iets op schijf komt. Op 6 november gedemonstreerd aan de product owner en getest op Society 5.0.","md",null,{},"\u002Fdevlog\u002F2026-11-09-spraakketen-gesprek-printer",{"title":177,"description":284},"devlog\u002F2026-11-09-spraakketen-gesprek-printer","feat","PgKumic-XXGdr8t1r7638eosvNnhQlPVcg9DyHij6cA",[294,295,300],{"path":288,"date":283,"title":177,"description":284,"type":291,"project":151,"hash":286},{"path":296,"date":297,"title":298,"description":299,"type":291,"project":151,"hash":286},"\u002Fdevlog\u002F2026-11-01-spraak-onderzoek-en-plan","2026-11-01","Spraak: onderzoek, een plan en meten in plaats van gokken","Piper gekozen voor text-to-speech, omdat het lokaal draait en Nederlandse stemmen heeft. Een plan geschreven met 21 user stories, elk onderdeel een interface en een fake gegeven, en de Whisper-modellen small en medium tegen elkaar gemeten.",{"path":301,"date":302,"title":303,"description":304,"type":305,"project":151,"hash":286},"\u002Fdevlog\u002F2026-10-25-flow-en-guerrilla-test","2026-10-25","Eerst snappen wat we bouwen","Voordat ik code schreef, heb ik de flow van de booth uitgetekend en een guerrilla test gedaan met het Figma-ontwerp, waarbij ik zelf de AI speelde. De omslag werkte, en de test gaf input die ik twee weken later nog gebruikte.","docs",[307,308,309],{"path":288,"date":283,"title":177,"description":284,"type":291,"project":151,"hash":286},{"path":296,"date":297,"title":298,"description":299,"type":291,"project":151,"hash":286},{"path":301,"date":302,"title":303,"description":304,"type":305,"project":151,"hash":286},1794297410524]