AI-assistent för bostadsrättsföreningar och styrelser som hanterar återkommande e-postfrågor. Plockar upp inkommande mejl, matchar mot historiska ärenden och skriver ett utkast till svar baserat på hur styrelsen svarat förut. En styrelsemedlem godkänner eller justerar innan utskick.<br><br>Byggd på <em>Akka SDK</em> med event sourcing, integrerad med <em>Gmail</em> och <em>Google Sheets</em>. En <em>SmolLM2-135M</em> nano-LLM hanterar klassificering och utkastning — lätt nog att inte kräva en stor modell.<br><br><em>3-stegs teststrategi</em>: dummy-LLM:er för snabbhet och determinism, nano-modellen som realistiskt mellanlager, och produktionsmodellen för slutlig kvalitetskontroll.<br><br><a href="https://github.com/wbern/community-assistant" target="_blank" rel="noopener noreferrer">github.com/wbern/community-assistant</a>
Fjärrstyrd agentorkestrering på en <em>Raspberry Pi 4</em>, åtkomlig från mobilen via appen <em>Happy</em> (inklusive röststyrning). En <em>MCP-server</em> fungerar som kontrollplan: en Claude Code-instans startar och stoppar andra Claude Code-sessioner utifrån arbetsbelastning.<br><br>Varje agent har <em>GitHub</em>-åtkomst och kan självständigt köra tester, skapa pull requests och fortsätta arbeta medan operatören är borta från datorn. Hela uppsättningen provisioneras med <em>Ansible</em> — reproducerbar infrastruktur som går att deploya på kraftigare hårdvara, fler maskiner eller hos en kund.<br><br><a href="https://github.com/wbern/pi-pai" target="_blank" rel="noopener noreferrer">github.com/wbern/pi-pai</a>
Återställde funktionalitet i underhållslösa leverantörs-<em>DLL:er</em> utan tillgång till källkod. Kunden startade om sin servermjukvara var 15:e minut på grund av ett <em>race condition</em> i binärerna.<br><br><em>3-fasprocess</em>: dekompilerade DLL:erna (resultat ~80% korrekt, resten trasigt på grund av binärernas ålder); byggde en testsvit mot den befintliga setupen för att låsa in nuvarande beteende; fixade den dekompilerade koden tills varje test passerade; löste sedan själva samtidighetsproblemet.<br><br>Deployad via <em>Tailscale</em> till <em>5 kundsajter</em> med 3 rollback-strategier. Låste upp en betydande intäktsström för kunden.
Modernisering av ett desktopverktyg för lottning av schackturneringar från 2018 till en <em>ren webbapplikation</em>. Verktyget används fortfarande av många klubbar för sin enkelhet, och lottningsalgoritmerna är dess kärnvärde — parningar i schack är förvånansvärt komplicerade.<br><br>Den ursprungliga Java-frontenden kopplades isär från databasoperationerna och lottningslogiken exponerades via ett REST-lager. Byggde därefter <em>snapshot-tester av alla lottningspermutationer</em> — över 200 snapshots av hur databasen förändras under en turnering. Med det skyddsnätet på plats portades hela backenden till webbläsaren med <em>sql.js</em>; varje snapshot-test passerade vid första körningen.<br><br>Applikationen körs nu <em>helt offline i webbläsaren</em> — ingen backend behövs. <a href="https://lotta.bernting.se/?tab=pairings" target="_blank" rel="noopener noreferrer">lotta.bernting.se</a><br><br><a href="https://github.com/wbern/lotta" target="_blank" rel="noopener noreferrer">github.com/wbern/lotta</a>
Definierar tekniska regelverk för ett team som <em>Architectural Decision Records</em>, och startar sedan en kortlivad LLM-agent per ADR vars uppgift är att bedöma om kodändringar lever upp till varje regel. Teamets <em>process</em> är viktigare än själva verktyget — adr-lint automatiserar bara utvärderingen.<br><br>Samma princip tillämpad på en publicerad artikel om AI och tillit: <em>15 ADR:er</em> definierade ramarna innan en mening var skriven, och en agent per ADR granskade var och en av <em>22 utkast</em> oberoende. Open source.<br><br><a href="https://github.com/wbern/adr-lint" target="_blank" rel="noopener noreferrer">github.com/wbern/adr-lint</a>
Du tittar på den. Sajten är byggd med <em>Astro</em>, <em>TypeScript</em> och <em>testdriven utveckling</em> — discipliner som motverkar regressioner vid iteration.<br><br>Målet: en engagerande upplevelse snarare än ännu en generisk utvecklarsajt. Starkt påverkad av UX-personer som jag samarbetat med genom åren.<br><br><a href="https://github.com/wbern/william.bernting.se" target="_blank" rel="noopener noreferrer">github.com/wbern/william.bernting.se</a>
Slash-kommandoverktyg för AI-kodningsagenter som upprätthåller <em>testdriven utveckling</em>. Återanvändbara promptmallar kapslar in TDD-metodiken så att den inte behöver upprepas varje session — kompenserar för att kodningsagenter inte är tränade på praktiken.<br><br>Inkluderar en generator för att anpassa installationsplats. Repot har 100% testtäckning. Fick <em>över 100 GitHub-stjärnor över en natt</em> vid release. Open source.<br><br><a href="https://github.com/wbern/agent-instructions" target="_blank" rel="noopener noreferrer">github.com/wbern/agent-instructions</a>
Statisk analys som lyfter <em>beteendemönster i en kodbas</em> och pekar ut tydliga refaktoriseringsmöjligheter. Byggd för att ta bort den sociala friktionen kring kodkvalitet — verktyget visar mönstren neutralt så att teamet kan besluta tillsammans vad som ska städas.<br><br>Körs i CI eller lokalt. Open source.<br><br><a href="https://github.com/wbern/obscene" target="_blank" rel="noopener noreferrer">github.com/wbern/obscene</a>
Verktyg för att hantera <em>Claude Codes</em> vecko- och sessionsgränser. Pingar ett eller flera konton schemalagt så att gränserna återställs så tidigt som möjligt, och kan konfigureras för att tajma en sessionsreset till mitten av arbetsdagens peak.<br><br>Liten, fokuserad, open source — ett av flera verktyg byggda för att göra vardagsarbetet med AI-agenter förutsägbart.<br><br><a href="https://github.com/wbern/cc-ping" target="_blank" rel="noopener noreferrer">github.com/wbern/cc-ping</a>
Publik referensuppsättning för <em>Gas Town</em>-stil terminalbaserad agentorkestrering. Kör flera AI-agenter sida vid sida i terminalen — synliga snarare än dolda i bakgrunden — med tydlig struktur för vilken agent som äger vilken roll.<br><br>Ingen produkt; ett dokumenterat "så här satte jag upp det, om du vill replikera." <a href="https://github.com/wbern/gastown-me-and-my-crew" target="_blank" rel="noopener noreferrer">github.com/wbern/gastown-me-and-my-crew</a>
Litet kommando som visar <em>alla aktiva tmux-sessioner i en enda ruta</em> — en kontrolltornsvy för att övervaka många AI-agenter som körs parallellt. Open source.<br><br><a href="https://github.com/wbern/tmux-explode" target="_blank" rel="noopener noreferrer">github.com/wbern/tmux-explode</a>
Webbaserat schackbräde som spelar <em>öppningsreels</em> — ursprungligen byggt för att studera Hyper-Accelerated Dragon-varianten av Sicilianskt som svart.<br><br>Byggt med <em>testdriven utveckling</em> och en <em>diamantformad testsvit</em> — många något tyngre tester i mellanlagret — som visade sig särskilt välanpassad för agentisk kodning. Hanterar begränsningen att LLM:er inte kan spela schack genom att luta sig mot schackprotokoll och grundläggande principer.<br><br>En testbädd för att hantera stora mängder AI-skriven kod från grunden.
Presentation om <em>testdriven utveckling med AI-kodningsagenter</em>. Byggd helt från terminalen med Claude Code, slides skapade med <em>Slidev</em>, hostade på den här sajten — alltid tillgängliga och redo att köras.<br><br><a href="https://github.com/wbern/slidev-tdd-with-ai" target="_blank" rel="noopener noreferrer">github.com/wbern/slidev-tdd-with-ai</a>
Interaktiv dashboard byggd från en personlig export av <em>LinkedIn-konversationer</em>. Ungefär hälften av kalla kontakter kände sig tvungna att förklara sin förfrågan när de hälsades på — en tydlig effekt av att bryta normen.<br><br>Konversationerna kategoriserades i <em>13 kategorier</em> och visualiseras genom <em>7 vyer</em> som lyfter mönster i vem som är värd att lägga tid på. Byggd för att informera en kontaktstrategi från primärdata snarare än magkänsla.
Pipeline som omvandlar <em>AutoCAD-ritningar till 3D-visualiseringar</em> med LLM-agenter i varje steg. Varje transformationssteg utförs av en agent, utan manuell detaljstyrning av det visuella resultatet.<br><br>3D förblir ett utmanande område för agentisk kodning — mycket av ekosystemet är fortfarande inlåst bakom <em>proprietära assets och mjukvara</em>. Projektet visar gränserna för vad agenter kan och inte kan göra när ekosystemet inte är öppet.
Platformer i Doodle Jump-stil byggd från grunden med webbteknologi — ingen spelmotor. Egen <em>Entity Component System</em>-arkitektur i React: varje spelobjekt sätts ihop av lösa komponenter (position, hastighet, kollision, soliditet).<br><br>Fysiken använder <em>icke-linjär gravitation</em> med olika accelerationskurvor för uppåt- och nedåtrörelse. Stöder <em>tangentbord och touch</em>, renderad med <em>Pixi.js 7</em> via WebGL, testad med <em>Vitest</em>.<br><br><a href="https://github.com/wbern/platformer" target="_blank" rel="noopener noreferrer">github.com/wbern/platformer</a>
<em>RAG-baserad mejlrådgivare</em> för en fastighetsförvaltningskund med <em>38 000 historiska supportmejl</em>. Kombinerar <em>hybridsökning</em> — BM25 nyckelordssökning via SQLite FTS5 och vektorsökning via <em>LEANN</em>, ett grafbaserat retrieval-system som komprimerar lagringen med 97%. Resultaten slås ihop med <em>Reciprocal Rank Fusion</em> och matas till en lokal LLM via <em>Ollama</em>.<br><br>Träffsäkerheten gick från 40% till <em>100%</em> efter att metadataprefix och hybridstrategin lagts till. Körs helt privat på en <em>Proxmox-VM</em> provisionerad med Ansible — ingen data lämnar kundens servrar. <em>Telegram-bot</em> och en mejlbevakare ger personalen rådgivning i realtid, med källhänvisningar till de historiska mejl som låg till grund för svaret.
Inkrementell migrering av Telia.se från ett legacysystem byggt i <em>Freemarker</em> — en mallmotor djupt sammanflätad med affärslogiken — till en modern frontend, utan big bang-omskrivning.<br><br>Arbetet omfattade att bygga bryggor mellan gammalt och nytt, införa mönster som kunde samexistera med den befintliga kodbasen, och successivt fasa ut Freemarker-mallar utan att störa produktionstrafiken. Uppdraget i en mening: <em>migrera utan att stanna</em>.
Min konsultfirmas webbplats. <em>IT-integration, coachning och migration.</em><br><br><a href="https://www.kendev.se" target="_blank" rel="noopener noreferrer">www.kendev.se</a>
Ledde omdesignen av Sembo.se:s startsida från ett experimentellt landningsläge till en <em>förstklassig användarupplevelse</em> — omarkitektur, prestanda och en sammanhållen design som matchade resten av plattformen.<br><br>Levererades genom <em>coachning av teamet</em> och tydliga tekniska standarder. Startsidan blev en central yta för <em>kampanjer, inspirationsinnehåll och snabb resebokning</em> — och ett bevis för vad ett litet, fokuserat team kan leverera.