Independent Software Engineering

Browser software, built end to end.

I design, build, test and ship Manifest V3 Chrome extensions and browser-native systems — architecture through automated testing to the store listing. Every project on this site: one engineer, no team to hand the hard parts to.

38Project pages
0Trackers, ever
1Person shipping

What I build

Three kinds of work, one way of working

Different surfaces, same discipline: pure logic separated from the interface, tested headlessly, and shipped without an analytics tag anywhere in it.

Chrome Extensions

Manifest V3 across side panel, popup and new-tab surfaces. Local storage only, minimal permissions, and a permission-versus-code audit before every store submission.

Idle Games and Simulation

Economy curve design, offline-accrual math, and headless simulation harnesses that fast-forward thirty in-game days in seconds to catch balance and concurrency bugs.

Automation and Tooling

Python automation, browser RPA against legacy systems, reporting pipelines, and the document workflows behind a working legal-services operation.

Flagship — on the Chrome Web Store

Dota Companion

A private Dota 2 dashboard that grew a second half. It tracks whether you are actually improving — a streak counted against your own GPM baseline, not against attendance — and it values your entire Steam inventory against the Community Market. No account, no API key, nothing stored anywhere but your own machine. Version 2.5 moves it into Chrome’s side panel and adds hero reviews, searchable Guides, a ward map and share cards.

What it does

Improvement streaks, goals measured against your current twenty-game average, hero splits, and private notes on people you queue with. Then a full-page inventory view: every item priced, grouped and searchable, with a value history built from your own refreshes rather than a market average.

The part a price cannot tell you

Because it already reads your match history, it can cross the two: how much of your cosmetic spend is riding on heroes you actually play, and how much is parked on heroes you have not picked in twenty games. Every other inventory tool has the price lookup. None of them have the second dataset.

Flagship — on the Chrome Web Store, version 2.0

Annoying Dino

A mischievous dinosaur that lives on whatever page you are reading. He chases your cursor, perches on headings, lays eggs that hatch into friends, delivers joke cards, and occasionally survives a meteor. Version 2.0 rebuilt the lot — a new motion system, five species, volcanoes, a wardrobe and a fossil record — on the same three permissions as before.

What he does

Roams the page and leaves footprints, chases the pointer and either chomps or tail-bonks it when he catches it, naps in the middle of your article, roars at nothing in particular, and brings friends: hatchlings that follow him around and the occasional pterodactyl fly-by.

What he does not do

Touch the page. Everything he does is drawn in his own layer, and the site underneath is never modified. No network requests, no analytics, no account — and 2.0 added nothing to the permission list, so nobody who already had him installed saw a new warning.

How these ship

The part that is not visible in a screenshot

Anyone can post a demo. These are the four practices that decide whether it still works on somebody else’s machine a month later.

Logic that runs without a browser

Game and product logic lives in pure, dual-export modules with no DOM and no browser APIs. The same file runs inside the extension and inside a headless Node test, and for anything time-driven, inside a simulation that fast-forwards thirty minutes of ticks, accrual and hatching into milliseconds. Behaviour is proven long before anything is clicked.

Suites gate the ship, not the mood

Syntax, manifest limits, tuning constants, save concurrency, DOM contracts and a full render pass all run before a zip exists. A regression test is only accepted once the bug has been re-introduced and the test has been watched to fail, and anything that persists user data has its suite graded by mutation testing.

Instruments get proven before their numbers do

A measurement is a claim like any other. Before a benchmark, a probe or a coverage number is believed, it is run against a case whose answer is already known, and it has to be capable of reporting failure. A harness that cannot fail has not proved anything.

Local-first, and provably so

No accounts, no analytics, no third-party calls by default. The codebase is swept for network APIs and remote assets, and the build gate carries a privacy-egress check plus a DOM snapshot diff. The one deliberate network call, pricing a Dota inventory against the Community Market, is rate-limited and disclosed on its own page.

Who this is for

Depends why you are here

Hiring teams

Every project here was specified, built, tested and shipped by one person. The engineering section above and the devlog are the evidence — including the parts where something broke and had to be diagnosed properly.

Agencies and collaborators

Browser-native work, automation against systems that were never meant to be automated, and internal tooling. If it runs in a tab or cleans up a manual process, it is probably in scope.

People who just want the thing

Most of these are free on the Chrome Web Store and run entirely offline. No sign-up, no email capture, nothing phoning home. Pick one from the list below and install it.

Selected work

Projects

A selection. The full index, with per-project privacy details, is on the projects page.

Ask

There is an AI on this site now

It answers questions about what gets built here, and it will work through a build decision with you — decompose, find the flaw, resolve, check. It is deliberately short, and it says “I don’t know” rather than inventing a version number.

Ask about the work

What these extensions do, how they are tested, and whether I am free for a project. It points at the real page instead of guessing at details.

Bring a stuck decision

Side panel or popup, a bug that only appears on a double click, an idle curve that went flat. Real constraints get better answers than tidy questions.

Built on a free tier

A Val Town proxy holds the key and enforces a four-axis budget against Groq’s free tier. The whole build is written up in the devlog.

Ask AI How it was built

Devlog

Recent shipping notes

Questions

Before you ask

Are you available for work?
Yes — open to conversations about contract work, collaboration, or a technical role. The fastest route is the contact form, which goes straight to my inbox.
What is the actual stack?
JavaScript and Python, mostly without frameworks. Chrome Manifest V3 for the extensions, plain modules and a headless Node harness for testing, Playwright for real-browser capture and automation, and Python for the automation and reporting work. This site is a WordPress install managed through its REST API rather than a page builder.
Why is there no telemetry in any of this?
Because none of it needs any. These are local tools; a save file has no business leaving your machine. It also makes the privacy answers on each project page verifiable rather than aspirational — the codebase is checked for network calls before those claims are written.
Did you build all of this alone?
Yes. Specification, architecture, art, testing, store listings and this site. Where AI tooling was part of the workflow, that is said plainly rather than hidden — the judgement, the debugging and the decisions about what ships are mine.
Where do the numbers on this page come from?
Counted from the source, not estimated. The project count is the live index; the suite count is what actually runs before a build is bundled. If a number here is ever wrong, it is a bug and I would like to know about it.
What is Annoying Dino?
Annoying Dino is a free Chrome extension that puts a mischievous dinosaur on any webpage you are reading. Version 2.0.0, released August 30, 2026, rebuilt the motion system, added five species, volcanoes, meteors and a wardrobe, and kept the same three permissions. It collects nothing and makes no network requests.
Ask me questions →

Let us build something

Open to contract work, collaboration, or a technical role. Tell me what you are trying to make work.

Elsewhere: YouTube · itch.io · GitHub · dev.to · Reddit · Instagram · LinkedIn

Replies come from a person · usually same day

WRITEUPS

Read the work, not just the list

Long-form case studies live on the writing index, with short direct answers to the same questions on the answers page. For the professional summary, see the CV. The engineering profile covers how the work gets built. There is also a Positivity Wall — a shared nine-panel surface where every visitor leaves one generated stamp, and yours is still there when you return.

DEVLOG

New builds, in your inbox

Occasional notes on what shipped, what broke, and what the fix actually was. No schedule, no marketing.