Rapid Prototyper·Team-builder·Debugger·“Legacy Diver”
Rapid Prototyper·Team-builder·Debugger·“Legacy Diver”
Rapid Delivery·Coach & Mentor·Troubleshooter·Codebase Rescue
Rapid Delivery·Coach & Mentor·Troubleshooter·Codebase Rescue
Hey!

William Bernting

Ship Often·Build Great Teams·Deep Diver·Evangelist
Ship Often·Build Great Teams·Deep Diver·Evangelist
AI when it matters·recruited talent·complex debugging·rescued codebases
AI when it matters·recruited talent·complex debugging·rescued codebases
Automation·People-person·AI-Enabled Coder·Legacy Expert
Automation·People-person·AI-Enabled Coder·Legacy Expert
scroll down
Rapid Prototyper, Team-builder, Debugger, “Legacy Diver”, Rapid Delivery, Coach & Mentor, Troubleshooter, Codebase Rescue, Ship Often, Build Great Teams, Deep Diver, Evangelist, AI when it matters, recruited talent, complex debugging, rescued codebases, Automation, People-person, AI-Enabled Coder, Legacy Expert

Built, shipped, done.

Built, shipped, done.

AI Agent

Community Assistant

AI assistant for community boards handling recurring email questions. Picks up incoming mail, matches against historical tickets, and drafts a reply based on how the board answered before. A board member approves or amends before sending.<br><br>Built on the <em>Akka SDK</em> with event sourcing, integrated with <em>Gmail</em> and <em>Google Sheets</em>. A <em>SmolLM2-135M</em> nano LLM handles classification and drafting — light enough to run without a large model.<br><br><em>3-tier testing strategy</em>: dummy LLMs for speed and determinism, the nano model as a realistic middle tier, and the production model for final confidence checks.<br><br><a href="https://github.com/wbern/community-assistant" target="_blank" rel="noopener noreferrer">github.com/wbern/community-assistant</a>

Infrastructure

Pi-PAI

Remote agent orchestration on a <em>Raspberry Pi 4</em>, accessed from a phone via the <em>Happy</em> app (with voice control). An <em>MCP server</em> acts as the control plane: one Claude Code instance starts and stops other Claude Code sessions based on workload.<br><br>Each agent has <em>GitHub</em> access and independently runs tests, opens pull requests, and continues work while the operator is away from the computer. Fully provisioned with <em>Ansible</em> — reproducible infrastructure that redeploys to bigger hardware, more machines, or a client site.<br><br><a href="https://github.com/wbern/pi-pai" target="_blank" rel="noopener noreferrer">github.com/wbern/pi-pai</a>

Legacy Rescue

DLL Decompilation

Recovered functionality from unmaintained vendor <em>DLLs</em> with no source code available. The client was restarting their server software every 15 minutes due to a <em>race condition</em> in the binaries.<br><br><em>3-phase process</em>: decompiled the DLLs (output ~80% correct, the rest broken by binary age); built a test suite against the existing setup to lock in current behavior; fixed the decompiled code until every test passed; then resolved the concurrency issue itself.<br><br>Deployed over <em>Tailscale</em> to <em>5 customer sites</em> with 3 rollback strategies. Unlocked a significant revenue stream for the client.

Modernization

Legacy Chess Tool Rewrite

Modernization of a 2018-era desktop chess tournament pairing tool into a <em>browser-only application</em>. Still used by many clubs for its simplicity, the seeding algorithms are the software's core value — pairings in chess are surprisingly complex.<br><br>The original Java frontend was decoupled from its database operations and the pairing logic exposed through a REST layer. Built <em>snapshot tests of every pairing permutation</em> — over 200 snapshots of how the database evolves during a tournament. With that safety net in place, the entire backend was ported into the browser with <em>sql.js</em>; every snapshot test passed on the first run.<br><br>The application now runs <em>fully offline in the browser</em> — no backend required. <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>

Open Source

adr-lint

Defines technical rules for a team as <em>Architectural Decision Records</em>, then spawns a short-lived LLM agent per ADR to judge whether code changes meet each rule. The team's <em>process</em> matters more than the tool itself — adr-lint just automates the evaluation step.<br><br>Same principle applied to a published article on AI and trust: <em>15 ADRs</em> defined the boundaries before a sentence was written, and one agent per ADR independently reviewed each of <em>22 drafts</em>. Open source.<br><br><a href="https://github.com/wbern/adr-lint" target="_blank" rel="noopener noreferrer">github.com/wbern/adr-lint</a>

Meta

This CV

You're looking at it. The site is built with <em>Astro</em>, <em>TypeScript</em>, and <em>test-driven development</em> — disciplines applied to prevent regressions during iteration.<br><br>The goal: an engaging experience rather than another generic developer site. Strong influence from UX collaborators over the years.<br><br><a href="https://github.com/wbern/william.bernting.se" target="_blank" rel="noopener noreferrer">github.com/wbern/william.bernting.se</a>

Open Source

TDD Command Generator

Slash-command toolkit for AI coding agents that enforces <em>test-driven development</em>. Reusable prompt templates encode the TDD methodology so it doesn't have to be repeated every session — compensating for the fact that coding agents aren't trained on the practice.<br><br>Includes a generator for customizing install location. Repo has 100% test coverage. Received <em>over 100 GitHub stars overnight</em> on release. Open source.<br><br><a href="https://github.com/wbern/agent-instructions" target="_blank" rel="noopener noreferrer">github.com/wbern/agent-instructions</a>

Open Source

obscene

Static analysis that surfaces <em>behavior patterns in a codebase</em> and highlights clear refactor opportunities. Built to remove the social friction around code quality — the tool shows the patterns neutrally so the team can decide together what to clean up.<br><br>Runs in CI or locally. Open source.<br><br><a href="https://github.com/wbern/obscene" target="_blank" rel="noopener noreferrer">github.com/wbern/obscene</a>

Open Source

cc-ping

Utility for managing <em>Claude Code</em> weekly and session limits. Pings one or more accounts on a schedule so the limits reset as early as possible, and can be configured to time a session reset around the middle of the workday peak.<br><br>Small, focused, open source — one of several tools built to make day-to-day work with AI agents predictable.<br><br><a href="https://github.com/wbern/cc-ping" target="_blank" rel="noopener noreferrer">github.com/wbern/cc-ping</a>

Open Source

Me and My Crew

Public reference setup for <em>Gas Town</em>-style terminal-based agent orchestration. Runs multiple AI agents side by side in the terminal — visible rather than hidden in the background — with clear structure for which agent owns which role.<br><br>Not a product; a documented "this is how I set it up, if you want to replicate." <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>

Open Source

tmux-explode

Small command that displays <em>all active tmux sessions in a single pane</em> — a control-tower view for monitoring many AI agents running in parallel. Open source.<br><br><a href="https://github.com/wbern/tmux-explode" target="_blank" rel="noopener noreferrer">github.com/wbern/tmux-explode</a>

Personal Project

Chess Reel

Web chess board that plays <em>opening reels</em> — originally built to study the Hyper-Accelerated Dragon variation of the Sicilian as black.<br><br>Built with <em>test-driven development</em> using a <em>diamond-shaped test suite</em> — many slightly heavier tests in the middle layer — which proved especially well suited to agentic coding. Handles the limitation that LLMs can't play chess by leaning on chess protocols and foundational principles.<br><br>A testbed for managing large amounts of AI-written code from scratch.

Teaching

TDD with AI — Presentation

Presentation on <em>test-driven development with AI coding agents</em>. Built entirely from the terminal with Claude Code, slides made with <em>Slidev</em>, hosted on this site — always accessible and ready to run.<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>

Data Analysis

LinkedIn Conversation Analysis

Interactive dashboard built from a personal export of <em>LinkedIn conversations</em>. Around half of cold contacts felt compelled to explain their request once greeted — a clear effect of breaking the silent-norm.<br><br>Conversations were categorized into <em>13 categories</em> and visualized through <em>7 views</em> surfacing patterns in who is worth spending time on. Built to inform an outreach strategy from primary data rather than intuition.

3D Visualization

Architectural Blueprint to 3D

Pipeline that converts <em>AutoCAD blueprints into 3D renderings</em> using LLM agents at each step. Each transformation stage is executed by an agent, with no manual micromanagement of the visual output.<br><br>3D remains a challenging space for agentic coding — much of the ecosystem is still locked behind <em>proprietary assets and software</em>. The project surfaces the practical boundaries of what agents can and can't do when the ecosystem isn't open.

Game

Pixi Platformer

Doodle Jump-style platformer built from scratch with web technology — no game engine. Custom <em>Entity Component System</em> architecture in React: each game object composed of loose components (position, velocity, collision, solidity).<br><br>Physics use <em>non-linear gravity</em> with different acceleration curves for upward and downward movement. Supports <em>keyboard and touch</em>, rendered with <em>Pixi.js 7</em> via WebGL, tested with <em>Vitest</em>.<br><br><a href="https://github.com/wbern/platformer" target="_blank" rel="noopener noreferrer">github.com/wbern/platformer</a>

AI / RAG

Knowledge Bot

<em>RAG-based email advisor</em> for a property-management client with <em>38,000 historical support emails</em>. Combines <em>hybrid search</em> — BM25 keyword search via SQLite FTS5 and vector search via <em>LEANN</em>, a graph-based retrieval system that compresses storage by 97%. Results are merged with <em>Reciprocal Rank Fusion</em> and fed to a local LLM via <em>Ollama</em>.<br><br>Retrieval accuracy went from 40% to <em>100%</em> after adding metadata prefixes and the hybrid strategy. Runs entirely private on a <em>Proxmox VM</em> provisioned with Ansible — no data leaves the client's servers. A <em>Telegram bot</em> and an email watcher deliver real-time advice with source citations to the historical mails that informed each answer.

Legacy Migration

Telia.se

Incremental migration of Telia.se from a <em>Freemarker</em>-based legacy templating system — deeply intertwined with the business logic — to a modern frontend, without a big-bang rewrite.<br><br>Work involved building bridges between old and new, introducing patterns that coexisted with the existing codebase, and progressively phasing out Freemarker templates without disrupting production traffic. The brief in one phrase: <em>migrate without stopping</em>.

Business

kendev.se

My consultancy's website. <em>IT integration, coaching, and migration.</em><br><br><a href="https://www.kendev.se" target="_blank" rel="noopener noreferrer">www.kendev.se</a>

Leadership

Sembo.se Startpage

Led the redesign of the Sembo.se startpage from an experimental landing into a <em>first-class user experience</em> — rearchitecture, performance, and a cohesive design matching the rest of the platform.<br><br>Delivered through <em>team coaching</em> and clear technical standards. The startpage became a key surface for <em>campaigns, inspirational content, and quick travel booking</em> — and a proof point for what a small, focused team can ship.

0 Score
47
prototypes created in the last 12 months
5,000
users on a single internal tool
14
dev teams supported at one company
15yr
of professional software development
5,000
lines of code written per day
6
developers recruited in 6 months
~10
public talks per year
182
LinkedIn endorsements received
481
LinkedIn endorsements given
2,000+
followers on LinkedIn
11,000+
LinkedIn messages sent and received

15 years of building.

2015 – 16
Team Lead HPE
2017 – 20
Systems Developer KITS AB
2020 – 21
Senior Engineer Telia
2021 – 22
Lead Developer Telia
2022 – 23
Head of Dev NetConsult
2023 – 25
Tech Lead Sembo
2025
Backend Developer Hedin IT
2025 —
Frontend Developer Akka

The stack.

The stack.

Agentic AITest-Driven DevelopmentClaude / LLMsNode.jsTypeScriptReactNext.jsC#VueAngularDevOps / CI/CDAWS / AzureProject DeliveryMonoreposMicro-frontendsCoachingSpec-kitTanStackAstro.js
“It is in the doing of the work that we discover the work that we must do.”
— Woody Zuill