vibescoder

115 Days In: One Afternoon of Admin Panel Improvements, End to End

·7 min read

Day One of this blog was 115 days ago — a lounge chair in Cabo, an iPhone, and a Coder workspace. The admin tooling has been growing ever since. This post isn’t about 115 days of slow drift, though. It’s about one afternoon, back to back, no gaps: 2:54 PM to 6:23 PM, a single continuous run of admin panel work that went from a small bug fix to a genuinely ambitious feature to four rounds of finding out why that feature didn’t actually work to three mobile bugs I only found because I finally used the thing on my phone.

Here’s the real order it happened in.

The timeline

Time (PDT)What shipped
2:54 PMFixed a loose-file blind spot in the image-orphan detector (unrelated bug, same session)
3:12 PMBuilt /admin/settings — a page for the AI writing-style config that had a working backend and no UI at all
3:15 PMAdded a read-only visual TODO viewer at /admin/todo — the backlog file, rendered as a real checklist instead of raw Markdown
4:21 PMWired image upload directly into the /admin/images browser (previously only reachable mid-post-edit)
4:21 PMAdded drag-and-drop reorder to the TODO viewer — move items, click Save, one commit
4:38 PMAdded a 🚀 launch agent button next to every TODO item — click it, fire a real Coder Agents chat pre-prompted to tackle that item
4:51 PMFix #1: added the function timeout the launch-agent route was missing
5:00 PMFix #2: guarded a second crash path in the same route
5:15 PMFix #3: diagnostic logging to find out why it still wasn’t working
~5:15–6:00 PMFix #4 and #5 (not code — a Cloudflare setting and a malformed API token), verified working end to end
6:23 PMFixed three mobile layout bugs, found by finally opening the panel on my actual phone

Under four hours, one continuous session, six real features and five real bugs. Here’s the texture of it.

Building the todo admin, then improving it twice

The visual TODO viewer went in first (3:15 PM) — nothing clever, just parsing the backlog file into an actual checklist instead of asking me to read raw Markdown. Within the hour it got two upgrades in the same sitting: drag-and-drop reorder (4:21 PM, so I could rearrange priorities without hand-editing a file), and — twenty minutes later — the ambitious one. A 🚀 launch agent button next to every open item. Click it, and it fires a real Coder Agents chat via the same Chats API the Coder Agents UI itself uses, pre-prompted to go tackle that specific backlog item end to end.

Image upload landed in the same window (4:21 PM, effectively simultaneous with the reorder feature) — a different corner of the admin panel, but the same afternoon, the same instinct: the backend already existed, it just weren’t reachable from the one screen that should have had it front and center.

The button that didn’t work — four different ways

The launch-agent button looked done at 4:38 PM. It wasn’t. Getting it from “merged” to “actually works” took five separate fixes across roughly ninety minutes, each one uncovering a different layer of the problem:

  1. 4:51 PM — First click: Unexpected token '<', "<!DOCTYPE "... is not valid JSON. The route had no function-timeout override, so Vercel was killing it mid-request (spinning up a real workspace takes longer than the default timeout) and serving its own HTML error page instead of JSON.

Launch agent button showing a raw client-side error before the underlying causes were found
Launch agent button showing a raw client-side error before the underlying causes were found

  1. 5:00 PM — Fixed, redeployed, clicked again: a bare 502, no message. A second code path — the response-body read — sat outside the only try/catch in the handler, so it could crash the same way one layer deeper.
  2. 5:15 PM — Added logging everywhere just to see what was actually happening, since the error still wasn’t self-explanatory.
  3. Still 502, still no message even with logging — because the real blocker wasn’t in the app at all. Cloudflare Bot Fight Modeturned on back when the Coder deployment first went behind a Cloudflare Tunnel — was serving a Just a moment... JS challenge to every server-to-server request. Vercel has no browser to solve that with. Disabled it at the zone level.
  4. Still failing, differently — once Cloudflare stopped intercepting the request, Coder’s own API finally responded, with a real auth error: the API token in Vercel was in the wrong format. Coder tokens are an ID and a secret joined by a delimiter, and matching that format exactly took a couple of tries.

Two app bugs, one edge-security setting, one credential format — in that order, each one hiding the next until the previous was actually fixed. Confirmed it was finally working the only way that counts: queried the Coder API directly and watched the chat the button had launched already running the task.

Three bugs a laptop will never show you

With the button finally working, the last stop of the afternoon (6:23 PM) was opening /admin/todo on my actual phone instead of a desktop browser — and immediately hitting three layout bugs none of the desktop work above had ever surfaced, in the same spirit as an earlier round of mobile-only bugs that only showed up once I actually looked at the site on a phone instead of a laptop.

The admin nav bar had no flex-wrap. Two of its links (Settings, TODO — both from this same afternoon) pushed the row past the mobile viewport instead of dropping to a second line.

Admin nav bar links running off the edge of the screen instead of wrapping to a second line
Admin nav bar links running off the edge of the screen instead of wrapping to a second line

The new Target Directory dropdown in the image-upload form had no width constraint at all, so it rendered wider than the screen the moment a slug name was even moderately long.

Target directory dropdown extending past the edge of the mobile viewport
Target directory dropdown extending past the edge of the mobile viewport

And the TODO reorder row — drag handle, checkbox, item text, the new launch-agent button, and the up/down arrows — was all crammed into one unwrapped flex row. On mobile, the arrows and the launch-agent error text visually collided.

TODO reorder row with the up/down arrows and launch-agent button cramped and overlapping on a narrow screen
TODO reorder row with the up/down arrows and launch-agent button cramped and overlapping on a narrow screen

Same fix in spirit for all three: stop assuming desktop width, let things wrap or stack on small screens, and only force the compact single-row layout back once there’s actually room for it.

One more thing the backlog review turned up

While going through the backlog to see what was still open, one item — “Add image upload to the admin Images panel” — was still sitting there marked open, despite having shipped earlier the same afternoon. Two other longstanding backlog ideas turned out to be resolved too, just never checked off: a Substack RSS import already fought to a standstill and written up as its own post, and a mobile-workflow friction idea that traced back to a one-off observation from a redesign months ago and was never actually pursued. All three got logged as done (or scratched, with the reasoning) instead of lingering — the same kind of audit-then-close-the-loop discipline that’s kept this backlog honest before.

By the Numbers

  • Days since Day One: 115
  • Length of this session, start to last merge: ~3 hours 29 minutes (2:54 PM–6:23 PM PDT)
  • Features shipped: 6 (orphan-detection fix, settings page, visual TODO viewer, image upload, TODO reorder, launch agent button)
  • Fixes required to make the launch-agent button actually work: 5, across ~90 minutes
  • Of those, app-code bugs: 2
  • Of those, infrastructure misconfiguration: 2 (Cloudflare zone setting, API token format)
  • Mobile layout bugs found only by using the panel on an actual phone: 3
  • Backlog items marked “open” that had already shipped that same afternoon: 1
  • Way the launch-agent button was ultimately confirmed working: queried the Coder API directly and watched the chat it launched already running the task

Comments