PLUGmil

← blog ·

plugmil.dev is a site now, not a placeholder

sitecloudflare

The old plugmil.dev was one HTML file: 5 KB, an inline stylesheet, and an inline script that spun an ASCII globe. It did its job — it held the name and pointed at the accounts. It also shipped four things that were not obvious from looking at it.

What was actually wrong

Every path returned 200. /robots.txt, /sitemap.xml, /favicon.ico, and any typo all resolved to the same HTML document with a 200 status. That is the single-page-application fallback doing what it was configured to do. For a one-pager it is invisible. For a crawler it means the site claims a robots policy and a sitemap that are actually just the homepage.

The globe never stopped. setInterval(render, 1000/30) ran for as long as the tab existed — scrolled away, backgrounded, or on a machine whose owner had asked the OS for reduced motion. Thirty full re-renders a second, forever.

Mobile was the desktop layout, scaled. The link ring was absolutely positioned on a fixed 600px stage, and small screens were handled with transform: scale(.62) on the whole thing. That shrinks the label text along with the geometry.

html, body { overflow: hidden }. Correct for a single screen. Fatal the moment there is a second page.

What it is now

Next.js 16 on Cloudflare Workers, through the OpenNext adapter. Every route is prerendered — the worker is serving static output, not rendering per request.

The globe is the same algorithm, taken from the Plug Design System v0.4 engine rather than the old inline copy. That upgrade is visible: the system runs ULTRA ring density (15° parallels, 12° meridians, 1° point step) where the old page ran 20°/18° with a 3° step. Frame zero renders on the server, so the globe is present in the first paint and with JavaScript switched off. The animation stops when the element scrolls out of view, when the tab is hidden, and when reduced motion is requested.

robots.txt and sitemap.xml are generated. Unknown paths return a real 404.

Still not built

The footer used to promise blog, arcade and shop. The blog exists — this is it. The arcade and the shop do not. They are listed as not built rather than as coming soon.