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.

mdashes created by hand

Selected work

01

Gate

Check-in that takes care of itself

GWSI · four warehouses · in production

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.

B E F O R E Driver at the window Staff types 5–7 fields Wrong reference number three times, on average A F T E R Driver’s phone Reference validated Live status board

Result

Data entry per load
3–5 min → none
Wrong-number retries
3 → 0
Staff time back
~90 min/day
Rollout
4 warehouses, 10 min of training

SvelteKit · TypeScript · Supabase · Vercel · Vitest · Playwright

02

Vanguard

Paperwork that can’t drift out of sync

GWSI · four warehouses · in production

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.

B E F O R E Staff hand-built every email, CSV, and photo set — 30+ loads a day A F T E R Staff confirm a load Webhook Formatted CSV Damage photos + serials PO and order details

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.

The whole library Parsed nightly into one index Ships in the daily sync Search worked with no signal.

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.

Result

Instructor attendance time
5–10 min → 0
Late arrivals
no longer the instructor’s problem
One-on-one queue
populates itself by arrival time

SvelteKit · TypeScript · Tailwind · Supabase · Vercel

07

Whitney Gallery

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.

Also

My Scruffy Puppy

Two children’s picture books, written with my wife, Melissa: Scruffy Puppy Gets a Bath and Scruffy Puppy’s Big Adventure.

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.

The cover of Scruffy Puppy Gets a Bath: a small scruffy dog sitting in a bathtub full of bubbles, by Melissa and Phil Sinatra.
The cover of Scruffy Puppy’s Big Adventure: the dog sitting on a path through tall grass with a tennis ball, bees overhead, by Melissa and Phil Sinatra.

How I work

I’m an engineer who is good at diagnosis

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.

Contact

Email is best

I read all of it and I answer.

phil@philsinatra.com

Phil Sinatra