Work

My own projects.

  • Buttler

    In personal use, private

    A self-hosted voice and home assistant with Raspberry Pi room satellites, a phone app and desktop apps. Personal data stays on my own server. Which device may show personal content is decided on the server, not by the device.

    What a shared screen may not show

    Python / FastAPI, Flutter, .NET 8, Raspberry Pi

    Buttler phone app in the household view: a shared grocery list, the living room, and a note that personal content stays hidden until the user verifies on the device. Buttler phone app in the household view: a shared grocery list, the living room, and a note that personal content stays hidden until the user verifies on the device.
    Household view: personal content stays hidden.
    Rooms and screens: a planned kitchen satellite, this phone in household view, a workstation marked as personal screen, and a living room TV marked as shared screen. Rooms and screens: a planned kitchen satellite, this phone in household view, a workstation marked as personal screen, and a living room TV marked as shared screen.
    Rooms and screens: each device is marked shared or personal.
    Conversation screen: the request to turn on the living room lights and the simulated confirmation. Conversation screen: the request to turn on the living room lights and the simulated confirmation.
    A simulated request.
    Phone app, rendered from the design build with sample data.
  • AI Usage Widget

    Released, open source

    Desktop widgets for Windows, KDE Plasma and GNOME that show how much of your Claude and Codex quota is used and when it resets. I wrote the logic once in JavaScript and run it inside three native shells. It links to aiusage.guide for quick fixes.

    C++17 / Qt 6, QML, JavaScriptGitLab

    Windows widget in test mode, using sample data.
  • aiusage.guide and aiusage-skills

    Live and open source

    aiusage.guide is a bilingual guide to working with Claude Code, Codex and Gemini CLI. aiusage-skills is the plugin that goes with it: twelve skills for planning, test-driven development and reviewing changes. The two feed into each other; what works in the skills ends up in the guide, and the guide shapes the skills. Skills by other authors are kept at fixed versions.

    How it handles other people's skills

    Eleventy, Python, GitLab CIaiusage.guidePlugin on GitLab

  • EDIU

    Working, private

    Creates draft merge requests from GitLab issues marked as ready. It can open a draft, but it can't merge or approve. A self-hosted model plans first, and harder cases go to hosted models. In existing codebases I've seen the model reinterpret the task to fit the code during correction loops, instead of changing the code to fit the task.

    Python, GitLab, vLLM

  • lockstep

    Proof of concept, private

    A deterministic simulation core for a multiplayer game, split out of the game into its own library. Unity only displays the state and the core can't reference it. The networking part exists only in an unreleased prototype.

    C#, .NET, Unity