← vibed.website

bain.monster

A dashboard over one private folder of notes, with a public page that publishes the real numbers under project names that do not exist.

On 19 August every website I own went down for eleven hours. The thing that took them down was the dashboard I built to watch them. It runs on the same hosting account as the sites it checks, and it had burned through that account's free allowance of computing time.

The dashboard is bain.monster and it reads one private folder. Project notes, a journal file for each day, an inbox, a running list of every decision inside every project. Claude Code writes into that folder all day. The dashboard is how I read it back.

The sign-in page says it in one line. "One private markdown repo in, eleven live views out." The shorter version is that the folder is the database. Logging a thought and shutting a project down are the same move, one line changing in a file.

The top of the public sign-in page at bain.monster: the wordmark with the r struck out in red, the headline One private markdown repo in, eleven live views out, and the line saying this page is also the sign-in. The top of the public sign-in page at bain.monster: the wordmark with the r struck out in red, the headline One private markdown repo in, eleven live views out, and the line saying this page is also the sign-in.
the wordmark, struck, and the sign-in line · the public tour at bain.monster/signin
// tl;dr

01A private dashboard over the folder of notes Claude Code writes into all day. Eleven views, and no database but the folder itself.

02It also watches my sites, the databases behind them and what the models cost. On 19 August the watching itself took every site I own down for eleven hours.

03The sign-in page is public and is a full tour of all eleven views, with real numbers under invented project names. Promotion via true numbers, privacy via fiction.

04Building it has taken about 3.76 billion tokens of Claude Code. The physical capture station I built for it in one session lasted a day before I deleted it.

The brain viewer

It started on 18 April 2026 under the name DevDash. Twenty commits in forty-two minutes, one evening. A month later I rebuilt it as a viewer for the notes, with pages for Today, Projects, Inbox and Insights.

The day after that rebuild, 14 May, most of it moved at once. A design pass over the whole app, a heatmap of the journal. Then a diagnosis I had not expected. The dashboard looked like it only knew about recent projects, and the cause was in the notes rather than the code. Most of the project files carried a status other than active. I built a status manager into the projects page and left the rest of the app alone, because the data was the thing that was wrong.

On 20 May it moved to bain.monster, and got a wordmark that animates brain.monster into bain.monster by striking out the r.

Twice a day a model reads the last week of journals and the projects still running, and writes one summary the pages read back. A second routine, running on Opus, ranks what I should do next and commits its ranking into the folder as a file, one per run, kept forever, so there is a record of every ranking it ever made.

The morning block of the Today view in the public tour: a ranked next move for the invented project gleis-board, with its reasoning and evidence lines, and a smaller second suggestion beside it. The morning block of the Today view in the public tour: a ranked next move for the invented project gleis-board, with its reasoning and evidence lines, and a smaller second suggestion beside it.
the today view, morning · the ranked move is the Opus routine's, read back out of the repo

The Days view draws the same journal as a river. One coloured band per project running left to right across the logged window, with a diamond above it for every win I carried forward that day. A stretch I did not log shows up as a hole in the bands, which is the part I actually use it for.

The Days view in the public tour: the river, one colored band per invented project flowing across three months, a diamond above it for each carried win, tiles for 56 of 68 days logged, a streak of 8, 81 wins carried and 136 decisions, and a week-rhythm bar chart. The Days view in the public tour: the river, one colored band per invented project flowing across three months, a diamond above it for each carried win, tiles for 56 of 68 days logged, a streak of 8, 81 wins carried and 136 decisions, and a week-rhythm bar chart.
the river, one band per project, a diamond per win · the window is 68 days and it ends on 6 july

The status board

The status board went live on 2 June 2026. It checks my sites, the databases behind them, whether the data is fresh and whether the outside services still respond. Thirty-one checks, plus the databases it finds on its own. None of it runs when someone opens the page. A schedule does the checking, and the page reads the last result.

There was going to be a fifth kind of check, a heartbeat from my own machine. I cut it thirty-two minutes after shipping the board. The commit is blunt about it. "Phase 2 (local-file heartbeat) is not being built."

Two rules keep the board honest. Down means checked and failed, and it renders red. Unknown means could not check, and it renders gray. A free database that has put itself to sleep shows gray by design. A service telling me to slow down counts as degraded, and the runner says why in a comment. "429 = rate-limited = transient = degraded, never down."

The status board in the public tour: 27 of 31 operational, 0 down, 1 degraded, 0 stale, 3 unknown, above service cards for crumbsheet.kitchen, the spool-watch board, the captures database and hetzner inference. The status board in the public tour: 27 of 31 operational, 0 down, 1 degraded, 0 stale, 3 unknown, above service cards for crumbsheet.kitchen, the spool-watch board, the captures database and hetzner inference.
the status board · gray is could not check, red is checked and failed

On 8 June both lists stopped being hand-maintained. The databases get discovered automatically, and the site list builds itself out of the analytics, so a new domain that gets a single pageview shows up on its own.

The analytics came first, on 27 May. The plan was one project per site, until the free tier turned out to allow exactly one, which I found out by renaming the default and then failing to create the second. One shared project was the better design anyway. The tracker went out to the other sites as one change each, all but one merged the same session. I closed that one because the project was already dead.

What the models cost

August was mostly about what the models cost. A flat monthly subscription and a pay-per-use key produce different numbers, so the page splits them, then splits them again by key. On 23 August I relabelled one plan, because the per-session cost it reports counts against a quota rather than landing on my card. The label now reads "usage ≠ card · go = $10/mo".

The claude view on the live instance: $1,192.21 this week so far against $1,661.99 last week, a subscription-value card reading $6,073 extracted on a $200 a month plan for a 30.4 times multiplier, an anomaly card reporting today's cost within normal range, a 28 day streak, and a daily tokens and cost chart running 1 to 30 August 2026.
what the models cost · the thirty days to 30 august 2026

The number the panel leads with is a conversion. It reads $6,073 of pay-as-you-go value extracted over thirty days, against a plan billed at $200 a month. A 30.4 times multiplier. Both figures are true and only one of them ever leaves my account, which is the whole reason the page splits them.

Two leftovers on that page bothered me for a while, a dead spend-trends section and an orphaned quota strip. I deleted both on 15 August, a net 392 lines gone. My project note went on listing them as the thing to decide for another eight days, which is a fair demonstration of what this dashboard is for and what it cannot do. It reads the notes. It does not check them.

The 402 day

Vercel's mail on the morning of 19 August said the free team had "used 300% of the included free tier usage for Fluid Active CPU (4 hours)". I wrote the incident up the next day and titled it "Vercel account paused, every site 402, monitor was the cause".

The monitor was easy to convict. It swept every site every hour, and fourteen of the sixteen were hosted on the account paying for the sweep. The worst was the check against this dashboard, which bounced into the public sign-in page and drew it in full, two database reads at a time. Every hour, for months.

Then I measured it, and the logs told a different story. The checking loop was about 5% of it. The rest was tracking data I had pointed at the same app, roughly 7,600 calls a day against the monitor's 384. The commit that corrects my own incident note says it plainly. "Measurement after the unblock does not support that."

The fix was checking three critical hosts often and everything else once a day. Load dropped to 85 requests a day. I stayed on the free plan, because the run rate was a bug and not demand. Vercel granted a one-time courtesy unblock with triple limits for thirty days. Those run out around 19 September, and the next breach means paying or nothing.

The capture station

On that same 14 May I designed, built, deployed and flashed a physical capture station for my desk. It is a CYD, a cheap yellow board with a small touchscreen on it.

I picked capture over the other things it could have been, an ambient display or a morning ritual screen. Capture was the one that beat reaching for my phone. A thought gets logged with a physical tap.

Ambient mode is interactive, which was the whole point of building a device at all. Tap a todo to check it off. Tap a stagnant project to snooze it a week. Tap the focus banner to cycle what I am on. Tap a tile to start the day's journal. A todo is identified by its own text rather than by where it sits in the file, so if the file moved between the screen drawing it and my finger landing, nothing gets ticked off.

The capture screen is six tiles. Five are picked for me, a mix of AI suggestions and my own presets, and the sixth opens a keyboard.

Then on 15 May I deleted all of it. The commit body opens "Physical ESP32 device retired". Thirty-six files, one day old.

A month later a smaller version came back. On 15 June a 2.4 inch screen on a different board got a read-only view of the same folder, Today and captures, on a key of its own, so the two boards on my desk cannot take each other down. Making that display standalone and always-on has been on the goal list ever since. The board has instead spent that time on a World Cup live display and then a Düsseldorf weather map, which tells you where the goal ranks.

The sign-in page

The sign-in page is the only part anyone else can see. It is a tour through the eleven views the headline promises, every one mocked up with a working layout and invented contents. The projects on it are called gleis-board, crumbsheet, gather-play, desk-critter, spool-watch, laplog, cedar-pulse. None of them exist. The two views it leaves out are the cost pages, so the whole August money story is missing from the public version.

The Atlas view in the public tour: an active shelf holding gleis-board and crumbsheet and a paused shelf holding desk-critter, each row carrying its next move and its todo and decision counts. None of the projects exist. The Atlas view in the public tour: an active shelf holding gleis-board and crumbsheet and a paused shelf holding desk-critter, each row carrying its next move and its todo and decision counts. None of the projects exist.
the atlas shelves · active, paused, done and abandoned add up to the 71 in the band

The counts on the same page are real. A band of them sits under the headline, and the page vouches for them in its own words. "Those numbers are real, measured on the live instance…" And in the same breath, "Every project name below is invented; the brain itself stays private, behind GitHub OAuth with an allowlist of one."

A page vouching for itself is worth nothing, so here is where the counts come from. They were measured on the live instance and written into the page as fixed values. The decision is dated 6 July and lists the same figures the band still shows, 71 projects and 967 decisions. That is why the tour is frozen on that date, down to the river ending there and the Today view reading Jul 6, week 28. The token count in the band, 8.8 billion in thirty days, covers every project on the Claude account, and this dashboard is one of them.

The band of aggregates under the headline: 71 projects on file, 27 active right now, 15 sites live, 967 decisions logged, 56 of 68 days journaled, 31 services watched, 8.8B tokens in thirty days. The band of aggregates under the headline: 71 projects on file, 27 active right now, 15 sites live, 967 decisions logged, 56 of 68 days journaled, 31 services watched, 8.8B tokens in thirty days.
the real-numbers band · measured on the instance, then frozen into the page
The Today view on a phone: Jul 6, week 28, the morning block with the ranked next move for gleis-board and the crumbsheet suggestion under it. The Today view on a phone: Jul 6, week 28, the morning block with the ranked next move for gleis-board and the crumbsheet suggestion under it.
The river on a phone: the per-project bands stacked above the days-logged, streak, wins and decisions tiles. The river on a phone: the per-project bands stacked above the days-logged, streak, wins and decisions tiles.
the tour on a phone, today and the river

The rule sits in that same entry. Promotion via true numbers, privacy via fiction. Every count on that page was true the day I measured it, and not one name on it will ever be real.