<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Andy Stewart</title>
    <description>The latest articles on DEV Community by Andy Stewart (@lcmd007).</description>
    <link>https://dev.to/lcmd007</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3890210%2F844dfe22-6b9d-4b32-87aa-ff45eaf98145.jpg</url>
      <title>DEV Community: Andy Stewart</title>
      <link>https://dev.to/lcmd007</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lcmd007"/>
    <language>en</language>
    <item>
      <title>DeepSeek V4 + Claude Code: Building a "Surgical" Development Workflow with China's Strongest Open-Source Model</title>
      <dc:creator>Andy Stewart</dc:creator>
      <pubDate>Mon, 11 May 2026 06:39:43 +0000</pubDate>
      <link>https://dev.to/lcmd007/deepseek-v4-claude-code-building-a-surgical-development-workflow-with-chinas-strongest-54i2</link>
      <guid>https://dev.to/lcmd007/deepseek-v4-claude-code-building-a-surgical-development-workflow-with-chinas-strongest-54i2</guid>
      <description>&lt;p&gt;The "Vibe Coding" era has evolved. With the release of DeepSeek V4, we finally have an open-source reasoning engine from China that can truly compete with closed-source giants like GPT-4o and Claude 3.5.&lt;/p&gt;

&lt;p&gt;As a system architect (founder of deepin and Lazy Cat), I have always pursued determinism and architectural sovereignty. By combining DeepSeek’s logical reasoning with Claude Code’s CLI automation, we can build an AI-native development loop that is extremely low-cost and offers high control.&lt;/p&gt;

&lt;p&gt;In just 5 minutes, you can configure this "Terminal Arsenal."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The Engine: Installing Claude Code&lt;/strong&gt;&lt;br&gt;
Claude Code is more than just a chat box; it is an agent running in your terminal that can directly manipulate local files, run tests, and manage Git workflows. It is a true engineering tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Microsoft Windows 10:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;（1）Press Win+R, type cmd, and open the Command Prompt.&lt;/p&gt;

&lt;p&gt;（2）Paste the following code and hit Enter (Note: It must be CMD; PowerShell will not work)：&lt;br&gt;
&lt;code&gt;curl -fsSL https://claude.ai/install.cmd -o install.cmd &amp;amp;&amp;amp; install.cmd &amp;amp;&amp;amp; del install.cmd&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
（3）After installation, verify it by running:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;claude --version&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If the version number appears correctly as shown in the screenshots, the installation is successful.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fps2kspkqn95pda4nsytl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fps2kspkqn95pda4nsytl.png" alt="installation" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note: Pay attention to the small grey text regarding adding environment variables.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unix (macOS and Linux):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;（1）Open your terminal emulator. (macOS users: Search for "Terminal" in Spotlight. Linux users: You know the drill.)&lt;br&gt;
（2）Paste and execute the following code (ensure your network can access global services):&lt;br&gt;
&lt;code&gt;curl -fsSL https://claude.ai/install.sh | bash&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;（3）Verify the installation:&lt;br&gt;
&lt;code&gt;claude --version&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvvf3qlh6mjbs5ecwww5n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvvf3qlh6mjbs5ecwww5n.png" alt="claude code" width="800" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The Soul: DeepSeek V4 API&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;DeepSeek is currently the "smartest brain" with the highest cost-performance ratio globally.&lt;/p&gt;

&lt;p&gt;（1） Visit the &lt;a href="https://platform.deepseek.com/" rel="noopener noreferrer"&gt;DeepSeek Open Platform&lt;/a&gt; to register.&lt;br&gt;
（2）I recommend an initial top-up (using the &lt;code&gt;flash&lt;/code&gt; model is incredibly cheap and perfect for high-frequency iterations).&lt;br&gt;
（3）Generate your &lt;strong&gt;API Key&lt;/strong&gt;. &lt;br&gt;
&lt;em&gt;Safety Tip: I personally store my keys in Bitwarden on my local LCMD private cloud; I refuse to let my data sovereignty go "streaking" on the public cloud.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdiae6w8w66aufbrlyktq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdiae6w8w66aufbrlyktq.png" alt="deepseekn" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Launch Command: Driving Claude Code with DeepSeek&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;（1）Using the Anthropic-compatible interface provided by DeepSeek, we can seamlessly swap the underlying model.&lt;/p&gt;

&lt;p&gt;（2）Enter the following code in your terminal (replace with your actual Key):&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic ANTHROPIC_AUTH_TOKEN=sk-你的访问密码 ANTHROPIC_MODEL=deepseek-v4-flash claude&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Note: There are spaces in the command—do not miss them. Even a single wrong character will cause it to fail. It is best to copy this into a text editor first, edit it, and then paste it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Real-World Demo: Building a High-Tech Product Page&lt;/strong&gt;&lt;br&gt;
Once launched, try giving the Agent instructions (using my LC03 project as an example):&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Create an introduction page for LC03. Requirements: White theme, minimalist high-tech aesthetic (Surgical Logic style), optimized for desktop experience. Once written, automatically open the HTML in my browser."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The Workflow: Claude Code will automatically plan the file structure, write the code, and handle permissions. You are only responsible for high-level architectural decisions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb9ba9s519w7mew84kd05.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb9ba9s519w7mew84kd05.png" alt="coding" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnk8m6uvfhbbdp184duqg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnk8m6uvfhbbdp184duqg.png" alt="demo" width="800" height="2174"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Why is this the ultimate solution for the "One-Person Company" (OPC)?&lt;/strong&gt;&lt;br&gt;
During the development of LightOS (the AI Development All-in-One), I realized that leadership is essentially the quality of the nervous system under pressure. The same applies to tools.&lt;/p&gt;

&lt;p&gt;By using Chinese open-source models like DeepSeek, we not only reduce costs but, more importantly, reduce dependency on "external black boxes," keeping the core business logic pure and controlled.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Join the Community&lt;/strong&gt;&lt;br&gt;
The OPC is no longer a myth. We are deploying AI-generated software directly onto decentralized private hardware, reclaiming digital sovereignty.&lt;/p&gt;

&lt;p&gt;Are you ready to move from "writing prompts" to "building systems"? Let's discuss the future of AI infrastructure together.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>deepseek</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Breaking the "Desk-Lock": A Linux Veteran’s Blueprint for Walking Programming and Productivity Reconstruction</title>
      <dc:creator>Andy Stewart</dc:creator>
      <pubDate>Wed, 06 May 2026 08:55:02 +0000</pubDate>
      <link>https://dev.to/lcmd007/breaking-the-desk-lock-a-linux-veterans-blueprint-for-walking-programming-and-productivity-2696</link>
      <guid>https://dev.to/lcmd007/breaking-the-desk-lock-a-linux-veterans-blueprint-for-walking-programming-and-productivity-2696</guid>
      <description>&lt;p&gt;People call me a "Involution King" (卷王).&lt;/p&gt;

&lt;p&gt;They see me managing a company, writing core infrastructure code, and handling a mountain of "miscellaneous" tasks—all while maintaining a relentless release schedule. They’re curious: "Andy, how do you actually ship that much code?"&lt;/p&gt;

&lt;p&gt;The answer is simple: I stopped anchoring myself to a desk. I code while walking, while thinking, and while moving. Whether I'm shopping with my wife, walking the dog, or waiting at the school gate, I am in development mode.&lt;/p&gt;

&lt;p&gt;For me, this isn't just about efficiency; it's about a seamless transition of roles:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;While writing logic&lt;/strong&gt;, I am the Programmer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;While walking and ideating&lt;/strong&gt;, I am the Product Manager.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;While pushing a release&lt;/strong&gt;, I am the Project Manager.&lt;/p&gt;

&lt;p&gt;I don’t need to be tethered to a physical coordinate. What I need is a systematic architecture—a "plumbing" system that lets me dispatch tasks to AI as digital agents, rather than just staring at a dry chat interface on a smartphone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The 4 "Hardcore" Pain Points of Mobile Programming&lt;/strong&gt;&lt;br&gt;
While walking by East Lake or waiting for my daughter after school, I’ve stress-tested nearly every mobile AI coding solution on the market. I’ve realized that true "Programming Freedom" requires overcoming four technical hurdles:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Seamless Workflow "Drift" (Context Handoff)&lt;/strong&gt;&lt;br&gt;
I cannot accept fragmented environments. When I leave my office and head outdoors, my entire coding environment and debugging context must "drift" instantly to my mobile device. The phone isn't a crippled backup; it must share the exact same underlying logic as my workstation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Breaking the "Geofence"&lt;/strong&gt;&lt;br&gt;
True mobile programming isn't just sitting on your couch. It’s in the car, at the grocery store, or by the BBQ grill. Inspiration is fleeting. You must have the ability to turn a thought into a Commit within 60 seconds of it hitting your brain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Closed-Loop Real-Time Rendering&lt;/strong&gt;&lt;br&gt;
Programming is fundamentally a loop of "Execute &amp;amp; Verify." Writing code without seeing the result is flying blind. Whether I’m tweaking a UI pixel or refactoring an Agent’s scheduling logic, I demand an instant, live preview of the execution on my actual device.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. The "Bare Metal" Debugging Advantage&lt;/strong&gt;&lt;br&gt;
This is the Achilles' heel of most cloud IDEs and web-based AI tools. When you are both the developer and the user, your phone is both your dev machine and your real-world testbed. Validating functions on actual hardware in real-time provides a level of "dev-euphoria" that only hardcore engineers truly understand.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Field Report: My "Fluid Laboratory" *&lt;/em&gt;&lt;br&gt;
Shopping with my wife: Fixing a bug in the Hermes Agent. I’ve already mapped out the logic while walking; during the gaps in our conversation, I whip out my phone, "chat" with the system, modify the code, and verify the fix on the spot.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7cq193d8x2ay2c7suk2f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7cq193d8x2ay2c7suk2f.png" alt="Shopping with my wife: Fixing a bug in the Hermes Agent." width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;BBQ by East Lake: Refactoring code amidst the smoke and fire.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqn2g6z726wvhuka4jixx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqn2g6z726wvhuka4jixx.png" alt="BBQ by East Lake: Refactoring code amidst the smoke and fire." width="800" height="1317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Waiting for school pickup: A 15-minute window is more than enough to ship a new version.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F90537xx04p23k0cfgho1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F90537xx04p23k0cfgho1.png" alt="Waiting for school pickup: A 15-minute window is more than enough to ship a new version." width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Core Gear: LCMD Micro-Server&lt;br&gt;
The backbone of this entire operation is my LCMD Micro-Server, running 24/7 at my home.&lt;/p&gt;

&lt;p&gt;It’s not just a NAS; it’s my Productivity Command Center. You can dispatch heavy-lifting tasks—computational power, environment isolation, and version control—to it at any time, leaving you free to focus on decision-making and high-level planning.&lt;/p&gt;

&lt;p&gt;In the past, individuals couldn't handle complex projects because they were trapped by expensive cloud costs and fixed workstations. Now, with a Micro-Server and AI, you can fit an entire development studio in your pocket.&lt;/p&gt;

&lt;p&gt;Stop "welding" yourself to your desk. Go walk, go think, and code as naturally as you breathe.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>coding</category>
      <category>productivity</category>
    </item>
    <item>
      <title>20-Year Linux Veteran Gets "Kernel Panicked"? Hardcore Fix for Random Desktop Freezes on AMD GPUs</title>
      <dc:creator>Andy Stewart</dc:creator>
      <pubDate>Thu, 30 Apr 2026 09:22:00 +0000</pubDate>
      <link>https://dev.to/lcmd007/20-year-linux-veteran-gets-kernel-panicked-hardcore-fix-for-random-desktop-freezes-on-amd-gpus-2em7</link>
      <guid>https://dev.to/lcmd007/20-year-linux-veteran-gets-kernel-panicked-hardcore-fix-for-random-desktop-freezes-on-amd-gpus-2em7</guid>
      <description>&lt;p&gt;After 20 years of hacking away in the open-source world and the Linux community, I’ve realized I might actually be a Bug Magnet.&lt;/p&gt;

&lt;p&gt;On my previous laptop, a Dell G16, the power-saving mode of the Intel AX201 Wi-Fi card caused &lt;code&gt;pacman&lt;/code&gt; updates to crawl at snail speeds. I finally solved that by surgically disabling the power-saving logic. Last year, I switched to this ThinkPad P14s, specifically choosing the AMD integrated graphics version. I thought, "No NVIDIA proprietary drivers to mess with—surely this will be stable, right?"&lt;/p&gt;

&lt;p&gt;As it turns out, if you have a mind for "tinkering," bugs will find you with pinpoint accuracy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Symptom: The Unavoidable "Frozen Frame"&lt;/strong&gt;&lt;br&gt;
Recently, my desktop environment started freezing multiple times a day. That feeling of the entire GUI suddenly solidifying is incredibly frustrating. It even made me wonder if I had broken the system by messing with some underlying plumbing.&lt;/p&gt;

&lt;p&gt;After work, I decided to cut the Gordian knot and reinstalled EndeavourOS. The freezes persisted. But I noticed a crucial clue: While the GUI was dead, the TTY was still functional. This classic "pseudo-hang" usually means the system hasn't crashed; rather, there’s a communication breakdown between the kernel driver and the hardware.&lt;/p&gt;

&lt;p&gt;I fired up dmesg for a deep-dive log review and finally caught the culprit.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[    4.392040] amdgpu 0000:c4:00.0: amdgpu: [drm] PSR support 1, DC PSR ver 0, sink PSR ver 3 DPCD caps 0x7b su_y_granularity 4&lt;br&gt;
[    4.392173] amdgpu 0000:c4:00.0: amdgpu: [drm] PSR support 0, DC PSR ver -1, sink PSR ver 0 DPCD caps 0x0 su_y_granularity 0&lt;br&gt;
[    4.392327] amdgpu 0000:c4:00.0: amdgpu: [drm] PSR support 0, DC PSR ver -1, sink PSR ver 0 DPCD caps 0x0 su_y_granularity 0&lt;br&gt;
[    4.392453] amdgpu 0000:c4:00.0: amdgpu: [drm] PSR support 0, DC PSR ver -1, sink PSR ver 0 DPCD caps 0x0 su_y_granularity 0&lt;br&gt;
[    4.392587] amdgpu 0000:c4:00.0: amdgpu: [drm] PSR support 0, DC PSR ver -1, sink PSR ver 0 DPCD caps 0x0 su_y_granularity 0&lt;br&gt;
[    4.392641] amdgpu 0000:c4:00.0: amdgpu: [drm] PSR support 0, DC PSR ver -1, sink PSR ver 0 DPCD caps 0x0 su_y_granularity 0&lt;br&gt;
[    4.392703] amdgpu 0000:c4:00.0: amdgpu: [drm] PSR support 0, DC PSR ver -1, sink PSR ver 0 DPCD caps 0x0 su_y_granularity 0&lt;br&gt;
[    4.392774] amdgpu 0000:c4:00.0: amdgpu: [drm] PSR support 0, DC PSR ver -1, sink PSR ver 0 DPCD caps 0x0 su_y_granularity 0&lt;br&gt;
[    4.392842] amdgpu 0000:c4:00.0: amdgpu: [drm] PSR support 0, DC PSR ver -1, sink PSR ver 0 DPCD caps 0x0 su_y_granularity 0&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;The Root Cause: AMD Driver's PSR Feature&lt;/strong&gt;&lt;br&gt;
After a technical post-mortem, I discovered the freezes were caused by the Panel Self Refresh (PSR) feature of the AMD Radeon 890M.&lt;/p&gt;

&lt;p&gt;This is a known driver bug, particularly prone to triggering on the Ryzen AI 9 HX PRO 370 (Strix Point) platform + amdgpu driver + Plasma desktop combo. PSR is intended to save power by allowing the panel to refresh itself when the image is static, but in practice, it becomes a "chokehold" that causes the GPU driver to hang.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Surgical Solution: Manually Disabling PSR&lt;/strong&gt;&lt;br&gt;
For programmers and veterans, the logic for solving problems isn't "reinstalling everything"—it's precise excision. Since the power-saving logic is buggy, we manually disable the feature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here is the fix:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1.sudo nano /etc/kernel/cmdline , add the parameter amdgpu.dcdebugmask=0x10 to the end of the line.&lt;/p&gt;

&lt;p&gt;2.sudo reinstall-kernels , to regenerate the kernel entries and initrd. This will automatically update all .conf files under /efi/loader/entries/, applying the new parameter to current and future kernels.&lt;/p&gt;

&lt;p&gt;3.sudo reboot , restart the system.&lt;/p&gt;

&lt;p&gt;Verifying the Kernel Parameters:&lt;/p&gt;

&lt;p&gt;Use the command cat /proc/cmdline to check if amdgpu.dcdebugmask=0x10 is present at the end.&lt;/p&gt;

&lt;p&gt;You can also run cat /sys/module/amdgpu/parameters/dcdebugmask. If the output is 16 (the decimal equivalent of 0x10), PSR is successfully disabled.&lt;/p&gt;

&lt;p&gt;Finally, run dmesg | grep -i psr. You should no longer see any PSR-related logs in the kernel.&lt;/p&gt;

&lt;p&gt;After this bit of tinkering, the laptop is now rock-solid. I haven't encountered a single desktop freeze since.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>kernel</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>20 Years of Linux Input Method Tweaking: From Kernel Drivers to AI Models—The Ultimate Form of Input Experience</title>
      <dc:creator>Andy Stewart</dc:creator>
      <pubDate>Thu, 30 Apr 2026 07:46:34 +0000</pubDate>
      <link>https://dev.to/lcmd007/20-years-of-linux-input-method-tweaking-from-kernel-drivers-to-ai-models-the-ultimate-form-of-541d</link>
      <guid>https://dev.to/lcmd007/20-years-of-linux-input-method-tweaking-from-kernel-drivers-to-ai-models-the-ultimate-form-of-541d</guid>
      <description>&lt;p&gt;Having spent 20 years navigating the open-source world and the Linux community—from building Deepin OS to developing EAF—I’ve always held one conviction: A programmer’s sense of achievement comes half from changing the world, and half from the ultimate refinement of their tools. Many ask me why I still spend so much energy on RIME configurations in the age of AI. It's because an input method is an extension of one's thoughts. Every missed character or mistyped toggle between Chinese and English is a profanity against the "Flow State."&lt;/p&gt;

&lt;p&gt;I’ve tested Rime-Ice, Rime-Frost, and Wanxiang, but ultimately returned to Rime-Ice. Wanxiang’s pinyin mode was simply too frustrating due to frequent accidental triggers. Today, I’m organizing all my Fcitx configuration practices into this post. This isn't just a tutorial; it’s a tribute to the open-source community’s spirit of "standing on the shoulders of giants." Since I’ve benefited from the wheels others built, I must contribute my polished solutions back.&lt;/p&gt;

&lt;p&gt;If you are an Arch Linux user, congratulations—you don't need to mess with the command lines below. You can simply use my tool, rime-ice-installer, which automatically installs and applies all the configurations mentioned here.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yay -S rime-ice-installer&lt;br&gt;
rime-ice-installer&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features of rime-ice-installer:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1.Installs Fcitx and Rime-Ice (Wusong).&lt;br&gt;
2.Automatically configures X11/Wayland environments.&lt;br&gt;
3.Automatically configures the Wanxiang AI Large Model.&lt;br&gt;
4.Configures convenient habits, such as using commas and periods for paging by default.&lt;br&gt;
5.Includes a dark-theme-friendly skin.&lt;br&gt;
6.Most importantly: It maps the Shift key to switch the system's English layout rather than entering Fcitx's internal "English Mode." Once Fcitx's English mode is triggered accidentally, it's notoriously difficult to switch back via the keyboard, often requiring a mouse click on the system tray.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installing Fcitx5&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Install the Fcitx5 packages:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo pacman -S fcitx5 fcitx5-gtk fcitx5-qt fcitx5-configtool fcitx5-rime librime&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fcitx5: Core input method framework.&lt;/li&gt;
&lt;li&gt;fcitx5-gtk: Support for GTK applications. Essential for fixing missing characters during fast typing.&lt;/li&gt;
&lt;li&gt;fcitx5-qt: Support for QT5 applications. Essential for fixing missing characters during fast typing.&lt;/li&gt;
&lt;li&gt;fcitx5-configtool: GUI configuration tool.&lt;/li&gt;
&lt;li&gt;fcitx5-rime: RIME input method engine.&lt;/li&gt;
&lt;li&gt;fcitx5-im: Input method setup tool.&lt;/li&gt;
&lt;li&gt;librime: RIME libraries, required by emacs-rime below.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Wayland Environment Setup&lt;/strong&gt;&lt;br&gt;
After installing the packages, in a KDE environment, simply go to KDE Settings -&amp;gt; Virtual Keyboard, select Fcitx5, and log out/in.&lt;/p&gt;

&lt;p&gt;For specific apps like WeChat that fail to support Chinese input, you need to create the configuration file ~/.config/plasma-workspace/env/ime.sh and add:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;export GTK_IM_MODULE=fcitx&lt;br&gt;
export QT_IM_MODULE=fcitx&lt;br&gt;
export XMODIFIERS="@im=fcitx"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;After logging out and back in, you should be able to type Chinese in WeChat under Wayland.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Notes:&lt;/strong&gt;&lt;br&gt;
You must install fcitx5-gtk and fcitx5-qt and set the IM variables above, otherwise, typing too fast will result in "character leaking," where the pinyin is inserted directly into the input box instead of converting to Hanzi.&lt;/p&gt;

&lt;p&gt;Add-ons: Remove the shortcuts for the clipboard and quick input modules to avoid conflicts with Emacs keybindings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;X11 Environment Setup&lt;/strong&gt;&lt;br&gt;
For X11, write the following to ~/.xprofile:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;export GTK_IM_MODULE=fcitx&lt;br&gt;
export QT_IM_MODULE=fcitx&lt;br&gt;
export XMODIFIERS="@im=fcitx"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Log in again to apply.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Notes:&lt;/strong&gt;&lt;br&gt;
Same as Wayland, ensure fcitx5-gtk and fcitx5-qt are installed to prevent character leaking.&lt;/p&gt;

&lt;p&gt;Disable clipboard/quick input shortcuts to avoid Emacs conflicts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installing Fcitx5 Skins&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;yay -S fcitx5-skin-adwaita-dark&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then modify the config file ~/.config/fcitx5/conf/classicui.conf:&lt;br&gt;
`&lt;strong&gt;Horizontal candidate list&lt;/strong&gt;&lt;br&gt;
Vertical Candidate List=False&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prevent font scaling with DPI to avoid oversized interface&lt;/strong&gt;&lt;br&gt;
PerScreenDPI=False&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Font and size (check options with fc-list)&lt;/strong&gt;&lt;br&gt;
Font="Noto Sans Mono 13"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gnome3-style theme&lt;/strong&gt;&lt;br&gt;
Theme=adwaita-dark`&lt;/p&gt;

&lt;p&gt;Note: I personally prefer "TsangerJinKai03," so you can replace the Font with TsangerJinKai03-6763 15.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installing Rime-Ice (Wusong Pinyin)&lt;/strong&gt;&lt;br&gt;
The steps above set up the core and skin, but the default Fcitx dictionary is quite poor. For a fluid experience, you need Rime-Ice.&lt;br&gt;
Copy all rime-ice configurations to the fcitx rime directory:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git clone https://github.com/iDvel/rime-ice --depth=1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Modifying Default Configurations&lt;/strong&gt;&lt;br&gt;
Switch to the rime-ice directory and perform these three operations:&lt;br&gt;
1.grep all- { when: paging, accept: comma, send: Page_Up } 和 - { when: has_menu, accept: period, send: Page_Down } ，Remove the annotations&lt;br&gt;
2.grep page_size, change 5 to 9.&lt;/p&gt;

&lt;p&gt;`sed -i 's/# (- { when: (paging|has_menu), accept: (comma|period), send: Page_(Up|Down) })/\1/' default.yaml&lt;/p&gt;

&lt;p&gt;sed -i 's/page_size: 5/page_size: 9/' default.yaml`&lt;/p&gt;

&lt;p&gt;he first two enable paging with commas and periods; the third increases the number of candidate words.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adding Large Language Models&lt;/strong&gt;&lt;br&gt;
While Rime-Ice is already quite smart, we can enhance context-based suggestions by installing a Wanxiang language model.&lt;/p&gt;

&lt;p&gt;The specific operation method is as follows: &lt;br&gt;
Download rime-lmdg. I downloaded the amz-v2n3m1-zh-hans.gram file. &lt;/p&gt;

&lt;p&gt;Move the file amz-v2n3m1-zh-hans.gram to the rime-ice directory. &lt;/p&gt;

&lt;p&gt;Create a new rime-ice.custom.yaml file in the rime-ice directory with the following contents:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;patch:&lt;br&gt;
  grammar:&lt;br&gt;
    language: amz-v2n3m1-zh-hans&lt;br&gt;
    collocation_max_length: 5&lt;br&gt;
    collocation_min_length: 2&lt;br&gt;
  translator/contextual_suggestions: true&lt;br&gt;
  translator/max_homophones: 7&lt;br&gt;
  translator/max_homographs: 7&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Updating the Fcitx Directory&lt;/strong&gt;&lt;br&gt;
After adjusting the configs, perform the copy. Backup and clear ~/.config/fcitx/rime/ and ~/.local/share/fcitx5/rime first to avoid conflicts.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cp -r ./rime-ice/* ~/.config/fcitx/rime/&lt;br&gt;
cp -r ./rime-ice/* ~/.local/share/fcitx5/rime&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;~/.config/fcitx/rime/: Primarily read by the emacs-rime plugin.&lt;/p&gt;

&lt;p&gt;~/.local/share/fcitx5/rime: Read by Fcitx for external software.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deleting Accidental Input&lt;/strong&gt;&lt;br&gt;
If you accidentally confirm a pinyin string, it might become the first candidate. These are recorded here:&lt;/p&gt;

&lt;p&gt;~/.local/share/fcitx5/rime/en_dicts/en.dict.yaml ~/.config/fcitx/rime/en_dicts/en.dict.yaml&lt;br&gt;
Find the errant string, delete it, save, and restart Fcitx.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installing emacs-rime&lt;/strong&gt;&lt;br&gt;
This section is about bringing Rime-Ice into Emacs.&lt;br&gt;
First, install posframe, and then download emacs-rime:&lt;/p&gt;

&lt;p&gt;git clone &lt;a href="https://github.com/DogLooksGood/emacs-rime" rel="noopener noreferrer"&gt;https://github.com/DogLooksGood/emacs-rime&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Add the directory to your load-path and add the following config:&lt;/p&gt;

&lt;p&gt;`(require 'rime)&lt;/p&gt;

&lt;p&gt;;;; Code:&lt;br&gt;
(setq rime-user-data-dir "~/.config/fcitx/rime")&lt;/p&gt;

&lt;p&gt;(setq rime-posframe-properties&lt;br&gt;
      (list :background-color "#333333"&lt;br&gt;
            :foreground-color "#dcdccc"&lt;br&gt;
            :font "WenQuanYi Micro Hei Mono-14"&lt;br&gt;
            :internal-border-width 10))&lt;/p&gt;

&lt;p&gt;(setq default-input-method "rime"&lt;br&gt;
      rime-show-candidate 'posframe)`&lt;/p&gt;

&lt;p&gt;The configurations above respectively set the path for emacs-rime to read RIME configurations, the UI details, and the use of posframe to display candidate words.&lt;/p&gt;

&lt;p&gt;After restarting Emacs, invoke the toggle-input-method command to try typing in Chinese.&lt;/p&gt;

&lt;p&gt;The Rime-Ice home page provides several input examples. If typing the same pinyin yields the identical Chinese candidate words, it confirms that you have successfully implemented Rime-Ice.&lt;/p&gt;

&lt;p&gt;In my personal experience, the fine-tuning of Rime-Ice is exceptional—far more professional than any RIME dictionary I’ve tried to cobble together myself. Chinese input, especially for long sentences, no longer requires flipping through endless pages of candidates.&lt;/p&gt;

&lt;p&gt;The combination of emacs-rime and Rime-Ice makes Chinese input in Emacs an absolute joy. I’ve personally sent a small donation to the author of Rime-Ice to show my appreciation for their hard work and contribution to the open-source community！&lt;/p&gt;

</description>
      <category>fcitx5</category>
      <category>linux</category>
      <category>archlinux</category>
      <category>emacs</category>
    </item>
    <item>
      <title>Farewell to F5: Building a Seamless Writing Workflow with Jekyll LiveReload</title>
      <dc:creator>Andy Stewart</dc:creator>
      <pubDate>Wed, 29 Apr 2026 09:07:10 +0000</pubDate>
      <link>https://dev.to/lcmd007/farewell-to-f5-building-a-seamless-writing-workflow-with-jekyll-livereload-1nff</link>
      <guid>https://dev.to/lcmd007/farewell-to-f5-building-a-seamless-writing-workflow-with-jekyll-livereload-1nff</guid>
      <description>&lt;p&gt;As a 20-year Linux veteran, I have zero tolerance for mechanical tasks that break my "flow."&lt;/p&gt;

&lt;p&gt;When using Jekyll for blogging, many developers fall into a repetitive trap: edit a paragraph -&amp;gt; switch to the browser -&amp;gt; hit manual refresh (F5). It’s a tiny friction, but like a memory leak in your code, it slowly drains your creative energy throughout the day.&lt;/p&gt;

&lt;p&gt;The solution has been hiding in the Jekyll documentation all along.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The Core Command: Instant Synchronization&lt;/strong&gt;&lt;br&gt;
Stop using the plain &lt;code&gt;jekyll serve&lt;/code&gt;. Instead, fire up your local environment with this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Bash&lt;br&gt;
jekyll serve --livereload&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;By adding this parameter, Jekyll spins up an internal listener. The moment your Markdown file is modified and saved, the browser updates the view automatically, as if it’s reading your mind.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. My Hardcore Workflow: Emacs + Hammerspoon + Magit&lt;/strong&gt;&lt;br&gt;
Configuring LiveReload is just the foundation. Real efficiency comes from automating the entire pipeline. Here is my "zero-friction" loop—designed so that the moment my fingers leave the keys, everything is already in motion:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drafting in Emacs&lt;/strong&gt;: Writing fluidly in &lt;code&gt;markdown-mode&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auto-Save&lt;/strong&gt;: My &lt;code&gt;auto-save&lt;/code&gt; plugin commits the changes to the disk the split-second I stop typing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Invisible Refresh&lt;/strong&gt;: Jekyll detects the change immediately. I use Hammerspoon to snap to the browser, where the content is already rendered and waiting for me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Magit Deployment&lt;/strong&gt;: Once I'm satisfied with the preview, a few quick Magit keystrokes push the update straight to GitHub Pages.&lt;/p&gt;

&lt;p&gt;A developer’s dignity is reflected in the craftsmanship of their toolchain. Achieving this kind of "seamless transition" allows you to pour 100% of your focus into the content itself, rather than acting as a manual bridge between your editor and the browser.&lt;/p&gt;

&lt;p&gt;What "manual refresh" or repetitive task in your daily workflow drives you crazy? How did you use scripts or automation to kill it off for good?&lt;/p&gt;

&lt;p&gt;Share your efficiency secrets or your Jekyll optimization tips in the comments below.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>jekyll</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>$400 or $4? Using 'Surgical Logic' for a Hardcore MacBook Keyboard Repair</title>
      <dc:creator>Andy Stewart</dc:creator>
      <pubDate>Wed, 29 Apr 2026 06:47:43 +0000</pubDate>
      <link>https://dev.to/lcmd007/400-or-4-using-surgical-logic-for-a-hardcore-macbook-keyboard-repair-h4c</link>
      <guid>https://dev.to/lcmd007/400-or-4-using-surgical-logic-for-a-hardcore-macbook-keyboard-repair-h4c</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftekrf3q4gm2w6ob7m2so.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftekrf3q4gm2w6ob7m2so.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As a long-time Linux enthusiast and a heavy hitter on the keys, I’ve always been fascinated by the underlying architecture of our tools. Recently, my MacBook Pro met its match—I managed to physically break one of the keycaps.&lt;/p&gt;

&lt;p&gt;A quick trip to the Apple Store ended with a quote that made my jaw drop: $400 to replace the entire top case assembly. For a hacker used to "building and breaking," this didn't sit right. I decided to embrace the DIY spirit and handle it myself.&lt;/p&gt;

&lt;p&gt;I spent about 30RMB ($4) buying a full set of replacement keycaps from Taobao.com. I thought this was going to be a "level 1" repair, but a single mistake quickly turned it into a "boss fight."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnldusfgtn4m7bbxhxspj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnldusfgtn4m7bbxhxspj.png" alt=" " width="770" height="672"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Incident: A Lesson in Chemistry and Adhesives&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;At first&lt;/strong&gt;, I thought only the keycap was broken. After a failed attempt to force it back on, I realized the butterfly hinge underneath was damaged. In a moment of misplaced confidence, I grabbed a bottle of Super Glue (502).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The second&lt;/strong&gt; that drop hit the board, I knew I had messed up. Super glue is fast-acting, low-viscosity, and highly corrosive to certain plastics. It didn't just bond the hinge; it seeped into the base and melted the precision elastic membrane responsible for the key's tactile feedback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The result&lt;/strong&gt;: The 'J' key was dead. No travel, no click, just a solid block of plastic. This is what happens when you ignore the physical properties of your materials.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhm0yoqri4zmkyx88zvlg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhm0yoqri4zmkyx88zvlg.png" alt=" " width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structural Analysis: The Precision of the Butterfly Design&lt;/strong&gt;&lt;br&gt;
Since I had already "bricked" the base, I decided to perform a full "autopsy" to understand the mechanics. Despite the frustration, the engineering is remarkably sophisticated:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Logic Board (PCB)&lt;/strong&gt;: The bottom layer, handling circuitry and LED backlighting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Butterfly Hinge&lt;/strong&gt;: Two interlocking wings that sit between the PCB and the base.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Base&lt;/strong&gt;: The critical component. It snaps into four tiny notches on the PCB, holds the hinge in place, and houses the metal dome for tactile feedback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keycap&lt;/strong&gt;: The outer shell that clips onto the top of the hinge.&lt;/p&gt;

&lt;p&gt;The tolerances here are incredibly tight. Even a microscopic amount of excess glue can paralyze the entire movement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tooling Up: Finding the Perfect "Surgical Glue"&lt;/strong&gt;&lt;br&gt;
To fix the melted base, I needed an adhesive that met three hardcore requirements:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Needle-fine Applicator&lt;/strong&gt;: Total control at the millimeter level to avoid the contact points.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Material Safety&lt;/strong&gt;: Non-corrosive to delicate plastics.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Slow-Curing&lt;/strong&gt;: Allowing time for precise alignment and error correction.&lt;/p&gt;

&lt;p&gt;I eventually found B7000, a specialized adhesive used in smartphone repairs. Its needle-nose tip allowed for the precision I desperately needed.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0okesubo7h6r6vz33yvj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0okesubo7h6r6vz33yvj.png" alt=" " width="800" height="614"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Ultimate $4 Fix (Step-by-Step)&lt;/strong&gt;&lt;br&gt;
Materials Required:&lt;br&gt;
Replacement Base + Hinge ($2)&lt;br&gt;
New Keycap ($1)&lt;br&gt;
B7000 Adhesive ($1)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxmi467wylbf7ceehwarg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxmi467wylbf7ceehwarg.png" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Repair Process:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.Debridement&lt;/strong&gt;: I used tweezers to painstakingly peel off the damaged, glue-crusted base from the PCB.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.Precision Grouting&lt;/strong&gt;: I applied three tiny dots of B7000 (about 2mm wide) on the PCB, strictly avoiding the center sensor and the top LED.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.Assembly&lt;/strong&gt;: I snapped the hinge into the new base first, then aligned the base with the four PCB notches and pressed down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4.Verification&lt;/strong&gt;: I tapped the center of the base to ensure the character appeared on the screen with a clean rebound.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5.The "Cure" (Crucial!)&lt;/strong&gt;: Do not snap the keycap on yet. Wait several hours for the glue to fully cure. If you try to snap the keycap on too early, the vertical pull will rip the base right off the board.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6.Final Marriage&lt;/strong&gt;: Once cured, I snapped the keycap on with a satisfying click.&lt;/p&gt;

&lt;p&gt;This experiment taught me that modern hardware is a marvel of integration, where even a tiny key carries immense complexity. While the journey was chaotic, it proved a point: There is no machine that cannot be fixed, provided you understand its logic.&lt;/p&gt;

&lt;p&gt;Faced with a $400 repair bill, I chose a $4 fix and a heavy dose of curiosity.&lt;/p&gt;

&lt;p&gt;Have you ever had a "minor" repair turn into a major disaster, only to pull off a hardcore recovery in the end? What’s the most "dangerous" thing you’ve ever done to your daily driver?&lt;/p&gt;

</description>
      <category>diy</category>
      <category>tutorial</category>
      <category>productivity</category>
      <category>linux</category>
    </item>
    <item>
      <title>Stop Backspacing Like a Typist: My "Surgical" Syntax Deletion Tool for Emacs</title>
      <dc:creator>Andy Stewart</dc:creator>
      <pubDate>Wed, 29 Apr 2026 03:40:44 +0000</pubDate>
      <link>https://dev.to/lcmd007/stop-backspacing-like-a-typist-my-surgical-syntax-deletion-tool-for-emacs-57o4</link>
      <guid>https://dev.to/lcmd007/stop-backspacing-like-a-typist-my-surgical-syntax-deletion-tool-for-emacs-57o4</guid>
      <description>&lt;p&gt;I’ve always believed that a hardcore developer shouldn't waste a single second on low-level chores like "deleting code."&lt;/p&gt;

&lt;p&gt;In Emacs, most people delete code by either mashing the Backspace key like they're tapping out Morse code, or using &lt;code&gt;kill-word&lt;/code&gt; only to find they’ve overshot and deleted half the expression. While &lt;code&gt;subword-mode&lt;/code&gt; fixed navigation for CamelCase, &lt;strong&gt;deletion&lt;/strong&gt; still lacks that critical sense of &lt;strong&gt;determinism&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I wanted a tool that combines the raw power of &lt;code&gt;skip-syntax&lt;/code&gt; with the granular intelligence of &lt;code&gt;subword-mode&lt;/code&gt;. So, I built a plugin for what I call &lt;strong&gt;Syntax Block Deletion&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why "Surgical" Precision Matters&lt;/strong&gt;&lt;br&gt;
Standard deletion relies on whitespace or generic word boundaries. This tool operates on the &lt;strong&gt;logic&lt;/strong&gt; of your code. By tapping directly into Emacs' internal syntax tables, it achieves a "what you see is what you prune" experience:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Subword Awareness&lt;/strong&gt;: When it hits &lt;code&gt;FooBarExample&lt;/code&gt;, it recognizes &lt;code&gt;Foo&lt;/code&gt;, &lt;code&gt;Bar&lt;/code&gt;, and &lt;code&gt;Example&lt;/code&gt; as distinct entities. You can snip away** Bar** without touching the rest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Syntax Boundary Intelligence&lt;/strong&gt;: It automatically senses operators, delimiters, and symbol boundaries. It knows exactly where a logical unit ends, so it won't go charging through your parentheses like a blunt instrument.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero-Latency Feedback&lt;/strong&gt;: Built on low-level syntax skipping, the response is instantaneous. No bloat, just speed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Arm Your Editor&lt;/strong&gt;&lt;br&gt;
The implementation is lean and mean. I recommend binding these to your most accessible keys to completely replace your default deletion commands:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;delete-block-forward&lt;/code&gt;: Instantly prune the next syntax block.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;delete-block-backward&lt;/code&gt;: Precisely detonate the previous logical unit.&lt;/p&gt;

&lt;p&gt;When you're building complex systems like &lt;strong&gt;EAF&lt;/strong&gt;, these micro-efficiencies compound into massive productivity gains. Every keystroke should be &lt;strong&gt;deliberate&lt;/strong&gt;. If you’re still tolerating the uncertainty of "I wonder how much this keypress will delete," your toolchain is overdue for a refactor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let's start a discussion:&lt;/strong&gt;&lt;br&gt;
In a world of highly customizable editors, what other "high-frequency" actions do you think are still fundamentally broken or inefficient? What "secret weapons" have you hidden in your own config to maintain your flow?&lt;/p&gt;

&lt;p&gt;See you in the comments, and I'm looking forward to your PRs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Repository&lt;/strong&gt;: [((&lt;a href="https://github.com/manateelazycat/delete-block))" rel="noopener noreferrer"&gt;https://github.com/manateelazycat/delete-block))&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;Happy Hacking!&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>showdev</category>
      <category>sideprojects</category>
      <category>tooling</category>
    </item>
    <item>
      <title>20-Year Linux Veteran: How I Slashed My Emacs Startup Time by 90%</title>
      <dc:creator>Andy Stewart</dc:creator>
      <pubDate>Wed, 29 Apr 2026 03:30:17 +0000</pubDate>
      <link>https://dev.to/lcmd007/20-year-linux-veteran-how-i-slashed-my-emacs-startup-time-by-90-417l</link>
      <guid>https://dev.to/lcmd007/20-year-linux-veteran-how-i-slashed-my-emacs-startup-time-by-90-417l</guid>
      <description>&lt;p&gt;As a long-time contributor to the Emacs community and the creator of EAF (Emacs Application Framework), I’ve always maintained one rule: If your development tool takes more than 2 seconds to start, it’s murdering your creativity.&lt;/p&gt;

&lt;p&gt;Many developers complain that Emacs is "bloated," but the truth is usually just poorly architected configuration. Today, I’m skipping the fluff and sharing my hard-earned methodology for optimizing startup performance. By following these three steps, you can compress your startup time to 1/10th of what it is now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Stop Guessing: Benchmark Your Config&lt;/strong&gt;&lt;br&gt;
The first rule of optimization: &lt;strong&gt;If you can't measure it, you can't improve it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don't blindy disable packages. Insert the following code at the very top of your configuration to use &lt;code&gt;benchmark-init&lt;/code&gt;. This recursively analyzes the overhead of every single line in your setup.&lt;/p&gt;

&lt;p&gt;`Code snippet&lt;br&gt;
(let (&lt;br&gt;
      ;; Temporarily set GC threshold to infinity to prevent garbage collection during startup&lt;br&gt;
      (gc-cons-threshold most-positive-fixnum)&lt;br&gt;
      ;; Clear file-name-handler-alist to skip regex matching on every loaded file&lt;br&gt;
      (file-name-handler-alist nil))&lt;br&gt;
  (require 'benchmark-init-modes)&lt;br&gt;
  (require 'benchmark-init)&lt;br&gt;
  (benchmark-init/activate)&lt;/p&gt;

&lt;p&gt;;; Your core configuration goes here&lt;br&gt;
  )&lt;code&gt;&lt;br&gt;
After startup, run &lt;/code&gt;M-x benchmark-init/show-durations-tree`. This gives you a precise, millisecond-level "hit list" showing exactly which packages are slowing you down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Dynamic Decoupling: Don't Load What You Don't Use&lt;/strong&gt;&lt;br&gt;
This is a fundamental architectural shift. Many libraries are only needed for specific scenarios—why let them clog your startup path?&lt;/p&gt;

&lt;p&gt;Take the &lt;code&gt;noflet&lt;/code&gt; library, often used to suppress the "Active processes exist" query when quitting:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Inefficient Way:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Code snippet&lt;br&gt;
(require 'noflet) ;; Loaded at startup, even if you don't quit for days&lt;br&gt;
(defadvice save-buffers-kill-emacs (around no-query-kill-emacs activate)&lt;br&gt;
  (noflet ((process-list ())) ad-do-it))&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Hardcore Way (On-Demand Loading):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Code snippet&lt;br&gt;
(defadvice save-buffers-kill-emacs (around no-query-kill-emacs activate)&lt;br&gt;
  "Only load the library at the moment the exit command is triggered"&lt;br&gt;
  (require 'noflet) &lt;br&gt;
  (noflet ((process-list ())) ad-do-it))&lt;/code&gt;&lt;br&gt;
By moving &lt;code&gt;require&lt;/code&gt; inside the function or using &lt;code&gt;eval-after-load&lt;/code&gt;blocks, you can strip away 50% of unnecessary dependencies from your initial boot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The Ultimate Weapon: Lazy-Loading via Key Triggers&lt;/strong&gt;&lt;br&gt;
This is my core secret. The logic is simple: Defer the loading of 90% of your plugins until the moment you actually press the key to use them.&lt;/p&gt;

&lt;p&gt;The traditional approach is "Load, then Bind." My lazy-load technique flips this: "Bind, then Inject."&lt;/p&gt;

&lt;p&gt;At Startup: Only define the keybindings (e.g., &lt;code&gt;Ctrl + c p&lt;/code&gt; for project management).&lt;/p&gt;

&lt;p&gt;At Runtime: The moment you hit that key, Emacs injects the source code and executes the command instantly.&lt;/p&gt;

&lt;p&gt;This reduces your startup process to a list of pure key mappings—the leanest possible configuration.&lt;/p&gt;

&lt;p&gt;Top-tier developers demand two things from their tools: determinism and extreme responsiveness.&lt;/p&gt;

&lt;p&gt;Optimization isn't about removing features; it's about precise resource allocation. Save your startup time for the work that matters, and keep your "flow" uninterrupted. If you're chasing terminal efficiency, try refactoring your config with these three steps today.&lt;/p&gt;

&lt;p&gt;Happy Hacking!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>performance</category>
      <category>linux</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Lightweight Analytics for Jekyll: Why I Chose Hit Kounter Over Google Analytics</title>
      <dc:creator>Andy Stewart</dc:creator>
      <pubDate>Tue, 28 Apr 2026 09:31:22 +0000</pubDate>
      <link>https://dev.to/lcmd007/lightweight-analytics-for-jekyll-why-i-chose-hit-kounter-over-google-analytics-ke5</link>
      <guid>https://dev.to/lcmd007/lightweight-analytics-for-jekyll-why-i-chose-hit-kounter-over-google-analytics-ke5</guid>
      <description>&lt;p&gt;&lt;strong&gt;Privacy and Speed First&lt;/strong&gt;&lt;br&gt;
As I continue to polish my Jekyll blog on GitHub Pages, I realized I needed one more thing: View Counts. I wanted to know which topics resonate most with my readers, but I had two strict requirements:&lt;/p&gt;

&lt;p&gt;No Google Analytics: I don't want my site to be blocked or slowed down by heavy tracking scripts (especially considering accessibility in different regions).&lt;/p&gt;

&lt;p&gt;Minimalist Integration: It should be as "plug-and-play" as Jekyll itself.&lt;/p&gt;

&lt;p&gt;After searching, I found Hit Kounter. It’s simple, fits perfectly with static sites, and just works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to Set It Up in 2 Minutes&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;1. The Header Injection&lt;/strong&gt;&lt;br&gt;
First, you need to include the Hit Kounter script in your HTML &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;. Usually, this goes into your&lt;code&gt;_includes/head.html&lt;/code&gt;file:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;HTML&lt;br&gt;
&amp;lt;script src="https://cdn.jsdelivr.net/npm/hit-kounter@0.1.0/dist/hit-kounter.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Displaying Views on Post Pages&lt;/strong&gt;&lt;br&gt;
To show the view count for a specific article, just add this tag to your post template (e.g., _layouts/post.html):&lt;/p&gt;

&lt;p&gt;&lt;code&gt;HTML&lt;br&gt;
&amp;lt;span data-hk-page="current"&amp;gt; - &amp;lt;/span&amp;gt; Views&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The current attribute automatically detects the current URL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Displaying View Counts on the Homepage&lt;/strong&gt;&lt;br&gt;
If you want to show the traffic for each post on your homepage index, use this snippet in your index.html loop:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;HTML&lt;br&gt;
&amp;lt;span data-hk-page="{{ post.url | prepend: site.url | prepend: 'https:' }}"&amp;gt; - &amp;lt;/span&amp;gt; Views&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Pro Tip: Hit Kounter requires the absolute URL to track accurately. That’s why we use prepend: site.url and ensure https: is explicitly added. Without the full protocol, the counter won't trigger.&lt;/p&gt;

&lt;p&gt;That’s All!&lt;br&gt;
Just git push and your analytics are live. No complex dashboards, no privacy concerns, just a clean, simple number that tells you what your audience loves.&lt;/p&gt;

&lt;p&gt;It’s another small step toward building the perfect minimalist writing environment.&lt;/p&gt;

&lt;p&gt;What are you using to track your static site? Are you a fan of self-hosted analytics or do you prefer these "Zero-Config" tools? Let me know in the comments!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;About the Author:&lt;/strong&gt;&lt;br&gt;
I am Yong Wang, a 20-year Linux veteran and former CTO of Deepin. I’m currently building Little Chinchilla, an AI Agent host designed for private-domain computing. Catch me on &lt;a href="https://github.com/manateelazycat" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; where I spend most of my time hacking Emacs.&lt;/p&gt;

</description>
      <category>jekyll</category>
      <category>analytics</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why Jekyll + GitHub Pages is the Ultimate Sanctuary for Minimalist Developers</title>
      <dc:creator>Andy Stewart</dc:creator>
      <pubDate>Tue, 28 Apr 2026 09:22:32 +0000</pubDate>
      <link>https://dev.to/lcmd007/why-jekyll-github-pages-is-the-ultimate-sanctuary-for-minimalist-developers-3mml</link>
      <guid>https://dev.to/lcmd007/why-jekyll-github-pages-is-the-ultimate-sanctuary-for-minimalist-developers-3mml</guid>
      <description>&lt;p&gt;&lt;strong&gt;The Return of the Creative Spark&lt;/strong&gt;&lt;br&gt;
After migrating my blog to GitHub Pages, I felt a long-lost surge of creative desire. The reason is simple: Jekyll, the engine behind GitHub Pages, perfectly aligns with my philosophy of software and life.&lt;/p&gt;

&lt;p&gt;As a developer who has spent two decades in the Linux trenches and countless hours in Emacs, I don’t want to be bogged down by database migrations, VPS maintenance, or clunky web editors. I want to write.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here is why Jekyll won me over:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Zero Infrastructure: No databases, no servers. Everything lives on GitHub. It’s free, stable, and "set and forget."&lt;/p&gt;

&lt;p&gt;Markdown + CSS Synergy: I get the zen-like simplicity of Markdown combined with the total control of CSS. I can fine-tune every detail—from zebra-striped tables to the exact border-radius of a code block.&lt;/p&gt;

&lt;p&gt;Content-First Workflow: Once the theme is defined, my workflow is just: write -&amp;gt; git push. That’s it.&lt;/p&gt;

&lt;p&gt;Local Real-time Preview: One command—jekyll serve—and I can see exactly how my thoughts look in the browser.&lt;/p&gt;

&lt;p&gt;Emacs Integration: This is the deal-breaker. I don't need a browser-based editor. I write everything in Emacs. It’s fluid, fast, and familiar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My Custom CSS Hacks for a Modern Static Blog&lt;/strong&gt;&lt;br&gt;
To make a static blog feel modern and professional, you don't need heavy frameworks. You just need a few clever CSS rules. Here are the snippets I use to polish my reading experience:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Responsive Image Scaling&lt;/strong&gt;&lt;br&gt;
Screenshots and photos come in all sizes. To prevent them from breaking the layout, I force them to scale gracefully with the page width:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CSS&lt;br&gt;
li &amp;gt; img, p &amp;gt; img {&lt;br&gt;
    margin: 0 auto;&lt;br&gt;
    display: block;&lt;br&gt;
    max-width: 90%;&lt;br&gt;
    margin-top: 5px;&lt;br&gt;
    margin-bottom: 5px;&lt;br&gt;
    margin-left: 2em;&lt;br&gt;
    margin-right: 2em;&lt;br&gt;
    border-radius: 5px;&lt;br&gt;
}&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;2. Elegant Centered Tables&lt;/strong&gt;&lt;br&gt;
Standard Markdown tables are often left-aligned and look awkward. Centering them makes the page feel balanced:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CSS&lt;br&gt;
table {&lt;br&gt;
    border-collapse: collapse;&lt;br&gt;
    border-spacing: 0;&lt;br&gt;
    border: 1px solid #AAA;&lt;br&gt;
    margin-left: auto;&lt;br&gt;
    margin-right: auto;&lt;br&gt;
}&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;3. Zebra-Striped Rows&lt;/strong&gt;&lt;br&gt;
Reading large tables is a nightmare without visual cues. A subtle zebra stripe makes data much more digestible:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CSS&lt;br&gt;
tbody tr:nth-child(even) {&lt;br&gt;
    background-color: #F5F5F5;&lt;br&gt;
}&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;4. "Soft" Code Blocks&lt;/strong&gt;&lt;br&gt;
Code is the soul of a developer's blog. Default sharp corners create visual tension. Adding a small border-radius makes the code area feel more natural and easier on the eyes:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CSS&lt;br&gt;
div.highlight, pre.highlight {&lt;br&gt;
    border-radius: 5px;&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;For me, Jekyll is more than just a static site generator. It’s about creating a focused writing environment.&lt;/p&gt;

&lt;p&gt;It allows me to achieve visual perfection with minimal overhead while maintaining maximum editing efficiency. It’s fluent, comfortable, and keeps me in the zone.&lt;/p&gt;

&lt;p&gt;How about you? Are you still fighting with WordPress or Medium, or have you embraced the "Git-based" blogging lifestyle? If you are an Emacs user like me, I'd love to hear about your blogging setup in the comments!&lt;/p&gt;

&lt;p&gt;About the Author:&lt;br&gt;
I am Yong Wang, a 20-year Linux veteran, Emacs lover, and former CTO of Deepin. I’m currently exploring the intersection of AI Agents and private computing with my new project.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>showdev</category>
      <category>emacs</category>
      <category>linux</category>
    </item>
    <item>
      <title>I Built China’s Top Linux OS, Handed it to Linus Torvalds, and Then I Had to Walk Away</title>
      <dc:creator>Andy Stewart</dc:creator>
      <pubDate>Tue, 28 Apr 2026 08:15:20 +0000</pubDate>
      <link>https://dev.to/lcmd007/i-built-chinas-top-linux-os-handed-it-to-linus-torvalds-and-then-i-had-to-walk-away-2062</link>
      <guid>https://dev.to/lcmd007/i-built-chinas-top-linux-os-handed-it-to-linus-torvalds-and-then-i-had-to-walk-away-2062</guid>
      <description>&lt;p&gt;In the open-source world, many know Deepin Linux. It is the distribution that dared to build an oasis in the Linux desert—obsessed with aesthetics, seamless user experience, and a unique desktop environment built from the ground up.&lt;/p&gt;

&lt;p&gt;I am Yong Wang, the co-founder and former CTO of Deepin, and a 20-year Linux veteran. In 2019, I decided to leave the battlefield I spent eight years building and return to being a pure developer. Before I start my next journey, I want to share the "hardcore" story of growing from a single developer to a 1,000-person team—and why, at the peak of it all, I was forced to walk away.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. 2011: Adrenaline, GTK+, and "Square Wheels"&lt;/strong&gt;&lt;br&gt;
In 2011, Deepin was just a "garage startup." Our office was a tiny 70-square-meter room with second-hand chairs, bright red carpets, and the sounds of developers howling like wolves at 3:00 AM as they cracked a difficult bug.&lt;/p&gt;

&lt;p&gt;Back then, the Linux desktop felt like a wasteland. The "wheels" were all square: cryptic configurations and monotonous grey native controls. I couldn’t stand seeing users struggle with poorly designed software. We wanted to build wheels that were round and smooth.&lt;/p&gt;

&lt;p&gt;One crazy memory: In late 2011, just 20 days before the release of version 11.12, our CEO suddenly suggested we ditch Gnome 2 for the brand-new Gnome 3. Any rational team would have said no. But we only had courage. I led the team to crank out 10,000 lines of code in 20 days—an average of 500 LoC per day. When we saw the Deepin logo flash onto the screen for the first time, the sense of achievement was, for us, equivalent to the moon landing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Brothers in the Trenches: Passion Over Code&lt;/strong&gt;&lt;br&gt;
In the early days, we had no biological clock. We’d nap with our heads hanging over our chairs and wake up to keep coding. Once, the entire R&amp;amp;D team didn't go home for three weeks straight.&lt;/p&gt;

&lt;p&gt;I remember a bet I made with "Monkey," the author of Deepin Music. He scoffed and said I couldn't build a complex list control in time. For that, we stayed in the office for over 30 hours. He was chain-smoking, and I was smashing the keyboard. At 6:00 AM the next day, the code merged perfectly. We went to a barbershop with greasy hair just to get a quick wash, then came right back to work.&lt;/p&gt;

&lt;p&gt;Collaboration in the open-source community is that pure: a shared dream + a reliable team equals more motivation than any corporate system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The Peak: From 100M Funding to Linus Torvalds’ Hands&lt;/strong&gt;&lt;br&gt;
By 2015, we had secured roughly $12 million in funding. But for the technical team, the real "medal of honor" didn't come from investors—it came from the creator of Linux himself.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;The moment Linus Torvalds experienced Linux Deepin *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnvinytql978ciezblsl1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnvinytql978ciezblsl1.png" alt=" " width="630" height="1046"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of our proudest moments was handing a laptop pre-installed with Deepin to Linus Torvalds. Watching the "Godfather of Linux"—who is famously picky about his desktop environments—personally experience and navigate the UI we built from scratch was surreal. At that moment, Deepin wasn't just a local project anymore; it had reached the global stage.&lt;/p&gt;

&lt;p&gt;But as we moved into a high-end, 2,000-square-meter office and the team swelled toward 1,000 people, the "nursing home" vibe began to set in. I realized that once communication distance increases, a high-performance team can quickly become mediocre. I had to stop my compiler and learn how to manage, but the growing scale began to suffocate the very creativity that brought us to Linus's hands.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Why I Left: A Forced Farewell&lt;/strong&gt;&lt;br&gt;
By 2018, Deepin supported 70 languages with over 50 million downloads worldwide. To the outside world, this was the peak. To me, it was a long, painful "forced downgrade."&lt;/p&gt;

&lt;p&gt;I discovered that as a company evolves into a massive machine, pure technical ideals are diluted by complex interests, power plays, and bureaucracy. I was no longer the CTO who could hack all night; I had become a business machine, exhausted by endless meetings and carrying the weight of organizational "blame."&lt;/p&gt;

&lt;p&gt;I thought we would fight together forever, but the influx of capital and the sheer scale turned simple camaraderie into something complicated. The suffocating feeling of "wanting to do the right thing but having no power to steer the ship" eventually forced me to make that painful decision. I left a cause I thought I would fight for my entire life. This departure was partly a proactive choice to preserve my sanity, but mostly a forced exit pushed by reality. I couldn't take Deepin with me, but I took my conscience as a developer.&lt;/p&gt;

&lt;p&gt;To all the geeks out there:&lt;br&gt;
Entrepreneurship is essentially a journey to understand yourself more deeply. While the world is chasing the "next big trend," look down at the code in your hands.&lt;/p&gt;

&lt;p&gt;If you feel pain on the path to your ideals, remember: that is the sound of the system undergoing a "kernel upgrade" under extreme pressure.&lt;/p&gt;

&lt;p&gt;About the Author:&lt;br&gt;
I am Yong Wang, former CTO of Deepin and a 20-year Linux developer. I am currently starting fresh with my new project (小龙猫), focusing on private-domain AI computing hardware.&lt;/p&gt;

&lt;p&gt;If you've experienced the collision between ideals and reality, or if you're interested in Linux architecture and AI Agents, let’s connect in the comments!&lt;/p&gt;

</description>
      <category>linux</category>
      <category>opensource</category>
      <category>career</category>
      <category>startup</category>
    </item>
    <item>
      <title>From Stochastic Drifting to Vector Anchors: How I Solved Voice Consistency in Qwen TTS</title>
      <dc:creator>Andy Stewart</dc:creator>
      <pubDate>Mon, 27 Apr 2026 09:15:17 +0000</pubDate>
      <link>https://dev.to/lcmd007/from-stochastic-drifting-to-vector-anchors-how-i-solved-voice-consistency-in-qwen-tts-4dff</link>
      <guid>https://dev.to/lcmd007/from-stochastic-drifting-to-vector-anchors-how-i-solved-voice-consistency-in-qwen-tts-4dff</guid>
      <description>&lt;p&gt;Stop relying on seeds. Learn how to implement deterministic persona via vector constraints.&lt;/p&gt;

&lt;p&gt;I’ve spent the last 72 hours deep in the trenches of Qwen TTS (Text-to-Speech) technology. After three days of high-intensity parameter deduction and experimentation, I’ve finally cracked a problem that has been a nightmare for many: Cross-sentence voice stability.&lt;/p&gt;

&lt;p&gt;If you’ve tried to narrate a long text with AI, you know the frustration. You find a perfect voice for the first sentence, but by the third sentence, the AI has "morphed" into a different person.&lt;/p&gt;

&lt;p&gt;Here is the architectural breakdown of why this happens and how to fix it using what I call the "Vector Anchor" method.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The "Seed" Fallacy&lt;/strong&gt;&lt;br&gt;
Early in my investigation, I focused on the seed parameter. In traditional generative systems, a seed implies reproducibility. However, in the context of Qwen’s latent space, its utility is strictly scoped:&lt;/p&gt;

&lt;p&gt;What Seed does: It ensures that the exact same text produces the exact same audio (even the MD5 hashes will match).&lt;/p&gt;

&lt;p&gt;Where Seed fails: As soon as you change the input text—even by a single character—the seed’s constraint collapses. The model’s "vocal cords" drift, and the persona shifts randomly.&lt;/p&gt;

&lt;p&gt;Architectural Insight: A seed is a snapshot of an inference sequence, not a persistent identity. Relying on seeds for cross-sentence stability is a dead end.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Tone Instructions vs. Identity Definition&lt;/strong&gt;&lt;br&gt;
Qwen’s natural language tone instructions (e.g., "make it thicker," "cleaner," "more mature") are brilliant, but they are personality modifiers, not identity definitions. They adjust the "texture" of the voice but cannot lock the underlying persona across different text inputs.&lt;/p&gt;

&lt;p&gt;To achieve industrial-grade stability, you need a physical anchor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The Solution: The Vector Anchor Workflow&lt;/strong&gt;&lt;br&gt;
The only way to achieve true deterministic output in Qwen TTS is through Voice Cloning via Vector Constraints. Here is the 3-step logic I verified:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: The Persona Hunt&lt;/strong&gt;&lt;br&gt;
Use tone instructions and seeds to iterate. If a voice is too "girly," instruct it to be "cleaner and more professional." If a male voice is too thin, add "depth and weight." Keep iterating until you hit that "Perfect Sample."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Feature Extraction&lt;/strong&gt;&lt;br&gt;
Export that perfect generation as a .wav file. This is no longer just "audio"; it is now your Source of Truth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Hardening with .pt Files&lt;/strong&gt;&lt;br&gt;
Use the Qwen interface/API to generate a .pt file (speaker embedding) from that WAV.&lt;/p&gt;

&lt;p&gt;Think of the .pt file as a Vector Anchor.&lt;/p&gt;

&lt;p&gt;It acts as a deterministic constraint on the model's latent space.&lt;/p&gt;

&lt;p&gt;By passing this file as a reference for every subsequent sentence, you "force" the model to stay within the specific vocal coordinates of your persona.&lt;/p&gt;

&lt;p&gt;The "Double-Layer" Control&lt;br&gt;
The most fascinating part of this architecture? Once the identity is locked via the .pt file, tone instructions still work.&lt;/p&gt;

&lt;p&gt;You can maintain a stable persona (Identity A) while using secondary instructions to change the mood (excited, somber, whispered). You get a consistent narrator who can actually act.&lt;/p&gt;

&lt;p&gt;The Architect’s Takeaway: Truth Comes from Practice&lt;br&gt;
After three days of stress-testing these parameters, the result is incredibly natural—a narrator that sounds human, consistent, and professional.&lt;/p&gt;

&lt;p&gt;In this AI era, we may find ourselves writing fewer lines of manual code, but the demand for logical deduction and system orchestration has never been higher. Models are black boxes, but parameters follow logic.&lt;/p&gt;

&lt;p&gt;As I always say: Truth comes from practice. You don’t know how a system breathes until you’ve pushed its boundaries yourself.&lt;/p&gt;

&lt;p&gt;Hopefully, this architectural shortcut saves you the three days of wandering I went through.&lt;/p&gt;

&lt;p&gt;Have you encountered voice drift in your TTS workflows? How are you handling identity persistence in generative models? Let’s talk in the comments.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tts</category>
      <category>machinelearning</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
