I Spent Two Years Thinking About This Blog

Saying I "thought about it" isn't quite right; it was closer to an obsession. It started back when I couldn't write frontend or backend code, couldn't write embedded code either. I was messing around with electronics then, and I stumbled onto @ushio's videos on and their website, and thought it was so much fun that I wanted one too. Over the next six months or so I learned C from scratch, plus a little JS and CSS, and put up a static blog with Hexo deployed on Github Pages — my own little corner of the world, at last.

Hexo: A fast, simple & powerful blog framework. , hexo.io, opens in new tab
A screenshot of the Hexo project's home page in dark mode, with the blue hexagonal "H" logo at top left beside nav links for Docs, API, News, Plugins, Themes, About, a GitHub icon, a search box with a Cmd-K hint, and an English language switcher at right. The hero reads "A fast, simple & powerful blog framework" above a copyable install command, `$ npm install hexo-cli -g`, with a blue arrow button, and below it a row of badges: 41k GitHub stars, 5k forks, 212k/month downloads, and a Follow @hexojs link. A release strip lists hexo 8.1.0 on 2025-10-26, hexo 8.0.0 on 2025-09-16, hexo 7.3.0 on 2024-07-02, and Hexo 7.2.0 on 2024-04-17, and the next section begins with feature headings "Blazing Fast" and "Markdown Support". The release dates and download figure date the capture to on or after late October 2025.
ushio , sakura-ushio.icu, opens in new tab
A screenshot of a personal blog's post list, with a dark sidebar on the left holding a round anime-style avatar, the name 小汐, a 主页 link, a row of 所有文章 / 友链 / 关于我 links, and four circular social icons including GitHub and QQ. The main column shows a pinned post card titled PD-METER-R4 dated 2023-01-29, whose Chinese summary says it is under development and, compared with R3, has an optimized layout, a replaced main controller, and a few new features; below that sit two photographs of a small green PCB labelled USBC-R4 SAKURA, front and back, shot on a white cloth with a Xiaomi 12S Ultra camera watermark reading 2023.02.06 15:47. The card carries a 置顶 (pinned) tag and a 展开全文 >> expand button, and a second card for WORX-BAT-Charger dated 2023-02-14 begins below. It appears to be evidence of a hardware hobbyist's blog documenting iterations of a USB-C power-delivery meter board.

Later, I came across @Innei’s personal site. Its design was exquisite and it was packed with features; one look was all it took for me to want it, and I even sponsored the project. Although I never ended up using it, I don’t regret spending the money, because it gave me the chance to get my hands on the React source code. Just like when I first encountered C, I thought: it’s only code—what’s the big deal? Someday, I’ll write one myself.

静かな森 , innei.in, opens in new tab
A screenshot of a personal blog homepage in dark mode, with a near-black background and pale petals drifting across it. A pill-shaped nav bar sits at the top centre with the Chinese items 首页 (active), 文稿, 手记, 时光, 思考 and 更多, a small anime-style avatar at the top left and a sign-in icon at the top right; the hero text on the left reads "Hi, I'm Innei 👋。" above "A NodeJS Full Stack <Developer />" and the line "An independent developer coding with love." Below that is a row of round social buttons — Bilibili, NetEase Cloud Music, GitHub, email, RSS, Telegram and X — while a large circular anime portrait of a silver-haired girl with a pink bow anchors the right side, and a grey Chinese quotation about responsibility and inner strength runs along the bottom edge. It is evidently the landing view of Innei's personal site as rendered in a browser at desktop width.

That was in 2024, and then ’24, ’25, and ’26 brought us to where we are now

There’s been no stopping it since then.

Out of Control

It started as nothing more than wanting to add a light/dark toggle to @colmugx's Hexo theme Nlvi. I slapped one together out of Dark Reader's JS -- ugly, and I wasn't happy with it. Then I learned CSS @media, then JS SPA switching, then TailwindCSS's .dark class, then SSR next-theme, and finally a Cookie plus a Head Sync inline script to kill the FOUC flicker. Four or five approaches, all told.

🎨 A simple theme for hexo. , github.com, opens in new tab
A promotional mockup for a Hexo blog theme, pairing the wordmark "NIvi" in large light-grey type over a short salmon-pink underline on the left with two overlapping browser-style screenshots of the theme on the right. The larger, desktop-width panel shows a cream header with the script logo "Hexo" and a nav of search, ARTICLE, ARCHIVES, TAGS, ABOUT, below which sits a typographic test post dated 2013-12-27 titled "Elements" — the standard Hexo sample page walking through Heading 1 to Heading 6, a Paragraph section of lorem ipsum with pink inline links, bold, italic, underline and code spans, a pink-barred blockquote, and a three-column table with "Table Header 1–3" over "Division 1–3" rows. A narrower mobile or tablet rendering of the same page overlaps it at lower right, showing the logo centred and the identical content reflowed to a single column. The whole thing sits on plain white and reads as a theme showcase, evidence that the design renders its full HTML element set cleanly at both widths.

But that was only the tip of the iceberg. After discovering React, I went from the Stone Age of Hexo and plain JavaScript all the way to the Next.js 13 Page Router, then detoured into Vue, studied single-page application routing, learned how the index.html fallback works, and recreated the project countless times. I bought a server and tinkered with Docker, Nginx, and a network-attached storage system; finding 1Panel ugly, I hand-built the Canopy control panel, researched storage arrays and wrote RFS, then got so fed up with acme.sh acting up while I struggled with secure sockets layer certificates in China that I wrote a reverse proxy in Rust: Vane & Lazyacme. It began as eight hundred lines of junk hacked together in three hours one evening, but after some friends in a group chat egged me on, I spent four months cramming in HTTP/3, zero-copy operations, a layered model, and a flow engine. Then there is Seam, a full-stack framework and another enormous rabbit hole—but that story can wait.

Overengineering

Then the age of AI arrived, and my anxiety doubled again.

The most ironic part is that all of this was supposed to be built alongside the blog, documented as it happened. Instead the blog got , the ideas kept piling up, and there was nowhere to record any of them. On one side my conscience kept accusing me: you said you would finish Vane, so you can't stop now. On the other side, a growing sense of helplessness as I drifted further and further away. I always remembered what I was supposed to be doing; I just couldn't get it done. Thinking about it carefully, it has been a very long time since I sat down and wrote anything at all. Looking back now, all of it points to the same thing -- over-engineering.

I honestly didn’t feel I was going off track at the time. Vane? The blog would need to be deployed eventually anyway, so I’d need a reverse proxy. Seam? I’d have to write full-stack code sooner or later, so I might as well build my ideal framework first. Every step had a rationale; every step was something I’d “need later.” But the problem was, “later” would never come, because I never even started...

Failure

A blog doesn’t actually need a reverse proxy or a homegrown framework. But at the time, I treated them as prerequisites—as a justification that seemed reasonable even though it kept blocking me forever. They never were. There was only one real prerequisite: sitting down and writing the first article.

It’s not that I hadn’t worked on the blog. Quite the opposite—I tried three times.

Vercel , vercel.com, opens in new tab
A screenshot of the Next.js homepage in dark mode, showing the landing hero as it appears in a desktop browser. A top nav carries the Vercel triangle and NEXT.js wordmark on the left, links for Showcase, Docs, Blog, Templates and Enterprise beside it, and on the right a "Search documentation..." field with a ⌘K hint, a Deploy button and a Learn button. The centre of the page reads "The React Framework for the Web" in large white type, with the subhead "Used by some of the world's largest companies, Next.js enables you to create high-quality web applications with the power of React components," above a pale "Get Started" button and a dark "Learn Next.js" button, and below them the command `~ npx create-next-app@latest`. Faint dotted grid lines and two partial circle outlines sit behind the text as background ornament.

My first attempt was back in the Next.js 13 Page Router days. At the time, I only vaguely understood what a single-page application was and knew nothing about concepts like SSR, SSG, or ISR—but people said SSR was good, so I wanted to use it too. As I kept building, I realized I had no idea what problems these architectures were meant to solve, and I couldn’t continue. Later, I switched to a pure Vue 2 single-page application. Why Vue? Embarrassingly, I just liked the name, and since it was new to me anyway, I figured I’d give it a try. That didn’t last long either. On my third attempt, I returned to React, starting with plain JSX. I learned TypeScript, became comfortable with TSX, understood the difference between CJS and ESM, fell in love with reactive programming, and adopted libraries such as Lucide, Framer Motion, and Radix UI that I would later find indispensable—this time, it finally looked respectable. But I still failed, because fundamentally I was only imitating others: whatever they used, I used too. It looked convincing, but I had no real understanding of why things should be done that way. Add AI hallucinations to the mix, and I could get plenty of things running as a minimum viable product, but they became minefields when it was time to scale up.

Remix , remix.run, opens in new tab
A screenshot of the Remix website's landing page, rendered on a pale grey-to-white gradient with the wordmark "Remix" at top left and a nav row at top right reading Blog, Jam, Store, V2 Docs. Centred headline text announces "Remix 3 is under active development", with the subtitle "A new full stack framework built on Web APIs" beneath it. Filling the lower two-thirds is a stylised illustration of a car hidden under a black drape, its folds catching light, with a rainbow-striped diagonal banner and white racing-stripe flashes crossing the middle — the classic covered-supercar teaser motif. It reads as evidence of the pre-announcement state of the Remix 3 project page, where the framework rewrite is being publicised before any release.

Later, I learned about React (Remix) Router loaders, the Next.js 15 App Router, and RSC, but by then daily life had grown so busy that I had little time to code—and thus no chance to fail a fourth time. Looking back, I worked on my site from Next.js 13 all the way through Next.js 15; I had barely finished migrating and hadn’t even launched it when Next.js 16 beta 1 came out.

Let Go

To say I’d “let it go” isn’t quite accurate; I was just tired.

A screenshot of a macOS terminal window (traffic-light buttons top left, dark background, monospaced type) showing a box-drawn table of daily LLM token usage and cost, scrolled so the header row is off-screen. Each row is a date from 2026-03-03 through 2026-03-13 paired with the models used that day — haiku-4-5, opus-4-6, and on some days sonnet-4-6 — followed by five numeric columns that read as input, output, cache-write and cache-read tokens plus a total, and a final dollar amount; totals run from 161,186,904 tokens at $97.92 on 2026-03-12 up to 3,277,442,496 tokens at $1,765.56 on 2026-03-09. Cache-read is by far the dominant column, often billions against a few million output tokens, and cost tracks that total closely. It appears to be output from a usage-reporting CLI, evidence of a heavy multi-day Claude Code workload peaking in the 2026-03-06 to 2026-03-09 window at roughly $1,700 a day.

The pace of the AI era is too fast. Models iterate one after another, new techniques surface wave after wave, and I grew more and more anxious, as if stopping meant being overtaken. At the wildest point I wrote code sixteen hours a day and could burn $1.9k USD of tokens in a single day (around February, I think); I was nearly wrecked. But what stopped all of it wasn't some epiphany, just plain exhaustion. Under a rhythm that kept tightening, the last straw came down and instead I felt relief, I let it go, I ; and this way is pretty good too.

I started letting go. I gave up the things I had once clung to, learned when to stop, and left tomorrow’s problems for tomorrow. Vane isn’t finished? Leave it for now. Seam still has a long way to go? Come back to it later. The blog isn’t perfect? Launch it first. I went all in on Vibe Coding: if there’s no problem, leave it alone; if one comes up, deal with it then.

The strange thing is that quality didn't get worse after I let go. I think it's probably because those days of coding weren't wasted. I started using AI back in the GPT-2 days, but at that time I was still dutifully writing every line of code and understanding every concept. That period gave me my foundation. What came later was less Vibe Coding than Context Coding — the judgment I needed was still there, and letting go didn't lead to any stupid mistakes, or accidents for that matter.

All that tinkering before is what gave me the confidence to let go now.

Origin

The final solution turned out to be surprisingly simple: everything on Cloudflare. R2 for object storage, D1 as the edge database, KV for caching, and Worker for server-side rendering—all serverless, with no servers.

Cloudflare Worker , workers.cloudflare.com, opens in new tab
A screenshot of the Cloudflare marketing homepage hero, cropped to the top of the page, on a saturated orange background with a faint dotted texture and a warm pale glow rising from the bottom centre. The navigation bar carries Products, Solutions, Resources and Pricing as dropdown items, with a "Login" pill and a white "Start building" button at the right; the headline reads "Everything we learned from powering 20% of the Internet—yours by default", followed by the subhead "Cloudflare is your AI Cloud with compute, AI inference, and storage — letting you ship applications instead of managing infrastructure." and a second white "Start building" call to action. It is evidence of Cloudflare's current positioning as an "AI Cloud" rather than purely a CDN or security vendor, leaning on the 20%-of-the-internet reach claim as the proof point.

Is this answer ironic? Extremely so. Before reaching this “simple” destination, I took one enormous detour. I once planned to self-host, which meant managing a server, wrestling with Docker, and managing containers. So I wrote Canopy as a control panel, Lazycert to manage certificates, Vane as a reverse proxy, and Twig for resource-monitoring instrumentation. A whole pile of projects, all to serve one garbage server.

Storage was the same story. I thought object storage was too expensive and wanted to use my own server’s hard drive, so I wrote RFS, a VFS that atomically deduplicated and consolidated data into a single file. I even revived the registry concept from the 1980s and 1990s, then mounted the whole thing through FUSE. The result? I spent even more time reinventing an inferior wheel while the server sat idle for a year—a thoroughly money-losing venture.

Vercel , vercel.com, opens in new tab
A desktop-browser screenshot of Vercel's marketing homepage, rendered on a black background with a faint grid overlay. The dark navigation bar carries the Vercel triangle wordmark on the left, menu items for Products, Resources, Solutions, Enterprise and Pricing, and Ask AI, Log In and Sign Up controls on the right; the hero headline reads "Build and deploy on the AI Cloud." above the subhead "Vercel provides the developer tools and cloud infrastructure to build, scale, and secure a faster, more personalized web." Two buttons sit below it — a white "Start Deploying" primary with the triangle glyph, and an outlined "Get a Demo" secondary. Beneath them a large line-art triangle rises out of the grid, lit from behind by a bloom that fades blue on the left through green at the apex to red on the right, evidence of a recent capture of the site's current AI Cloud positioning.

After one long detour, I ended up back at serverless after all. Vercel’s concept is good, but I don’t like Next.js; Vercel also relies on too much magic, and its middleware design—precompiling it to run at the edge—still leaves the system fragmented in the end and has even led to several CVEs. You might as well run everything together at the origin. Cloudflare Workers, on the other hand, is excellent: it takes things to another extreme by compiling artifacts under 10 MB to WASM, allowing real business logic to run at the edge. That’s exactly what I want. Its only drawback is the cost—but that hardly counts as a drawback, since time saved is money.

Less is more

I’d heard this countless times, but it took me two years to truly understand what it meant.

Back to the essence of engineering: “Make it function, make it correct, then make it exceptional.” I finally got on the right track and got it working. Is the blog bare-bones right now? It is. Incomplete? Absolutely. But it’s better than nothing. If you haven’t even put anything online and keep building the thing you “might need,” forever chasing an invisible perfection, you’ll end up with nothing to show for it. This isn’t a compromise; it’s an engineering trade-off. Anyway, I’ve learned to let go. So I let go. Once I stopped obsessing over a single detail, I actually walked out the door. My phone’s camera roll hadn’t seen an outdoor photo in ages, so I took a quick shot by the roadside—I really hadn’t been out in a long time (

A photograph, taken looking down at a low hedge of clipped evergreen shrubs running diagonally across the frame behind a pale granite kerb, with a strip of grey paving and asphalt in the lower left corner. The shrubs are dense but visibly thin near the kerb, where bare woody stems and a floor of brown leaf litter show through, and the foliage carries the yellow-green flush of new spring growth; a slender tree trunk rises out of the planting at the top edge, and a band of rust-red bedding plants fills the far background. The light is bright and directional, low enough to throw long soft shadows of an out-of-frame object across the pavement and the kerb, suggesting late afternoon.

Looking back at the detours I took, do I regret them? No. Some things may never make sense until you try them yourself. Besides, in the age of AI, it is virtually impossible to follow the same old path I once did; too many workflows have changed. Then there is this project, Taki, coded entirely with AI—but that does not mean it cannot be maintained for the long term or that it lacks a human touch. Whether AI was involved is not really important anyway. What I enjoy is not writing code itself, but building something...