← Blog

I lifted yesterday and did not open the spreadsheet once.

That sounds small. To explain why it is not, I have to describe the spreadsheet.

For about a year I have been alternating between five-rep and eight-rep sets — five-rep days for strength and power, eight-rep days for endurance — adding a few pounds to my one-rep max after each session that goes well. The one-rep max is the number the rest of the spreadsheet hangs off of, and from there everything else is arithmetic. A percentage of the max gives me today’s weight. The rep scheme says how many times to lift it. And then there is the part nobody really enjoys mid-workout, which is figuring out what plates add up to that weight, given the bar in the rack and whatever the last person left on the floor.

That last step is the one that grinds. The warmup is over, you are standing in front of a bar that has the wrong weight on it, and you have to do a little arithmetic before you can load the work set. Forty-five-pound bar plus a forty-five each side gets you to one thirty-five. Add a twenty-five each side and you are at one eighty-five. If today’s number is two ten you need a ten more. If it is two oh seven you need to round, and which way you round depends on whether you are about to do five or eight. The math is not hard. It is just continuous, and it lives in the worst possible place — in the middle of a workout, on a phone you were trying to leave alone.

I built SetCue over about five hours of evenings and early mornings around work. It is a native iOS app, currently on the phone — which is not where I ultimately want it, since the phone is the thing I am trying to keep out of the gym, but it is what an evening could produce. The screen I actually look at during a session does only one thing: it tells me what to put on the bar for the first work set of whatever lift is next. It already knows my one-rep maxes. It knows whether today is fives or eights. The percentage, the rounding, the plate diagram, the bump to the max for next session if this one went well — all of that lands together, in the time it takes me to walk from the warmup back to the rack. I have used it for a few days, and I have already nudged a couple of buttons around because the gym is not the couch I sketched the layouts on.

The interesting thing is not that the app exists. The interesting thing is that two years ago I would not have bothered.

Building used to need a market.

For most of my life as a developer, the math of building a small personal tool did not work. Not because the tool was hard to imagine — most of them are obvious — but because the build cost was always too high to amortize against my own use alone.

A native iOS app meant a weekend before there was an app, spent getting Xcode and provisioning profiles and the simulator into a state where anything would even run, and then learning whatever layout system Apple had decided to ship that year. A web app meant a hosting decision, a domain, and the small ongoing maintenance of every framework choice you had made along the way. Even a one-off script came with the tax of figuring out where it would live and how it would survive the next laptop. The first time you did any of this, the ramp was a weekend. Each subsequent project was cheaper, but never as cheap as not doing it.

Against that ramp, you had to decide whether the tool was worth it. The math you did was not always explicit, but it was always the same one: how much annoyance does this remove from my life, multiplied by how often I will use it, against how many hours I will spend building it. For most personal annoyances the number came out negative. The annoyance was real. The build was just more expensive than the annoyance was bad.

So you found other ways to live with it. You built a spreadsheet, or you wrote a recurring reminder, or you accepted that some part of your week would be a little stupider than it needed to be. The friction stayed because every alternative was worse.

If you wanted the build to be worth it, you needed help, and the help that mattered was strangers — enough of them, with the same annoyance, willing to pay something or to use the thing often enough that the time you put in started looking justified. That is what is there a market here? was actually asking. It was not asking whether the idea was good. It was asking whether enough strangers shared the friction to amortize the build cost back below the annoyance line.

Most personal annoyances did not clear that bar. Even ones that were genuinely worth solving for me. So they stayed annoyances, and the spreadsheet stayed the spreadsheet.

The cost crossed below my own annoyance.

What happened in the last year is that the build cost dropped enough that the math works for one person.

The ramp is gone. Most of the work that used to eat the first weekend before there was an app — getting an iOS project to build, sketching a data model, writing the plate math, deciding what the screens looked like — now happens inside a conversation, in roughly the time it takes to read what comes back. Five hours instead of forty. Not because I got better. Because the floor moved.

And the parts that did the moving are exactly the ones I expected. The Average of the Public Web argued that AI is, fundamentally, a recombiner of the public internet — synthesizing widely-shared knowledge at speed. That is true, and it is also exactly what SetCue needed. Plate math has never been a private edge. Neither has any particular flavor of progressive overload scheme. The arithmetic that turns a one-rep max into a percentage, the percentage into a weight, the weight into a stack of plates on a bar — all of that is well-trodden public-web stuff. Anyone with a search engine could have written the formulas a decade ago. The substrate was sitting there.

What was missing was never the substrate. It was the direction. AI Has No Needs was about that — the human contributes the felt friction, the model contributes the recombination, and that is the division of labor that actually matters. SetCue is what that essay looks like in practice. The annoyance of standing in front of a bar doing arithmetic was never going to be felt by a model. The plate calculator the model could write all along.

So the build math has flipped. The substrate, which used to be most of the work, is now nearly free. The direction — the felt sense that this was worth fixing — was always free, because it was always mine. What used to cost real money was assembling the one around the other, and that is the part that has collapsed. Five hours is not a marketing number. It is approximately what the work actually took, in evenings, around a job. For a tool I use multiple times a week for the foreseeable future, that paid for itself the first session.

The threshold the build used to have to clear was enough strangers, willing enough, to pay back a forty-hour ramp. The threshold it has to clear now is me, often enough, to pay back five hours.

That is a different threshold. Almost everything that annoys me clears it.

Audience of one used to be a joke.

The phrase I built it for myself used to come with a tone. There was a slight defensiveness in it — the implication that this was a learning exercise, or that you secretly hoped it would become a real thing once enough other people noticed. Software for one person was a halfway state on the way to software for many people. It was not a finished category.

It is now.

The thing that changed is not the willingness to build for yourself — that has always existed, and programmers have always written tiny tools for their own use. What changed is the expectation that you eventually had to expand the thing, monetize it, or justify it to someone. That expectation came from the cost. When the build was forty hours, you wanted to be able to point at something that made the forty hours legible — a side project, a portfolio piece, a future business, a learning outcome, anything that translated the time into a story other people could read. When the build is five hours, the only thing it needs to be legible against is the next workout I do.

That sounds like a small change. It is actually a structural one. A category of software now exists that has nothing around it — no roadmap, no second user, no marketing surface, no business case even in the aspirational sense. It is a tool the way a wrench is a tool: made for a job, used until the job is done, lent to someone else if they ask for it, otherwise kept in the drawer.

You can feel the difference in how you make decisions inside the app. There is no question of whether a feature should exist for users who lift differently than me, because there are no users who lift differently than me; there is only whether it should exist for me, and the answer comes much faster than it would if I had to imagine other people answering it. The product is also much smaller. The version of SetCue that existed two years ago in my head — the version I would have considered shipping — had a plate-customization picker for whatever weights a user’s gym carried, a way to swap between rep schemes for people on different programs, a workout history view, an export, a settings screen of its own. The version that exists now has none of those things, because I lift the same way every session, and the imagined users who would have needed them were imagined. If my training changes I will add them. If it does not I will not.

User research is just lifting.

When the audience is one person and that person is me, the entire feedback loop that surrounds traditional product development collapses.

I do not need to schedule interviews. I do not need to imagine a synthetic persona who might struggle with the screen, because the person looking at the screen is me, and if I am confused I know about it instantly. The friction shows up the moment it exists, and it shows up to the only person who matters. There is no ticket to file. I notice it, and I am also the person who can go fix it.

I have moved three things in SetCue since I started using it. The button to advance to the next lift was on the wrong side for a one-handed grip with the phone propped against the rack. The font for the today’s-weight number was too small — fine on the couch with my phone inches from my face, useless when the whole point is to glance once and put the phone back away. The plate diagram was showing the total weight per side, which is correct but wrong; what I actually want at a glance is the plates I need to add to what is already on the bar, because after the warmup I am building on top of plates that are already loaded, not putting the work weight together from scratch. None of these would have been visible from a couch. All of them were obvious within the first session.

This is the kind of feedback loop that traditional product development tries very hard to approximate, and only ever approximates. Interviews are slow, and what they capture is filtered through whatever a user can articulate in the moment, which is rarely the part that actually mattered. Beta testers are a smaller and weirder population than the eventual users, and the things they notice are weighted toward the things they are willing to write down. Analytics tell you what people did but rarely what they wanted. The closest a normal product comes to the person who wants the thing also makes the thing in real time, while wanting it is a senior designer dogfooding their own app — and even that is rare, because most products are not built by their daily users. When the audience is one, that proximity is the default. There is no gap between the user and the builder for friction to fall into.

The thing this changes is not the quality of the product. There are plenty of small personal apps that are buggy, ugly, or weirdly opinionated. The thing it changes is the grounding. Every decision in SetCue is grounded against an actual lift that actually happened, not against a hypothesis about how a user would behave. That grounding is what AI Has No Needs called staying close to the ground — the antidote to building in the abstract, where the model is most willing to flatter your direction. When you are the user, you cannot build in the abstract. You either lifted with the app this morning or you did not.

The App Store as a side door.

For most of the time I have been building things, the App Store was the destination. It was the moment a project graduated from code on my machine to thing in the world, and submission was the milestone the rest of the project oriented around. Shipping MapleDays in 7 Days was largely a post about how much of the work was getting to the App Store rather than the building itself — the copy, the screenshots, the support page, the unglamorous half of shipping that nobody starts out wanting to do.

SetCue may end up there. After a few more weeks of using it, if the friction stays low and a couple of friends ask whether they can have it too, I will probably submit it. The path to a listing is well worn now, and not particularly expensive.

But the App Store is not the destination of SetCue in the way it was the destination of MapleDays. It is a side door. The app already exists. It is already being used. It is already paying back the time it took to build, every session. The launch, if it happens, is the place I might walk it through later if anyone asks. It is no longer the moment the project becomes real. The project was real the first time I walked up to the bar and did not open the spreadsheet.

That is a different relationship with software than the one I grew up with. Software used to be made for markets, and trickled to me as one of the buyers. Now software is made by me, for me, and trickles outward only if it happens to be useful to somebody else. I am upstream of the market, instead of downstream of it. Strangers are an encore I might or might not perform.

I do not think this scales to everything. Some categories really do require strangers — multiplayer, marketplaces, networks, anything where the value comes from other people being there. Most personal tooling is not like that. Most personal tooling is just somebody, alone, putting up with something that does not need to be put up with anymore. The wrench-shaped category. The SetCue-shaped category. The shape that used to require a market and no longer does.

There is more friction in my life than I realized I was tolerating. Most of it was tolerated because the build was not worth it. Most of it now is.