This is my personal blog focused on technology, learning notes, and everyday observations. I write about frontend development, backend architecture, AI, programming techniques, useful tools, and the lessons I learn along the way.
Background Let me start with a quick note: in the rest of this post, "dae," "daed," and "mihomo" refer to the familiar transparent proxy stack you already know. I previously documented my experience running daed on the Cudy TR3000 . Back in my internship apartment, the broadband was only 200 Mbps—I ran some tests and found that proxy throughput could saturate the connection, and the CPU seemed to…
This blog is a pure SSG site built with Nuxt v4, Nuxt Content v3, and i18n. When I first set it up, I casually made what looked like an unimportant decision: every page URL should end with a trailing slash . It sounded like the kind of thing that should be solved with a single config line. In practice, Nuxt still has no unified official switch for trailing slash handling ( nuxt/nuxt#15462 has been…
Late-Night "Impulse" Purchase A few nights ago at midnight, I was lying in bed idly browsing JD.com when I miraculously caught this perpetually out-of-stock Xiaomi Book Pro 14 2026 top-spec version in stock! The suddenly appearing purchase button was practically waving at me. Although my brain wrestled with the decision for a bit, my hands were very honest and pressed the payment button. While I…
In November last year, I got a new mainland China version Xiaomi 15 as my daily driver. Actually, my previous Redmi K70 Ultra was released in the same year as this Xiaomi 15, and performance-wise they're comparable. However, during my Gap Year while traveling across the country, I realized it was a shame not being able to capture the night scenes I encountered, so I wanted to switch to a phone…
If you’re familiar enough with the current network environment in mainland China, you probably know that dl.google.com is often directly accessible without a proxy . For example, you can download the Chrome offline installer directly from google.cn/chrome/?standalone=1 on a domestic network, and the final download domain is dl.google.com . My usual setup is to keep my proxy tool’s TUN mode enabled…
Vercel's default cache configuration is actually not very reasonable, but few people notice it. First, Let's Look at the Results Analysis Testing Approach Both images show test results from my blog on PageSpeed Insights . The testing steps were: Deploy Run the first test on PageSpeed Insights Wait 120 seconds to prevent PageSpeed Insights from using cached results Run the second test and use those…
Background On one of my VPS servers with optimized routing, port 443 needs to serve two distinct purposes: Hosting my blog for visitors from mainland China, handling HTTPS encryption/decryption and serving static content Disguising certain special-purpose traffic to mimic HTTPS traffic from well-known, commonly-allowed websites (yes, I'm talking about Reality) This meant I needed a solution to…
In my previous blog post , I mentioned a core insight: For small sites with low traffic and geographically dispersed visitors, DNS cold start isn't an occasional "accident" but rather a passive "norm." For most webmasters, site traffic doesn't increase overnight, so our visitors will likely need to go through the complete DNS resolution process. In the previous post, I discussed switching to…
When we talk about website performance, we usually focus on front-end rendering, lazy loading of resources, server response time (TTFB), and so on. However, before the user's browser can even begin to request content, there is a crucial part that is rarely mentioned in performance optimization: DNS resolution. For obscure small sites, a "DNS Cache Miss," or what I call a "DNS Cold Start," can…
I've been refactoring my blog recently, and while preparing for autumn recruitment and memorizing technical concepts, I came across HTTP/2 server push. I then attempted to configure HTTP/2 server push for my blog during deployment to further optimize first-screen loading speed. Why HTTP/2 Server Push Could Improve First-Screen Loading Speed As shown in the diagram below, in traditional HTTP/1.1,…
Nuxt Content is a powerful module in the Nuxt ecosystem for handling Markdown, YAML, and other content types. Recently, while migrating my blog from Hexo to Nuxt v4 + Nuxt Content v3 , I encountered a tricky issue: the v3 default query API does not directly provide support for "contains" ( $contains ) operations on array fields. For example, here's the Front Matter of the blog post I'm currently…
In August 2023, the CA/Browser Forum passed a vote eliminating the requirement for publicly trusted CAs like Let's Encrypt to maintain OCSP servers. In July 2024, Let's Encrypt published a blog post disclosing its plans to shut down its OCSP server. In December of the same year, Let's Encrypt released a timeline for shutting down its OCSP server , with the following key dates: January 30, 2025 -…
In August of this year, a GitHub Organization I'm part of frequently triggered CI during private project development, exhausting the 2,000 minutes of monthly Action quota provided by GitHub for the Free Plan (shared across all private repositories, public repositories don't count). After reviewing the CI workflow setup, which seemed reasonable, I needed to find alternative solutions to provide…
Last summer, I spent considerable time setting up an image hosting solution for my blog. The core goal was geo-distributed DNS resolution to ensure fast image loading for visitors both inside and outside China. The technical approach seemed perfect—until recently, when fellow bloggers reported slow image loading on first visits. That's when I discovered the real problem. 955 milliseconds of DNS…
Recap: When morphdom Meets Vue In the previous article , we embarked on a performance optimization journey for Markdown rendering. From the most primitive full refresh with v-html , to block-by-block updates, we eventually brought out the "ultimate weapon" - morphdom . By directly comparing and manipulating the real DOM, it updates the view with minimal cost, perfectly solving the performance…
Background In a recent AI project I took over, I needed to implement a ChatGPT-like conversational interface. The core workflow is: the backend continuously pushes AI-generated Markdown text fragments to the frontend via SSE (Server-Sent Events) protocol. The frontend is responsible for dynamically receiving and concatenating these Markdown fragments, ultimately rendering and displaying the…
Update Goals node-sass -> sass (dart-sass) Minimize impact, avoid updating other dependency versions unless necessary Based on the above two conditions, see if we can upgrade the node.js version Reasons to Abandon node-sass node-sass has been deprecated, dart-sass is the officially recommended successor by Sass node-sass installation on Windows is very troublesome, requiring both Python 2 and…
First Observation of the Frontend "Quantum State" Phenomenon This story sounds bizarre—even surreal. Half a month ago, while happily coding at my desk (with hotpot and songs in the background 🍲🎤), I stumbled upon a truly uncanny bug. As a bona fide human software engineer, writing bugs is normal—but this one defied all intuition: the moment I opened DevTools (F12) to inspect the relevant DOM…
The issue arose from the need to display a ~5‑minute product showcase video on a webpage. The original H.264-encoded file weighed 60 MB, with a bitrate of 1646 kbps—impractical for network delivery: not only does it inflate CDN bandwidth costs, but it also severely degrades the user experience under weak network conditions. Thus, we must compress the video using more modern codecs while ensuring…
This happened during the internal development of Jinghong’s image hosting service. A freshman reported that el-image and el-table were “clashing.” Demo iframe: demo When I saw that the table behind was showing through the el-image preview overlay, my first reaction was to ask the student to check whether the z-index was correct—specifically whether the el-image mask overlay had a higher z-index…
Fundamental Principles If you try searching for this article's title on a search engine, the articles you find will likely suggest using the following two APIs. I hope your search engine isn't so outdated that it's still recommending Flash-based ZeroClipboard solutions in 2025 document.execCommand 2012 brought us not only the supposed end of the world, but also IE 10. With IE 10's release on…
This all started when Jinghong's former technical director complained that the school's internal network servers couldn't connect to the external network, making APT installation and updates extremely difficult. He had to manually download packages from the source, along with their dependencies, and the dependencies of those dependencies... and then transfer all these packages to the server via…
Background Not long ago, I spotted the Cudy TR3000 router I'd been eyeing for a while at a discount price of ¥153 on JD.com. While it wasn't quite the all-time low of ¥130 (or even ¥110 with bundled deals), it was within my acceptable range. So I immediately ordered this Cudy TR3000 mini router I'd been longing for, to help ease my pre-semester anxiety (a mental condition). This router is powered…
Admittedly, I've gotten addicted to Cloudflare Workers In my earlier post "Updating RPM Spec Files for Packaging with GitHub Actions" , I used GitHub Actions to automate spec file version bumps. Combined with Fedora Copr's webhook support, this enables fully automated package builds. It seemed perfect — except there was no build status monitoring, meaning I had no way to get timely notifications…