Real-time cost alerts in Slack and CLI. Anomalies surface where engineers already work.
›whoami
Staff product designer and AI engineer. Ten years designing AI products, sole design ownership from zero to one.
›ls work
›
Training, images, video and datasets in a single application that installs with one command and runs on your own GPUs. I designed it, engineered it and deployed it.
Four phases shipped: LoRA training, image inference, datasets and captioning, and video across two model families. The source is on GitHub.
Two years of diffusion research. The first thing it made was a gift for my father.
Direction
Weights in one service, the interface in another, datasets in a third. Each one a login, a bill and a format. Making the thing is the smallest part of the day.
No secrets, no CLI setup, no account. The one token it needs is pasted into the UI and stored where the app can reach it.
modal deploy app.py builds the images and returns an address that is the entire application — interface, API and GPU jobs.
Weights land on your own volume, chosen explicitly. Nothing downloads on its own, and the folder layout is the contract — datasets are images with text beside them.
Two families of video model that genuinely differ. Rather than one panel with half its controls quietly inert, the composer is rebuilt from what the chosen model says it reads. Change the model, or change the medium on the chip inside the field — the prompt survives both.
a red paper boat drifting across rain-flooded pavement, slow push in, overcast daylight
A control that is present but ignored is worse than one that is absent — it is the interface making a promise the model will not keep. Below, the real bar in the deployed app.
Not in the trainer. A caption set that repeats itself teaches the repetition, and you find that out eight hours and a GPU bill later. So the dataset screen counts what the trainer is actually going to read.
80 of 80 carry the trigger word, 80 of 80 are captioned, median seventy words. The list on the right is every clause appearing more than once — even lighting five times, with soft five times. That is the overfitting warning, delivered before the run instead of after it.
Captions are written by a vision model as prose, not tags, because the text encoders these models use parse grammar.
The decisions that matter most leave no trace. There is no video mode to enter, no project type to choose at the start, and nothing announcing that two systems were joined — one canvas, one prompt, one gallery. Done properly it is unremarkable, which is why it has to be claimed here and nowhere in the product.
The switch lives inside the prompt field rather than in the chrome, because which one you get is a property of what you're making, not an address you navigate to. What differs between them is only the options. The canvas holds the screen either way — options sit in a bar under the picture, never a rail beside it, since a settings column costs the image 384 pixels of the one dimension it cannot get back.
Where this goes once the models are fast enough: a gesture-driven canvas for iPad. Nothing is labelled and everything is live — you touch her face to change her. What the machine invented is marked differently from what you actually said, and rerolling it costs nothing.
Speculative, and deliberately labelled as such. What makes it a design rather than a mood board is the list underneath it.
Eleven sentences, each written to kill a specific thing when the cheap fix gets proposed. If a sentence has never vetoed anything, it isn't earning its place — cut it.
The failure to guard against isn't the model, or latency, or scope. It's month four, when something doesn't fit cleanly and the cheapest fix is a panel.
Scale here isn't requests per second. It's dataset size, model size and cost per job — so the decisions that matter are about what runs where.
The work I’m proudest of here is the work nobody will notice — two systems joined so completely that no one thinks to ask when they were separate. Good design is unobtrusive — Dieter Rams. Underneath sit three words that settle the arguments, in priority order when they conflict.
A missing model prints the volume, the exact path it wanted and what is actually there — the three facts that separate a wrong profile from a typo. Any error you can hit twice should have explained itself the first time.
Job records carry filenames; bytes are served off the volume by their own route. A dictionary polled every two seconds must never grow with the size of the result.
Adding a second family of video model added no backend — it reuses the container, the warm process and the same job contract. What is per-family is a graph builder and a row in a table.
Cloud cost intelligence for engineering teams.
Real-time cost alerts in Slack and CLI. Anomalies surface where engineers already work.
Learning complex cloud architecture directly from backend engineers. Designing tools for the immediate technical team.
Accepting raw AWS tags as-is to build adjacent structures with minimal UI interference.
Adapting IBM Carbon for rapid engineering execution.
Research, interaction models, and execution from seed through two funding rounds. Scaling the platform to market.
Infrastructure tags carry no consistent owner or logic.
A learned ML baseline detects cost anomalies in your environment in real time.
The platform sends cost anomalies in Slack, routed to the relevant team by design, reducing dependency on dashboards.
The resource, opened on the anomaly. Causes ranked by cost correlation — the deploy on top. Acknowledge reports back to the channel.
Routine drift logs quietly. A departure from baseline pages the on-call in 33 minutes.
Every resource carries an owning team. The alert lands in that team's channel, not a company-wide feed.
Rate against baseline, start time and projected impact travel with the alert.
Changes from the 24 hours before the spike, ranked by cost correlation. The deploy sits two minutes before the inflection.
My team's changes is the default view. AWS noise sits one tab away.
An acknowledgement here updates the channel. The team sees it is handled.
Competitors monitor cloud cost for finance. The platform maps spend to the engineers who create it.
I design systems, not screens.
Synchronizing software design systems with industrial manufacturing cadences.
Aligning software component architecture with industrial manufacturing cadences.
The system. Tokens — color, type, spacing, radius — and the components they generate. A design change is a change build already has the name for.
Design in the running product. Engineers build against the live screen, not a spec — what they see is what ships.
The resubmit cycle, collapsed. Days of PDF round-trips become one working session on a living design.
An ask sized to a yes. Months of meetings across teams, managers, and directors — distilled to one pilot feature.
The pilot that shipped. One feature, run end to end on the new cadence — the cadence stuck.
A minimalist audio terminal removing cognitive overload through responsive geometry.
An interactive appliance for psychological rest. Sound stripped of choice to match your mind.
The geometry responds to you. There is nothing to operate.
This is not the negative.