Sydney, NSW Open to software, AI and test-automation roles

Lachlan Brown

Selected work

Things I have built since 2025. All of them are running on my machine right now.

Spirescape

Playable prototype · Sep 2026 · set in the Gloomfell world

Slay the Spire combat in a RuneScape world. I wrote the design down before I wrote the code.

Play the demo in your browser Unity WebGL, about 11 MB, best on a desktop browser. If you meet someone in there, they are real.

Spirescape mixes Slay the Spire's card combat with RuneScape's open-world skilling and economy. I designed it before I built it. Eighteen rounds of a structured design interview produced 168 locked decisions, each with an ID, a date and the reason behind it, in one log that is the only source of truth. Superseded decisions get struck through, not deleted. Open questions have their own file. No document and no agent is allowed to invent an answer. Every rule in the code cites the decision it comes from, and because "everything connects to something" is the one design pillar, the content loader refuses to start if any material has fewer than two uses.

The prototype is a zero-art tutorial you can play in a browser. One shared rules library is compiled by both a headless .NET server and a Unity 6 client, so the client never works out a rule itself. It sends what you meant to do and draws whatever the server's 600 ms tick sends back, and a second browser is a second player in the same world. The test suite plays the whole tutorial end to end over a real socket with a headless client, and a smoke driver plays the opening in a built player and saves screenshots. It runs on a five-dollar Lightsail box in Sydney behind Caddy, which serves the WebGL build, fetches its own certificate and proxies the WebSocket on the same origin. The music is written as MIDI in Python and rendered through a General MIDI bank, the way the 2004 RuneScape soundtrack was.

Built with
  • C#
  • .NET 10
  • Unity 6
  • WebGL
  • WebSockets
  • xunit
  • Caddy
  • Lightsail
  • MIDI in Python
Shape
Shared rules core, authoritative headless server, thin Unity client
Design
168 locked decisions over 18 interview rounds; the code cites them by ID

MusicLearn Trainer

Public release · Sep 2026 · GPL

A plugin that hides the answer so you actually learn to read music.

MusicLearn sits on a MIDI track in Ableton Live, watches the keyboard, draws what I played on a real grand staff in the Bravura font, and checks it against the exercise. MIDI passes straight through, so instruments and recording keep working. It is C++ on JUCE 8, and the whole interface is one HTML file hosted in WebView2 and baked in at build time. Serve that file from a folder and it runs in Chrome against Web MIDI, so I can work on the interface without rebuilding the plugin. The drills and item pools are plain data in the same file.

The drills are built around recall, not copying. A new item is shown once with its answer, then hidden. A wrong note is drawn in red exactly where it sits, next to the note that was asked, with a message like "F5, one step too high". Misses come back within a few items, the picker weights everything by error rate and how long since you last saw it, and a level suggests moving on at 90 percent first-try over the last twenty. Progress lives in the plugin's WebView2 profile. Nothing leaves the machine.

Download MusicLearn Windows VST3 for Ableton Live 12 or any VST3 host, 1.8 MB. Unblock the zip, copy the folder into C:\Program Files\Common Files\VST3\ and rescan; INSTALL.txt inside has the steps. AGPL v3, source on GitHub.
Built with
  • C++
  • JUCE 8
  • VST3
  • WebView2
  • Web MIDI
  • Bravura
  • CMake and Ninja
MusicLearn Trainer open inside Ableton Live 12: a grand staff asking for a bass-clef A2, a piano keyboard with the played key highlighted, and a reading-level panel showing 38 percent mastered
Read mode inside Ableton Live 12. The staff asks for A2 in the bass clef; the keyboard, the level's mastery gate and the session stats sit around it.

Gloomfell

In development · 2025 to present

A tower-defence game where the 3D models are scripts and a fleet of agents argues over which one looks best.

I do not model anything by hand. Each character and tower is a Python script that runs Blender headlessly and exports an FBX. The script's knobs sit at the top as plain variables, so trying a design change means writing a row of overrides, not editing code. A preview harness renders each row in parallel Blender processes, stops them fighting over the GPU, and writes every wave to its own folder with a manifest and the renderer version, so I can reproduce any picture later. Previews cannot touch the real .blend or FBX. A hook interlock refuses to run any script that could.

The agent workflow around that harness is on its third design, and I rebuilt each one on what the last one measured. The first was one agent with one fixed camera, editing the script against its own render. The second was a fleet: an orchestrator, designers, modellers working in their own git worktrees, and three verifiers scoring renders out of 100. Across 81 logged attempts the panel almost never agreed, so I turned every rule that had been prose into a mechanism. The third dropped the scores for blind pairwise judging on a random 360-degree orbit, added silhouette masks and sanity checks, and runs per-asset shepherds and makers through review panels that can accept, send back or scrap. I steer it from a live page with a chat box. A champion is a run, a cell and a seed, so I can replay any verdict.

Built with
  • Unity 6
  • URP
  • C#
  • Blender Python API
  • Preview harness
  • Agent fleet
  • Blind pairwise review

The Silent Knight · three builds, one script

Knight, version 1: a rounded chrome figure with a red crest and a gold cross on its shield, on a tan backdrop
v1 · Apr 2026 · one agent, one camera, first pass
Knight, version 2: dark armour with a gold T emblem and a blue plume, captured in the Blender viewport
v2 · Apr 2026 · same session, second pass
Knight, version 3: silver plate outlined in gold trim, a swept golden plume, a blue cape, a sword and an open book
v3 · 31 Jul · procedural rebuild, first variant row through the harness

The Mage · three builds, one script

Mage, version 1: a blocky pale-blue figure with a pointed hat and a simple staff, on a tan backdrop
v1 · Apr 2026 · one agent, one camera
Mage, version 2: a pale blue robed figure with a pointed hat and a plain staff, rendered on a lit stage
v2 · 31 Jul · procedural rebuild, before the fleet
Mage, version 3: the same figure with a gnarled, kinked staff and a stone plinth, lit on a dark stage
v3 · 12 Aug · fleet champion after blind pairwise panels

Every tile is a render of the script as it was on that date. Nothing is retouched. I rebuilt the knight's v3 around three legibility rules (silhouette first, gold trim on every plate, dark recesses behind the glow) after v2 failed a store-icon test. The mage's v3 is what the fleet did to v2 over 450 logged runs.

Earshot

Working prototype · 2026

A listener that hears what I say and acts on it, without anything leaving my machine.

Earshot transcribes whatever it hears in real time, shows the words in a floating overlay as they are spoken, and fires rules I have written on what was said. Silero voice-activity detection gates a two-tier Whisper pipeline: a tiny model gives rough partials every 400 ms while you are still talking, then an accurate model transcribes the finished sentence. Rules only ever see the final text, so nothing fires on a guess.

Rules escalate through three tiers: keyword and regex for free, a local model through Ollama, then a budgeted cloud call. Actions go out over MQTT, HTTP, the shell and AutoHotkey. Nothing leaves the machine unless a rule says so, and the only thing written to disk is the list of triggers that fired.

Built with
  • Python 3.11
  • faster-whisper
  • Silero VAD
  • WebSocket bus
  • Ollama
  • Tauri v2
  • Rust
Shape
Python backend and rules engine; Rust and WebView2 overlay

Lodestone

In development · Apache-2.0

Back up a dev setup so it still works on the next machine.

Lodestone backs up, restores and shares a Claude Code and terminal setup across machines. Copy a config folder to a new computer and half of it is dead on arrival: a hook pointing at a file that got left behind, a script with no runtime, a server with no key. Lodestone treats each piece as a capability with dependencies, checks the destination is ready before restoring, and installs whatever is missing.

It finds secrets across every provider and never stores them in plaintext. A desktop app and a standalone CLI share one Rust engine, split across core, platform, CLI and Tauri crates.

Built with
  • Rust
  • Tauri
  • Dependency manifests
  • Encrypted secret store
  • Four-crate workspace
Shape
Desktop app plus CLI over a shared engine

Operations cockpit

Daily use · 2026

My mail, calendar, tasks and background services on one screen, with Google as the source of truth.

A set of dashboards that render inside Obsidian, each one a single JavaScript block over a Python backend. The mail cockpit merges several Gmail accounts into one feed with triage, compose, reply and full Gmail search, and sorts every conversation into Work, Security, Finance, Releases, Marketing or Personal. Rules go first and a small model handles the leftovers. Appointments it finds in mail land on their own calendar automatically.

Calendar and tasks sync both ways with Google. A process warden keeps the long-running services alive and reports on them. OAuth tokens are DPAPI-encrypted and kept outside the vault.

Built with
  • Python
  • Gmail, Calendar and Tasks APIs
  • OAuth2
  • DPAPI
  • JavaScript
  • Haiku classification
Shape
Python backends own credentials and sync; the UI reads a local cache and shells out for actions

Data analyses

Two public reports · Oct 2026

Questions I wanted answered properly, worked through from public records and published with every source.

The Sutherland Shire's water asks whether ANSTO and the Lucas Heights tip can reach the Shire's drinking water (they can't: both drain downstream of Woronora Dam), what coal mining under the catchment is doing to it, what the PFAS record from 2024 and 2025 actually says, and how a resident could test for themselves. It is built from licences, monitoring data, regulator reports and inquiry transcripts, with 87 linked sources and no water sampled.

The State Harm Index scores the governments of 37 countries from 1 to 100 on repression, violence, environmental damage, corruption and social harm, with the change over one day to ten years. Yearly indicators from V-Dem, Transparency International, UCDP and Our World in Data set the long run; the day's news, scored by a small model, moves it. It is built to rebuild itself every evening; that run is paused for now, so the page shows the data to 7 October 2026.

Built with
  • Node.js
  • V-Dem, CPI, UCDP, OWID
  • GDELT
  • Haiku scoring
  • Scheduled task
  • Self-contained HTML
Shape
Each project's engine builds its page; the site project checks it and publishes

Smaller tools

Each solved one problem I had that week.

  • zigbee-mcp

    A Model Context Protocol server that exposes my Zigbee2MQTT lights and sensors as typed tools, so an LLM agent can control a room with structured calls instead of hand-written MQTT messages.

    Node.js · MQTT · MCP · open source

  • Terminal Orbs

    A click-through overlay for WezTerm. Glowing orbs gather on the lines of terminal output that matter, scored by regex heuristics and a small model, and change colour with Claude Code's status, so I can tell from across the room whether it is waiting on me.

    C# · Win32 layered windows · WezTerm CLI

Experience

Transport for NSW · QA Automation Engineer

Oct 2021 – Jul 2025
  • Automation engineer on four of the team's six delivery streams, owning automation strategy and execution across API, UI and mobile layers.
  • Built a business-rule dispatch layer over the AWS SDK (Lambda, DynamoDB, Cognito, S3) that let tests exercise individual services directly, running the whole regression pack at about 2,500 cases an hour.
  • Built an Opal fare-engine simulator covering base fare, trip rules, public holidays and station access fees, adopted as the branch's standard fare check.
  • Wrapped the AWS layer in a no-code suite so manual testers could drive live services and mock API and React state; it became the base of an internal Codeless Automation Framework.
  • Wrote data-parity tooling for system migrations, running identical inputs through legacy and replacement services to catch behavioural drift before cutover.
  • Designed CI/CD pipelines in Jenkins and Bitbucket Pipelines covering compile, build, export and test for React Native apps and their backend integrations.

Vision Packaging · Automation Engineer

Jan 2015 – Aug 2018
  • Designed a product classification system giving every SKU a structured, comparable description, which unlocked pricing analysis and sales automation.

Earlier · alongside a UTS degree

2014 – 2021
  • Website security testing, May to October 2021.
  • Systems administration, self-employed, 2015 to 2019, for mPort 3D Body Mapping and Strong Property Real Estate.
  • Electronics component sales: Australian Scientific as owner, 2014 to 2020, and Jaycar in 2019.

Toolbox

Professional means I have been paid to use it for years. Project means I have shipped something real with it.

  • LanguagesTypeScript and JavaScript, Java (professional) · C#, Python, Rust, C++, Swift (project)
  • TestingSelenium WebDriver · Playwright · Cypress · Cucumber and Gherkin · JUnit and TestNG · API automation · Test framework architecture · Mock and stub layers for React and REST
  • Cloud and CI/CDAWS Lambda, DynamoDB, Cognito, S3, CloudFront, Serverless Framework · Azure · Docker · Jenkins · Bitbucket Pipelines · Git
  • Frontend, mobile, dataReact · React Native for iOS and Android · MySQL · PostgreSQL · DynamoDB · Cassandra
  • Desktop and agentsTauri · WebView2 · JUCE · Unity 6 · Blender scripting · MCP servers · Local and cloud LLM pipelines
  • Working practiceAgile and Scrum · JIRA · Unix and Linux, Windows, macOS · CCNA Routing and Switching

Also on GitHub

All 41 public repositories

Education

  • Bachelor of Science in Information Technology, University of Technology Sydney, 2015 to 2021.
  • CCNA Routing and Switching, Cisco.