I find the real problem,
then build the simplest system that solves it.
I’m a digital media engineer. On any given project that means I’m the developer, the
designer, the systems architect, and the person who gets handed the thing nobody else wants to
own. The title on the door changes — CTO, VP of Marketing, professor — and the work underneath it stays the same.
A warehouse is a building trucks come to. Before anyone can unload one, somebody has to establish
what is on it and where it is supposed to go. At GWSI that happened at a window: the driver walked
up, and a member of staff typed five to seven pieces of information into a computer while the
driver read them out.
Two things made that slow. Drivers frequently don’t speak English and the staff at the window
only do. And the reference number that identifies the load — the one piece of information
everything else hangs off — is the piece drivers most often have wrong. So it went: wrong
number, look it up, that’s not it, wait while the driver digs through paperwork for another
one. Three attempts was normal. Each warehouse kept its own record of all of this in
its own spreadsheet.
I moved check-in onto the driver’s phone. The form checks the reference number against the
warehouse’s own system before it will submit, so a driver with the wrong number is told
immediately, along with where on their paperwork the right one is. Once it goes through, the load
appears on a live board the staff work from: who has arrived, which dock door they’re
assigned, how loading is going, how long they have been waiting. Managers get the numbers
underneath — door usage, wait times, and how close trucks arrive to the time they promised.
Some imported freight enters the country before duty has been paid on it. It sits in a bonded
warehouse under US Customs rules, and those rules are strict: at any moment you have to be able to
say which items are still under bond, which have been released, and where each one physically sits
in the building. Inspectors arrive unannounced and expect that answer on the spot.
Four warehouses were answering it four different ways, out of spreadsheets and email threads.
Nothing reconciled against anything else. Close to a quarter of records disagreed with reality. The
annual filing to Customs took days or weeks to put together, most of it spent working out which
version of which spreadsheet to believe.
I built one application that all four warehouses use for the same job: logging freight into bond,
releasing it back out, and holding the paperwork attached to both. Notifications to customers and to
Customs happen as part of the process rather than being somebody’s job to remember. When two
records disagree, the system raises it that day instead of in December. The year-end report builds
itself.
Result
Status discrepancies
23% → 0
Year-end report prep
days or weeks → under 3 min per warehouse
Paperwork
four local systems → one
Training
under 10 minutes
PHP 8.1+ · MySQL 8.0+ · Composer · Node
03
Relay
The emails nobody has to write
GWSI · four markets · in production
A warehouse holds freight belonging to other companies, and every one of those companies wants to be
told something slightly different when their freight moves. One wants a spreadsheet, formatted their
way, attached to an email, every time a truck is unloaded — thirty-plus times a day across the
four markets. Another wants photographs, part numbers, and serial numbers any time something arrives
damaged. There are hundreds of customers and each has their own version of this.
Staff were doing all of it by hand, which meant the person confirming a load also had to carry
hundreds of customers’ preferences in their head, and build the file, and write the email, and
get it right, every time.
Relay watches the warehouse system for one thing: a member of staff confirming that freight has
arrived or shipped. When that happens, whatever that customer’s rules say should follow —
the email, the spreadsheet in their format, the photos with the serial numbers attached
— happens without anyone deciding to do it. Staff handle the freight. The rules live in the
system instead of in people.
Result
Staff time back
2–3 hrs/day, per market, across 4 markets
Missed data sends
zero
Customer rules
carried by the system, not by people
Bun workspace monorepo · TypeScript · Cloudflare Workers · Wrangler
04
DePuy Synthes iOS
Hundreds of thousands of documents, offline, in a 5MB app
DePuy Synthes / Johnson & Johnson · North America and Europe · 15+ years in production
DePuy Synthes makes surgical implants and the instruments used to fit them. Their sales reps, and the
surgeons those reps support, need product documents, training material, and video — and they
need it while standing in a hospital, where the signal is usually gone. The material lived on
scattered servers and travelled by email, so reps rarely had the current version of anything and had
no way to tell whether they did.
The answer was two native iOS apps sharing one content engine: one for North America, one for Europe,
each with its own branding and its own legal requirements. I was lead frontend developer on both and
built the pipeline that pushed all content into them.
Two pieces made it work. SAMM was the content management system — I designed, built, and
maintained it through version 2.0 — and it let J&J staff assemble product presentations and
publish updates themselves, with no developer involved and no App Store release. MUNCH read the
entire document library every night, PDFs and video transcripts included, and compressed it into a
searchable database small enough to travel with the daily sync. A rep in a hospital basement with no
bars could search every document the company had. I worked on MUNCH as a support engineer.
Result
Initial download
under 5MB
Content updates
shipped without an App Store release
Search
full text across the library, offline
Lifespan
15+ years, retired when J&J moved development in-house
PHP · MySQL · JavaScript · HTML/CSS in a native iOS shell
05
Food Safety
The binder is gone
GWSI · four warehouses · maintained by the coordinator
Warehouses that store food get inspected, without warning, against documentation they are required to
keep current. At GWSI that documentation was more than a hundred Word, Excel, and PDF files spread
across four sites, all maintained by one person. The same document existed in several places in
several versions. A full update happened about once a year and took weeks. Because inspectors turn up
unannounced, every site also kept a printed copy — a thousand-page binder, expensive to produce
and out of date the week after it came off the printer.
I converted every document to Markdown and published the whole set on the company’s public
website, rendered from those same files, so there is one version of each and it is always the current
one. Then I set up a separate repository for the Food Safety Coordinator, taught her Git and
Markdown, and handed it over. She edits a document when the document changes and sends it as a pull
request. The binders went in the recycling.
Result
Source of truth
100+ documents, one place, always current
Paper
1,000+ page binder eliminated
Update cadence
once a year → whenever something changes
Maintenance
the Food Safety Coordinator, not me
Markdown · mdsvex · SvelteKit
06
Rollcall
Attendance that takes itself
Drexel UXID · in production
Taking attendance in a lecture means either stopping what you are doing to do it, or reconstructing it
afterwards from memory. The university’s approved tools want the instructor to mark every
student by hand, and the five minutes before class — the only window there is for it — is
exactly when students are lined up asking questions.
Students scan a QR code on the way in, sign in with their Drexel email and student ID, and are marked
present or late by the clock. Rosters import from a spreadsheet, sessions open and close on a timer,
and the list fills in live while the room does.
The part that changed behaviour wasn’t the attendance. Arrival order also builds the queue for
after-class one-on-ones: first in, first seen. Students started showing up early.
The field trip, when there could be no field trips
Whitney Laboratory for Marine Bioscience, University of Florida · 2020
The Whitney Lab is a marine biology research station on the Florida coast. Part of what it does is run
tours for third through fifth graders from schools near enough to drive there, and part of its funding
is attached to running them. Covid ended the tours, and the funding with them.
I was lead designer and developer, and one of three instructional designers, on three online modules
covering what the tours covered in person: mud snails, estuaries, and conservation. We worked from the
lab’s own scientists rather than from a textbook. A teacher can run a module over a video call
and talk a class through it, or a student can work through it alone, on whatever device is in the
house. There is a launch page and an admin panel so the lab controls what is open and when.
Two things came out of it that the in-person tour couldn’t do. The lab had something concrete to
show donors during a year when it had nothing else to show them. And the audience stopped being
limited to schools within driving distance of the building.
Result
Modules shipped
3, built with the lab’s scientists
Reach
local driving radius → anywhere
Funding
something to show donors mid-lockdown
Delivery
teacher-led over video, or self-paced
React · PHP · MySQL
Shorter takes
Backstage
Import files that don’t bounce
Getting a new shipment into the warehouse system means typing every detail of every pallet by hand,
or building a spreadsheet in exactly the shape the system will accept. That shape differs by customer
and by what is being stored, so the spreadsheets failed constantly and had to be reworked. Backstage
takes whatever the customer actually sent — a PDF, a spreadsheet, a CSV, a text file —
and returns a file that will import first time, with part numbers checked against the warehouse
system and anything that doesn’t match emailed to whoever needs to chase it. Ten to sixty-plus
minutes per shipment became under two. It runs for the company’s seven largest customers.
SvelteKit · TypeScript · Vercel
Inventory Adjustment System
Unpicking a mistake without breaking the order things ship in
Warehouses ship oldest stock first, and the system enforces that by reception date. So correcting a
mistake on a shipment that has already been logged isn’t an edit — you have to ship the
goods back out of the system and receive them again carrying their original date, or everything after
it ships in the wrong order. This was being done across a pile of spreadsheets and PDFs and took three
or four people two to four days. It is now a command-line tool that reads the current inventory, works
out the adjustments, makes the calls in the right sequence, and writes the customer report at the end.
One person, under ten minutes.
Bun · TypeScript · shell
Editor tools
Small things I got tired of doing by hand
Four published editor extensions, all of them scratching an itch I had while working:
Nested Comments
and its
Sublime Text
counterpart handle commenting out markup that already contains comments, which HTML is famously bad at.
macOS Dark Mode
and
Popping and Locking Black
are themes. They are tiny, they are public, with a few hundred thousand downloads.
VS Code · Sublime Text
Front-end work
Sites you can actually open
Design, markup, CSS, and the maintenance afterwards, which is the half of front-end work nobody puts
in a portfolio. A few of these I have been keeping current for more than a decade.
Aripeka needed two of them, because it sells into two markets that have almost nothing in common.
aripeka.org covers the
US business across its lumber, bath, and wine divisions.
aripeka.com.br is
the Brazilian one — in Portuguese, built around what buyers there actually ask about, rather
than translated across from the American site. One design system, two audiences, no compromise
between them.
Scruffy is a dog who is certain that whatever is happening right now is the greatest thing that
has ever happened. Kitty is a cat who was asleep and would like to go back to being asleep.
That’s the whole engine, and it holds up for the adult doing the reading as well as the
kid being read to.
Both of them are real. Scruffy and Kitty are our family’s dog and cat, and we didn’t
have to invent much.
I built the site, produced the book files, and wrote half the arguments between the dog and the
cat. Melissa wrote the other half, and did all of the artwork.
Work out what is actually wrong first.
Most of what I get handed has been “just how we do it” for years, and the problem people
describe is rarely the problem they have. Gate looked like a data entry problem. It was a problem
with drivers arriving holding the wrong number.
Use tools I already know well.
I’m not looking for an excuse to try something new on somebody else’s problem. Things I
understand deeply ship sooner, break in ways I recognise, and are still running years later.
AI runs through everything I build now.
It is the largest change to this work in twenty years and I have rebuilt how I work around it, not
bolted it on the side. One person ships what used to take a team, and I am not nostalgic about the
version of this job where that wasn’t true.
If it takes more than ten minutes to learn, it’s the wrong tool.
Nobody came to work to operate my software. Four warehouses picked up Gate the day it shipped and
nobody ran a training session.
Automate the boring part and leave judgement to people.
Relay writes the email and attaches the damage photos. It never decides whether the freight is
damaged, because it isn’t the one standing in front of it.
Then get out of the way.
Software only I can maintain is a liability I handed someone, not a system I delivered. The Food
Safety Coordinator maintains her own documentation now and sends me pull requests.