<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>XiaoMo · Blog</title><description>XiaoMo&apos;s personal site: writing, small games, and browser tools.</description><link>https://www.moiu.cn/</link><language>en</language><item><title>Why I built yet another personal site</title><link>https://www.moiu.cn/en/blog/hello-world/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/hello-world/</guid><description>Not because there was nowhere to write, but because there was nowhere to put writing, small games and tools side by side.</description><pubDate>Wed, 23 Sep 2026 00:00:00 GMT</pubDate><category>meta</category><category>Astro</category></item><item><title>Shipping a static site is not &quot;upload the folder&quot;: caching, compression, honest 404s</title><link>https://www.moiu.cn/en/blog/static-hosting-nginx/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/static-hosting-nginx/</guid><description>Almost every static-hosting bug lives in response headers. Which files may be cached forever, which may not be cached at all, and why a static site must never use an SPA fallback.</description><pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate><category>meta</category><category>performance</category></item><item><title>Pushing first-load JS to zero with Astro islands</title><link>https://www.moiu.cn/en/blog/astro-islands/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/astro-islands/</guid><description>From &quot;async import&quot; to &quot;hydrate on demand&quot; — what each of the three lazy-loading layers actually solves, with the code that runs on this site.</description><pubDate>Fri, 18 Sep 2026 00:00:00 GMT</pubDate><category>Astro</category><category>performance</category><category>Vue</category></item><item><title>321 assertions, no test framework: why pure logic must import nothing</title><link>https://www.moiu.cn/en/blog/zero-import-selftest/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/zero-import-selftest/</guid><description>My test suite is `node scripts/selftest.ts` — no framework, no dependencies. The price is that every module it touches must have zero relative imports, and that price bought a codebase shape.</description><pubDate>Mon, 14 Sep 2026 00:00:00 GMT</pubDate><category>Astro</category><category>meta</category></item><item><title>Full-text search on a static site: index at build time, no backend at runtime</title><link>https://www.moiu.cn/en/blog/pagefind-search/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/pagefind-search/</guid><description>A static site does not need Algolia to have search. Generate the index during the build, run the query entirely in the browser, and pay a few seconds of build time.</description><pubDate>Tue, 08 Sep 2026 00:00:00 GMT</pubDate><category>meta</category><category>performance</category></item><item><title>Turning screen-printing limits into design tokens</title><link>https://www.moiu.cn/en/blog/riso-ui/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/riso-ui/</guid><description>This site&apos;s visual direction is Riso screen printing. What I actually built was the printing constraints as tokens, so retheming touched two files and no component changed.</description><pubDate>Tue, 01 Sep 2026 00:00:00 GMT</pubDate><category>design</category><category>CSS</category></item><item><title>Manual i18n: what hand-rolling three languages costs</title><link>https://www.moiu.cn/en/blog/manual-i18n/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/manual-i18n/</guid><description>I hand-rolled this site&apos;s i18n instead of using Astro&apos;s built-in config. Here is why, and exactly where the cost shows up — two 404 incidents and a blog that was half translated.</description><pubDate>Mon, 24 Aug 2026 00:00:00 GMT</pubDate><category>meta</category><category>design</category></item><item><title>Design tokens: one file that runs the whole site</title><link>https://www.moiu.cn/en/blog/design-tokens/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/design-tokens/</guid><description>Why every colour, spacing step and corner radius lives in _tokens.scss — and why changing this site&apos;s entire visual direction only touched two files.</description><pubDate>Tue, 11 Aug 2026 00:00:00 GMT</pubDate><category>CSS</category><category>design</category></item></channel></rss>