<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Shaun Li Blog</title><link>https://shaunli.com</link><description>Shaun Li blog feed</description><language>en</language><lastBuildDate>Tue, 08 Sep 2026 13:01:27 GMT</lastBuildDate><generator>Astro</generator><atom:link href="https://shaunli.com/rss.xml" rel="self" type="application/rss+xml" /><item><title>jst 0.1.0: Rewriting My First npm Package After 15 Years</title><link>https://shaunli.com/blog/30-jst-0-1-0-15-year-rewrite/</link><guid>https://shaunli.com/blog/30-jst-0-1-0-15-year-rewrite/</guid><description>A few weeks ago, I published a retrospective on jst, the very first npm package I shipped back in April 2011 during the Node v0.4 era. At the time, I framed it as digital archaeology. The package had been parked at version 0.0.13 for fiftee</description><pubDate>Sat, 05 Sep 2026 13:00:00 GMT</pubDate></item><item><title>The Harness Paradox: What OpenAI&apos;s Astra Actually Proved About AGI</title><link>https://shaunli.com/blog/29-gpt-astra-harness-paradox-agi-runtime/</link><guid>https://shaunli.com/blog/29-gpt-astra-harness-paradox-agi-runtime/</guid><description>OpenAI finally said the letters out loud.
On September 3, 2026, with the official rollout of GPT-6 Astra, Greg Brockman offered the sentence intended for the history books: future observers might look back at the release of Astra as the poi</description><pubDate>Fri, 04 Sep 2026 06:15:00 GMT</pubDate></item><item><title>Downloads Do Not Measure the App</title><link>https://shaunli.com/blog/28-why-a-better-app-gets-fewer-downloads/</link><guid>https://shaunli.com/blog/28-why-a-better-app-gets-fewer-downloads/</guid><description>My barcode app has been on the Google Play Store since May 2020. Six years later it has roughly a hundred installs, and the apps it sits next to in the search results have a hundred million. I spent most of those six years assuming that gap</description><pubDate>Sun, 23 Aug 2026 13:00:00 GMT</pubDate></item><item><title>QR Code Manager Is a Wallet, Not a Scanner</title><link>https://shaunli.com/blog/27-qr-code-manager-offline-barcode-wallet/</link><guid>https://shaunli.com/blog/27-qr-code-manager-offline-barcode-wallet/</guid><description>The queue behind me is four people long, the cashier has already said the total, and I need to show a barcode I have never once memorised. That is the moment this app was built for, and it is not a scanning moment.
QR Code Manager has been </description><pubDate>Sun, 23 Aug 2026 12:00:00 GMT</pubDate></item><item><title>Ten Million Rows In, One Hundred Out</title><link>https://shaunli.com/blog/26-agent-bulk-read-gap-mcp-pagination/</link><guid>https://shaunli.com/blog/26-agent-bulk-read-gap-mcp-pagination/</guid><description>Glide will store ten million rows for you. Its own documentation says so: Big Tables hold &quot;up to 10 million rows,&quot; against 25,000 for a regular Glide Table. Four lines further down, the same page says this:

Aggregations in general are limi</description><pubDate>Sat, 22 Aug 2026 17:00:00 GMT</pubDate></item><item><title>Every SaaS Shipped an MCP Server. None of Them Shipped an Identity.</title><link>https://shaunli.com/blog/25-saas-mcp-servers-missing-agent-identity/</link><guid>https://shaunli.com/blog/25-saas-mcp-servers-missing-agent-identity/</guid><description>Ask an agent to clean up the duplicate rows in your CRM base. It is a boring task, it is exactly the kind of thing you bought an agent for, and the two things that go wrong are both structural.
The first is that it will be slow in a way tha</description><pubDate>Sat, 22 Aug 2026 16:00:00 GMT</pubDate></item><item><title>Against GNOME and KDE — and Why Every Desktop Converges on Them Anyway</title><link>https://shaunli.com/blog/24-against-gnome-kde-desktop-architecture-convergence/</link><guid>https://shaunli.com/blog/24-against-gnome-kde-desktop-architecture-convergence/</guid><description>The Linux desktop has been having the same argument since 1998, and the argument has a structure: a big integrated desktop ships something opinionated, a smaller project rebels by decomposing it into parts you assemble yourself, the assembl</description><pubDate>Sat, 22 Aug 2026 14:00:00 GMT</pubDate></item><item><title>Hyprland Gives You a Compositor, Not a Desktop</title><link>https://shaunli.com/blog/23-hyprland-compositor-not-a-desktop/</link><guid>https://shaunli.com/blog/23-hyprland-compositor-not-a-desktop/</guid><description>Every thread about switching to a tiling setup ends the same way. Someone posts a screenshot with a translucent terminal, a blurred wallpaper and a bar full of glyphs, and someone else replies: just use Hyprland.
That advice is not wrong so</description><pubDate>Sat, 22 Aug 2026 13:00:00 GMT</pubDate></item><item><title>The Agent Runtime Problem: Four Things a while-Loop Doesn&apos;t Give You</title><link>https://shaunli.com/blog/22-agent-runtime-problem-state-sessions-loop-money/</link><guid>https://shaunli.com/blog/22-agent-runtime-problem-state-sessions-loop-money/</guid><description>Almost every agent you can install today is a while loop. Send the context, take the response, execute the tools, push the results onto an array, repeat. It is a good loop. It is roughly two hundred lines, it works, and for the first year o</description><pubDate>Sat, 22 Aug 2026 12:00:00 GMT</pubDate></item><item><title>gpui and the Mail Client Problem: A Text Field Costs 778 Lines</title><link>https://shaunli.com/blog/21-gpui-rust-desktop-mail-client-vs-tauri-electron/</link><guid>https://shaunli.com/blog/21-gpui-rust-desktop-mail-client-vs-tauri-electron/</guid><description>I spent a week on a question that turned out to be much older than the framework I was researching: what would it take to write a mail client in 2026? Not a demo — two accounts, a couple of hundred thousand archived messages, a thread list </description><pubDate>Thu, 20 Aug 2026 12:00:00 GMT</pubDate></item><item><title>Omarchy 4.0: The Distro Is Mostly a Migration Runner</title><link>https://shaunli.com/blog/20-omarchy-4-quattro-architecture-study/</link><guid>https://shaunli.com/blog/20-omarchy-4-quattro-architecture-study/</guid><description>I opened the Omarchy repository expecting to find a theme collection with an installer attached. Version 4.0 — &quot;Quattro&quot; — had just landed on 14 August 2026, the release notes led with a desktop shell rewritten in Quickshell, and the screen</description><pubDate>Tue, 18 Aug 2026 12:00:00 GMT</pubDate></item><item><title>X&apos;s Phoenix Ranker: A Transformer That Cannot See Its Own Batch</title><link>https://shaunli.com/blog/19-x-algorithm-phoenix-ranker-candidate-isolation/</link><guid>https://shaunli.com/blog/19-x-algorithm-phoenix-ranker-candidate-isolation/</guid><description>When X open-sourced the-algorithm in 2023, the interesting part was the plumbing: a Scala service graph, a light ranker, a heavy ranker, and a set of hand-tuned engagement weights. The model at the centre was modest enough to describe in a </description><pubDate>Mon, 17 Aug 2026 12:00:00 GMT</pubDate></item><item><title>Pi&apos;s Durable AgentHarness: An Agent Loop That Survives kill -9</title><link>https://shaunli.com/blog/18-pi-durable-agentharness-design/</link><guid>https://shaunli.com/blog/18-pi-durable-agentharness-design/</guid><description>Most agent runtimes model a run as a while loop: send the context, take the response, execute the tools, push onto an array, repeat. The array lives in memory. Kill the process between the tool executing and the push, and the tool ran but n</description><pubDate>Tue, 11 Aug 2026 12:00:00 GMT</pubDate></item><item><title>Bun&apos;s Zig→Rust Rewrite in 11 Days: The Loop, Not the 64 Claudes</title><link>https://shaunli.com/blog/17-bun-zig-to-rust-rewrite-ai-loop/</link><guid>https://shaunli.com/blog/17-bun-zig-to-rust-rewrite-ai-loop/</guid><description>In eleven days in May 2026, Bun&apos;s 535,496 lines of Zig became Rust. One engineer, roughly 64 Claude instances, 6,502 commits, about $165,000 in API tokens. The headline wrote itself, and most of the coverage since has argued about whether t</description><pubDate>Fri, 07 Aug 2026 12:00:00 GMT</pubDate></item><item><title>herdr Joins Y Combinator: A Rust Agent Runtime, Not Another tmux</title><link>https://shaunli.com/blog/16-herdr-y-combinator-agent-runtime/</link><guid>https://shaunli.com/blog/16-herdr-y-combinator-agent-runtime/</guid><description>herdr is an open-source Rust agent runtime that owns the terminal sessions your coding agents run in, and on 6 August 2026 it announced it is joining Y Combinator&apos;s F26 batch. The announcement came from Can Celik, who built the whole thing </description><pubDate>Fri, 07 Aug 2026 08:00:00 GMT</pubDate></item><item><title>Cloudflare Wallets and cloudflare.pay: Identity and Payments for AI Agents</title><link>https://shaunli.com/blog/15-cloudflare-wallets-and-cloudflare-pay-identity-and-payments-for-ai-agents/</link><guid>https://shaunli.com/blog/15-cloudflare-wallets-and-cloudflare-pay-identity-and-payments-for-ai-agents/</guid><description>Cloudflare Wallets is a programmable stablecoin wallet for AI agents, and cloudflare.pay is the handle namespace that gives those agents a human-readable identity. Together they are the buyer&apos;s half of an agentic payment market whose seller</description><pubDate>Wed, 05 Aug 2026 09:30:00 GMT</pubDate></item><item><title>x402 Native Payments: HTTP 402 Protocol for AI Agents</title><link>https://shaunli.com/blog/14-x402-native-payments-http-402-protocol-for-ai-agents/</link><guid>https://shaunli.com/blog/14-x402-native-payments-http-402-protocol-for-ai-agents/</guid><description>x402 is an open payment standard that lets AI agents and machines pay for APIs, data, and digital services directly over HTTP. It revives the long-dormant HTTP 402 (Payment Required) status code, replacing API keys, accounts, and subscripti</description><pubDate>Wed, 05 Aug 2026 07:50:14 GMT</pubDate></item><item><title>simpleconf: A Go Config Service for When etcd Is Too Much</title><link>https://shaunli.com/blog/13-simpleconf/</link><guid>https://shaunli.com/blog/13-simpleconf/</guid><description>simpleconf is a lightweight configuration service in Go. It serves JSON key-path read/write over HTTP and an optional minimal TCP protocol. Optional Raft clustering provides high availability without running etcd or Consul.
I started it in </description><pubDate>Wed, 05 Aug 2026 03:54:32 GMT</pubDate></item><item><title>我的第一個 npm 套件：2011 年的 Node 模板引擎 jst</title><link>https://shaunli.com/blog/12-my-first-npm-package-jst/</link><guid>https://shaunli.com/blog/12-my-first-npm-package-jst/</guid><description>翻 npm 套件清單時，發現自己最早的發布記錄停在 2011 年。那是我寫的第一個 npm 套件：jst（Node JavaScript Template）——一個號稱 pretty high performance 的模板引擎。
這篇不是要推銷一個 15 年沒人維護的套件。它是數位考古，也是後面兩個仍在維護的路由庫 —— alpinejs-router、svelte-router —— 的前情提要：同一個作者，同一種執念，中間隔了十多年。

In English: This</description><pubDate>Wed, 05 Aug 2026 03:40:00 GMT</pubDate></item><item><title>svelte-router: Svelte 3–5 SPA Routing Without SvelteKit</title><link>https://shaunli.com/blog/11-svelte-router/</link><guid>https://shaunli.com/blog/11-svelte-router/</guid><description>@shaun/svelte-router is a lightweight client-side router for Svelte 3, 4, and 5 — no SvelteKit required. Declarative links, dynamic params with regex, wildcards, hash or HTML5 history, zero runtime dependencies.
Current release: 2.0.2 (June</description><pubDate>Wed, 05 Aug 2026 03:30:00 GMT</pubDate></item></channel></rss>