Portfolio · personal projects

What I build when nobody is asking

Games, a voxel engine, local AI services, developer tools and a few experiments that taught me more by failing. Line counts are measured, not estimated: copies, generated files and bundled libraries are left out.

68projects shown
4,226,065lines of code, measured
1,811tests
12programming languages

Deep dives

The hard problem first, then what I did about it.

RobOS

Built a working operating system inside a browser tab

A web page gets one thread, no file system and no processes — roughly everything an operating system needs, removed on purpose. Making windows that look like a desktop is the easy part. The real work is supplying what a kernel supplies inside a sandbox built to withhold it: applications that cannot tread on each other in one shared runtime, a file system with no disk underneath, and windows that stay coherent while several apps redraw at once. Then a real Python interpreter moves into the page, so applications can be written in Python — the part most people assume is a joke.

The window manager, virtual file system and app launcher are written from scratch in JavaScript, with Pyodide supplying genuine CPython in the browser. Each application loads as its own module with its own WebSocket channel to a Flask backend, so a text editor and a real-time multiplayer game can run side by side without noticing each other. Graphics quality follows the device — a rule written the day a regression made desktop machines render like phones.

Agent Orchestrator

Split one AI into a team that disagrees with itself

Ask a single model to review its own work and it will tell you the work is fine. Self-correction is not a prompting trick — the capacity for disagreement has to exist structurally, or the loop just launders the first answer. Separating the roles and forcing structured handoffs between them is what makes a rejection possible, and a rejection is the only thing that makes correction real.

Planning, execution, criticism and repair are distinct stages with typed contracts between them — a supervisor decomposes the work, a critic evaluates the result against it, and a repair stage must act on that evaluation. Output is structured at every boundary, which is what makes automated judgement tractable.

AerobizX

Built a complete economic simulation that runs in a browser tab

Simulating competing airlines — route profitability, demand, fleet economics, rival carriers responding to your moves — is normally server work, because it is genuinely expensive to compute. Doing it entirely client-side means the backend can never become the bottleneck, the cost, or the outage.

Hand-built simulation with no game engine underneath it, behind a deliberately thin static server and a file-based save API, and held to a measured budget in CI.

VoxelBlox

Ported a racing game to the browser and proved it, tick for tick

Porting a game usually means rewriting it and hoping it feels the same. Racing is the worst case: the physics is chaotic, so a rounding difference on the first lap is a different winner by the third, and 'feels about right' is not a test anyone can run.

Anything that can be worked out ahead of time is baked in Python — the track in the game's own vertex format, textures, collision, 310 rule constants and the course's 412 sounds — and only the per-tick rules are rewritten in JavaScript on WebGL2. The JavaScript then races against recordings of the Python original, tick by tick, so a difference is a failing test instead of a vague feeling. The baking runs across a fleet of machines, and the result is playable at voxelblox-notes.pages.dev/play.

VoxelStrike

Got a real-time 3D combat game out of a language famous for taking its time

A game has about sixteen milliseconds to draw each frame. Python spends a good share of that before your code even starts, which is why nobody sensible writes a 3D engine in it. That is exactly the appeal: every design choice here exists to win those milliseconds back, and the screen keeps score — the frame either lands or you watch it stutter.

The hot loops are compiled with Numba, the terrain is raymarched per pixel on the GPU, lighting is baked into the colour map ahead of time, and everything that is not ground is an instanced draw. Then bombs carve real craters into the live terrain. Every performance change is measured A/B against the last commit, so a slowdown shows up as a number long before anyone feels it.

D-Docs

Turned document production into a single command

Producing a consistent, shareable technical document normally means someone doing layout by hand every time — which is where quality drifts, and why the tenth document never looks like the first. Automating it properly means handling the parts people quietly do manually: hierarchy, navigation, cross-references and self-contained output.

Markdown in, a polished self-contained HTML or PDF document out, with hierarchical heading structure and breadcrumb navigation generated automatically for long technical material.

Whisper Portal

Taught an AI to look before it edits

Most AI code editing pastes a file into a prompt and hopes the answer is in there. When it is not, the model confidently invents something plausible — the software version of answering an exam question you did not read. The fix is not a cleverer prompt; it is letting the model go and look, and trusting it to decide where.

The model gets search, read and edit as real tools and runs the investigation itself: what to examine, what to fetch, then the change. Around it sits a transcription platform — meetings recorded until you stop them, speakers separated across a fleet of machines, eleven on-demand analyses — behind a default-deny login and a honeypot that hands automated scanners convincing fake credentials.

CodeContext

Made the quality of what you hand an AI a repeatable process

Model output is capped by the quality of its input, and assembling that input is usually done by hand — copying files into a prompt, differently every time. So results vary for reasons nobody can trace, and the natural response is to blame the model. Making context assembly deliberate and repeatable removes the variable.

Select the exact entities from a codebase that matter rather than dumping whole files, keep reusable libraries of system messages and prompt templates, and produce context of the same quality every time.

Growth Quest

Took the runtime dependency out of a fully voiced application

Anything that speaks normally calls a speech service while the user waits. That single decision brings latency, a per-use cost, and an outage whenever the provider has one — and it is a bad trade for software children use at home, where a failure is not an error message but a game that stopped working. The alternative is to do all the speech work once, ahead of time, which sounds obvious until every piece of content has to become addressable data first.

All content — quests, inventory, collection sets, shop items — lives in SQLite as structured records, and a generation pass walks it to produce audio for every line through a local TTS engine. The pass is idempotent, skipping what already exists, so adding content generates only the new lines rather than rebuilding the library. A shared type package sits between the FastAPI backend and the React front end so both sides agree on the same schema.

CodeAtlas

Built a catalogue of my own code that will not quote a number it has not checked

Counting your own code sounds easy until the count lies. One project here first measured 27.5 million lines against about 95,000 of real source — saved web pages, notebook outputs and backup folders all look like code if you squint. A number that wrong, stated with confidence, is worse than no number, and every resume or sales page built on it inherits the mistake.

Every folder is sorted into source, ingested data, generated output or duplicate, and only source counts. One pass over each project feeds the dependency graph, the hotspot scores and the unused-code scan, so they cannot disagree about which files exist. The same measurements run a nightly security sweep, answer AI agents in any project over MCP, and keep this portfolio honest: its figures are quoted from measurements, not typed from memory.

Project Cockpit

Taught a drawer full of mismatched computers to work as one AI service

Local AI on one PC hits a wall fast: one graphics card, one model at a time, and every app wired to its own port. Meanwhile the house was full of capable machines doing nothing — mini PCs, handhelds, an old gaming laptop. A fleet only helps, though, if nobody has to remember which box does what.

One endpoint sits in front of everything. Requests go to whichever machine is fastest or already has the model loaded; a GPU arbiter says no before a card quietly spills into system memory and runs at a third of the speed; idle models are parked and woken on demand; and every machine reports its vitals every 30 seconds, so 'do we need more hardware?' is answered with data instead of a hunch.

Ports of Call (Ship Voyage)

Shipped a fully voiced game that does not need a server to talk

A story game with spoken dialogue normally needs a server writing lines for every player, so each new player costs money and every outage sinks the ship. The alternative is to do all that work once, before release — which sounds obvious until you have to rebuild a whole game around never calling anything at runtime.

Every line of voice and text is generated ahead of time and shipped as static files, more than 41,000 voice clips streamed from storage at the edge. Saves live on the player's device with optional cloud sync, so the network is a bonus rather than a dependency. Pages come from Cloudflare's edge, audio from R2 and optional saves from D1 — and a weak phone still gets a smooth crossing.

Whisper Dictation

Made speech-to-text work in every application at once

Dictation is normally trapped inside whichever application implements it, so it is available exactly where you are not. Capturing input at the operating-system level makes it work everywhere — including in software that has never heard of it — but means dealing with global hotkeys, focus, and hardware that is frequently already in use by something else.

A background client captures a global hotkey regardless of which window has focus, retries microphone acquisition when the device is busy or mismatched, and returns the transcription straight to the clipboard from either a local or a remote model.

Unwritain Studio

Built a game rules engine that two people cannot break by clicking at once

The moment two players act at the same instant, a naive system applies both and the rules quietly stop meaning anything. It is the bug that never shows up while you test alone and always shows up in front of an audience — and you cannot find it by clicking, because you cannot click twice at the same time.

Turn order, action limits and duplicate rejection live on the server, not in the browser. An automated suite plays entire battles in seconds to prove the rules hold when everyone acts at once. Underneath sit a versioned REST API with four middleware layers, a proper relational content model, and the writing-and-voice studio the game mode grew out of.

Grocer

Proved the software was right, instead of hoping it was

Almost all software can only demonstrate that it did not crash. Whether it produced the *correct answer* is usually unknowable, so bugs live for years. This one has a rare property: every source document states its own total, which makes the parser's output checkable against ground truth the document itself supplies. That turns correctness from an assumption into something you can run.

Every parsed line item is reconciled against the order's printed subtotal. The consumption maths is deterministic Python and the language model only reasons over numbers already computed — so suggestions stay explainable, and a backtest gate blocks any change that lowers accuracy before it can land.

NBLidar

Turned a province's laser survey into a world you can walk around on a phone

New Brunswick has been laser-scanned from the air and the data is free — in the way a pallet of unlabelled hard drives is free. Tens of gigabytes of point clouds per corridor, in formats only mapping software opens, behind a download site that turns scripts away. Making it something a person can stroll through on a phone means solving storage, processing and delivery at once, with no server to pay for.

Every 1 km tile is a self-contained job on a fleet of machines: download from NRCan's public bucket, rasterise into 1 m columns, mesh, cut into 200 m web chunks, then delete the source. The browser draws 12-byte instanced quads — a quarter of the memory of an ordinary vertex format — streamed under a frame-rate governor from nine Cloudflare Pages sites that share one map. GeoNB's own site sits behind a bot challenge, so the build uses NRCan's official bulk copy of the same surveys instead of trying to sneak past it.

Every project

Filter by area or search for anything: a language, a library, a word.

RobOS

Browser Operating System

A complete desktop operating system that runs inside a browser tab: windowing, a file system and real applications, with Python itself executing client-side through a Pyodide runtime.

  • Python runs in the browser through Pyodide — an actual CPython runtime, not a transpiler
  • Window manager, virtual file system and application launcher written from scratch
  • Applications load as independent modules, each over its own WebSocket channel
727,128 lines · 645 commits · FastAPI, Flask, Uvicorn, PyQt

Agent Orchestrator

Self-Correcting LLM Pipeline

A desktop orchestrator that splits one local language model into a team of specialists — planner, generator, critic, repairer, enhancer — which pass typed JSON between them and are structurally able to reject each other's work.

  • Five named stages with typed contracts, not one prompt pretending to be a team
  • Rejection is structural: the critic emits a report the repair stage must act on
  • Recursive self-correction and enhancement cycles rather than a single pass
342,517 lines · Flask, PyQt, Pydantic, Next.js

AerobizX

Airline Strategy Simulation

A full airline-management strategy game — route networks, fleet economics, demand and rival carriers that react to your moves — simulated entirely in the browser, behind a small server that only serves files and stores saves.

  • The entire economic model runs client-side — the server only serves files and saves
  • Competing carriers respond to player decisions rather than following a script
  • Up to four players in local hot-seat
292,114 lines · 1,341 commits · Flask, Express

VoxelBlox

Open-World Voxel Sandbox

An open-world voxel sandbox in Python — dig, build, drive, fly to space — where every texture, model, sound and note of music comes from code, and whose racing game made the jump to the browser with its physics proven identical.

  • every texture, model, sound and piece of music generated in code
  • Voxel Racers carried into the browser and proved against the Python game: all 7,200 physics ticks identical
  • WebRTC multiplayer with a signed handshake; 13-18 ms round trips measured between two machines
291,760 lines · 1,984 commits · NumPy, Pillow, Pygame, ModernGL

VoxelStrike

Destructible Combat Engine in Python

Land, air and sea combat over terrain you can actually blow holes in, written in Python and kept at frame rate by Numba-compiled kernels and a per-pixel GPU raymarch.

  • two renderers over one height field: the Comanche-style column raycaster in Numba and a per-pixel GPU raymarch
  • craters carved into the live terrain, rims slumped so a machine can always drive back out
  • every gate shown to fail on a deliberate revert; A/B benchmarks interleaved against HEAD
286,276 lines · 2,484 commits · NumPy, Pillow, Pygame, ModernGL

D-Docs

Document Publishing Pipeline

Turns a markdown file into a polished, self-contained HTML site or PDF in one command, generating hierarchy, table of contents, breadcrumbs, anchors and zoomable diagrams automatically.

  • One command from markdown to a shareable HTML site or PDF
  • Automatic heading hierarchy, breadcrumbs, anchors and zoomable SVG
  • Four content-flow models rendered from a single source document
272,152 lines · 1,162 commits · PyQt, NumPy, ONNX Runtime, Pillow

Whisper Portal

Transcription & Agentic Code Editor

A bulk transcription platform with speaker diarization that grew into an agentic code editor: the model is handed real search, read and edit tools and investigates a codebase itself instead of guessing from a pasted file.

  • A real tool-calling loop — search, read, edit — not a single-shot prompt
  • Meetings record until stopped; fleet meetings get speakers by diarizing first, then transcribing each speaker's span
  • An on-demand analysis tab: eleven meeting analyses and questions answered from the transcript
202,168 lines · 561 commits · FastAPI, Uvicorn, PyQt, PyTorch

CodeContext

LLM Context Workbench

A desktop workbench for assembling exactly the right context to hand a language model: select individual functions and classes out of a codebase rather than dumping whole files, and keep reusable libraries of system messages and prompt templates.

  • Entity-level selection — individual functions and classes, not whole files
  • Reusable libraries of system messages and prompt templates
  • A full desktop application for a task most people do ad hoc in a text editor
155,048 lines · PyQt, NumPy

Growth Quest

Family Responsibility RPG

A React and FastAPI role-playing game that turns household responsibilities into quests, with every line of spoken dialogue generated ahead of time from a content database so the game never calls a speech service at runtime.

  • All voice content pre-generated from a database — no runtime speech calls
  • Idempotent generation: adding content produces only the new audio
  • Shared type package keeps backend and front end in step
111,390 lines · 4 tests · 6 commits · FastAPI, Uvicorn, Pillow, Pydantic

CodeAtlas

Codebase Inventory & Portfolio Engine

Keeps an inventory of a personal software estate across four drives and refreshes it every night behind its own test suite: a reuse index, measured dependency graphs, a security worklist, and a resume and portfolio whose every figure can show its working.

  • four-bucket line accounting — source, ingested, generated, duplicate — with the subtraction always shown
  • one walk feeds three analyses, so they cannot disagree about which files exist
  • a vulnerability sweep across every environment, ranked by what runs, each fix proved against the old environment
97,438 lines · 61 tests · 256 commits

Project Cockpit

Control Plane for a Home AI Fleet

Started as a terminal for keeping an eye on dozens of AI coding agents and grew into the control plane for a home fleet of machines: one OpenAI-compatible endpoint for chat, vision, embeddings, speech and images, jobs farmed out to idle machines, graphics cards scheduled, and every machine's vitals recorded every 30 seconds.

  • one OpenAI-compatible endpoint for chat, vision, embeddings, speech and images across the fleet
  • routing on measured speed, warm models and the local network before the tunnel (4.5 ms against 574)
  • a ten-minute recording transcribed in 18.8 s across six machines, against 138 s and 14% of the text on one
91,027 lines · 130 tests · 428 commits · PySide6 / Qt, pywinpty

Ports of Call (Ship Voyage)

Edge-Hosted Age-of-Sail RPG

Ports of Call, an Age-of-Exploration trading and naval RPG on Cloudflare's edge: no game server and no runtime AI, because every line of voice and text is generated at build time and shipped as static assets.

  • No game server and no runtime AI — every line of voice and text pre-generated at build time
  • Local-first saves with optional cloud sync
  • Live on Cloudflare Pages; audio from R2, saves and a leaderboard in D1
80,882 lines · 584 commits · FastAPI, Uvicorn, NumPy, Playwright

Whisper Dictation

Server & Global Hotkey Client

Speech-to-text that works in every application at once: a background client captures a global hotkey no matter which window has focus, and the transcription lands on the clipboard from either a local or a remote model.

  • Global hotkey capture works regardless of which window has focus
  • Retries microphone acquisition when the device is busy or mismatched
  • Local or remote model behind the same interface
66,859 lines · 1 commits · FastAPI, Flask, Gradio, PyQt

Unwritain Studio

A writing-and-voice studio: a versioned FastAPI service with real auth middleware, a SQLAlchemy content model, a TTS pipeline, and an LLM dungeon-master mode with turn-based combat.

  • Rules enforced server-side, so a client cannot act twice at once
  • Automated suite plays whole battles to prove rules hold under concurrency
  • Four middleware layers: logging, rate limiting, auth and API keys
25,564 lines · 47 tests · 133 commits · FastAPI, Uvicorn, PyTorch, NumPy

Grocer

Household Consumption Model

Turns supermarket order pages — saved by hand or fetched from the household's own browser — into a household consumption model, then has a local LLM propose the next shop, grounded in arithmetic rather than guesswork.

  • Every parse reconciled against the total the source document itself states
  • Consumption maths is deterministic Python; the model only reasons over it
  • Backtest gate blocks changes that reduce accuracy before they land
21,600 lines · 165 tests · FastAPI, Uvicorn, PyTorch, Pillow

NBLidar

New Brunswick as a Walkable Block World

Turns New Brunswick's open LiDAR surveys into a 1-metre block world you can orbit, fly over or walk through in a browser — built tile by tile across a fleet of machines and served from Cloudflare's edge, in English and French.

  • 5,139 km² and 263 of the province's 2,057 named communities built from open LiDAR
  • one 1 km tile per fleet job: each machine downloads, builds and deletes its own data
  • mesher and browser-export scheme reused from VoxelBlox; bilingual, phone-friendly WebGL2 viewer on nine Pages sites
7,383 lines · 4 tests · 35 commits · NumPy, Pillow, ModernGL, Numba

FlowForge

Static Marketing Site

A marketing site for a business-automation consultancy: hand-written HTML, CSS and JavaScript with no framework and no build step, served locally by a small Python script.

  • No build step — the source and the deployed artefact are the same files
  • CSS is nearly as large as the markup, carrying the whole visual design
  • A 68-line Python server is the entire tooling requirement
415 lines · 26 commits

Energy Equity Research Platform

A Flask research platform for TSX energy equities and beyond: a stacking ensemble and signal gates run overnight in an off-hours window, every pipeline stage is logged and alerted, and a daily research shortlist is tracked against a benchmark.

  • Nightly research candidates with a point-in-time track record against a benchmark
  • Off-hours compute window; the daytime site serves a static snapshot
  • A run ledger with de-duplicated alerts on every pipeline stage
188,392 lines · 693 commits · Flask, PyQt, PyTorch, scikit-learn

Ownword (WhisperKeyboard)

Voice-First Android Keyboard

An Android keyboard, shipped as Ownword, built around speech: on-device dictation, swipe typing, word prediction, autocorrect and a sentence check, plus read-aloud and Ask Ownword from any app — reconstructed from its own APK after the original project was lost.

  • Rebuilt from a shipped APK; parity checks and an APK diff verify the reconstruction
  • Dictation on the phone since 1.0.310; the server route closed in 1.0.362
  • Swipe typing, with key lighting measured (93% right) before it was built
130,073 lines · 441 commits · Pillow

Qwen3-TTS Studio

Local Speech Studio and API

A local text-to-speech studio and OpenAI-compatible API for Qwen3-TTS, patched to run its CUDA-Graph serving engine on an RTX 3090 under WSL2 — nine voices, plus voices cloned from a recording or designed from a description.

  • CUDA-Graph serving engine patched to run under WSL2
  • one model resident at a time; a single command returns the GPU
  • tests run against fake engines, so the suite needs no GPU
83,786 lines · 139 commits · FastAPI, PyTorch, Transformers, Diffusers

Ironvale

Serverless Real-Time Strategy

A complete real-time strategy game in a single HTML file that links two players directly over WebRTC and runs the same battle on both machines in lockstep — no server of its own anywhere.

  • deterministic lockstep simulation — only commands cross the network
  • peer-to-peer over WebRTC, no server of its own
  • an AI opponent that gets no bonus resources and differs only in skill
64,145 lines · 99 commits · Whisper

Nutrition & Meal Tracker

A FastAPI nutrition application built on the Open Food Facts dataset, with a logging model that tracks nutrients per entry, saved meals composed of items, and versioned schema migrations.

  • Per-nutrient log rows rather than a single collapsed calorie figure
  • Saved meals composed from individual items, not duplicated entries
  • Versioned schema migrations so the database evolves in place
61,534 lines · 64 commits · FastAPI, Uvicorn, PyTorch, pandas

Code Runner

Side-by-Side Diffing Editor

A desktop code editor and runner built around comparison: two panes, real-time diff highlighting between them, and a model that explains what actually changed rather than just marking the lines.

  • Real-time diff highlighting between two live editor panes
  • Model-written explanation of what a difference actually does
  • Push changes between panes to reconcile two versions in place
52,657 lines · PyQt

ChatterBox

Scripted Voice Studio

A FastAPI service and desktop front end for scripted, multi-clip voice generation, with saved voice templates and four separately-tuned API variants benchmarked against each other.

  • Named, reusable voice templates instead of per-clip settings
  • Four parallel API implementations kept side by side and benchmarked
  • Generation metrics recorded per run, aggregated for comparison
52,533 lines · 19 commits · FastAPI, Uvicorn, PyQt, PyTorch

Equity Screener & Research Desk

A desktop stock screener that collects market data with a real browser, stores it in a local database, ranks candidates, and records research experiments and detected events so a screen can be replayed later.

  • Browser-driven collection rather than reliance on an undocumented API
  • Incremental refresh: fetch only missing metadata, only stale prices
  • Research experiments and detected events stored for later replay
50,334 lines · 7 tests · 12 commits · PyQt, pandas, NumPy, Playwright

Movie Night

Living-Room Media Catalogue

A poster catalogue of your films and shows, built to be driven from about three metres away — with an optional voice layer that can click anywhere on screen, drive VLC exactly, and learn the titles speech-to-text keeps mangling.

  • Voice is optional by construction: the catalogue is fully usable with a mouse alone
  • A closed grid vocabulary recognised locally, so the common case never waits on the network
  • Recursive voice mouse-grid — any pixel on screen reachable without a cursor
48,477 lines · 60 tests · 174 commits · PySide6 / Qt, Tkinter

Ask Code

Portable Codebase Q&A

Point it at any repository and ask questions in plain language: retrieval over the source feeds a local model that answers, edits and runs an agent loop, with nothing leaving the machine.

  • Retrieval index tracks chunk health so stale context is detected, not served
  • Token budget exposed before a query runs, not discovered afterwards
  • Local inference — the codebase never leaves the device
41,539 lines · 136 tests · 95 commits · FastAPI, Uvicorn, PyTorch, NumPy

File Organizer

Indexed Search and Journalled Tidying

Finds anything in a large folder tree, and — only if you ask — tidies one folder up under a safety suite that must pass before a single file is allowed to move.

  • One safety module every mutation passes through — no second path to the filesystem
  • `apply` refuses to run unless the safety suite passed against the tree as it is now
  • Journalled execution with undo, which re-checks safety before acting on a stale plan
36,785 lines · 760 tests · 25 commits · PyQt, NumPy

Document Pipeline Orchestrator

A browser-based orchestration platform for document-processing workflows that replaced two legacy desktop applications with one interface, running pipelines with real-time progress instead of blocking dialogs.

  • Replaced two legacy desktop applications with one browser interface
  • Pipelines run as tracked jobs with real-time progress and cancellation
  • Per-stage statistics captured, so a bad run is diagnosable after the fact
34,275 lines · 55 commits · FastAPI, Uvicorn, PyQt, Tkinter

Knowledge-Base RAG Chatbot

A local retrieval-augmented chatbot that answers from a markdown knowledge base using hybrid search — keyword and vector results fused by reciprocal rank — with citations back to the source document.

  • Hybrid retrieval: keyword and vector results fused by reciprocal rank
  • Citations resolve back to the source markdown document
  • Chat and embeddings both served locally
32,607 lines · 63 commits · FastAPI, Uvicorn, PyQt, NumPy

Quest of the Number Dragon

Maths Adventure for Kids

A maths adventure for children — counting to fractions and early algebra, with voice coaching, music and RPG battles — in one self-contained HTML file that works offline, published at number-dragon.pages.dev with the file as a download.

  • the whole app, voices and music included, in one offline HTML file
  • rebuilt from a patch chain and checked byte-identical to what ships
  • teaches the method and never gives the answer, from a graded evidence review
19,922 lines · 64 commits

AutoDoc

Codebase Documentation Generator

Reads a codebase and writes its documentation: analyses functions, classes, imports and the call graph, then generates prose from the structure with enterprise authentication and token estimation built in.

  • Builds a call graph and import model before writing any prose
  • Filters to referenced files instead of documenting everything
  • Token estimation before the run, not a surprise afterwards
18,889 lines · PyQt

Simple Voice Navigator

Hands-Free Browsing

Say "back", "new tab" or "read this" while browsing and it happens — recognised offline in about 50 ms, and listening only while a browser is in front and actually being used.

  • listens only while a browser is in front and in use
  • offline recognition, about 50 ms per phrase
  • an installer that repairs itself on re-run
16,048 lines · 229 tests · 28 commits · NumPy

Describe & Walk

Narrated Walkthroughs and 3D Scenes

Walk through a space narrating it on video and get back a written verbal map; the same recordings can be turned into Gaussian-splat 3D scenes — all on local models and graphics cards.

  • Narration and frames lined up by timestamp
  • A staged summary into one written map rather than isolated captions
  • Gaussian-splat 3D scenes from phone video
15,580 lines · 31 commits · FastAPI, Uvicorn, PyTorch, NumPy

LAN Music & Photo Server

A desktop-controlled local web server that streams music with matched artwork to any device on the network, started and stopped from a small control window rather than a terminal.

  • Serves to any device on the LAN with no client install
  • Start, stop and status from a desktop control window, not a terminal
  • Pairs audio with matching artwork and plays continuously
13,923 lines · Flask, PyQt

MusicAPI

Library Service & Web Player

A FastAPI music service with a Svelte single-page front end, WebSocket updates, database migrations, and AI annotations stored against artists and tracks.

  • API, WebSocket and built SPA served from one application
  • Catch-all routing so client-side routes survive a refresh
  • Versioned database migrations rather than a recreated schema
13,658 lines · 22 tests · 59 commits · FastAPI, Uvicorn, yt-dlp, SQLAlchemy

ACE

Context-Budgeted LLM Workbench

A workbench that treats context as a budget: it keeps engineered context under a model-aware cap with explicit headroom reserved, and ingests documents in overlapping batches that preserve salience instead of truncating.

  • Model-aware context cap with headroom explicitly reserved
  • Overlapping batch ingestion with salience-preserving tail quotes
  • Adaptive configuration and playbooks make a good setup reproducible
12,407 lines · PyQt, Transformers

Long-Form Story Generator

Generates multi-part stories through a local model from named, reusable prompt templates, with batching, live logs and the ability to stop a run mid-flight.

  • Named, managed prompt templates instead of retyped prompts
  • Batched queue with live logs and a working stop control
  • Runs entirely against a local Ollama model
12,117 lines · PyQt

AI Project Scaffolder

Generates new project skeletons from templates, and converts an existing tree into a structured context bundle — with gitignore-aware scanning and typed parse results rather than string handling.

  • Scaffolds from templates and reverses the process into a context bundle
  • Gitignore-aware scanning keeps vendored and generated trees out
  • Typed parse results, so malformed input is reported not mangled
11,886 lines · 1 commits · PyQt

Script Launcher

A single front door for a large collection of standalone scripts — registered, described, themed and launched from one window instead of remembered as file paths.

  • Registry of scripts with names and descriptions, not remembered paths
  • Edit and launch in place from one window
  • Customisable appearance so groups of tools stay visually distinct
11,106 lines · PyQt

PCB Design Tooling (.NET)

A C# application for printed-circuit-board work — the only .NET codebase in the estate, and the counterweight to a portfolio that would otherwise read as Python-only.

  • The estate's only .NET codebase, kept visible rather than hidden
  • Domain work in electronics design rather than general application code
9,742 lines · 24 commits

Function Extractor

Extracts individual functions and classes out of source with the surrounding context they need to make sense, so a single entity can be moved between projects or handed to a model without dragging the whole file along.

  • Entity-level extraction with the surrounding context that makes it valid
  • Detected functions and classes presented as a browsable list
  • Extracted versions saved and reloadable rather than overwritten
9,392 lines · PyQt, Tkinter

Graph HTML

Flowchart Renderer

A self-contained interactive flowchart renderer: open one HTML file and get a pannable, clickable node graph with no server, no build step and no install.

  • Zero-dependency delivery: one HTML file, no server and no install
  • Nine versions kept side by side, each titled with the problem it addressed — a visible record of the approach evolving
  • Path-following through the graph is the problem the last four versions exist to solve
8,906 lines

Local STT

Offline Speech-to-Text in One File

Push-to-talk speech-to-text that runs entirely inside one self-contained HTML file — the model, ONNX Runtime in WebAssembly and the interface all embedded, with no install, server or network.

  • the whole model and runtime embedded in one HTML file
  • a runtime network guard — privacy enforced, not promised
  • end-to-end tests with the network offline and a scripted microphone
8,816 lines

Pennies

Incremental Game

An incremental game built around social and psychological pressure as mechanics: achievements, notifications and modelled social expectations, with detailed statistics tracked behind them.

  • Social expectation and notification pressure modelled as game state
  • Detailed statistics tracked as first-class records
  • Achievements and configuration typed rather than hard-coded
8,245 lines · 31 commits · Pygame

Patch Merger

Class-Aware Code Applier

Applies multiple code patches at once with class-targeted method insertion, strict validation before anything is written, and a side-by-side review pane listing every function and class the patch would replace or add.

  • Patches resolved against the parse tree, not by text position
  • Whole plan validated before anything is written to disk
  • Ambiguous anchors reported as errors rather than silently guessed
8,241 lines · PyQt

MusicBoard

Structural Audio Soundboard

A soundboard that analyses music structurally rather than just triggering clips: select a region of the waveform, find where that motif repeats across the track, and group the results into families.

  • Motif search - select a region, find where it recurs across the track
  • Multi-scale self-similarity scanning, from notes and riffs up to whole sections
  • A texture gate that drops background grooves and keeps real sections
7,040 lines · 53 tests · 77 commits · Tkinter, NumPy

QwenTTS

Voice Cloning API

A REST service wrapping a Qwen speech backend, supporting preset voices, zero-shot cloning from a short reference clip, and multi-format audio output behind a versioned API.

  • Zero-shot voice cloning from a short reference recording
  • Versioned API with typed request models and saved voice profiles
  • Explicit model load and unload control rather than permanent residency
6,828 lines · 18 tests · FastAPI, Uvicorn, PyQt, PyTorch

Flowchart Pages

The same flowchart-rendering idea as Graph HTML, carried through fifteen versions, with d3 added alongside vis-network for layout control.

  • Fifteen iterations of one renderer, kept as separate documents
  • d3 introduced at v10 alongside vis-network, for layout the library would not do on its own
  • Shares its lineage with Graph HTML — the same problem approached twice
5,969 lines

Pyodide Desktop-in-Browser Sandbox

An experiment in building a desktop-style application interface that runs Python in the browser through Pyodide, iterated across several successive attempts kept side by side.

  • Groundwork for the Pyodide runtime approach later used in RobOS
  • Successive attempts kept side by side rather than tidied away
  • File load and save API behind a browser-resident Python runtime
5,863 lines · Flask, Three.js

Conversation Generator

Multi-Voice Dialogue Audio

Writes conversations of any length — thirty seconds to four hours — with a local language model, then performs them in chosen voices through Qwen3-TTS Studio, from a browser page or one command.

  • conversations up to four hours, written in continuing blocks
  • resumable, with overload protection for the speech engine
  • one settings file shared by the web page and the command line
4,873 lines · 31 tests · 19 commits · FastAPI, Uvicorn, Pydantic

Block Battle

Multiplayer Puzzle Game

A competitive block puzzle game with a server-side engine, socket play, accounts and purchasable skills — the rules live on the server rather than in the browser.

  • Game engine and rules enforced server-side, not in the client
  • Socket-based play with accounts and persistent progression
  • Purchasable skills handled through the same authenticated API
4,362 lines · Flask

CodeThink

A Thinking-Budget Dial for Local Models

Steer how long a local reasoning model thinks while it is still thinking — with the mouse wheel — and a bandit that learns the right budget per kind of prompt instead of guessing it.

  • The thinking budget is a live control, not a parameter fixed before generation starts
  • A dial in the browser reaching a streaming request over SSE, read before each reasoning step
  • Abortable streaming, so turning the budget down stops work already in flight
4,303 lines · 34 tests · Flask

HS600 Drone Studio

Control and telemetry tooling for an HS600 drone, built by capturing and decoding its packet protocol rather than from a published specification.

  • Packet protocol reverse-engineered from captures, with no published spec
  • Captured packets and connection checks modelled as typed records
  • Takeoff, land and telemetry driven over the decoded link
3,983 lines · PyQt, NumPy, OpenCV, Tesseract

MistrelTTS

Speech Synthesis Service

A compact FastAPI speech service exposing generation, voice listing and health behind a typed API, with custom voices and generation history persisted.

  • Typed request and response models over a minimal surface
  • Custom voices and generation history persisted rather than transient
3,737 lines · FastAPI, Uvicorn, PyTorch, Pydantic

Personal Memory Database

A personal database that captures screenshots with their metadata and stores entries for retrieval by similarity rather than by remembering what you filed them under.

  • Screenshot capture with metadata attached at the moment of capture
  • Similarity-based retrieval instead of exact recall of a label
3,183 lines · PyQt, Pillow

Speaker Identifier & Quote Attributor

Finds every quoted passage in a document and attributes it to a speaker, turning unlabelled dialogue into an attributed transcript.

  • Extracts and attributes every quoted span in a document
  • Emits a rewritten, attributed file rather than a separate report
3,038 lines · PyQt

3D Graph Visualiser

Renders three-dimensional data visualisations in the browser, driven from Python-computed geometry.

  • Computation in Python, interactive rendering in the browser
2,973 lines · NumPy

Unlimited OCR

Long-Document Platform

A local OCR platform built on a 3B-parameter vision-language model specialised for long documents, with a job queue, evaluation harness, and a training-data pipeline that feeds corrections back into the model.

  • Reinforcement loop: corrections archived and rebuilt into fine-tuning data
  • Command surface covers the whole loop — ocr, serve, eval, archive, build-sft
  • Runs a 3B vision-language model locally, so private documents stay put
2,674 lines · 9 tests · 7 commits · FastAPI, Uvicorn, PyTorch, Transformers

Project Context Maker

Scans a project and assembles a context file for an AI assistant from its structure and key files, with the output strategy — structured JSON or direct artifact — selectable rather than fixed.

  • Analysis, prompting and output separated into distinct layers
  • Pluggable output strategies — structured JSON or direct artifact
  • Entry file nominated so the context is anchored to a real starting point
2,633 lines · PyQt

VidDownload

Video Archiver for Awkward Players

A desktop tool that saves the video embedded in a web page as an MP4, trying yt-dlp, a real browser and, as a last resort, recording playback in parallel parts.

  • four strategies in order, from yt-dlp to recording playback
  • parallel recording: tabs seek to their own slice and ffmpeg splices the parts
  • a per-job report naming every candidate URL and why each attempt failed
2,524 lines · 22 tests · Tkinter, Playwright, yt-dlp

WhisperTyper

Desktop Dictation

A desktop dictation window that monitors for speech, transcribes locally, keeps a searchable history of what was said, and stays on top so it works alongside whatever you are writing in.

  • Transcription history stored and searchable rather than transient
  • Always-on-top window so it works alongside the target application
  • Local Whisper inference — no audio leaves the machine
2,430 lines · PyQt, PyTorch, Transformers, NumPy

CSV Analyzer

A desktop CSV explorer with stacked filters and regex matching, reporting distinct counts and confirmed totals as the filters change.

  • Stacked filters that add and clear independently
  • Regex matching alongside plain filtering
  • Distinct and confirmed counts recomputed live as filters change
2,260 lines · PyQt

Video Joiner & Audio Combiner

Joins video files in a chosen order and combines them with audio tracks or generated speech, with natural-order sorting so files sequence the way a human expects.

  • Natural-order sorting so clip 2 precedes clip 10
  • Manual reordering or automatic sort before joining
  • Background music and imported speech layered over the result
2,167 lines · PyQt, NumPy, Pillow

VoiceGrid

Voice-Driven Grid Control

A spoken-command grid interface with an offline recogniser, built so its core logic — grid parsing, recognition and the application state machine — can be tested without any of the heavy dependencies installed.

  • Core logic tested with the speech, UI and audio libraries absent
  • Lazy imports keep the state machine independent of the hardware layer
  • Offline recognition — no cloud speech service involved
2,035 lines · 19 tests · 4 commits · PySide6 / Qt

Local LLM Inference Server

Serves a local transformer model behind an OpenAI-compatible chat completions endpoint, so existing clients can point at it without code changes, with model loading driven from a desktop window.

  • OpenAI-compatible endpoint, so existing clients need no changes
  • Explicit model load control from a desktop window
  • Generation settings exposed rather than fixed at startup
1,906 lines · FastAPI, Uvicorn, PyQt, PyTorch

Stock Analyzer

A focused desktop tool for analysing equities from downloaded market data, with manual row entry for figures that are not in the export.

  • Works from a downloaded CSV with no API dependency
  • Manual row entry for figures missing from the export
1,782 lines · PyQt, pandas, NumPy

Cloudflare Deployment Manager

A desktop control panel for Cloudflare infrastructure: scaffold and deploy Workers, create and redeploy Pages projects, and set up tunnels with their DNS records from one window.

  • Pages, Workers, tunnels and DNS managed from one window
  • Worker scaffolding writes its routes into the configuration
  • Tunnel plus DNS record creation in one step
1,766 lines · PyQt