Work · Twelve projects · 2020 – present

The Shelf

Twelve things, all finished enough to hand to a stranger. A trading-research boardroom, a Unity island resort containing seven complete games, a chess server that plays for you when your clock runs out, a fortune machine you argue with, two LED panels that disagree about where intelligence belongs, a local-first painting apprentice, a pipeline that turns five phone photos into a printable part, two faith apps, a fantasy-football draft model, and a novel that grew an audiobook, an animated short, and a sixteen-room adventure game.

Every one of them was specified, designed, built, and shipped by one person.

Projects

12

Shipped or playable

Languages

8

Python · TS · C# · Swift · Dart · C++ · JS · MATLAB

Platforms

6

Web · iOS · Android · macOS · Edge · Embedded

Public sites

6

Bablytics · Blunderbuss · Atelier · Ramen-Tio · Board Foxes · My Family Rosary

(01)

Software & Machine Learning

Systems where the interesting part is the architecture, not the interface.

(01)

Bablytics

Multi-agent market research
Python · LLM boardroom · PyTorch
2020 – present

  • Live

An AI boardroom that reads the market's infinite library twice a day.

Every weekday morning Bablytics scrapes options-volume spikes, US and world news, congressional trade disclosures, chart technicals and market-cycle data; assembles roughly forty candidate trades; and convenes fifteen AI personas to grade every one of them. Thirteen grade, a dedicated Skeptic rebuts with all grades in hand, and an Executive publishes a ranked Top 20 — split into an options desk with specific selected contracts and a plain stock book — plus a morning memo.

After the close, the Evening Court convenes: the day's leads are scored against the closing tape and every member journals where they were right, where they were wrong, and the lesson they take — and those lessons feed back into the next morning's grading. Realized 1-day and 5-day returns simultaneously train a small neural net that predicts outcomes from board grades and features, so the Executive learns which members to trust rather than being told.

The board's personas are built from published philosophies rather than personalities — value discipline, options flow, statistical regime, gap statistics, tail risk, house-edge analysis. The name is Borges: the market publishes a Library of Babel every day and almost all of it is noise, so the tool is the catalog room. Research and entertainment only — not financial advice, and it executes nothing.

  • Python
  • Multi-agent LLM
  • Neural net
  • Scrapers & ETL
  • SQLite
  • Web app
  • Desktop packaging

(02)

Atelier

Local-first generative art
PyTorch · SD-Turbo · VGG19 · VAE
2026

  • Live

An apprentice for your studio. You draw the outline, it lays in the colour — in your palette, your hand.

Give Atelier a handful of one artist's pieces and describe what you want to see. It draws the content, repaints it the way that artist paints, and hands back a set of candidates ranked by how completely they took the style. Five stages: SD-Turbo for content, depth-weighted VGG19 neural style transfer for the repaint, a composition lock that restores your framing, an optional locally-trained variational autoencoder acting as a prior on the artist's own marks, and a final grade-and-rank.

Two details do most of the work. Style statistics come from native-scale crops — marks matched at the size they were actually made, not squashed into a thumbnail — and the shallow VGG layers carrying palette and texture are weighted heavily while the deep layers are weighted almost to zero, so the artist's subjects are never smuggled into your scene.

Private by construction. No account, no upload, no server; models, style index and gallery all live in one folder on the user's own machine, and the only network access in the product's life is a one-time model download. Nothing trains a shared model on anybody's work. Ships as a signed desktop app for Mac, Windows, and Linux.

  • PyTorch
  • VAE
  • Diffusion
  • Neural style transfer
  • Python desktop app
  • Offline

(03)

Draft Engine

Fantasy football valuation model
Python · pandas
2026

A scoring-aware draft board for a league whose rules break every public ranking.

Public fantasy rankings assume public scoring. This league pays 0.2 points per rushing attempt on top of full PPR, which quietly re-prices half the player pool — and no off-the-shelf board reflects it. The engine re-projects every player under the league's actual settings, computes value over replacement by position, blends the result against ESPN's ADP to find where the market is wrong, and emits a ranked board as CSV, JSON, and a self-contained interactive HTML artifact for draft night.

  • Python
  • pandas
  • VORP modeling
  • Data blending
  • HTML artifact generation

(04)

Sleep Psycho

Photogrammetry → printable part
Python · MediaPipe · SciPy · trimesh
2026

Five phone photos of a face become a watertight, print-ready custom sleep mask.

Two steps, and both of them are the interesting part. Photos to face mesh: five phone shots at known angles, with MediaPipe locating the same 478 semantic landmarks in each — eye corners, nose tip, brow points, lip edges. Because the same named point is found in every view, that yields dense correspondences without relying on skin texture, which is exactly where classical keypoint matching fails on faces. Bundle adjustment then solves every 3D point and every camera pose together, down-weighting landmarks facing away from a camera, holding a weak prior toward an average face, and automatically rejecting any photo that disagrees with the rest. Real-world scale comes from iris diameter, near-constant at 11.7 mm across adults.

Face mesh to printable shell: because every mesh shares the same vertex numbering, the mask outline is defined once, relative to landmarks, and transfers to any face with no training data at all. Anchors sit 14 mm above the brow, 22 mm outside each outer eye corner, 26 mm below each eye at the cheek, and at the nose bridge. A fine polar grid ray-casts onto the mesh to read true skin height and surface angle, the inner surface is offset 2.5 mm for the foam gasket and domed a further 11 mm over each eye so nothing touches the lashes, and every offset scales with local slope so the wall keeps thickness where the face turns toward the temples.

It verifies its own output rather than trusting it: watertight, consistent triangle orientation, positive volume, and measured clearance between shell and skin. Exports a print-ready STL, roughly 130 × 66 mm and 30 g in PLA. Every dimension is a parameter, so variants are printed and compared rather than argued about — the clearest example on this site of the mechanical, CAD and machine-learning sides being one job instead of three.

  • Python
  • MediaPipe
  • Bundle adjustment
  • Photogrammetry
  • trimesh
  • Parametric geometry
  • 3D printing

(02)

Games

Where the engineering has to be invisible or the whole thing stops being fun.

(05)

Board Foxes

Open-world game · 42 scenes
Unity 6 · C# · every asset procedural
2026 – present

  • Guide live

Seven skateboarding foxes, one coastal island, and seven full games hiding inside it.

There is no separate overworld — the island is the game. Villas climb the hillside, a resort drive winds down to the plaza, and past it sit the lagoon, the pier, the beach ring and open ocean. Every fox skates, so skating is how you travel and rails are public transit. Seven legendary foxes host seven venues, and each venue is a complete game in its own genre rather than a mode: a score-attack trick park, a four-course kart grand prix, a percent-knockback platform fighter, a sky-island creature frontier, a 2D platformer with an overworld map and secret exits, a seven-board party game with forty minigames, and a hundred-level marble climb.

The second-largest system is a full creature RPG in the national park: 150 species across eight biome tiers, dual typing over fifteen types, evolution lines, hidden abilities, held items, and 146 moves that each animate differently. Creatures roam visibly — skittish ones flee, aggressive ones charge. Seven gym leaders hold a badge chain, the gyms are enterable puzzle dungeons rather than arenas, and around two hundred route trainers sit between them.

The island keeps running when you stop. A day is twenty real minutes; the moon runs its own fourteen-hour arc on an eight-day phase cycle; the ocean has a real mixed-semidiurnal tide that walks ten metres up and down the beach. Residents work shifts and go home, weather rolls through, and none of it can be rerolled by quitting out. Thirty-four residents speak, 141 achievements track it, and there are 55 fish and 13 crops underneath.

Every scene regenerates deterministically from code — one editor command or a headless batch invocation — so a script change never means rebuilding a level by hand.

  • Unity 6
  • C#
  • Procedural generation
  • Systems design
  • Simulation
  • LLM NPCs
  • Save systems

(06)

Blunderbuss

Correspondence chess, on a clock
JavaScript · Cloudflare Workers + Durable Objects
2026

  • Live

Chess with a friend over text, on a per-move clock. Miss the clock and a random legal move is played for you.

It exists because correspondence chess has two failure modes: the opponent who takes three days to reply, and the opponent who takes three days because they are feeding the position to an engine. A short per-move clock fixes both at once, and a random move is a real consequence that still leaves a game worth finishing.

The scheduling is the design. Each player's clock starts when they open the game, not when the opponent moved — so nobody is punished for delivery, an unread text costs nothing, and the worst case for a single move is two clocks rather than infinity. When time does run out, a Durable Object alarm fires server-side and plays for you whether or not anybody has the page open.

The random move is deterministic — seeded from the position and ply and nothing else, no wall clock, no Math.random — which is what lets any client replay the move list and arrive at the same board the server has. A game's entire state is a move list plus a handful of timestamps, so there is no second source of truth to drift. No accounts either: a token in local storage is the whole identity model, and holding only the link makes you a spectator.

  • JavaScript
  • Cloudflare Workers
  • Durable Objects
  • Custom chess engine
  • Test suites

(07)

Ramen‑Tio

Zoltar-style arcade game
React Native · Expo · TypeScript · Firebase
2026

  • Live

Argue a fortune-teller out of a free bowl of ramen.

El Gran Ramen-Tio — Mexico’s finest oracle and, inexplicably, ramen’s number-one fan — guards one steaming bowl behind the glass of a carnival fortune machine. You get ten coins and sixty seconds a turn to flatter, reason, beg, bribe, or baffle him into handing it over. Every plea moves a persuasion meter; you win the bowl at +100 and get thrown out at −100.

He is not a script. Every reply is generated live in character, about what you actually said — he quotes your words back at you, twists them, holds a grudge across turns, and gets visibly flustered as the meter climbs. Flattery, logic, a sob story, bribery, real ramen scholarship and pure nonsense all land differently, and he notices when you repeat yourself. Threats go badly.

Three oracles gate the game, and the difficulty is adaptive in an unusual way: beat one and it studies how you did it, so the higher tiers resist the tactics that have already worked. Your winning move has a shelf life. Twelve achievements sit on top, including one hidden phrase no oracle can resist.

Network loss is a design case rather than an error state — the machine falls back to a smaller built-in repertoire and keeps playing, so it never goes dark. Free to play, with a one-time purchase that removes ads permanently.

  • React Native
  • Expo
  • TypeScript
  • Live LLM character
  • Adaptive difficulty
  • Offline fallback
  • Firebase Hosting
  • IAP

(03)

Hardware & Embedded

Two sibling LED products that reached opposite architectural conclusions — because the link between the brain and the panel was different, and that is the only thing that should decide it.

(08)

Pixelwall

20×20 RGB LED wall
ESP32 · FastLED · PyTorch · Web app
2026

Text, images, video, and audio-reactive visuals on 400 pixels — from one web app with no build step.

A 20×20 WS2812B panel at 16.7 mm pitch, driven by an ESP32 over USB serial, with the entire application being a single HTML file you open in a browser. Three levels: Type (paged and scrolling text, a stock ticker), Sight (any photo or video downsampled to 400 pixels), and Sound — a microphone through an FFT into a learned decoder that paints the wall.

Level three is the research piece. Sixteen auto-gained audio features drive twenty-four latents into a convolutional decoder — z → 5×5×32 → 10×10×20 → 20×20×12 → RGB, LeakyReLU with BatchNorm and CoordConv — trained on openly-licensed concert footage reduced to 20×20 and exported as weights the browser loads. The JavaScript decoder is checked numerically against PyTorch — same weights, same latent, agreement to within uint8 rounding — because hand-indexed weights make it very easy to ship a plausible picture that is not actually the trained model.

  • ESP32
  • FastLED
  • PyTorch
  • CNN decoder
  • Web Audio / FFT
  • WebSerial
  • Zero-dependency web app

(09)

Dynamic Bumper Sticker

8×32 flexible LED panel for a vehicle
ESP32 · BLE · iOS Shortcuts
2026

Talk to your phone — the message appears on the back of your car.

An 8×32 flexible RGB panel, roughly 12.6″ × 3.1″, 256 pixels. Eight rows fit a 5×7 font; thirty-two columns fit five characters. Five characters is not a message, so scrolling is the primary mode rather than an effect — a constraint that shapes the whole product.

The one architectural decision: Bluetooth Low Energy gives roughly 1–4 KB/s on iOS, and a single 8×32 RGB frame is 768 bytes. Streaming frames would cap out near 3–5 fps and fall apart whenever the link degrades — which, in a car, it will. So the phone sends what to say, not what to light. The ESP32 owns the font, the scrolling and the timing; a scrolling message costs about 24 bytes instead of 23 kB a second, and the sticker keeps running when the phone is locked, out of range, or dead.

That is the exact opposite split from its sibling Pixelwall, where a fast USB link meant the laptop could render and the panel could be a dumb sink. Same family, opposite answer, for a reason that is written down. Shipped as a specification: BLE protocol, vehicle-lighting regulatory brief, bill of materials with automotive power and weatherproofing, and a browser simulator of the panel.

  • ESP32
  • BLE peripheral
  • Protocol design
  • Regulatory analysis
  • BOM & power budget
  • iOS Shortcuts / Siri

(04)

Narrative & Applications

A novel that grew three other products, and two apps built for families.

(10)

The Groundskeeper

Novel · Audiobook · Animated short · Game
Manuscript · JavaScript engine · macOS app
2026

The groundskeeper is dead. The garden knows who did it.

The Chronicles of the Groundskeeper is a novel — first of a series — about Josh Plowen, eighteen and newly orphaned twice over, reasonably sure the official story of his great-uncle's death is wrong. A ladder. His own shears. A night job for a duke of a country no map has heard of. The letter waiting on Josh's pillow carries a mushroom insignia and it leads down: to a hidden order older than Geneva, a diary that opens one page at a time, and a slow green war being waged, politely, beneath the streets. It is a book about the people who keep things alive and are mistaken for simple because of it.

Around the manuscript sits a full production pipeline, all of it built here: a print-ready KDP interior and cover wrap in illustrated and unillustrated editions; a narrated audiobook in US and UK voices with an original score; an animated short of the prologue; and a continuity system — a maintained canon file, an editor's log, a voice study, and per-chapter advisory passes — that keeps a long serial honest.

And a game. The Escape Rooms is a point-and-click adventure built on a custom engine: painted UI, ink-bloom transitions, inventory, deterministic choices with checkpoint resets, and cutscenes. Sixteen rooms are fully designed and machine-proven completable — a solver walks every room and a linter checks every reference, flag and item on each data change. Ships as a macOS app and as a plain web build.

  • Long-form fiction
  • Custom game engine
  • JavaScript
  • macOS packaging
  • Audio production
  • Animation
  • Print production

(11)

My Family Rosary

iOS & iPadOS app
Flutter · Dart · Firebase
2025 – present

  • Beta signup open

Pray the Rosary in your family’s own voices — including the ones you can no longer hear anywhere else.

Each person records the prayers once, in their own voice, and the app weaves those recordings into a complete Rosary or Chaplet the family can pray together — at the kitchen table, in the car, or a thousand miles apart. It reshuffles the voices daily, so the Rosary is new every morning. Anyone without a phone, a grandparent or a small child, can be recorded by someone else.

It works from the very first day, which is the detail that makes it usable: anything not yet recorded plays in the voice of Bishop James Wall, so a family is never staring at an empty app waiting for everyone to contribute. All four mystery sets are first-class objects with their named mysteries and traditional fruits, and a per-family configuration decides which optional prayers are included, so playback matches how that family actually prays.

Because every playback slot pins a specific recording, the name and photo on screen change as the speaker changes. Security is scoped to family-group membership at the rules layer with server-validated invite codes — an access model that matters more than usual when the content is a recording of someone’s grandmother. Conceived by Rebecca Even; built here.

  • Flutter
  • Dart
  • Firebase Auth
  • Firestore
  • Cloud Functions
  • Audio pipeline

(12)

Jesse Tree

iOS app
Swift · SwiftUI
2025

The Advent Jesse Tree, as a native iOS app.

A day-by-day Advent devotional built around the traditional Jesse Tree ornaments — each day's symbol, its scripture, and its place in the lineage — as a native SwiftUI application with a document-based model. Built to be used by a family in the same room rather than by one person on a phone.

  • Swift
  • SwiftUI
  • Document architecture
  • Xcode

Yours could
be next

Every project above started as a sentence describing a problem. Send yours — the problem, where it stands today, and what needs to be true in ninety days.

Start an engagement → Research