<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Armstrong Yan</title><link>https://yanqian.github.io/</link><description>Recent content on Armstrong Yan</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sun, 21 Jun 2026 18:34:32 +0800</lastBuildDate><atom:link href="https://yanqian.github.io/index.xml" rel="self" type="application/rss+xml"/><item><title>Why Sharing Myinfo Is More Than Autofill</title><link>https://yanqian.github.io/posts/publish/why-sharing-myinfo-is-more-than-autofill/</link><pubDate>Sun, 21 Jun 2026 18:34:32 +0800</pubDate><guid>https://yanqian.github.io/posts/publish/why-sharing-myinfo-is-more-than-autofill/</guid><description>&lt;p>A form asks for your name, address, nationality, contact details, income information, or family records. You have filled in some version of this form before. The service may also ask for documents, then someone or some backend process has to verify that the documents match what you typed.&lt;/p>
&lt;p>Then a button appears:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retrieve Myinfo
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>From the user&amp;rsquo;s point of view, this looks like autofill.&lt;/p>
&lt;p>That is true, but incomplete. Autofill saves typing. Myinfo does something more important:&lt;/p></description></item><item><title>What Happens When You Scan a Singpass QR Code</title><link>https://yanqian.github.io/posts/publish/what-happens-when-you-scan-a-singpass-qr-code/</link><pubDate>Sun, 21 Jun 2026 18:33:32 +0800</pubDate><guid>https://yanqian.github.io/posts/publish/what-happens-when-you-scan-a-singpass-qr-code/</guid><description>&lt;p>You open a banking website on your laptop.&lt;/p>
&lt;p>You click &amp;ldquo;Log in with Singpass&amp;rdquo;.&lt;/p>
&lt;p>A QR code appears.&lt;/p>
&lt;p>You open the Singpass app, scan the code, check the service name, approve the login, and the website suddenly knows it can let you in.&lt;/p>
&lt;p>From the user&amp;rsquo;s point of view, the whole thing feels almost too simple. The QR code appears, the phone approves, the browser continues.&lt;/p>
&lt;p>But the important question is:&lt;/p></description></item><item><title>Why Singpass Becomes National Trust Infrastructure</title><link>https://yanqian.github.io/posts/publish/why-singpass-becomes-national-trust-infrastructure/</link><pubDate>Sun, 21 Jun 2026 18:32:34 +0800</pubDate><guid>https://yanqian.github.io/posts/publish/why-singpass-becomes-national-trust-infrastructure/</guid><description>&lt;p>At first glance, Singpass looks like a login system.&lt;/p>
&lt;p>You open a government website, click &amp;ldquo;Log in with Singpass&amp;rdquo;, scan a QR code, approve it on your phone, and continue. From the user&amp;rsquo;s point of view, the experience is simple. It feels like a national version of &amp;ldquo;Sign in with Google&amp;rdquo;.&lt;/p>
&lt;p>But if we design such a system from first principles, it quickly becomes clear that login is only the visible tip of the system.&lt;/p></description></item><item><title>A Podcast Summarizer Taught Me That Summaries Are Not Understanding</title><link>https://yanqian.github.io/posts/publish/a-podcast-summarizer-taught-me-that-summaries-are-not-understanding/</link><pubDate>Wed, 10 Jun 2026 15:43:19 +0800</pubDate><guid>https://yanqian.github.io/posts/publish/a-podcast-summarizer-taught-me-that-summaries-are-not-understanding/</guid><description>&lt;p>Someone asked me a simple question about a project on my resume:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Did this software actually solve your problem?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>It was a good question.&lt;/p>
&lt;p>The project was a podcast summarizer.&lt;/p>
&lt;p>The source code is public here: &lt;a href="https://github.com/yanqian/podcast-summarizer" class="external-link" target="_blank" rel="noopener">yanqian/podcast-summarizer&lt;/a>.&lt;/p>
&lt;p>The original idea was straightforward.&lt;/p>
&lt;p>Long audio is expensive to consume.&lt;/p>
&lt;p>If I could transcribe it, summarize it, and read the summary, then maybe I could understand the whole episode without spending an hour listening.&lt;/p></description></item><item><title>I Built a Small Harness to Stop AI Coding Projects From Forgetting State</title><link>https://yanqian.github.io/posts/publish/i-built-a-small-harness-to-stop-ai-coding-projects-from-forgetting-state/</link><pubDate>Thu, 04 Jun 2026 10:46:50 +0800</pubDate><guid>https://yanqian.github.io/posts/publish/i-built-a-small-harness-to-stop-ai-coding-projects-from-forgetting-state/</guid><description>&lt;p>AI coding agents are powerful.&lt;/p>
&lt;p>But long-running AI coding projects break in a very specific way:&lt;/p>
&lt;ul>
&lt;li>the session is interrupted&lt;/li>
&lt;li>the context becomes too long&lt;/li>
&lt;li>the weekly quota runs out&lt;/li>
&lt;li>tomorrow&amp;rsquo;s agent forgets yesterday&amp;rsquo;s decisions&lt;/li>
&lt;li>the agent changes unrelated files&lt;/li>
&lt;li>the agent marks work done too early&lt;/li>
&lt;/ul>
&lt;p>The problem is not that AI cannot write code.&lt;/p>
&lt;p>The problem is that AI coding projects often do not have durable project state.&lt;/p></description></item><item><title>Remote Agent Workflow</title><link>https://yanqian.github.io/posts/publish/remote-agent-workflow/</link><pubDate>Mon, 01 Jun 2026 16:34:46 +0800</pubDate><guid>https://yanqian.github.io/posts/publish/remote-agent-workflow/</guid><description>&lt;p>This series is about moving from mobile SSH to a durable, repository-backed AI agent workflow.&lt;/p>
&lt;p>The starting point was simple: I wanted to keep local Codex work moving when I was away from my Mac.&lt;/p>
&lt;p>The deeper question became:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">How do I turn remote access into a recoverable, verifiable, long-running agent workflow?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="articles">
 Articles
 &lt;a class="heading-link" href="#articles">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>&lt;a href="https://yanqian.github.io/posts/publish/remote-mac-terminal-for-codex/" >Remote Agent Workflow, Part 1: Remote Mac Terminal for Codex&lt;/a>&lt;br>
Set up phone-to-Mac terminal access with Tailscale, SSH, Termius, tmux, and caffeinate.&lt;/p></description></item><item><title>Remote Agent Workflow, Part 1: Remote Mac Terminal for Codex</title><link>https://yanqian.github.io/posts/publish/remote-mac-terminal-for-codex/</link><pubDate>Sun, 24 May 2026 16:12:12 +0800</pubDate><guid>https://yanqian.github.io/posts/publish/remote-mac-terminal-for-codex/</guid><description>&lt;p>This is Part 1 of the Remote Agent Workflow series.&lt;/p>
&lt;p>This guide explains how to control a Mac terminal from a phone and keep long-running agent tasks alive, such as Codex, automation scripts, or local development agents.&lt;/p>
&lt;p>The goal is not remote desktop access. The goal is a reliable remote terminal workflow:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Phone -&amp;gt; SSH -&amp;gt; Mac -&amp;gt; tmux -&amp;gt; Codex / agent task
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>With this setup, your Mac becomes a lightweight remote execution node that you can access from anywhere.&lt;/p></description></item><item><title>Remote Agent Workflow, Part 2: From Remote Shell to Agent Control Plane</title><link>https://yanqian.github.io/posts/publish/from-remote-shell-to-agent-control-plane/</link><pubDate>Sun, 24 May 2026 16:12:12 +0800</pubDate><guid>https://yanqian.github.io/posts/publish/from-remote-shell-to-agent-control-plane/</guid><description>&lt;p>This is Part 2 of the Remote Agent Workflow series.&lt;/p>
&lt;p>In the previous article, I built a practical remote terminal workflow:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Phone -&amp;gt; Tailscale -&amp;gt; SSH -&amp;gt; Mac -&amp;gt; tmux -&amp;gt; Codex
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>That setup solved the first problem: how to reach my Mac when I am away from my desk, and how to keep long-running local agent tasks alive after my phone disconnects.&lt;/p>
&lt;p>It was useful immediately.&lt;/p>
&lt;p>But after using it in practice, I found a second problem.&lt;/p></description></item><item><title>Remote Agent Workflow, Part 3: Turning Telegram into a Local Codex Control Plane</title><link>https://yanqian.github.io/posts/publish/turning-telegram-into-a-local-codex-control-plane/</link><pubDate>Sun, 24 May 2026 16:12:12 +0800</pubDate><guid>https://yanqian.github.io/posts/publish/turning-telegram-into-a-local-codex-control-plane/</guid><description>&lt;p>This is Part 3 of the Remote Agent Workflow series.&lt;/p>
&lt;p>In the previous articles, I started with a practical remote terminal setup:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Phone -&amp;gt; Tailscale -&amp;gt; SSH -&amp;gt; Mac -&amp;gt; tmux -&amp;gt; Codex
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>That gave me a reliable way to reach my Mac from a phone.&lt;/p>
&lt;p>Then I hit the next limitation: a phone is not a good terminal.&lt;/p>
&lt;p>Mobile SSH is useful for emergencies, but it is not the interface I want for long-running AI development. I do not want to type shell commands, attach tmux sessions, scroll logs, and manually reconstruct state from a narrow phone screen.&lt;/p></description></item><item><title>Remote Agent Workflow, Part 4: In the Repository, Not in the Chat</title><link>https://yanqian.github.io/posts/publish/in-the-repository-not-in-the-chat/</link><pubDate>Sun, 24 May 2026 16:12:12 +0800</pubDate><guid>https://yanqian.github.io/posts/publish/in-the-repository-not-in-the-chat/</guid><description>&lt;p>This is Part 4 of the Remote Agent Workflow series.&lt;/p>
&lt;p>The first layer of my remote AI development setup was connectivity.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Phone -&amp;gt; Tailscale -&amp;gt; SSH -&amp;gt; Mac -&amp;gt; tmux -&amp;gt; Codex
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>That let me reach my Mac from a phone and keep long-running local tasks alive.&lt;/p>
&lt;p>The second layer was control.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Phone -&amp;gt; Telegram Bot -&amp;gt; local Codex runtime -&amp;gt; selected repository
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>That made the phone a control surface instead of a tiny terminal.&lt;/p></description></item><item><title>Remote Agent Workflow, Part 5: What Still Matters After Codex Mobile</title><link>https://yanqian.github.io/posts/publish/what-still-matters-after-codex-mobile/</link><pubDate>Sun, 24 May 2026 16:12:12 +0800</pubDate><guid>https://yanqian.github.io/posts/publish/what-still-matters-after-codex-mobile/</guid><description>&lt;p>This is Part 5 of the Remote Agent Workflow series.&lt;/p>
&lt;p>When I started this remote AI development setup, the problem was practical.&lt;/p>
&lt;p>I wanted to keep local Codex work moving when I was away from my Mac.&lt;/p>
&lt;p>That led to the first layer:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Phone -&amp;gt; Tailscale -&amp;gt; SSH -&amp;gt; Mac -&amp;gt; tmux -&amp;gt; Codex
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Then I realized mobile SSH was not the right daily interface, so I built a Telegram control plane:&lt;/p></description></item><item><title>AI-Native Software Engineering, Part 1: Mental Models in Agentic Coding</title><link>https://yanqian.github.io/posts/publish/agentic-coding-mental-models-and-the-new-depth-of-software-engineering/</link><pubDate>Sat, 23 May 2026 20:33:47 +0800</pubDate><guid>https://yanqian.github.io/posts/publish/agentic-coding-mental-models-and-the-new-depth-of-software-engineering/</guid><description>&lt;p>AI can generate code. Harnesses can validate behavior. But who builds understanding?&lt;/p>
&lt;p>This is Part 1 of the AI-Native Software Engineering series.&lt;/p>
&lt;p>The series asks a larger question:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">When AI lowers the cost of implementation,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">what remains scarce in software engineering?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This article starts with the first scarce resource:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Understanding.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Over the past few months, I&amp;rsquo;ve been experimenting heavily with AI-assisted software development.&lt;/p>
&lt;p>Not autocomplete.&lt;/p>
&lt;p>Not AI as a coding copilot.&lt;/p></description></item><item><title>AI-Native Software Engineering, Part 2: Harness Engineering and Correctness</title><link>https://yanqian.github.io/posts/publish/harness-engineering-is-about-limiting-ai-not-empowering-it/</link><pubDate>Sat, 23 May 2026 20:33:47 +0800</pubDate><guid>https://yanqian.github.io/posts/publish/harness-engineering-is-about-limiting-ai-not-empowering-it/</guid><description>&lt;p>Why the most important part of AI-native software engineering may not be generation, but constraint.&lt;/p>
&lt;p>This is Part 2 of the AI-Native Software Engineering series.&lt;/p>
&lt;p>It continues from &lt;a href="https://yanqian.github.io/posts/publish/agentic-coding-mental-models-and-the-new-depth-of-software-engineering/" >AI-Native Software Engineering, Part 1: Mental Models in Agentic Coding&lt;/a>.&lt;/p>
&lt;p>The previous question was:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">If understanding no longer comes mainly from writing code,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">how do humans build mental models in an agentic workflow?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The next question is:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">If implementation is delegated,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">where does correctness come from?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The conversation around AI-assisted software development often focuses on one thing:&lt;/p></description></item><item><title>AI-Native Software Engineering, Part 3: Software as Search</title><link>https://yanqian.github.io/posts/publish/software-is-becoming-search-why-engineers-are-turning-into-constraint-designers/</link><pubDate>Sat, 23 May 2026 20:33:47 +0800</pubDate><guid>https://yanqian.github.io/posts/publish/software-is-becoming-search-why-engineers-are-turning-into-constraint-designers/</guid><description>&lt;p>When implementation becomes abundant, engineering starts to look less like construction and more like navigation.&lt;/p>
&lt;p>This is Part 3 of the AI-Native Software Engineering series.&lt;/p>
&lt;p>It continues from &lt;a href="https://yanqian.github.io/posts/publish/harness-engineering-is-about-limiting-ai-not-empowering-it/" >AI-Native Software Engineering, Part 2: Harness Engineering and Correctness&lt;/a>.&lt;/p>
&lt;p>The first article asked:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">How does understanding form when implementation is delegated?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The second article asked:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">How does correctness form when generation is cheap?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This article asks:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">If implementation keeps getting cheaper,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">what are engineers actually doing?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Here, constraints shift meaning.&lt;/p></description></item><item><title>AI-Native Software Engineering, Part 4: Human Judgment Against Vibe Coding</title><link>https://yanqian.github.io/posts/publish/against-vibe-coding-why-human-judgment-still-matters/</link><pubDate>Sat, 23 May 2026 20:33:47 +0800</pubDate><guid>https://yanqian.github.io/posts/publish/against-vibe-coding-why-human-judgment-still-matters/</guid><description>&lt;p>You can automate implementation. You can automate evaluation. But judgment remains stubbornly human.&lt;/p>
&lt;p>This is Part 4 of the AI-Native Software Engineering series.&lt;/p>
&lt;p>It continues from &lt;a href="https://yanqian.github.io/posts/publish/software-is-becoming-search-why-engineers-are-turning-into-constraint-designers/" >AI-Native Software Engineering, Part 3: Software as Search&lt;/a>.&lt;/p>
&lt;p>The first article asked how understanding forms.&lt;/p>
&lt;p>The second asked how correctness forms.&lt;/p>
&lt;p>The third argued that software is starting to look like search.&lt;/p>
&lt;p>This article pushes back on a dangerous misunderstanding:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">If we have agents, harnesses, and constraints,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">software can produce itself.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>That is not true.&lt;/p></description></item><item><title>Understanding Singapore's Payment Stack: From Bank Apps to SGQR, PayNow, FAST, Contactless, and NETS</title><link>https://yanqian.github.io/posts/publish/understanding-singapore-payment-stack/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://yanqian.github.io/posts/publish/understanding-singapore-payment-stack/</guid><description>&lt;p>If you live in Singapore, you probably use these payment methods every day:&lt;/p>
&lt;ul>
&lt;li>You send money to a friend via PayNow.&lt;/li>
&lt;li>You scan a QR code at a hawker stall.&lt;/li>
&lt;li>You tap your card or phone at a supermarket.&lt;/li>
&lt;li>You use NETS at a local merchant.&lt;/li>
&lt;/ul>
&lt;p>They look similar from the user side, but underneath they solve different problems.&lt;/p>
&lt;hr>
&lt;h2 id="the-big-picture">
 The Big Picture
 &lt;a class="heading-link" href="#the-big-picture">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2>
&lt;p>&lt;img src="assets/singapore-payment-stack.svg" alt="Singapore Payment Stack">&lt;/p></description></item><item><title>Building a Private-to-Public Publishing Pipeline with Obsidian, Hugo, and GitHub Pages</title><link>https://yanqian.github.io/posts/publish/building-a-personal-blog-with-obsidian-hugo-and-github-pages/</link><pubDate>Fri, 08 May 2026 22:48:50 +0800</pubDate><guid>https://yanqian.github.io/posts/publish/building-a-personal-blog-with-obsidian-hugo-and-github-pages/</guid><description>&lt;p>I recently rebuilt my personal website around a simple idea:&lt;/p>
&lt;p>Keep Obsidian as the private source of truth, and selectively publish public notes into a clean personal website.&lt;/p>
&lt;p>This is less a Hugo tutorial and more a note about designing a publishing boundary between a private knowledge base and a public website.&lt;/p>
&lt;p>This article documents the architecture, tradeoffs, and workflow I ended up with.&lt;/p>
&lt;p>The repository names, URLs, and site pages in this article come from my own setup. If you follow the same approach, replace them with your GitHub username, repository name, domain, and navigation structure.&lt;/p></description></item><item><title>About</title><link>https://yanqian.github.io/about/</link><pubDate>Wed, 06 May 2026 10:12:47 +0800</pubDate><guid>https://yanqian.github.io/about/</guid><description>&lt;p>I am Armstrong Yan, a backend and platform engineer based in Singapore.&lt;/p>
&lt;p>My work focuses on reliable backend systems, platform engineering, distributed services, and practical automation. I care about systems that remain understandable under pressure: clear interfaces, observable behavior, safe failure handling, and engineering workflows that help teams move faster without losing the ability to reason about the software.&lt;/p>
&lt;p>This site is where I write public notes on backend architecture, cloud infrastructure, event-driven systems, AI-assisted software engineering, remote agent workflows, and personal knowledge systems. A recurring theme is the boundary between human judgment and automation: how repositories, feedback loops, and operating practices make complex work easier to recover, verify, and improve.&lt;/p></description></item><item><title>Now</title><link>https://yanqian.github.io/now/</link><pubDate>Wed, 06 May 2026 10:12:47 +0800</pubDate><guid>https://yanqian.github.io/now/</guid><description>&lt;p>This page is a snapshot of what I am focused on now, both in work and outside it.&lt;/p>
&lt;h2 id="work">
 Work
 &lt;a class="heading-link" href="#work">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2>
&lt;p>I am focused on backend and platform engineering, especially reliable systems, AI-connected workflows, and the engineering habits that make complex software easier to operate, debug, and reason about.&lt;/p>
&lt;p>I am also continuing to refine the Obsidian-to-Hugo publishing flow behind this site.&lt;/p>
&lt;h2 id="writing-and-tools">
 Writing and Tools
 &lt;a class="heading-link" href="#writing-and-tools">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>Obsidian for private notes and long-term knowledge work.&lt;/li>
&lt;li>Hugo and GitHub Pages for publishing.&lt;/li>
&lt;li>Codex and AI-assisted workflows for engineering experiments.&lt;/li>
&lt;li>Shottr for screenshots and lightweight visual annotation.&lt;/li>
&lt;/ul>
&lt;h2 id="outside-work">
 Outside Work
 &lt;a class="heading-link" href="#outside-work">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2>
&lt;p>I play table tennis two or three times a week. It is one of the few activities where I can feel improvement through repetition, timing, and tiny corrections.&lt;/p></description></item><item><title>Projects</title><link>https://yanqian.github.io/projects/</link><pubDate>Wed, 06 May 2026 10:12:47 +0800</pubDate><guid>https://yanqian.github.io/projects/</guid><description>&lt;p>Selected products and tools I built to solve real workflow problems, from visa form assistance to remote agent control planes and personal knowledge rediscovery.&lt;/p>
&lt;h2 id="selected">
 Selected
 &lt;a class="heading-link" href="#selected">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2>
&lt;h3 id="visapilot">
 VisaPilot
 &lt;a class="heading-link" href="#visapilot">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h3>
&lt;p>&lt;strong>Browser extension · AI assistant · Visa forms · Chrome Web Store · Edge Add-ons&lt;/strong>&lt;/p>
&lt;p>VisaPilot is a chat-first browser assistant for visa and arrival-card forms, with page understanding, guided filling, and progressive memory.&lt;/p></description></item><item><title>Resume</title><link>https://yanqian.github.io/resume/</link><pubDate>Wed, 06 May 2026 10:12:47 +0800</pubDate><guid>https://yanqian.github.io/resume/</guid><description>&lt;h2 id="profile">
 Profile
 &lt;a class="heading-link" href="#profile">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2>
&lt;p>Senior backend and platform engineer based in Singapore, with 10+ years of experience across distributed systems, production reliability, backend architecture, and platform engineering.&lt;/p>
&lt;p>I focus on building systems that are scalable, observable, and practical to operate. My work often sits at the boundary between product backend systems and platform infrastructure: API design, asynchronous workflows, incident diagnosis, reliability improvements, and automation that reduces operational friction.&lt;/p></description></item></channel></rss>