I’ve been thinking about this blog for two years.
Saying “want” isn’t quite accurate; it’s more like an obsession. It started back when, in the early days, I didn’t know how to write front‑end or back‑end code, nor embedded code. I was still tinkering with electronics, and by chance I saw @ushio’s Bilibili video and website, and thought it was fun, so I wanted to try it too. Later I spent about half a year learning from scratch to write C and a bit of JS/CSS, and using Hexet I set up a static blog hosted on GitHub Pages, which can be considered my own little corner of the world.


再后来,看到了 @Innei 的小站,设计很精致、功能也很全,当时的我看了一眼我就想要,甚至还赞助支持了,虽然后面没用上但是这钱也花的不怨 因为我摸到了 React 源码,就和我最初看到 C 一样,不过就是代码嘛,有什么大不了的,总有一天我要自己写一个。

Later on, I came across @Innei’s little site; its design is exquisite and its features are comprehensive. At that moment, I looked at it and wanted it immediately, even sponsored it. Although I didn’t end up using it later, I don’t regret spending the money because I got to touch the React source code, which was just like when I first saw C—just code, nothing spectacular. I’m sure that someday I’ll write my own.
Quiet Forest
That was the year 2024, then 24, 25, 26 years up to now
Since then, it hasn't been able to stop.
Out of Control
At first I just wanted to add a light‑dark toggle to @colmugx’s Hexo theme Nlvi. I slapped together a Dark Reader‑style JavaScript snippet – it looked ugly and I wasn’t happy with it. Then I learned CSS @media, moved on to a JS SPA toggle, tried TailwindCSS’s .dark class, then SSR with next‑theme, and finally hand‑crafted a Cookie + Head‑Sync inline script to fix the FOUC flicker. I ended up trying four or five different solutions.

But that's just the tip of the iceberg. After discovering React, I went from the Stone Age of Hexo and Vanilla JS all the way to Next.js 13 Page Router, then turned to Vue, studied SPA routing, understood the index.html fallback, and created countless new projects. I bought a server, tinkered with Docker, Nginx, NAS; finding 1Panel ugly, I hand‑wrote the Canopy panel, explored NAS storage arrays and wrote RFS. Dealing with SSL, the domestic environment made acme.sh so frustrating that I resorted to writing a reverse proxy in Rust: Vane & Lazyacme. What started as an eight‑hundred‑line junk project written in three hours one night turned, after a friend's encouragement, into four months of work, stuffing in HTTP/3, Zero‑Copy, the Layer model, and the Flow engine. Later there is also Seam, a full‑stack framework that is another nightmare—more on that later.
Over‑engineering
Then the AI era arrived, and anxiety doubled.
The most ironic thing is that these things were supposed to be done while recording after starting a blog. But the blog kept getting abandoned, ideas kept piling up, and there was nowhere to record them. On one side my inner self was condemning; I promised to finish Vane, but couldn’t, so I stopped. On the other side is a growing feeling of helplessness as I drift further away. I always remember what I want to do, but I just can’t bring it to life. Thinking carefully, I realize I haven’t sat down to write anything for a long time. Looking back now, all of this points to the same thing—over‑engineering.
I actually didn't feel like I was going off track at the time. Vane? Anyway, the blog will need to be deployed later, so I must have a reverse proxy. Seam? Since I’ll eventually have to write full‑stack code, I might as well get the framework I envision set up first. Every step has a reason, and each step is "something I'll need later." But the problem is, "later" never arrives, because I never actually start...
Failure
Doing a blog actually doesn’t require a reverse proxy, nor a custom framework. Yet at that time I treated them as prerequisites, as that forever‑blocking but reasonable excuse, but they never were. The only real prerequisite is just one: sit down and write the first article.
Actually, the blog hasn't been untouched; quite the opposite, I've done it three times.

The first time was back when it was still Next.js 13 Page Router. At that time I barely understood what a SPA was, and I had no clue about concepts like SSR, SSG, ISR, but because others said SSR was good, I wanted to use it too. As I kept writing, I realized I didn’t understand what problems these architectures were solving, and I couldn’t continue. Later I switched to a pure Vue 2 SPA. Why Vue? Honestly, I thought the name sounded nice, it was new, so I gave it a try. It didn’t last long. The third time I returned to React, starting from plain JSX, learned TypeScript, mastered TSX, understood the difference between CJS and ESM, fell in love with reactive programming, and started using Lucide, Framer Motion, Radix UI—libraries I now can’t live without—this time finally it looked somewhat right. But I still failed, because fundamentally I was just copying—using whatever others used, which only looked right on the surface, while I didn’t truly understand why. On top of that, with AI hallucinations, many things could be cobbled together into an MVP, but when scaling up, it was all pitfalls.

Later, I also learned React (Remix) Router Loader, Next.js 15 App Router, and RSC, but at that point my daily life was already very busy, I didn’t have much time to code, and I didn’t even get the chance for a fourth failure. Looking back now, my site went from Next.js 13 to Next.js 15; I had just finished the migration and hadn’t launched yet when Next.js 16 beta‑1 was released.
Letting go
Saying “想开了” is actually inaccurate; it’s because I’m tired.

AI era's rhythm is too fast. Models iterate one after another, new technologies keep emerging in waves, and I become increasingly anxious, as if stopping would mean being overtaken. At my craziest, I wrote 16 small pieces of code in a day; a day's worth of tokens could scorch $1.9k USD (around February), and I was nearly exhausted. But what halted all this wasn't any epiphany, just plain fatigue. In an ever‑tightening pace, the last straw finally fell, and I felt a sense of release, opened up, gave up the struggle; in this way, it's actually quite good.
I started to let go. I gave up the things I once clung to, learned to stop at the right moment, and to deal with tomorrow's matters tomorrow. Vane not finished? Leave it for now. Seam still far from done? Do it later. Blog not perfect? Launch it first. Begin fully with Vibe Coding; if there’s no problem, ignore it, and if there is, address it later.
Strangely, the quality didn't degrade after letting go. I think this is probably because those “古法” programming days weren't wasted; as early as the GPT‑2 era I started using AI, but back then I was still honestly writing every line of code and understanding every concept. That experience gave me a foundation, and rather than saying it was later Vibe Coding, it's more like Context Coding; the necessary judgment is still there, and letting go hasn't led to any low‑level mistakes or accidents.
All the previous struggles gave me the capital to let go now.
Origin
The final solution is actually very simple: All in Cloudflare. R2 object storage, D1 Edge database, KV for caching, Worker runs SSR, everything is serverless, no servers.

Is this answer sarcastic? Very sarcastic. Because before reaching this "simple" endpoint, I went around a full circle of detours. I once planned to self‑host, so I had to manage the server, tinker with Docker, handle containers, so I wrote Canopy as a management panel, wrote Lazycert to manage certificates, wrote Vane as a reverse proxy, and wrote Twig for resource‑monitoring hooks. A bunch of projects just to serve a junk server.
Storage is the same. I find object storage expensive, so I wanted to use the hard drives of my own server, and wrote RFS, a kind of VFS for atomic deduplication and merging of single files, even revived the registry concept from the 80s‑90s, and finally mounted it via FUSE. The result? I spent even more time building a less‑than‑ideal wheel, the server sat idle for a year, and it was a completely loss‑making business.

Finally, after going around in circles, I’m back to serverless. Vercel’s concept is good, but I don’t like Next.js; moreover, Vercel has too much “magic,” and the middleware design that pre‑compiles to run on the Edge ends up fragmented, even causing a few CVEs. It would be better to have everything on the origin. On the other hand, Cloudflare Workers are great, achieving another extreme: products under 10 MB compiled to WASM can run real business logic on the Edge, which is exactly what I want. Apart from the cost, there are essentially no drawbacks—though it’s not really a drawback, since the time saved is money.
Less is more
I've heard this sentence countless times, but it took me two years to truly understand its meaning.
The essence of returning to engineering is: “Make it function, make it correct, then make it exceptional.” I finally got on the right track and made it functional. Is my current blog simplistic? Yes, simplistic. Incomplete? Indeed incomplete. But it’s still better than nothing. If you don’t even have a launch line and keep working on something that’s “maybe needed,” constantly chasing an invisible perfection, you’ll end up with nothing to show. This isn’t a compromise; it’s an engineering trade‑off. Anyway, I’ve come to terms with it. So I’ve let go. No longer obsessing over a single detail, I stepped outside. My phone’s gallery hasn’t had an outdoor photo in ages, so I casually snapped a shot of the roadside—haven’t been out for a long time.

Looking back at the detours I took before, do I regret them? No, I don’t. Some things, if you don’t try them yourself, you may never understand them. Moreover, in the AI era, trying to follow the old path I once took is basically no longer possible; too many workflows have already changed. Also, this project is Taki, 100% AI coding, but that doesn’t mean it can’t be maintained long‑term, nor that it lacks a human touch. Actually, whether AI is present or not doesn’t matter; besides, what I love isn’t the act of writing code itself, but building something…