dozeGitHubGet doze

8:57

The laptop opens.

The fan is already spinning.

It never stopped. Not since yesterday.

A Tuesday, honestly.

One developer, a few projects, one ordinary day. Told twice.

Act oneMorning

9:02

Coffee. Lid up.

The tabs come back, one at a time.

web · pnpm dev api · poetry run… worker · go run docker compose kafka.sh zsh (??)

Six of them. You know what five are doing.

Nobody knows what zsh (??) is doing. You leave it alone.

9:20

You start the database. The first error of the day:

Address already in use.

Whose address? You ask the machine.

It's last week's client project. Its Postgres is still up, holding 5432, with the wrong data in it.

You open the README to see how this one is meant to start.

It says Getting started (2023). It was right, once.

You start writing ports down where you can see them.

3000? 3001? 8000 or 8001? Your head is full, so the bezel gets the rest.

Act twoNoon

11:30

Orders can't reach its database. You ask the AI.

It answers before you've finished asking. Quick. Confident.

Wrong.

“Apologies for the confusion! Try 5433.”

That's the other other one.

It read every file. It can't see your machine.

Act threeAfternoon

14:00

A message. can you look at billing?

A repo you haven't opened since spring. You wrote half of it.

make dev. No rule to make target.

There's a TypeScript service you've never seen. And a commit that says billing runs on the dev cluster now.

Nothing is wrong, exactly. It just isn't familiar any more.

How we got here

15:30

Last year local development got too hard, so it moved. Every team got a dev environment in the cloud, run by the platform team.

Which means tunnels. One port-forward per thing you need, and 5432 is still taken on this side.

Every save is a sync and a rebuild, somewhere else.

The debugger waits for the tunnel. The tunnel waits for the debugger. Timed out.

The logs are in another tool, in another tab.

Then #platform: Dev environments degraded. Investigating. No ETA.

Nobody on your team can run anything.

The platform team is on a production incident first, as they should be. Half of them are asleep in another timezone.

You sit, and wait.

You needed a platform team just to write code.

And on your desk, the most powerful computer you've ever owned sits there, waiting for a cluster to come back.

Local development didn't get fixed. It got moved.

Act fourEvening

18:40

Done. Before you go, you look.

23 containers still up. Two node processes since yesterday.

You close the lid.

None of it stops. Nothing stops on its own, so nothing stops.

The bag is warm by the time you're home.

You didn't design this.
It grew.

Rewind.

Same Tuesday. One app.

Act fiveThe same day, with doze

9:02

Lid up. The fan is off. It was off all night.

You open doze. Every project on this Mac is in one list, each with a switch. Last week's client project is stopped. It holds nothing.

You flip Larder on. It starts what ran last time, each service after the ones it needs.

Larder is our made-up grocery example: nine apps, four modules and a mail catcher. Or type doze up in a terminal; the app shows the same stack.

9:03

You open the map. Who calls whom, left to right, the way a request travels.

What they share sits underneath. How much memory, how many awake. Nothing to keep in your head.

One card is red.

9:05

The gateway can't have port 8000. You don't hunt for who has it. The app says: python3, pid 5387. The file server you started on Friday.

Stop it, one click. doze asks first, because it isn't doze's.

The first error of the day comes with a name.

11:30

A notification: orders crashed in larder.

One, for this crash. Not one per try.

11:31

You click Show. Orders' Logs tab, this run only.

Password authentication failed for user “orders”. Not a guess. What orders said, two seconds ago.

11:33

You ask your agent anyway. It reads the same stack through doze instead of guessing from the files.

A line in .env.local overrides the address doze gives orders. It's right the first time.

It can see your machine now.

14:00

can you look at billing?

Billing is in the list, stopped since spring. You pull the latest code and flip its switch.

14:06

The map shows a TypeScript service you've never seen: notifications, called by invoices.

Whoever added it added it to doze.hcl. If that file were wrong, nothing would start. So the map can't go stale.

15:30

Billing runs here, on your laptop, as plain processes. A breakpoint just hits.

#platform has an outage. You keep working. Nobody's pager is involved.

The platform team gets to build the platform, not babysit dev boxes.

18:40

You close the window. doze stays in the menu bar.

Billing went to sleep on its own, two minutes after you stopped calling it. Larder's workers read Kafka all day, so they never sleep, and what they use stays up with them.

18:42

So you open doze and flip Larder off. One switch.

You close the lid. Nothing is awake.

The laptop is cool. You go home.

The same Tuesday, twice.

Windows to keep an eye on
6
1 the doze app
Commands to remember
7
0 a switch per project
Ports in your head
8
0 every service has a name
Files to read before you start
9
0 the map shows what is there
Teams you wait on to run your code
1
0 it runs on your laptop
Still running when you close the lid
23
0 asleep, or stopped

These are the story's own numbers, not a benchmark. Yours will differ. Count yours.

Work hard. Then close the lid.

Next: how local development got moved, and how it comes back Start the day again