I build working systems across devices, data and applied AI.
Data engineer. I design these systems and decide what counts as proof; AI coding agents write most of the code under my direction.
-
A tour of the platform's sections in its own interface style, with figures extracted from its registry, run ledger, knowledge graph and design store. Projects are shown as counts, not names. Partial
BigBrain
BigBrain is the system the other projects are built inside. It keeps a registry of 36 internal projects and 131 studied external repositories, with their ports, status and health. Work is started and watched in BigTerminal. What the work teaches is kept in a provenance-tracked knowledge graph, and design quality has its own research lab. Models, budgets and providers are governed in one place, so every run's route and cost can be checked afterwards.
- Every estate project is registered with its ports, status and health
- Start, stop and open project servers from one page
- Start AI work against a project in BigTerminal
- Models, providers and budgets are governed in one place
- What the work teaches is kept in the knowledgebank
- Each run’s route and cost can be audited afterwards
- Compiles one registry of the estate from the projects themselves, with the provenance and confidence of every field.
- Shares model routing, provider capacity and budget ceilings across every run, with a free-routes-only mode enforced before each call.
- Exposes project context to external coding agents over MCP.
-
Replay of one real working day from the run ledger, in BigBrain's own interface style: real order and overlaps, idle gaps shortened. Runs on projects not listed here are left out. Proven
BigTerminal
You give it a goal from the browser or the terminal, or queue several. Each run gets a supervisor model, workers in their own Git worktrees and a reviewer that is a different model from the writer. Routing chooses across Claude, OpenRouter and local Ollama, and an operator pin can overrule it. A rate-limited provider parks the run until its reset time instead of failing it. Every attempt records its model, tokens, time and cost, and nothing completes until the Definition of Done passes.
- Give it a goal from the browser or the terminal
- Routing picks a provider and model; an operator pin can overrule it
- A supervisor model plans the work as structured directives
- Workers carry it out in isolated Git worktrees
- A different model reviews the change
- Definition-of-Done checks decide whether it counts
- The result lands with its model, tokens, time and cost recorded
- Routes each task across cloud and local model providers, and records why a route was chosen or overruled.
- Runs worker agents in separate Git worktrees, so parallel AI writers cannot overwrite each other or the operator's work.
- Refuses completion until every Definition-of-Done item has passed with evidence. Green implementer tests alone are not accepted.
-
Illustration of the real pipeline. The figures are measured on the system’s fully synthetic medium-tier campaign; sheets, coverholders and carriers are drawn. Partial
Bordereaux Management System
Coverholders send monthly spreadsheets of policies, premiums and claims. It keeps each original file untouched, maps its columns, checks every row against versioned rules and the binder's terms, and routes problems to an exception workflow where nobody approves their own fix. What it publishes is an event history with exact capacity splits, queryable by every party to the contract, and every published value traces back to the spreadsheet cell it came from.
- A coverholder uploads a spreadsheet; the original bytes are kept unchanged
- Columns are mapped; an uncertain mapping waits for a data steward
- Every row is checked against versioned rules and the binder's terms
- Errors are corrected or waived by someone other than the requester
- An approver publishes; events, splits and audit commit together
- Any value traces back to its source cell, and past states can be replayed
The full-scale simulator rerun on the final code was interrupted; the smaller runs pass on it.
- On a simulated market of 497,284 policies, every policy, claim, carrier total and point-in-time view matched the simulator's independent ledger exactly.
- A separate reviewer attacked the code and confirmed 15 defects; each fix has a test that was shown to fail on the old code.
- Access is checked on the server for every page, export and query; ad-hoc SQL runs read-only in an isolated process, limited to the caller's contracts.
-
The real graph (node types and edges; the layout is seeded) and one real retrieve, use and write-back loop from the run ledger. Only that task's own nodes are labelled. Partial
BigBrain Knowledgebank
Every accepted piece of AI work writes back what it learned: a fact, gotcha, decision or lesson, tied to its project and its evidence. Before the next task, the relevant nodes are retrieved and injected into the supervisor and workers within a token budget, and each worker reports which ones it actually used. Writes are transactions with before-and-after SHA-256 hashes and a byte-exact rollback, so a bad memory can be removed for good.
- Accepted work writes back a fact, gotcha, decision or lesson
- Each write is a transaction with before-and-after hashes
- The next task retrieves the relevant nodes within a token budget
- Supervisor and workers receive them with the brief
- Each worker reports which nodes it actually used
- Wrong or outdated knowledge is superseded or rolled back
- Retrieval is benchmarked on held-out questions: the right node is in the top three 0.917 of the time, with zero polluted results.
- Workers report which injected nodes they applied, ignored or found stale. The recorded application rate is 0.348.
- New knowledge supersedes old knowledge instead of overwriting it, so the history of what was believed stays inspectable.
-
Illustration of the real flow. The cube’s screen is a real framebuffer capture from a Sprite unit and the pack’s own character frames; the pack sizes are measured. Partial
Sprite
The phone puts the device on Wi-Fi through a protected temporary access point. From then on the device talks to a Node server, which plans content packs to fit its flash, sends them in chunks over authenticated APIs and reads back device health. Firmware changes count as proven only when they work on flashed hardware, with a rollback build kept. A successful compile is not enough.
- The phone puts the device on Wi-Fi through a protected access point
- The device registers with its content server
- The server plans content packs that fit the device’s flash
- Packs are sent in authenticated chunks
- The device shows the content and reports its health back
- Moved commissioning from Bluetooth to a protected Wi-Fi access point after measured Bluetooth/Wi-Fi coexistence failures.
- Found a production security guard that never compiled because of build flags, and a heartbeat path that leaked a device token. Both were closed and re-verified on hardware.
- Shrank a starter content pack from about 114% of the flash filesystem to about 62% by de-duplicating identical files in a generated profile, without deleting the originals.
-
Recorded from the running app and its engine, three seconds on each page; page-change and query waits are shortened. The athletes and telemetry are simulated, not historical footage. Partial
SportsVis
A live sports laboratory where fictional competitors act autonomously. Watch from above, open the professional desk and make a strategic change without stopping the action. A read-only SQL studio exposes the same simulation state, and an engineering handbook explains the models and their limits. The demo runs locally on the owner’s machine.
- Watch a shared autonomous sports session
- Open the professional desk and select a participant
- Apply a legal strategy change and observe its consequences
- Inspect the recorded samples in a read-only SQL workbench
- Read the engineering handbook and its disclosed limits
Synthetic models are deliberately simplified; local operation is verified separately from public hosting.
- Fan and professional modes share one session; analysis occupies reserved space beside or beneath the stage.
- Tyres and pit calls, football formations and substitutions, and between-round boxing advice affect the models.
- Cross-sport read-only queries return real recorded samples; unsafe SQL is rejected at the database boundary.
-
Recorded from the running app in real time. Before filming, the seeded world was run ahead at top speed so a village has grown. Experimental
Living Society
Agents live in a seeded world, gather resources and interact, and any run can be replayed exactly. Multi-seed runs, scenario matrices and ablations test the design's own assumptions. One ablation found that switching the communication system off gave about 7.4% more population after 4,000 ticks. The project records that as a finding instead of tuning it away.
- Pick a seed and a scenario
- Agents gather, trade and interact through bounded decisions
- Watch the world and click any agent to inspect it
- Replay any run exactly from its seed
- Compare runs across seeds, scenarios and ablations
- Exact replay from a seed, so any interesting run can be reproduced.
- 276 tests across 14 suites at the documented checkpoint, plus visual-regression and performance proofs.
- A long-horizon run of 10 seeds of 4,000 ticks each succeeded on every seed.
-
The running simulation rendered frame by frame at its own speed, two simulated minutes a second, early on a Monday morning; the camera moves, nobody is steered. Experimental
Alder Court
Around seventy residents of every kind of household live in an eight-storey block. Nobody is scripted: each person chooses what to do next from their needs, obligations, habits, relationships and household money, and says why. The aim is fidelity to everyday life, not a game. A Society now panel counts homes in deficit, the income gap, overcrowding, stress, isolation and lost sleep, and a lens rings every resident by the chosen measure.
- Pick a seed: households, jobs and budgets come from it
- Each resident scores their next action from needs, habits and money
- They walk planned routes, predicting everyone around them
- Workers and pupils leave in the morning and return in the evening
- Society now tracks deficits, crowding, stress, isolation and sleep
- Ring every resident by a measure, or follow anyone to read their reasons
- Decisions are scored from needs, obligations, habits, relationships and household money, and every choice carries its reason.
- Society now shows the building’s pressures live; the lens paints them onto every resident.
- Walkers predict each other and never walk into one another; doorways stay clear and lifts and stairs keep order.
-
Recorded from the running app on a throwaway profile with the live forecast for its default city; the scene lab loading and scene-change waits are shortened. Partial
WeatherComfort
The home screen is a real-time 3D street where Gus, a stylised London commuter, walks on and reacts to how you will feel in today's outfit: sweating, freezing into an ice statue, losing an umbrella to the wind. Behind him are the full forecast, a ten-second comfort log, and a personal model that learns whether you run hot or cold and turns that into practical advice on what to wear.
- Open the app: Gus walks on into today's forecast for your place
- Read today's outfit card and the hour-by-hour feel for your commute
- Log how you actually feel, with what you are wearing and where you are
- The personal model updates and explains what it has learned
- Preview any weather, time of day and reaction in the scene lab
Rendering performance on a visible display and on phones is not yet measured.
- The forecast is turned into how it will feel to you, hour by hour, for the parts of your day you actually spend outside or on transport.
- The learner was tested by planting a known bias in fixture logs and checking it is recovered, with a negative control.
- The outfit search is checked by brute force against the objective it optimises.
-
Recorded from the running app's built-in demo of three fictional, intermarried families, with no live backend. Portraits are AI-generated stills; the "video" is a still with captions. Partial
LegacyTree
LegacyTree is a genealogy app for building a family tree with relatives. Each person carries photos, dates, places, a biography and tags. The tree can be explored and opened into profiles, and the same family can be read as a timeline of births, marriages and deaths. Behind it sit accounts, shared editing, privacy settings and a Supabase backend. The app was generated with Lovable, an AI app builder; the estate's own addition is a GEDCOM parser.
- Explore a family tree as it grows in
- Open anyone's profile and play their introduction
- Match two separately built trees on the people they share
- Link them and see how any two relatives are related
- Interactive family trees whose members open into profiles with a video introduction, biography, favourite music and family links.
- Two trees researched separately can be matched on the people they share and linked, with the kinship path between any two relatives explained.
- Concurrent edits use optimistic locking, and likely duplicate people are flagged before a merge.
-
Recorded from the running app (last committed version): gallery and coverage gaps, a design recipe with its exclusions, side-by-side comparison. Partial
Design Observatory
Design work is stored as versioned experiments, and the app only projects that store. Each version climbs a ladder from candidate to exemplar, so weak work cannot quietly set the bar. Every exemplar carries a design recipe covering type, colour, composition, motion, performance and accessibility, plus what it deliberately excludes. The gallery reports which design problems it still cannot answer, and any two designs can be compared side by side.
- Study reference designs and store each attempt as a versioned experiment
- Critique rules flag what makes an interface look generated
- Strong versions climb to exemplar, each with a recipe of what it excludes
- Generate a web or app foundation from the estate templates
- Review the generated foundation against the same design rules
- What fails feeds back into the rules and the templates
- A promotion ladder (candidate, qualified, exemplar, featured, archived, superseded) decides what the gallery shows.
- Each design recipe lists what it excludes, so a transfer that brings back an excluded pattern fails.
- Its Foundations view generates the estate’s web and app templates in a scratch folder and reviews them against the same design rules.
-
Recorded from the running app: the salt mission, built only from its explicit teaching rules. Partial
MoleculeSim
You can browse and search every element, inspect representative atoms, then place atoms on the Bonding Bench. Only combinations covered by explicit teaching rules and recorded structures will form, such as water, salt and ethanol. Anything else stays visibly unsupported. Real-Chrome tests drive the missions, reduced motion and narrow-screen reflow, and a harness measures frame budgets.
- Open the Bonding Bench with a guided mission ready
- Pick elements from the inventory
- Place atoms in the chamber
- Supported combinations form; anything else is labelled unsupported
- Inspect bonds in the structure explorer
- Look closer in the element atlas or build an atom
- Bounded rules: unsupported combinations are refused rather than invented.
- Formation animations follow recorded structures and are labelled as a teaching model.
- 37 unit tests and 14 real-Chrome checks, including reduced motion and narrow-screen reflow.
-
Recorded from the running web version and its OCR server: find, photograph, read, match, collect. The location is simulated at the plaque, the plaque photo is generated, and the OCR wait is shortened. Partial
Blue Plaque Hunter
The map holds 2,264 plaques merged from public heritage sources, plus guided walks and daily quests. You pick a plaque, stand in front of it and take a photo. OCR reads the inscription, and collection only unlocks when the text matches that plaque and you are close enough to it. The server validates the claim and awards points. New plaques can be submitted, and they wait for moderation.
- Open the map of plaques, walks and daily quests
- Pick a plaque and walk to it
- Stand in front of it and take a photo
- OCR reads the inscription and your distance is checked
- The server validates the claim and awards points
- Your collection and quests update
- Imports and de-duplicates plaques from several public sources into one database, keeping each record's provenance and licence.
- Collection is gated twice: the OCR text must match the plaque, and the device must be close enough to it.
- The OCR server preprocesses photos and runs Tesseract behind tokens, rate limits and upload limits.
-
Recorded from the running app: choose, upload, preview on the card, host, QR, phone. The AR view itself needs a phone camera and is not filmed. Partial
QR3D Host
The front page is one guided journey. Choose a 3D object or a picture, upload it, check how it will stand on the printed card, and host it. The server stores the file, creates a stable QR identity and a printable card that carries the tracking marker. Scanning opens the secure AR page, which loads the same hosted file, and the code can be re-pointed later without reprinting.
- Choose a 3D object or a picture
- Upload it to your own server
- Check how it will stand on the printed card
- Host it: a stable QR identity is created
- Print the card with its QR code and tracking marker
- Scan on a phone and see it standing on the card
Proved in desktop Chrome with a synthetic camera; anchoring on a physical phone is still a manual check.
- Uploads are validated before anything is written: a GLB’s header and declared length must match the file.
- A printed code keeps its identity; what it opens can be changed later without reprinting.
- The printable card carries both the QR code and the square marker the camera anchors to.
-
Recorded from the running app: search, scrub the timeline to February, list what is active. Proven
Cultural Atlas
You ask what is happening in a place, or on your dates. The server answers map, timeline, country-by-month and preference-match queries over a catalogue of 1,747 dated occurrences, and a React and MapLibre interface draws the results. Each record carries its evidence state (confirmed, calculated, expected or pending), and the interface shows that state instead of hiding it.
- Ask what is happening in a place, or on your dates
- The server answers map, timeline and calendar queries over the catalogue
- The map, activity view and density timeline draw the answer
- Every record shows how certain its date and source are
- Share the exact view as a link
- A citation is not treated as a fetched source: of 1,240 cited sources the system has retrieved 7, and the interface says so.
- Splitting fixed places from dated events cut each timeline-scrub update from about 816 kB to about 2 kB, and from 30 requests to one.
- Found a map that rendered nothing because the bundler had broken MapLibre's worker URL without raising an error. The URL is now wired explicitly and a test guards it.
-
Recorded from the running studio on a desktop GPU: two of its starting compositions, then presentation mode. Experimental
FluidSim
An image archive is reduced to a latent space by principal component analysis. A slow walk through that space is decoded every frame on the GPU, and the decoded dream becomes both the pigment and the force field of a WebGPU fluid. The result is glossy, folding relief paint threaded with luminous fibres. Each work is a small file covering the dream, flow, matter, camera, light and look. Live wind data for a chosen city can steer the whole field.
- Pick a work or drop in an image archive
- The browser learns the archive's latent space
- A seeded walk drifts through that space
- Each decoded frame pours paint and force into the GPU fluid
- Present full screen, record, or export a still
- Render a master offline at the film tier
- The dream is a principal-component walk through a learned image archive, decoded on the GPU every frame.
- The decoded image is both paint and force: it pours pigment and steers the fluid that carries it.
- Drop in your own images or folder and the browser learns a new archive from them.
What I work with
Each area links to the projects on this page that show it. Lines marked “At work” come from my day job as a data engineer in insurance; that work is confidential, so it is listed rather than shown.
-
Data engineering
- BigBrain
- Bordereaux Management System
- BigBrain Knowledgebank
- WeatherComfort
- LegacyTree
- Design Observatory
- Blue Plaque Hunter
- Cultural Atlas
At work Batch and streaming pipelines with Azure Data Factory and Databricks, on a medallion (bronze, silver, gold) lakehouse
-
Databases & SQL
At work Relational databases and SQL over enterprise insurance data
-
Cloud, servers & networking
At work Azure cloud services, and on-premises and cloud servers
-
DevOps & CI/CD
At work CI/CD pipelines, GitHub and version control
-
Security
At work Data security and access control
-
APIs & backend
-
Real-time & streaming
-
AI, agents & ML
-
Testing & QA
-
Embedded & IoT
-
Mobile apps
-
Frontend, 3D & graphics
How these were built
I designed these systems, decided what counted as proof and verified the results. Most of the code was written by AI coding agents (Claude and Codex) working under my direction.
Every demo above is recorded from the project's own running app, on demo or scratch data. Where a project is hardware, or its live interface shows other private work, its caption says what the loop is instead.
- Proven
- The behaviour described was exercised end to end, with recorded evidence.
- Partial
- The core works; named parts are not yet proven.
- Experimental
- A lab or research system; read it as an experiment.