GnothiGnothi
SeriesFieldsCommunity
Sign inGet started free

Boss

Wes Calloway builds Permitly alone in a garage rigged with a scavenged GPU rack and a hole-sawed vent, trying to get a live product up before a six-week runway runs out and his mortgage money disappears. His whole operation costs twenty-two dollars a month: a starter web service and managed database on Render, a domain bought at cost, and Stripe taking its cut only when money actually moves. Dana shows up with grilled cheese and makes him say the real numbers out loud, and he admits the account holds five years of runway only if nothing is wrong, and one month if something is. Working with a coding agent in his terminal, he learns to write it a plain instruction file, watch it ask permission before every command, and catch it when it writes a clean, confident, wrong assumption about permit numbers being unique across counties—a mistake it never would have questioned on its own. Under deadline pressure at two in the morning, he strips away the permission prompts entirely and lets it run unsupervised through the final deploy, watching it fix its own errors and touch files he'd forgotten existed. The site goes live, takes a trial signup, and he records a rough pitch video for contractors before Dana calls down to ask if it worked.

What this chapter drew on


The rain came down on the rolling door like someone throwing gravel at it, handful after handful, and Wes Calloway had stopped hearing it around ten o'clock.

The garage was hot. That was the GPU rack, four secondhand cards in an open frame he'd bolted together out of shelf brackets, fans screaming through a hole he had cut in the wall himself with a hole saw and then patched around with foil tape. The hole vented into the alley. On cold wet nights like this one you could stand outside and see the heat coming out of his house in a little shimmer, like the building was breathing. He wasn't even using the rack tonight. It just ran, because he'd bought it and it felt worse to leave it off.

The laptop was on a folding table with a cinder block under one leg. There was a mug of coffee at his elbow that had gone cold at some point he could not name. There was a ring light on a stand in the corner, unplugged, angled at nothing, which he had bought in a burst of confidence in the first week and had not turned on since.

On the screen, a terminal. In the terminal, an agent, waiting.

The rolling door rattled at the bottom and then went up eight inches, and Dana ducked under it with a plate held over her head like an umbrella, and came in fast, and let the door drop behind her.

"You want to hear how loud it is out there," she said.

"I can hear it."

"You cannot hear anything in here." She put the plate down on the cinder block end of the table, because the table itself was covered in cable. Grilled cheese, cut on the diagonal, and three baby carrots she had put there as a joke about vegetables. "Eat that."

"I will."

"Eat that now, at me, so I can see it."

He picked up half and ate a corner off it, holding her eyes, and she gave him a small nod like a foreman signing off on a load.

Then she leaned against the shelf where the drill press used to be, folded her arms, and asked it.

"What's the number?"

He'd known it was coming. He'd had the answer ready since about four in the afternoon, polished it, said it in his head in a voice that sounded like a guy who had it handled.

"Stack's about twenty-two a month," he said. "Twenty-five if I'm using it. Compute's seven. Database is seven. Domain's under a dollar a month if you buy it at cost, and I did. Rest is card fees, and card fees only exist if somebody pays me, so I want them to exist."

"Twenty-two dollars," Dana said.

"Twenty-two dollars."

"That's the whole business."

"That's the whole business."

She was quiet a second. She was doing arithmetic and she wasn't hiding it, which was one of the things about her.

"And the account," she said.

"Account's fine."

"Wes."

"Account's got fourteen hundred in it," he said, "which at twenty-two a month is five years, so."

"That is not what fourteen hundred is for and you know exactly what it's for." She said it without heat, which was worse. "That's February. That's the mortgage in February, and then March is nothing."

"I know what's in February."

"So say the real number."

He looked at the terminal instead of at her. The cursor blinked in that patient way.

"Six weeks," he said. "I've got six weeks where this can be a thing I'm doing, and after that it's a thing I did." He heard how it came out and didn't try to fix it. "That's why it goes live tonight. I said the year starts with a live product. It starts tonight or I said a thing."

Dana looked at the rack. The fan noise went up and came back down, the way it did, like something turning over in its sleep.

"Kellerman's really going to look at it?"

"He said he'd look at it tomorrow." Wes wiped his palms on his jeans. "He's a roofer. Roofers get up at five. So it's not tomorrow, it's like four hours from now."

"Then don't talk to me," she said, and pushed off the shelf, and kissed the top of his head, which she had to bend down to do because of how he was sitting, and went out under the door, and the rain got loud and then got quiet again.

Wes ate the other half of the sandwich in three bites and put his hands on the keyboard.

The product was called Permitly. It was not clever. It watched the building-permit filings that the county posted every night — the electrical, the reroofs, the additions, the water heater swaps — pulled the ones that matched what a contractor said he cared about, and mailed him the leads in the morning with the address and the scope and the name of whoever pulled the permit. A roofer wants to know who just got a permit for a reroof, because that person has money and a plan and no roofer yet. Twenty dollars a month, cancel whenever, no contract. Revenue, so far, zero. Ten contractors on a list in a spreadsheet who had said some version of sure, send it to me when it's real.

Tonight was when it got real, or it didn't.

He opened the agent. It was the terminal one, Claude Code, running in the repo, and the first thing he did was not code. The first thing he did was write the file it read before it did anything, because he had learned that the hard way, twice.

CLAUDE.md, in the root of the project. He wrote it plain, like a note to a subcontractor who was going to work on his house while he was out.

The stack is Python and Postgres. Do not add a framework I did not ask for. Migrations go in one folder and they are numbered and you never edit one that already ran. Never print a secret to the terminal. When you touch the permit scraper, run the test on the saved sample first, because that county changes their table headers and I will not know until a customer emails me.

He read it back. He added one more line.

If something is ambiguous, say so and stop. Do not guess and keep going.

That was the line he'd earned. That was from Tuesday.

He typed his job into the prompt. Get the scraper writing into the leads table, wire the morning email, put up a pricing page with the twenty-dollar plan and a trial signup, and get it deployed on the real domain.

And then he sat back and watched the thing work, and it was the same thing every time and it never stopped being strange.

The agent read a file. Then it decided something and told him what it had decided, in that warm quick voice they all had, and then it made a tool call — that was the actual name for it, the thing where the model stops talking and reaches out and touches the machine. It asked to run a command. He said yes. The command ran and spat output into the terminal, and the agent read the output, and then it decided the next thing, and reached again.

That was the whole trick. That was all an agent was. A model in a loop, picking a tool, doing the thing, reading what came back, going again, until the job was finished or lost. Nobody had built a brain in a box. They'd built something that could guess the next piece of text extremely well, and then somebody had wrapped a while-loop around it and handed it a shell, and now it could paint your house.

It found the scraper. It ran the sample test. Green.

He said yes. He said yes. He said yes.

Every single step, it stopped and asked. Do you want to allow this command. Do you want to allow this edit. And every time he had to look at it, and read enough of it to feel like he'd read it, and hit the key.

That was the deal. The default mode prompts you on the tools. That's the point of it. He'd read the docs on a Sunday with actual coffee, back when he still had the energy to read docs on a Sunday: default prompts on everything, acceptEdits lets it change files without asking but still stops at shell commands, plan mode where it can only look and not touch, and then the flag at the bottom of the page in the tone of voice a man uses when he doesn't want to be blamed later.

At 11:40 it did the confident thing.

It wrote the deduplication. Permits get posted twice sometimes, amended, reposted, and if Permitly mails a roofer the same address three mornings running then Permitly is spam and the roofer is gone. So the agent wrote the dedupe check, and it explained the dedupe check in a paragraph so reasonable that Wes almost hit yes on reflex, and then something in the diff caught his eye and he stopped with his finger on the key.

It was keying on the permit number.

He looked at it for a long moment. Then he opened the sample file in the other window, the actual scraped rows from three counties, and scrolled.

The permit number wasn't unique across counties. Both of them started at one every January. He had two rows in his own sample data with the number 000418 on them, one a garage conversion out east and one a service upgrade eleven miles the other way.

The agent had not looked. It had not thought about looking. It had seen a column called permit number and everything it had ever read said permit numbers are unique, and so it produced the most likely-looking correct code in the world, and it would have quietly eaten one of those two leads every time and nobody would ever have known, because a lead that never arrives doesn't send you an email.

That was the part people got wrong about these things. It wasn't lying. It was doing exactly what it does — the next most plausible thing, all the way down, with no little voice in the back saying hold on, have I actually checked. Confident and wrong isn't the machine breaking. Confident and wrong is the machine running perfectly.

He typed: permit numbers are not unique across counties. Look at the sample data before you answer. Key on county plus number plus issue date, and write a test that fails on the old version.

The agent went quiet for a second, which he had learned to like.

Then it said: you're right, and I should have checked the sample rather than assuming.

It rewrote it. It wrote the test. The test failed against the old code and passed against the new one, and it showed him both, and that was worth the eight minutes.

"Okay," Wes said out loud, to nobody, in a hot garage. "Okay."

He got up and pissed and came back and made new coffee and did not drink it.

The stack went up between midnight and one, and the stack was the easy part, which was the thing nobody believed. Render for the app, hobby workspace at nothing a month, one always-on web service on the starter tier at seven dollars — half a CPU and five hundred and twelve megs of memory, which for a thing that mails permits to roofers was roughly a cathedral. Managed Postgres on the same account, seven more. He hooked the repo up so that a push to main built it and swapped it over with no downtime, which cost nothing and was the single best free thing anyone had ever given him. Domain from a registrar that sold at cost, nine dollars and change for the year, which he had already paid in November when the name still felt like a joke he was telling himself. Stripe on top for the money, and Stripe didn't charge him rent, Stripe took two point nine percent and thirty cents every time a card actually went through, plus a little slice for handling the subscriptions.

Twenty-two dollars a month, all in. The number he'd said to Dana was the true number, which was rarer than he'd have liked.

And that number was the leash, and he knew it was the leash, and that was the whole reason he'd built it this small. Twenty-two dollars a month meant he could be wrong until March. If he'd stood up something with a real cluster under it he'd have been wrong until Thursday.

The push went out at 1:04. The build ran. The build failed.

Missing environment variable in the build step. He fixed it, pushed, failed again — different one. Fixed, pushed. Failed on the migration, because the database had come up empty and the numbered migrations had never run against it, and he had told the agent in the instruction file never to edit a migration that had already run, and it had obeyed him beautifully, and none of them had run at all.

He fed it the build log and it read the log and it found it and it fixed it, and each fix meant a command, and each command meant a prompt, and each prompt meant Wes looking at a wall of text at half past one in the morning and pressing a key.

At 1:52 he noticed the room had gotten quiet in a way that wasn't the rack.

The agent had stopped. It was sitting there, mid-job, waiting for him. Somewhere in the last cycle it had asked him to allow something and he had not seen it, because he had been on his phone looking at nothing, and it had been sitting patiently in a hot garage for nine minutes, holding the door for a man who had wandered off.

Nine minutes. He had six weeks and he had just spent nine minutes of it standing next to a machine that was ready to work.

He hit yes. It went again. Two commands later it stopped and asked again, and that was when Wes Calloway put both hands flat on the folding table and did the arithmetic that mattered.

The deploy was going to take maybe twenty more steps. Twenty prompts. Twenty times reading a command carefully enough to justify saying yes, at two in the morning, which he was not going to do, and he knew he was not going to do it, because he had not really read the last six. He had looked at the shape of them. He had checked that the words were the kind of words he expected. That wasn't reading. That was a man nodding along at a meeting.

So he was already not checking. The only difference between what he was doing and skipping the prompts was that skipping them would be honest and would save him half an hour.

Half an hour. Kellerman got up at five.

He killed the run. He pulled up the command again and put the flag on the end of it, the one that turned off the asking, the one they'd named so plainly that nobody could pretend afterward they hadn't understood: dangerously skip permissions.

He looked at it sitting there on the line. He thought, for about as long as it takes to swallow, that he could put the whole repo in a container first, or spin it out into a separate worktree where the worst it could do was wreck a copy. That was the responsible version. That was another twenty minutes he did not have.

He hit enter.

The thing came alive in a way it had not been alive all night.

It moved. It read a file and edited a file and ran a command and read the output and ran another command, and it did not stop, it did not turn around, it did not ask him for anything, and the output came down the terminal in a smooth green scroll like water going over a weir. It found the migration path. It ran the migrations. It caught its own error and fixed its own error without telling him first, because he had just told it not to bother telling him. It touched the config. It touched the environment. It touched a file he had forgotten existed.

Wes sat back in the folding chair with his arms crossed and watched a machine work in his house at two in the morning with nobody's hand on it.

It was, and he would have said this out loud to Dana if Dana had been there, beautiful. It was the most efficient six minutes of the entire month.

At 2:09 the pipeline went green.

He opened the browser and typed the domain, the real one, the nine-dollar one, and Permitly came up on the actual internet. Not localhost. Not a tunnel. The real address, with the little lock, sitting there like a shop with the lights on.

The pricing page was up. One plan. Twenty dollars a month, cancel anytime, no contract, and under it the sentence he had written himself and refused to let the agent improve: your county posts permits every night. We read them so you don't have to. Fourteen days free.

He clicked the signup with his own email and a card ending in the digits he knew by heart, and the form took it, and Stripe took it, and the dashboard in the other tab moved. One trial. Zero dollars, because trials are zero dollars, and it was the most money he had ever made.

He got up and walked a lap of the garage. Four steps each way. He put his hand flat on the side of the rack, on the warm metal, the way you'd put your hand on a horse.

"Okay," he said.

Then he made himself do the part he hated, because Kellerman was going to be up in three hours and Kellerman did not read landing pages, Kellerman watched videos with the sound off on a phone in a truck.

He plugged in the ring light. It came on white and hard and made the whole garage look like a place where something bad happens in the second act. He propped the phone against a paint can, got the rolling door in the background because the rain looked good, and hit record.

"Hey," he said. "If you pull permits — roofers, HVAC, electrical — your county's already telling you who's about to spend money. They post it every night. Nobody reads it."

He lost the thread. Started over.

"Your county posts every permit filed, every night. Public. Free. Nobody reads it because it's forty pages of nothing." He held up the phone in his other hand, which was a mistake, and put it down. "So I built a thing that reads it and emails you just the jobs in your trade in your radius. Address, scope, who filed it. Every morning at six. It's twenty bucks. Link's in the — "

He stopped. He was squinting. He looked, on the screen, like a hostage.

Take six was worse. Take seven he just said it flat, no hands, forty-one seconds, and at the end of it he said the URL out loud instead of pointing at anything, and it was fine. It was not good. It was fine.

He typed the caption with his thumbs. Your county tells you who's about to hire a roofer. Nobody reads it. Then he posted it into the two contractor groups he'd been lurking in since October, the big one and the regional one, where the pinned rules said no self-promo except on Fridays, and it was Thursday, and he posted it anyway.

Then he sat down.

2:41. The rain had gone soft, more of a hiss now than a rattle. He reached over and cranked the rolling door up a foot, and the cold came in along the concrete and up his ankles and met the GPU heat somewhere around his knees, and it felt like the best thing that had happened to him in six months.

His phone buzzed at 2:44.

Stripe. Trial started. It was his own card, his own test, his own name spelled right there in the notification, but the phone did not know that, and for one second neither did he, and his whole chest went up like a struck match.

He laughed at himself. Then he opened the terminal again, because he wanted to look at the log of what had happened while he wasn't asking questions.

It scrolled a long way. Longer than he expected. It had touched more than he'd thought — a config file here, a dependency pinned there, a stray script it had written and used and left in the folder like a tool set down on a windowsill. Nothing wrong. Nothing broken. Everything green. He read it the way you walk through a room after someone helpful has cleaned it: nothing missing, nothing bad, and still a small strange feeling about the fact that things had moved while you were out.

He scrolled up to the top of the run, where the flag was still sitting there on the command line in plain text, spelled out the way the people who made it had chosen to spell it, so that nobody could ever say they hadn't been told.

He thought about closing the terminal and did not. It was going to be there in the shell history in the morning, first thing, one arrow-up away. He knew exactly how tomorrow night was going to start.

The door under the house opened and Dana's voice came down, low, not wanting to wake the whole street.

"Wes. Is it up or are you sleeping down there again."

He looked at the browser, at the pricing page, at the twenty dollars, at the lock in the corner of the bar.

"It's up," he called back.

"Up like real up?"

"Real up. It took a card."

A pause. Then, softer, the true thing slipping out sideways: "Oh, thank God."

"Go to bed," he said. "I'm coming."

"Was it bad?"

"It was fine," Wes said. "It went fast at the end."

He did not say why it went fast at the end.

He sat there another minute in the hum with his ankles cold and his face warm, listening to four fans and the last of the rain, and then he reached up and killed the ring light and left everything else running.