Refresh week: a terminal hero, a ghost 404, and Monhub
Last Friday I looked at this homepage and saw a default theme with my logo on it. One week and 35 commits later, the logo sits above a fake shell session, dead links get told they are dead by a handheld device, and the Pokémon quiz site I built this spring finally has a write-up. This post is the changelog.
The homepage grew a terminal #
The old hero was a logo, a tagline, and a subtitle. Perfectly fine. Also forgettable, and it bugged me every time I opened the site.

The new one answers three commands before you have typed anything. whoami gives you the job title, uptime claims 183 days with zero regrets, and cat ~/motto.txt prints the tagline. Under the screen there is a tmux bar with three windows, because a terminal without a multiplexer is just a prompt. The whole thing sits on an animated grid with data packets crawling across it. All CSS, no JavaScript, and it switches itself off if your OS asks for reduced motion.

Full disclosure: this hero took about ten attempts across two days. Attempt one was a green phosphor CRT with scanlines. It looked like a prop from a low-budget hacking movie, and I loved it for roughly six hours. Then came a cyan rebuild, then a fastfetch-style layout with an ASCII banner, and finally the current setup with the tmux bar. Git history is a graveyard of heroes this week.
404: Ghost Not Found #
The old 404 page did the job. A heading, a small device showing a question mark, and a system error box telling you to jack out.

The redesign commits harder to the Mega Man Battle Network idea. A PET mk-II loses its link while tracing your request, complete with static and a sweep line on the screen. A debrief box explains that whatever lived at this URL was backed up to nowhere. Two chunky buttons send you home or open the search overlay, and below them sit the latest posts and projects, so a dead link is a detour instead of a dead end.

My favorite detail is buried at the bottom. The PET suggests turning it off and on again, and notes it has been suggesting that for 183 days. Same uptime as the hero. Consistency matters.
Monhub finally has a page #
I built Monhub months ago and never wrote it up, which is rude for a site with a blog. The new project page covers what it actually is: five game modes, a Pokédex you fill by playing, a Safari where missed guesses cost you balls, and a canvas town with NPCs who all have opinions. Duels run over websockets, and the server never knows the correct answer, so cheating requires more effort than playing.

Project pages also learned a new trick. A liveUrl in the frontmatter adds a live badge next to the title, on the homepage card and in lists. Small thing, but it means playable projects stop looking like abandoned repos.
Under the hood #
The boring-but-important stuff:
- The nginx config shipped in the Docker image had been decorative. Its
error_pagehandling returned missing pages with HTTP 200, so crawlers saw soft 404s everywhere. The new config actually returns 404, and gets copied into the image at build time. - Social previews got a proper 1200x630 og-image, and the schema.org Person now carries my full name, Terje Nomeland, so search engines stop confusing me with other tjnomes.
- Pagefind loads lazily now, the Dilbert GIF became a WebP, and static assets ship with cache headers.
- On phones, wide tables scroll instead of exploding, spacing got tighter, and the terminal titlebar no longer overflows.
- Tooling moved to Bun 1.4, with a
bun.lockand a Docker builder swap from alpine musl to a glibc binary. Hugo’s v0.165 config deprecations are fixed too. - New favicons and manifest. The old apple-touch-icon weighed 27 KB for no reason anyone can explain. The new one is 6 KB.
Where this leaves the site #
Everything described here is live. The old design still exists in git history if you are nostalgic, though I cannot imagine why you would be. Next up is keeping the PET theme from eating entire weekends, because I have a Switch 2 to justify buying first.