Skip to content
Leader

← Notes

What the shelf costs to run

Ada Exampleinfra10 min

For about two years, when someone asked what it costs me to keep all of this running, I said “not much” and changed the subject. I believed it. The card on file was the same card I use for groceries, the charges came in on different days of the month from six different companies, and none of them individually was the kind of number that makes you stop and look. Twelve dollars. Four dollars. Nineteen dollars. Every one of them small enough to approve without thinking, which is exactly how you end up not knowing.

In March I stopped guessing. I pulled every invoice from the previous twelve months out of my email, put them in a spreadsheet, and tagged each line with which product it belonged to. It took an evening and a half, mostly because two of the providers only offer PDFs and one of them names every file invoice.pdf. The answer, for the month of March 2026, was eighty-eight dollars.

Monthly hosting cost for seven products in March 2026, from Ledgerline at 41 dollars down to Halyard at 2 dollars. The rule beside each name is set in its category colour. Ledgerline data $41 Tideline infra $19 Cusp tooling $12 Pennant tooling $7 Quartile data $4 Marlin infra $3 Halyard tooling $2
March 2026, by product. The rule is set in the product’s category colour.

Eighty-eight dollars a month is fine. That is not the interesting part. The interesting part is the shape of it: one product is nearly half the bill, three products together cost less than a sandwich, and the single cheapest line on the list belongs to something I turned off eighteen months ago.

Nearly half of it is one Postgres

Ledgerline costs forty-one dollars a month and thirty-eight of that is a managed Postgres instance. Not a large one. Two gigabytes of memory, a twenty-gigabyte disk that is eleven percent full, and a daily backup I have restored twice on purpose and never in anger.

I could run the same database on the same box that serves the application for about six dollars. I have done the arithmetic more than once, usually late at night, usually after seeing the invoice. I keep not doing it, and I think the reason is sound: Ledgerline holds other people’s invoice data, some of it going back to 2023, and the managed instance is the only part of my setup where somebody else is on the hook for the thing I would be worst at. Point-in-time recovery is a feature I have used exactly once, in June 2024, after I ran an UPDATE without a WHERE clause against production because I had two terminal tabs open and picked the wrong one. That single incident cost me an hour and about four hundred rows that came back intact. Rebuilding that capability myself to save thirty-two dollars a month is not a trade I want.

So the largest line on the bill is the one I am least tempted to cut, and the reason has nothing to do with load. It is insurance against me.

The three-dollar problem

The bottom of the graph is where the useful discovery was. Halyard costs two dollars a month. Marlin costs three, and Marlin has been archived since February 2025. I wrote about turning it off in shutting down Marlin, and I was fairly pleased with myself at the time, because the queue worker had been the second most expensive thing I ran.

It is still on the bill. The three dollars is object storage holding the dead-letter table I exported before I deleted the database, plus the request charges from a health check I forgot to remove, pinging a hostname that has not resolved since the spring. Twelve thousand failed DNS lookups a month, billed at a rate I had to look up to understand, on a monitor I cannot see because I deleted the dashboard it lived on.

Thirty-six dollars a year to keep a file I have not opened in two years and to ask a dead machine whether it is awake. The file is eleven megabytes. I have looked at it now. It contains four hundred and six jobs that failed in the last week of Marlin’s life, every one of them the same malformed webhook from the same customer, and every one of them irrelevant to anybody living.

What that line item taught me is that turning something off is not one action. It is a checklist, and I did about seventy percent of it and felt finished because the expensive part was done. Every small product has a floor: a domain, a certificate, a bucket, a monitor, a DNS zone, a row in somebody’s billing system. The floor does not go to zero when the product does. It goes to about three dollars and stays there, quietly, for as long as you keep paying it.

Three dollars is also, not coincidentally, below the threshold where I look at an invoice.

What the graph does not have on it

The graph has hosting on it. Hosting is the easy number, because somebody mails it to you.

Not on the graph: eleven domain renewals, which arrive in October and January and come to a hundred and forty dollars a year between them, including two domains for products that do not exist because I liked the names. Not on the graph: the email forwarding, five dollars a month, one line covering all seven products. Not on the graph: a backup of the backups sitting on a drive in a desk drawer, which cost eighty dollars once in 2023 and nothing since.

And not on the graph, obviously, the evening and a half I spent building the graph.

I have seen people put an hourly rate on their own maintenance time and multiply it out to prove that a side project is a loss. I understand the arithmetic and I do not do it, because it assumes the hours would otherwise have been billable, and mine would have been spent reading about somebody else’s database migration instead. But there is a real number in there that I do want to watch, and it is not money. It is the number of separate systems I have to hold in my head to fix something at nine in the evening. Seven products across four providers with three different deploy mechanisms is close to my ceiling. I noticed that before I noticed the eighty-eight dollars.

Four providers, and nobody to blame but the prices

The seven products sit across four companies. That is not a plan. Ledgerline is where it is because in 2023 that provider was the only one offering managed Postgres at a price a side project could carry. Pennant is somewhere else because a status page should not share an outage with the things it reports on. Cusp is on a third because its preview deployments need a build minute that is cheap and a teardown API that works, and the first two got one of those right each. Halyard is on the fourth for no reason except that I was already logged in.

Consolidating would save me something. I priced it in March: moving everything to the largest of the four would come to seventy-one dollars a month, which is seventeen dollars better than what I pay now, or two hundred and four dollars a year. I have not done it and I am fairly sure I will not.

Part of that is the status page argument, which I think is genuinely correct and which rules out ever having one provider. The rest is less flattering. Migrating Ledgerline’s database means a maintenance window on somebody else’s invoice data, and the last time I moved a Postgres between providers I lost forty minutes to a connection limit that was documented in a place I did not read. Two hundred dollars a year is not enough to buy that evening from me.

What I did instead was write down which provider each product lives on, in the product’s own file, so that the answer takes four seconds instead of three logins. That is not a saving. It is the thing I actually needed at nine in the evening, which the spreadsheet only found by accident.

Two things I moved

Quartile was four dollars a month for a small server that ran a weekly job and then sat there for six days and twenty-three hours. It is archived now, but the shop it was built for still wants the historical numbers, so the pages have to stay up. I exported the whole thing to static files in April and put them behind the same CDN that serves everything else. The four dollars became nothing, because the traffic is about two hundred page views a month and every provider gives that away. The weekly job, which is the only part that needed a computer, now runs on my laptop when I remember, which is roughly what the shop needs from a report nobody reads until quarter end.

The Marlin cleanup took twenty minutes and I did it the evening I finished the spreadsheet. I deleted the health check, downloaded the dead-letter export, deleted the bucket, and closed the DNS zone. Then I wrote the whole list down in a file called turning-things-off.md, because the thing I will get wrong next time is the same thing I got wrong this time.

Between them: seven dollars a month, eighty-four a year. Not a meaningful amount of money. Two fewer things that can page me, which is.

What I keep paying for on purpose

Tideline is nineteen dollars and about eleven of that is storing the same backups in a second region. It is still being built, it has one real user who is me, and the second region is the entire point of the product, so paying for it is not a decision I revisit. I wrote about why in paying for uptime.

Cusp is twelve dollars, all of it preview deployments that exist for three days and then delete themselves. The cost moves with how much I am working, which is the correct shape for that bill. In a slow month it is four dollars. In the week I rebuilt the deploy process it was nineteen, and the nineteen bought me the thing that made the rebuild possible.

Pennant is seven dollars for a status page that has to be up when nothing else is, so it runs somewhere nothing else runs. Halyard’s two dollars is a bucket and a build minute; it has no server at all, which is why it is the cheapest thing on the list that is actually alive.

The rule I ended up with

I did not come out of this with a budget. I came out of it with two habits.

The first is that a product has to earn its floor. Before I put something new on the shelf I now write down what it will cost per month with nobody using it, and that number includes the domain, the certificate, the bucket, the monitor and the DNS zone. If I cannot say the number, I do not start. The one I am building now is at that stage right now and the number is four dollars, which is fine, and knowing it is worth more than the four dollars. The two domains I bought for products that do not exist are the counterexample, and they renew in January, and I will probably keep them anyway.

The second is that the invoices get read in March. Not continuously, not with an alert, not on a dashboard, because I have tried building that and I deleted it. Once a year, in an evening, with a spreadsheet, the same way I do the taxes.

March 2027 will tell me whether eighty-eight was the bottom or the middle.

Filed under infra

Tagged cost, money, uptime