Examples Habit Tracker Kanban Board Leetcode Prep README.txt SandVox Tanks uApp Demo Why Maverick Meerkat?
Joshua Bemenderfer — How this site was built
How this site was built

Earlier today I asked the assistant for a history of this site. It didn’t rummage through folders — it ran SQL. Every write to this archive ends up in a table called uapp_file_history, and the whole story of the site’s first day is sitting there: 177 logged operations on 33 different files, 3.3 MB written, between 12:44 and 17:51 on August 27 — five hours and seven minutes, one sitting with a break in the middle.

Where the files came from

The archive itself was created that morning at 10:32. The posts — dated two days earlier — were carried over from the previous server-rendered site, and the first line of the builder describes its own origin:

// build.js — the site generator. Ported from plugins/md.ts + server/render.ts + server/index.ts

So the starting point was a port: the old build pipeline rewritten in plain JavaScript to run inside the archive, in a browser, with no Node and no Vite. The log picks up the moment that port started writing files.

The session, minute by minute

TimeWhat the log shows
12:44First write: js/build.js, 37.7 KB — the generator itself
12:48First pages: two posts, the admin site map, an embedded-components demo
13:03The editor toolbar is born (16 KB)
13:04First full rebuild: home, every post, the 404
13:53The probe storm (below)
14:17–14:28The generator grows 42 → 55 KB in seventeen revisions
15:16Housekeeping: the embedded-components post retires after 2h 28m
17:10Two read-only code reviews of the archive
17:41The big split: island-hydrate.js and md.js become files
17:51Last rebuild of the day

The probe storm

At 13:53:42 the log shows eleven writes to data/_probe.txt inside a single second, the file creeping from 5 bytes to 16 as it goes. Then five more writes to _probe2.txt over four seconds, then two throwaway pages deleted seconds after they were generated. This is what stress-testing the write path looks like from the inside — rapid-fire edits to see what replicated, what coalesced, and what the editor’s freshness model made of it all.

Grow, test, delete

The middle hours are a loop of extend, rebuild, try, delete. A delete-test page with its own ScratchWidget.vue was created, edited and deleted within thirty seconds — a full lifecycle test. Two more ui-delete-test pages came and went the same way. Of the 21 deletions in the log, every probe and test page was removed deliberately. Nothing test-shaped was left behind.

Reviews, then the refactor

At 17:10 and 17:23 two sub-agents were let loose on the archive with read-only instructions: one to review the build pipeline, one the runtime and editor. Twenty minutes later came the single biggest commit of the day: island-hydrate.js and md.js were split out of build.js into files of their own, ClientOnly.vue grew from 364 bytes to 1.2 KB (fallback slots), and WriteDemo.vue — the guestbook over in How this site works — appeared. The log can’t prove the reviews caused the refactor, but the timing is eloquent.

The scoreboard

FileVersions writtenGrowth
app/admin.html3317.3 → 24.7 KB
app/js/build.js2937.7 → ~56 KB (+49%)
app/index.html22steady, ~12.5 KB
app/js/editor-toolbar.js1516.0 → 25.6 KB

The home page still ends with a stray “Testing site rendering7” — a leftover from launch day that survived all twenty-two rebuilds of index.html. Some history the log doesn’t need to record; the page records it itself.

The log, live

Because the log is just a table, this post can end by querying itself. The box below reads uapp_file_history live — inside the editor it updates whenever anyone touches the archive:

🧾 The build log appears here when this page is opened inside the uapp editor.

What the log can’t tell you

Every row is attributed, but the attribution only says You on a browser — the log knows what happened, never whose idea it was. For that, the archive also kept the day’s 91 chat messages across three conversations: two code reviews, and a request to take a look at the file history and write a blog post. This is the one you’re reading.

Joshua BemenderferHow this site was builtSite map