Every site went 404
One afternoon I opened the TokiRing URL and got a 404. I checked the other services. The LP, TokiQR, the corporate site. All 404.
GitHub Pages had gone down across the board.
My first suspicion was an account-level restriction — Stripe integration flagged as commercial use, perhaps, or automated commits triggering a policy violation. I filed a reinstatement request with GitHub Support and kept digging.
The answer was on the GitHub dashboard.
"You have reached the usage limit for the free plan. The limit resets on April 1, 2026."
The Actions free tier — 2,000 minutes per month — was exhausted.
The failure mode no one imagined
I had anticipated GitHub Actions going down. CI/CD stopping, automated deploys failing — those kinds of breakage were in my mental model.
But "Actions quota exhausted → Pages returns 404" was not a chain I had imagined.
GitHub Pages looks like a simple static file delivery service. In reality, its build and serving pipeline runs on top of Actions. When Actions stops, Pages stops. The files exist, but the site goes dark.
I knew, as a fact, that "GitHub Pages uses Actions." But I had never asked the question "what happens to Pages if the Actions quota runs out?" before I hit the limit.
The failure taught me the chain. Only after it broke.
Hardware came out of storage
That day, I pulled a Raspberry Pi 5 and an M5Stack Core S3 out of storage. microSD cards, USB drives. Equipment that had been waiting for its moment.
GitHub Pages going down made "a delivery layer independent of commercial services" viscerally real — not just a theoretical concern. Something I had understood intellectually became physical conviction through a 404.
While setting up the Pi, the architecture became concrete. Place a Raspberry Pi at a community center. It becomes TokiRing's push notification server. When the network is alive, notifications reach people. When there's a large-scale outage, the PWA runs offline on local devices.
The distributed micro-server concept had existed before. But SSH-ing into the Pi, starting nginx, confirming the service was running — that turned it from concept to proof.
Migration to Cloudflare Pages
I migrated the static sites to Cloudflare Pages. Corporate site, LP, TokiQR, TokiRing, Hello Briefing — deployed one by one with Wrangler CLI.
Cloudflare Pages static delivery has no request limit. It is completely decoupled from Actions quotas. The risk of going 404 at month-end because a usage meter ran out simply does not exist in this architecture.
During the migration, something became clear: GitHub Pages is a perfectly fine service for "publishing a personal static site for free." It was the right starting point. The problem was not being able to accurately imagine its limits before hitting them.
Limits become visible only through use. No point resenting that. When something breaks, move fast. That's all.
Static delivery and Actions should have been decoupled.
The day it broke, that became writable.
What became visible after the break
After that day, the outline of a three-layer architecture came into focus.
The physical layer: QR codes and print. Readable without a network. Existing without power. Raspberry Pi and M5Stack Core S3 implement this layer as distributed micro-servers.
The civil layer: Cloudflare Pages. One of the world's largest CDN infrastructures delivers static files with no limits. An order of magnitude more reliable than GitHub Pages. This layer guarantees "if the network is alive, it reaches people."
The national layer: the National Diet Library. An online resource collection application was submitted and accepted. Someone a hundred years from now may access it through a digital archive.
This three-layer structure had been verbalized before. But living through "the day GitHub Pages went 404" turned it from a concept into a design philosophy grounded in felt experience.
Good thing it happened now
The 404 struck two days before a seminar — a 90-minute online session with a hundred-person audience, where I was scheduled to present the product.
I think about what it would have been like if it had broken on the day of the seminar. But it was two days before, which meant the migration made it in time. Deploying to Cloudflare Pages took a few hours.
If you could choose when to break, you'd choose a quiet moment when no one is watching. But you can't choose. Which is why being able to move fast when it breaks matters more than the break itself.
Good thing it happened now. Those words came out naturally.