Dithering pixels…
0 / 0
Case study · 2025

Waste Warrior

Waste Warrior is an effort to combat food waste by helping restaurants track what people want to eat when they reserve a table. I've been its lead front-end developer since September 2025.

Role
Lead front-end developer
Since
September 2025, part time
Reading time
1 minute
Published
21 November 2025
Waste Warrior

A quick summary

When I got put on Waste Warrior as a front-end developer the app left a lot to be desired, visually, but mostly functionally. The plan was to build out the app into a state where restaurants could actually start using it, and profiting from the platform. The process to get to that point was a bumpy road, but a very rewarding one.

We as a team managed to pull Waste Warrior up from a sub-par proof-of-concept application to a fully-fledged data-driven application with a bunch of features that we are very proud of.

The reservation flow after the rebuild. Captions sit in the margin, flush against the image.

Placeholder image

The reservation flow after the rebuild. Captions sit in the margin, flush against the image.

Where we started

Placeholder text

Long passages are set at 20 pixels on 30, which puts about sixty-six characters on a line. That is the measure book typographers have used for centuries: short enough that the eye finds the next line without effort, long enough that sentences do not break into fragments.

A margin note. Asides live beside the line they belong to instead of at the bottom of the page, so reading never has to jump.

Paragraphs are separated by one full line of space rather than an indent, which suits scrolling better than print conventions do. Headings get two lines of space above and hang in the margin, so the text column stays one unbroken ribbon of reading.

Placeholder quote. A block quote is indented, set in italic at body size, and carries no quotation marks of its own except one opening mark that hangs outside the column.
Name Surname, role

What we built

A code sample, when one is needed, keeps the same left edge as the text. There is no box around it: hairlines above and below, line numbers in a quiet grey, and the file name in the margin.

reservations.ts

TypeScript

1// expected waste per service, in kilograms2const waste = reservations3  .flatMap((r) => r.preOrders)4  .reduce((kg, dish) => kg + dish.expectedWaste, 0);

Sources