<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="https://yuyuan.dev/feed_style.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <tabi:metadata xmlns:tabi="https://github.com/welpo/tabi">
        <tabi:base_url>https:&#x2F;&#x2F;yuyuan.dev</tabi:base_url>
        <tabi:separator>
            •
        </tabi:separator>
        <tabi:about_feeds>This is a web feed, also known as an Atom feed. Subscribe by copying the URL from the address bar into your newsreader. Visit About Feeds to learn more and get started. It&#x27;s free.</tabi:about_feeds>
        <tabi:visit_the_site>Visit website</tabi:visit_the_site>
        <tabi:recent_posts>Recent posts</tabi:recent_posts>
        <tabi:last_updated_on>Updated on $DATE</tabi:last_updated_on>
        <tabi:default_theme></tabi:default_theme>
        <tabi:post_listing_date>date</tabi:post_listing_date>
        <tabi:current_section>Yuan&#x27;s blog</tabi:current_section>
    </tabi:metadata><title>Yuan's blog</title>
        <subtitle>A personal blog</subtitle>
    <link href="https://yuyuan.dev/atom.xml" rel="self" type="application/atom+xml"/>
    <link href="https://yuyuan.dev" rel="alternate" type="text/html"/>
    <generator uri="https://www.getzola.org/">Zola</generator><updated>2026-09-08T00:00:00+00:00</updated><id>https://yuyuan.dev/atom.xml</id><entry xml:lang="en">
        <title>Why a Wayland Kiosk Can&#x27;t Live in a Container</title>
        <published>2026-09-08T00:00:00+00:00</published>
        <updated>2026-09-08T00:00:00+00:00</updated>
        <author>
            <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://yuyuan.dev/posts/wayland-kiosk-container-vt/" type="text/html"/>
        <id>https://yuyuan.dev/posts/wayland-kiosk-container-vt/</id>
        <summary type="html">Three fixes, three dead ends, and a root cause underneath all of them: no container runtime can give a process its own virtual terminal.</summary>
        </entry><entry xml:lang="en">
        <title>About</title>
        <published>2026-09-03T00:00:00+00:00</published>
        <updated>2026-09-03T00:00:00+00:00</updated>
        <author>
            <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://yuyuan.dev/about/" type="text/html"/>
        <id>https://yuyuan.dev/about/</id>
        </entry><entry xml:lang="en">
        <title>Yuyuan Yuan (袁佑緣) — CV</title>
        <published>2026-09-03T00:00:00+00:00</published>
        <updated>2026-09-03T00:00:00+00:00</updated>
        <author>
            <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://yuyuan.dev/cv/" type="text/html"/>
        <id>https://yuyuan.dev/cv/</id>
        </entry><entry xml:lang="en">
        <title>Six Days Inside a GPU That Would Not Wake Up</title>
        <published>2026-09-03T00:00:00+00:00</published>
        <updated>2026-09-03T00:00:00+00:00</updated>
        <author>
            <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://yuyuan.dev/posts/blackwell-gsp-firmware-regression/" type="text/html"/>
        <id>https://yuyuan.dev/posts/blackwell-gsp-firmware-regression/</id>
        <summary type="html">An RTX 5070 Laptop that no NVIDIA driver could initialise, and what it took to prove the bug was in firmware rather than in code anyone can read.</summary>
        </entry><entry xml:lang="en">
        <title>The Watchdog That Watched a Disk Die Anyway</title>
        <published>2026-08-21T00:00:00+00:00</published>
        <updated>2026-08-21T00:00:00+00:00</updated>
        <author>
            <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://yuyuan.dev/posts/disk-guard-watchdog-blind-spot/" type="text/html"/>
        <id>https://yuyuan.dev/posts/disk-guard-watchdog-blind-spot/</id>
        <summary type="html">A disk-space guard observed the exact failure condition it was built to catch, twice, and the disk hit zero nine minutes later. Two bugs, two fixes, three hours apart.</summary>
        </entry><entry xml:lang="en">
        <title>One Flake, Seven Hosts, and the Backup That Died Without Telling Anyone</title>
        <published>2026-08-01T00:00:00+00:00</published>
        <updated>2026-08-01T00:00:00+00:00</updated>
        <author>
            <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://yuyuan.dev/posts/single-source-nixos-multihost/" type="text/html"/>
        <id>https://yuyuan.dev/posts/single-source-nixos-multihost/</id>
        <summary type="html">Two hosts each carried their own copy of the same backup config, and the same structural mistake in both of them let one backup silently stop running for two days.</summary>
        </entry><entry xml:lang="en">
        <title>A Nix-Managed GPU VM Is Genuinely Great, and Here&#x27;s the Proof</title>
        <published>2026-07-30T00:00:00+00:00</published>
        <updated>2026-07-30T00:00:00+00:00</updated>
        <author>
            <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://yuyuan.dev/posts/nix-homelab-gpu-vm/" type="text/html"/>
        <id>https://yuyuan.dev/posts/nix-homelab-gpu-vm/</id>
        <summary type="html">Passing an RTX 3060 through to a Proxmox VM, lying to NVIDIA&#x27;s driver about being virtualized, and making the whole thing reproducible from one command.</summary>
        </entry><entry xml:lang="en">
        <title>Teaching a Nix-Packaged Photo App About a GPU It Didn&#x27;t Know It Had</title>
        <published>2026-07-12T00:00:00+00:00</published>
        <updated>2026-07-12T00:00:00+00:00</updated>
        <author>
            <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://yuyuan.dev/posts/immich-gpu-ml-nixos/" type="text/html"/>
        <id>https://yuyuan.dev/posts/immich-gpu-ml-nixos/</id>
        <summary type="html">nixpkgs&#x27; Immich package has no CUDA wiring. Building it from source cost hours and an OOM kill. Fetching the vendor&#x27;s own wheel cost minutes.</summary>
        </entry><entry xml:lang="en">
        <title>Debugging a Bluetooth Kernel Regression on NixOS</title>
        <published>2026-05-25T00:00:00+00:00</published>
        <updated>2026-05-25T00:00:00+00:00</updated>
        <author>
            <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://yuyuan.dev/posts/mt7922-bluetooth-kernel-debug/" type="text/html"/>
        <id>https://yuyuan.dev/posts/mt7922-bluetooth-kernel-debug/</id>
        <summary type="html">How a two-line bounds check broke Bluetooth on the MT7922 chip, and the journey from dmesg to kernel source to patch.</summary>
        </entry><entry xml:lang="en">
        <title>The NVMe Drive That Only Failed While Charging</title>
        <published>2025-10-21T00:00:00+00:00</published>
        <updated>2025-10-21T00:00:00+00:00</updated>
        <author>
            <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://yuyuan.dev/posts/nvme-firmware-regression-zens13/" type="text/html"/>
        <id>https://yuyuan.dev/posts/nvme-firmware-regression-zens13/</id>
        <summary type="html">Three PCIe kernel parameters fixed nothing. The actual bug was in the firmware blob, and the fix was pinning a five-day-old package.</summary>
        </entry><entry xml:lang="en">
        <title>Balancing Car</title>
        <published>2017-09-22T00:00:00+00:00</published>
        <updated>2017-09-22T00:00:00+00:00</updated>
        <author>
            <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://yuyuan.dev/posts/balancing-car/" type="text/html"/>
        <id>https://yuyuan.dev/posts/balancing-car/</id>
        <summary type="html">A self-balancing two-wheel robot on a LinkIt 7697 — state-space control, IMU sensor fusion, and a small reinforcement-learning model.</summary>
        </entry>
</feed>
