<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/feeds/rss-style.xsl" type="text/xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>xuanyu.io</title>
        <link>https://xuanyu.io/</link>
        <description>A personal, writing-first blog by hex.</description>
        <lastBuildDate>Fri, 03 Jul 2026 14:15:01 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>Astro-Theme-Retypeset with Feed for Node.js</generator>
        <language>en</language>
        <copyright>Copyright © 2026 hex</copyright>
        <atom:link href="https://xuanyu.io/rss.xml" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Systems, Not Themes]]></title>
            <link>https://xuanyu.io/posts/systems-not-themes/</link>
            <guid isPermaLink="false">https://xuanyu.io/posts/systems-not-themes/</guid>
            <pubDate>Sun, 01 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Why we build design systems instead of selling themes, and what that means for long-term product thinking.]]></description>
            <content:encoded><![CDATA[<p>There is a difference between a theme and a system.</p>
<p>A theme is a surface. It gives you colors, fonts, and a layout. You install it, adjust a few settings, and move on. It works until it does not. When your needs change, the theme becomes a constraint.</p>
<p>A system is a structure. It gives you rules, relationships, and a way of thinking about your product. It grows with you. It does not need to be replaced — it needs to be understood.</p>
<h2>The problem with themes</h2>
<p>Themes optimize for first impressions. They are built to look good in a preview. They are designed to convert browsers into buyers.</p>
<p>But the people who use them — the ones who build real products — quickly discover the gap between what was promised and what is possible.</p>
<ul>
<li>Customization hits a wall</li>
<li>Components do not compose well together</li>
<li>Updates break things</li>
<li>The original design intent gets lost</li>
</ul>
<p>This is not a failure of any individual theme. It is a failure of the model.</p>
<h2>What a system provides</h2>
<p>A system does not try to look good in a screenshot. It tries to work well over time.</p>
<p>It provides:</p>
<ul>
<li><strong>Consistent spacing</strong> that scales across screen sizes</li>
<li><strong>Typography rules</strong> that maintain hierarchy without manual adjustment</li>
<li><strong>Component patterns</strong> that compose predictably</li>
<li><strong>Constraints</strong> that prevent drift</li>
</ul>
<p>The value is not in what it gives you. The value is in what it prevents.</p>
<h2>Building with restraint</h2>
<p>The hardest part of building a system is saying no. Every feature request feels reasonable in isolation. But systems degrade one reasonable addition at a time.</p>
<p>Good systems are opinionated. They make decisions so you do not have to. They trade flexibility for coherence.</p>
<p>This is the approach we take here. Not because constraints are fashionable, but because they work.</p>
]]></content:encoded>
            <author>hex</author>
        </item>
        <item>
            <title><![CDATA[On Calm Software]]></title>
            <link>https://xuanyu.io/posts/on-calm-software/</link>
            <guid isPermaLink="false">https://xuanyu.io/posts/on-calm-software/</guid>
            <pubDate>Thu, 15 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Most software demands attention. The best software respects it.]]></description>
            <content:encoded><![CDATA[<p>Open most applications and they compete for your attention. Notifications, badges, banners, modals. Every surface is an opportunity to interrupt.</p>
<p>This is not a design failure. It is a design choice. These products are optimized for engagement, and engagement requires interruption.</p>
<p>But there is another way to build software.</p>
<h2>Attention as a resource</h2>
<p>Your attention is finite. Every notification, every animation, every unexpected change in the interface costs something. Most software treats this cost as zero. It is not.</p>
<p>Calm software acknowledges this. It does its job and gets out of the way. It does not celebrate itself. It does not demand that you notice it.</p>
<h2>What calm software looks like</h2>
<ul>
<li>It loads fast and stays stable</li>
<li>It does not move things around after the page renders</li>
<li>It uses typography and whitespace instead of color and motion</li>
<li>It provides information without demanding a response</li>
<li>It respects the back button</li>
</ul>
<p>These are not features. They are qualities. You cannot put them in a changelog, but you feel their absence immediately.</p>
<h2>Why this matters</h2>
<p>The tools we use shape how we think. Frantic tools produce frantic work. Calm tools create space for focus.</p>
<p>We build products with this in mind. Not every product needs to be calm. But the ones that do — the ones used for writing, thinking, and building — should be.</p>
<p>This blog is one of them.</p>
]]></content:encoded>
            <author>hex</author>
        </item>
        <item>
            <title><![CDATA[Writing as Interface]]></title>
            <link>https://xuanyu.io/posts/writing-as-interface/</link>
            <guid isPermaLink="false">https://xuanyu.io/posts/writing-as-interface/</guid>
            <pubDate>Fri, 02 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The best interface for communicating complex ideas is still plain text.]]></description>
            <content:encoded><![CDATA[<p>We spend enormous effort designing interfaces. Layouts, components, interactions, animations. All of it in service of communicating something to someone.</p>
<p>But for complex ideas — the kind that require nuance, context, and careful reasoning — the best interface is still a paragraph.</p>
<h2>The limits of visual design</h2>
<p>Visual design excels at orientation. It tells you where you are, what you can do, and what matters most. It is essential for applications, dashboards, and tools.</p>
<p>But it struggles with depth. A card component can hold a title and a summary. It cannot hold an argument. A grid layout can organize information. It cannot develop a thought.</p>
<p>For that, you need prose.</p>
<h2>Why Markdown works</h2>
<p>Markdown is not a design tool. It is a writing tool. It gives you:</p>
<ul>
<li>Headings for structure</li>
<li>Paragraphs for ideas</li>
<li>Lists for enumeration</li>
<li>Code blocks for precision</li>
<li>Links for references</li>
</ul>
<p>Nothing else. And that is exactly right.</p>
<p>The constraint of Markdown forces clarity. You cannot hide weak thinking behind a beautiful layout. The words have to do the work.</p>
<h2>Building for writers</h2>
<p>When we built this blog, we started with the reading experience. Not the homepage, not the navigation, not the visual identity. The paragraph.</p>
<p>Every decision flows from there:</p>
<ul>
<li><strong>Font choice</strong>: optimized for long-form reading</li>
<li><strong>Line length</strong>: constrained to prevent eye fatigue</li>
<li><strong>Spacing</strong>: generous, to let ideas breathe</li>
<li><strong>Color</strong>: neutral, to keep focus on the text</li>
</ul>
<p>The result is not impressive. It is not meant to be. It is meant to be readable.</p>
<p>That is enough.</p>
]]></content:encoded>
            <author>hex</author>
        </item>
    </channel>
</rss>