Articles
Engineering notes, indie development and life essays, newest first.
20 posts22,502 words
2026
20 posts- Particle Skins: How My Blog Background Knows It's Raining Where You AreThe background particles first dressed by season, then followed the real-time weather, and finally geolocation moved onto my own server. The crashes taught more than the feature: a TypeError swallowed by requestIdleCallback, a static import that let one 404 kill every effect on the site, and a 502 that was not a bug.
- How a 640KB Chunk Disappeared from My VitePress BlogA zero word count in prerendered HTML led me to a 640KB mega chunk — every post compiled into JS just to read a few KB of frontmatter. Moving metadata to build time cut the main JS bundle to 48KB and shaved half a megabyte off dist.
- The Weak Spots of AI Code Editing: One Fault Line, Three Wrong FixesI had AI rebuild my archive page. Even after I pinpointed the bug to the horizontal line above 2026, it still fixed the wrong one. A full retrospective of two days of human-AI collaboration: five weaknesses, four countermeasures.
- Self-Hosting Visitor Stats: Ditching Busuanzi with 200 Lines of Python and SQLiteThe free stats service on my blog footer was half-dead, leaving a dead dash. I replaced it with a self-hosted counter built on the Python standard library and SQLite — zero dependencies, five pitfalls, each worth more than the feature.
- Modernizing This Blog: Noise, Spotlight, View Transitions & BentoA subtraction pass over three years of accumulated effects: film-grain noise, spotlight borders, native View Transitions, tighter display type, and a Bento home page. The traps were worth more than the effects — SPA navigation eating CSS transitions, :has specificity, and vp-doc global style pollution.
- How This Blog Is BuiltA walkthrough of the tech stack, theme customization, i18n setup, why I built RSS from scratch, and the performance trade-offs behind every visual effect.
- Three VitePress Customization TricksAdding a particle background, a cursor glow, and an ambient gradient to VitePress. The effects themselves are cheap — the traps hide in details: DPR, compositing layers, and learning not to animate.
- Alibaba Cloud ECS: Instance Selection & ICP FilingFrom instance selection, purchase, and ICP filing to going live — a full walkthrough of launching a personal server in mainland China, including the lesson learned from a filing rejection.
- Hardening SSH on a Fresh ServerA server exposed to the public internet has one door: SSH. Change the port, disable root login, switch to key auth, and add fail2ban to keep brute-force bots out.
- WorkBuddy: Turning AI from a Chat Box into a WorkbenchAfter trying plenty of AI tools, what I really lacked wasn't a chattier model — it was an assistant that actually does the work. WorkBuddy feels like it wires the filesystem, the terminal, the browser, and multimodal generation into a single conversation.
- A Visit to Hanshan Temple in SuzhouHalf a year of writing code tired out my eyes and my mind. I took a weekend drive to see Hanshan Temple in Suzhou.
- Adding a Live2D Mascot to a VitePress BlogHow I wired a Live2D model into this VitePress blog, plus the five traps I fell into — webpack split-bundle order, tap_body key naming, VitePress Layout slot limitations, and more.
- DeepSeek Harness: Installing the All-Plugins Agent FrameworkDeepSeek Harness is an open-source Agent runtime where every capability is a plugin. This guide covers Node.js setup and two ways to install the Agent (npx one-liner vs. source clone).
- Python Beginner's Guide: Environment Setup & First ProjectFrom installing the interpreter to running your first project. Compares uv, poetry, and pip. Covers Windows, macOS, and Linux. Every command is copy-paste ready.
- Local LLM Deployment — From PC to Self-Hosted Server, Five Paths Side by SideFive typical paths for running models on your own hardware — desktop apps to production inference frameworks, matched to your situation.
- OpenClaw vs Hermes — Two Approaches to AI Agent DesignOne reaches outward, one reflects inward — two AI Agent paths and their trade-offs across ten dimensions.
- Adding a Spec Layer for AI — My OpenSpec ExperienceAI coding is powerful, but requirements only live in chat history. OpenSpec adds a lightweight spec layer between you and AI — align first, then build. Here's my hands-on experience.
- Yangzhou Coffee Shop Work GuideTested multiple coffee shops in Yangzhou for WiFi, outlets, noise, and coffee quality. A location guide for remote workers.
- Why I Let AI Manage My MemorySessions end and context gets wiped. After four months of letting AI manage its own memory, what makes it remember is not a vector database but a few dumb disciplines — one fact per file, index first, and the courage to delete.
- Building a Personal Server from ScratchFrom a bare CentOS box to a static blog plus a live stats backend — SSH hardening, BT Panel and Nginx reverse proxying, systemd, need-to-know permissions, and three real deployment failures.