<?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>fryanpan.com</title>
        <link>https://fryanpan.com/</link>
        <description>Product Engineer Leader writing about agent infrastructure, healthtech systems, and engineering tradeoffs. 5 years at Deepcell (biotech), before that Playdom.</description>
        <lastBuildDate>Thu, 28 May 2026 16:12:08 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 Bryan Chan</copyright>
        <atom:link href="https://fryanpan.com/rss.xml" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Diagnosing Rare Diseases for 15¢ per Consult with Claude]]></title>
            <link>https://fryanpan.com/posts/rare-disease-benchmark/</link>
            <guid isPermaLink="false">https://fryanpan.com/posts/rare-disease-benchmark/</guid>
            <pubDate>Mon, 25 May 2026 20:00:00 GMT</pubDate>
            <description><![CDATA[It took two years and half a dozen doctors to figure out I had a rare disease. So I tested how good Claude is at diagnosing rare-disease cases using only public medical tools — and audited what the published benchmarks actually measure.]]></description>
            <content:encoded><![CDATA[<p>It took me about two years and half a dozen doctors to figure out that I have Mast Cell Activation Syndrome (MCAS). About 6% of the population is affected by a rare disease like MCAS, and rare disease patients typically endure more difficult journeys than I did.</p>
<p>Might there be a better way?</p>
<p>I wanted to see how good Claude is at diagnosing rare diseases and see if I can make it better using only public data. To do this, I tested Claude on rare-disease cases — building on the <a href="https://www.thelancet.com/journals/landig/article/PIIS2589-7500(25)00135-9/fulltext" target="_blank">RareArena</a> benchmark, but with 371 fresh cases published after Claude’s training data was frozen, so the model couldn’t have memorized them. Here’s what I found:</p>
<figure class="chart"><figcaption class="chart-title">How often Claude got the right answer on its top guess</figcaption><img src="https://fryanpan.com/charts/chart-83ba87e0c523.png" alt="How often Claude got the right answer on its top guess" style="max-width:100%;height:auto;display:block;border:0" /></figure>
<p>I tried different ways of setting up Claude, and each tweak gave a statistically significant improvement. However, I found it challenging to guarantee that the model wasn’t cheating on any of the cases.</p>
<h2 id="why-rare-disease-journeys-are-hard">Why Rare Disease Journeys Are Hard<a href="#why-rare-disease-journeys-are-hard" class="heading-anchor-link" aria-label="Link to Why Rare Disease Journeys Are Hard"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M2.6 21.4c2 2 5.9 2.9 8.9 0l3.5-3.5-1-1-3.5 3.5c-1.4 1.4-4.2 1.9-6.4-.3s-1.8-5-.3-6.4l3.5-3.5-1-1-3.5 3.5c-3 3-2 6.9 0 8.9ZM21.4 2.6c2 2 2.9 5.9 0 8.9L17.9 15l-1-1 3.5-3.5c1.4-1.4 1.9-4.2-.3-6.4s-5-1.8-6.4-.3l-3.5 3.5-1-1 3.5-3.5c3-3 6.9-2 8.9 0Z" /><path d="m8.01 14.97 6.93-6.93 1.061 1.06-6.93 6.93z" /></svg></a></h2>
<p>A “rare” disease affects fewer than 1 in 2,000 people. There are 7,000+ of them. Together, they touch about 6% of the population — most people know someone affected by a rare disease.</p>
<p>Patients wait almost 5 years on average (4.7) from symptom onset to diagnosis (<a href="https://www.eurordis.org/publications/rb-diagnosis-odyssey/" target="_blank">EURORDIS Rare Barometer</a>). They see on average 7-8 doctors. They’re misdiagnosed 2-3 times (<a href="https://globalgenes.org/wp-content/uploads/2013/04/ShireReport-1.pdf" target="_blank">Shire Rare Disease Impact Report, 2013</a>). Primary care doctors and specialists rule out the diseases they know about, but don’t consider the diseases they don’t know about. And often patients hop from doctor to doctor until they find an answer (or give up).</p>
<p>In Berlin, I started having <a href="https://octoturtle.net/2020/01/12/hello-my-brain-fog-friend/" target="_blank">symptoms in May 2019</a>.  While I was still in Germany, I saw a family doctor, a histamine intolerance expert, a gastroenterologist, and a nutritionist. Back in San Francisco, starting in 2020, I saw another family doctor and two different complex disease specialists.</p>
<p>Only the last specialist looked broadly enough to find an answer (after asking me to draw 40 tubes of blood in one session!)</p>
<figure><img src="https://fryanpan.com/_astro/health-snapshot.K66MCbJF_Z1jDNho.webp" alt="A diagram I made in 2019 mapping symptoms to known and unknown causes — most pointing at &quot;Unknown Cause?!&quot;" loading="lazy" style="max-width:100%;height:auto;display:block" /><figcaption>A diagram I made in 2019 mapping symptoms to known and unknown causes — most pointing at "Unknown Cause?!"</figcaption></figure>
<h2 id="benchmarking-and-improving-claude">Benchmarking And Improving Claude<a href="#benchmarking-and-improving-claude" class="heading-anchor-link" aria-label="Link to Benchmarking And Improving Claude"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M2.6 21.4c2 2 5.9 2.9 8.9 0l3.5-3.5-1-1-3.5 3.5c-1.4 1.4-4.2 1.9-6.4-.3s-1.8-5-.3-6.4l3.5-3.5-1-1-3.5 3.5c-3 3-2 6.9 0 8.9ZM21.4 2.6c2 2 2.9 5.9 0 8.9L17.9 15l-1-1 3.5-3.5c1.4-1.4 1.9-4.2-.3-6.4s-5-1.8-6.4-.3l-3.5 3.5-1-1 3.5-3.5c3-3 6.9-2 8.9 0Z" /><path d="m8.01 14.97 6.93-6.93 1.061 1.06-6.93 6.93z" /></svg></a></h2>
<p>I built on <a href="https://github.com/zhao-zy15/RareArena" target="_blank">RareArena</a> (Zhao et al., <em>Lancet Digital Health</em> 2026): 8,562 rare-disease screening cases derived from PubMed case reports, with verified diagnoses from the <a href="https://www.orpha.net/" target="_blank">Orphanet</a> rare-disease database.</p>
<p>Each test gives the model a clinical case write-up — symptoms, history, and physical findings, with the diagnosis stripped out — and asks for a ranked list of the top 5 candidate rare diseases. Here’s what one looks like:</p>
<blockquote>
<p><em>An 11-year-old girl presented with retinal findings on widefield optical coherence tomography imaging. Examination revealed increased thickening of the midperipheral retina bilaterally. In areas of retinal thickening, the retinal architecture showed coarse delineation with thinned and disrupted photoreceptor outer segments. The retinal pigment epithelium appeared normal on autofluorescence imaging. Retrospective review of conventional OCT imaging from age 3 demonstrated that the retinal thickening was already present at that earlier timepoint.</em></p>
<p>— One of the 371 cases (diagnosis hidden; the model has to produce a top‑5 guess)</p>
</blockquote>
<h3 id="trying-for-a-valid-benchmark">Trying for a Valid Benchmark<a href="#trying-for-a-valid-benchmark" class="heading-anchor-link" aria-label="Link to Trying for a Valid Benchmark"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M2.6 21.4c2 2 5.9 2.9 8.9 0l3.5-3.5-1-1-3.5 3.5c-1.4 1.4-4.2 1.9-6.4-.3s-1.8-5-.3-6.4l3.5-3.5-1-1-3.5 3.5c-3 3-2 6.9 0 8.9ZM21.4 2.6c2 2 2.9 5.9 0 8.9L17.9 15l-1-1 3.5-3.5c1.4-1.4 1.9-4.2-.3-6.4s-5-1.8-6.4-.3l-3.5 3.5-1-1 3.5-3.5c3-3 6.9-2 8.9 0Z" /><path d="m8.01 14.97 6.93-6.93 1.061 1.06-6.93 6.93z" /></svg></a></h3>
<p>Two challenges make it hard to run a benchmark using public case data: models might find the exact same case while exploring, or they might memorize case details from their training data.</p>
<p>On the first: Claude with a PubMed or web search tool can find the exact same case at runtime. When I gave it free rein, on about half the cases it looked up the actual case while diagnosing it — a.k.a. cheating. To try to avoid this, I implemented custom PubMed and web search tools that filtered out the case Claude was meant to diagnose, and I had tool-use audits in place to check whether filtering worked correctly. The <a href="https://www.nature.com/articles/s41586-025-10097-9" target="_blank">DeepRare</a> paper took a different and stronger approach: they evaluated their system on newly-collected hospital cohorts that were never published online (so there’s nothing for the model to find), plus ablations with web search disabled.</p>
<p>On the second: the model may have memorized some aspect of the PubMed case during its training. To avoid this, I collected 371 rare-disease cases published <em>after</em> Claude Opus 4.6’s August 2025 training cutoff, with diagnosis-framing language stripped out by a separate, smaller Anthropic model (Haiku) so Claude couldn’t reverse-engineer the answer. I can’t fully guarantee these PubMed cases didn’t leave some online trace that was included in the training data, or that the Haiku cleaning pipeline was perfect — but it’s the best I could do with public data.</p>
<h3 id="results">Results<a href="#results" class="heading-anchor-link" aria-label="Link to Results"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M2.6 21.4c2 2 5.9 2.9 8.9 0l3.5-3.5-1-1-3.5 3.5c-1.4 1.4-4.2 1.9-6.4-.3s-1.8-5-.3-6.4l3.5-3.5-1-1-3.5 3.5c-3 3-2 6.9 0 8.9ZM21.4 2.6c2 2 2.9 5.9 0 8.9L17.9 15l-1-1 3.5-3.5c1.4-1.4 1.9-4.2-.3-6.4s-5-1.8-6.4-.3l-3.5 3.5-1-1 3.5-3.5c3-3 6.9-2 8.9 0Z" /><path d="m8.01 14.97 6.93-6.93 1.061 1.06-6.93 6.93z" /></svg></a></h3>
<p>To assess how good each setup is, I looked at <strong>Top-1</strong> = the model’s first guess is the correct diagnosis, and <strong>Top-5</strong> = the correct diagnosis appears anywhere in the model’s top 5 guesses.</p>
<p>I tested three different ways of setting up Claude:</p>
<ol>
<li><strong>Vanilla Claude (no tools)</strong> — like opening Claude Desktop and asking a question. Got <strong>47.7%</strong> right on the first guess, already better than a typical first-visit family doctor.</li>
<li><strong>Extended thinking</strong> — same as vanilla, with extended thinking turned on. Lifted accuracy to <strong>54.9%</strong>.</li>
<li><strong>Tool use</strong> — plug in two free public medical databases (<a href="https://pubmed.ncbi.nlm.nih.gov/" target="_blank">PubMed</a> for the literature, the <a href="https://hpo.jax.org/" target="_blank">Human Phenotype Ontology</a> for clinical signs and symptoms). Pushed accuracy to <strong>76.0%</strong> at roughly $0.15 per consult.</li>
</ol>
<figure class="small-multiples"><img src="https://fryanpan.com/charts/smallmultiples-55bfd56f6f11.png" alt="Chart" style="max-width:100%;height:auto;display:block;border:0" /></figure>
<p>Uncertainty is about ±5pp at this sample size, and each step-up is statistically significant under paired same-case tests (p ≤ 0.001). One important caveat on the tools number: on a 25-case rerun under identical conditions, Claude agreed with itself on only 72% of cases — about a quarter of verdicts flip on a fresh run, since each tool-using run takes a slightly different path. The honest read is that tools-with-public-medical-data lands in the mid-to-high 70s on this set of cases, not exactly 76%.</p>
<p>A few reference points for scale:</p>
<ul>
<li><strong>General physician first-visit</strong>: ~26% Top-1 — as reported in the <a href="https://github.com/zhao-zy15/RareArena" target="_blank">RareArena paper</a>.</li>
<li><strong>DeepRare</strong> (Zhao et al., <a href="https://www.nature.com/articles/s41586-025-10097-9" target="_blank"><em>Nature</em> 2026</a>): 57.18% Top-1 averaged across HPO-only public benchmarks, 64.4% on a 163-case real-world hospital cohort (physicians at 54.6%). Different cohorts than I tested on, so this is a ballpark reference, not a head-to-head comparison.</li>
</ul>
<h2 id="opportunities--risks">Opportunities &amp; Risks<a href="#opportunities--risks" class="heading-anchor-link" aria-label="Link to Opportunities &amp; Risks"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M2.6 21.4c2 2 5.9 2.9 8.9 0l3.5-3.5-1-1-3.5 3.5c-1.4 1.4-4.2 1.9-6.4-.3s-1.8-5-.3-6.4l3.5-3.5-1-1-3.5 3.5c-3 3-2 6.9 0 8.9ZM21.4 2.6c2 2 2.9 5.9 0 8.9L17.9 15l-1-1 3.5-3.5c1.4-1.4 1.9-4.2-.3-6.4s-5-1.8-6.4-.3l-3.5 3.5-1-1 3.5-3.5c3-3 6.9-2 8.9 0Z" /><path d="m8.01 14.97 6.93-6.93 1.061 1.06-6.93 6.93z" /></svg></a></h2>
<p>These are encouraging results, but this is an artificial test. Finding candidate diagnoses is only one step in the medical journey — confirming a diagnosis and starting treatment takes much longer.</p>
<p>Over time, though, it seems likely that Claude might be helpful in the following ways:</p>
<ul>
<li><strong>Patient advocacy.</strong> A patient can go to their primary care doctor (PCP) with well-sourced candidate diagnoses and have a better chance of going to the right specialist on the first try. Or they may be able to plan confirmatory tests with their PCP first, if the tests are affordable or specialists are not easy to access (e.g., in developing countries).</li>
<li><strong>Doctor assistance.</strong> Doctors might be able to support their patients with faster or higher-quality diagnoses. Or the electronic health records system could spot patterns over time and alert the right doctor.</li>
</ul>
<p>Medicine is complex, with unintended side effects, so there are many ways that the methods above may fail or not help:</p>
<ul>
<li><strong>Real medicine is messy.</strong> Claude still gets many cases wrong (24% wrong on Top-1, 16% wrong on Top-5), and it will do even worse with real medical records. Medical history is often not as clean or complete as our test cases. Or it might be affected by patient or doctor biases.</li>
<li><strong>Common diseases are more common.</strong> Techniques optimized for surfacing rare diseases might shift focus too much away from common diseases. Common diseases are often easier to diagnose and cheaper to treat. Chasing a rare disease often means expensive testing and months of stress.</li>
<li><strong>Privacy.</strong> Inputs go to Anthropic, and Anthropic is subject to government pressure and data residency rules.</li>
</ul>
<p>So this tool may be useful, but mainly as a way to help speed up discussions with a doctor.</p>
<h2 id="conclusion">Conclusion<a href="#conclusion" class="heading-anchor-link" aria-label="Link to Conclusion"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M2.6 21.4c2 2 5.9 2.9 8.9 0l3.5-3.5-1-1-3.5 3.5c-1.4 1.4-4.2 1.9-6.4-.3s-1.8-5-.3-6.4l3.5-3.5-1-1-3.5 3.5c-3 3-2 6.9 0 8.9ZM21.4 2.6c2 2 2.9 5.9 0 8.9L17.9 15l-1-1 3.5-3.5c1.4-1.4 1.9-4.2-.3-6.4s-5-1.8-6.4-.3l-3.5 3.5-1-1 3.5-3.5c3-3 6.9-2 8.9 0Z" /><path d="m8.01 14.97 6.93-6.93 1.061 1.06-6.93 6.93z" /></svg></a></h2>
<p>From this experiment, I learned that anyone can reach around 70% accuracy in diagnosing rare diseases from PubMed cases — in the same order of magnitude as DeepRare’s reported numbers (though on different cohorts, so not a head-to-head comparison), using only Claude and public medical search tools, a much simpler setup than their multi-agent system with more than 40 specialized tools. It was also humbling to learn how hard it is to know whether the benchmarks are real.  It took a couple of rounds of running the benchmark and auditing to lock down different ways Claude might have memorized or cheated.</p>
<h2 id="try-a-diagnosis-yourself-with-claude-code">Try a Diagnosis Yourself With Claude Code<a href="#try-a-diagnosis-yourself-with-claude-code" class="heading-anchor-link" aria-label="Link to Try a Diagnosis Yourself With Claude Code"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M2.6 21.4c2 2 5.9 2.9 8.9 0l3.5-3.5-1-1-3.5 3.5c-1.4 1.4-4.2 1.9-6.4-.3s-1.8-5-.3-6.4l3.5-3.5-1-1-3.5 3.5c-3 3-2 6.9 0 8.9ZM21.4 2.6c2 2 2.9 5.9 0 8.9L17.9 15l-1-1 3.5-3.5c1.4-1.4 1.9-4.2-.3-6.4s-5-1.8-6.4-.3l-3.5 3.5-1-1 3.5-3.5c3-3 6.9-2 8.9 0Z" /><path d="m8.01 14.97 6.93-6.93 1.061 1.06-6.93 6.93z" /></svg></a></h2>
<p>If this might be useful to you, please give this a try and let me know how it works out!</p>
<h3 id="prerequisites">Prerequisites<a href="#prerequisites" class="heading-anchor-link" aria-label="Link to Prerequisites"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M2.6 21.4c2 2 5.9 2.9 8.9 0l3.5-3.5-1-1-3.5 3.5c-1.4 1.4-4.2 1.9-6.4-.3s-1.8-5-.3-6.4l3.5-3.5-1-1-3.5 3.5c-3 3-2 6.9 0 8.9ZM21.4 2.6c2 2 2.9 5.9 0 8.9L17.9 15l-1-1 3.5-3.5c1.4-1.4 1.9-4.2-.3-6.4s-5-1.8-6.4-.3l-3.5 3.5-1-1 3.5-3.5c3-3 6.9-2 8.9 0Z" /><path d="m8.01 14.97 6.93-6.93 1.061 1.06-6.93 6.93z" /></svg></a></h3>
<ul>
<li><a href="https://github.com/astral-sh/uv" target="_blank">uv</a> for the HPO MCP server’s Python dependencies</li>
<li><code>node</code> &amp; <code>npx</code> for the PubMed MCP server</li>
<li><a href="https://code.claude.com/docs/en/quickstart" target="_blank">Claude Code</a> installed and authenticated</li>
</ul>
<h3 id="steps">Steps<a href="#steps" class="heading-anchor-link" aria-label="Link to Steps"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M2.6 21.4c2 2 5.9 2.9 8.9 0l3.5-3.5-1-1-3.5 3.5c-1.4 1.4-4.2 1.9-6.4-.3s-1.8-5-.3-6.4l3.5-3.5-1-1-3.5 3.5c-3 3-2 6.9 0 8.9ZM21.4 2.6c2 2 2.9 5.9 0 8.9L17.9 15l-1-1 3.5-3.5c1.4-1.4 1.9-4.2-.3-6.4s-5-1.8-6.4-.3l-3.5 3.5-1-1 3.5-3.5c3-3 6.9-2 8.9 0Z" /><path d="m8.01 14.97 6.93-6.93 1.061 1.06-6.93 6.93z" /></svg></a></h3>
<ol>
<li><strong>Open Claude Code in a folder for this session.</strong> If you have medical records you want Claude to read — PDFs of lab results, appointment notes, imaging reports — put them in a folder and start Claude Code there. If you don’t have any yet, an empty folder works too; you’ll describe symptoms in your own words during the consultation.</li>
</ol>
<div class="code-block-wrapper"><svg class="icon-copy" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M6.9.8v18h14.5V.8zm12.8 16h-11v-14h11z" /><path d="M4.3 21.2V5.6l-1.7.5v17.1h14.3l.6-2z" /></svg><svg class="icon-check" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="m23.1 6.4-1.3-1.3L9.4 16.6l-6.3-5.4-1.2 1.2L9.4 20z" /></svg><pre class="astro-code astro-code-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8;overflow-x:auto"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">mkdir</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -p</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> ~/records</span><span style="color:#6A737D;--shiki-dark:#6A737D">       # or skip if you already have one</span></span>
<span class="line"><span style="color:#005CC5;--shiki-dark:#79B8FF">cd</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> ~/records</span></span>
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">claude</span></span></code></pre></div>
<ol>
<li><strong>Install the plugin.</strong> In the Claude Code session, paste this and press enter:</li>
</ol>
<blockquote>
<p>“Please install the rare-disease-consult plugin from <a href="https://github.com/fryanpan/rare-disease-consult-plugin" target="_blank">https://github.com/fryanpan/rare-disease-consult-plugin</a>. Follow the instructions in its AGENT_INSTALL.md file.”</p>
</blockquote>
<p>Claude will show a disclaimer, check that you have <code>uv</code> and <code>node</code>/<code>npx</code> (and offer to install them if missing), clone the plugin, register it, and tell you when to restart.</p>
<ol>
<li><strong>Start the consultation:</strong></li>
</ol>
<div class="code-block-wrapper"><svg class="icon-copy" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M6.9.8v18h14.5V.8zm12.8 16h-11v-14h11z" /><path d="M4.3 21.2V5.6l-1.7.5v17.1h14.3l.6-2z" /></svg><svg class="icon-check" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="m23.1 6.4-1.3-1.3L9.4 16.6l-6.3-5.4-1.2 1.2L9.4 20z" /></svg><pre class="astro-code astro-code-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8;overflow-x:auto"><code><span class="line"><span>/consult</span></span></code></pre></div>
<p>During intake, describe symptoms in your own words. If you put records in the folder, you can also point Claude at them: <em>“Please read the files in this folder and use them in the intake.”</em></p>
<p>If you’d rather install the plugin manually, see the <a href="https://github.com/fryanpan/rare-disease-consult-plugin#installation" target="_blank">plugin README’s Installation section</a> for the clone + register flow.</p>
<p>A few notes: the first invocation downloads HPO data (~50 MB, ~30 seconds, one-time). <strong>Currently Claude Code only</strong> — the plugin uses local helper tools (<code>uv</code> and <code>node</code>/<code>npx</code>) that aren’t yet available in Claude Cowork’s hosted runtime. Let me know if you want this to work in Cowork and I can take a look.</p>
<h2 id="links">Links<a href="#links" class="heading-anchor-link" aria-label="Link to Links"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M2.6 21.4c2 2 5.9 2.9 8.9 0l3.5-3.5-1-1-3.5 3.5c-1.4 1.4-4.2 1.9-6.4-.3s-1.8-5-.3-6.4l3.5-3.5-1-1-3.5 3.5c-3 3-2 6.9 0 8.9ZM21.4 2.6c2 2 2.9 5.9 0 8.9L17.9 15l-1-1 3.5-3.5c1.4-1.4 1.9-4.2-.3-6.4s-5-1.8-6.4-.3l-3.5 3.5-1-1 3.5-3.5c3-3 6.9-2 8.9 0Z" /><path d="m8.01 14.97 6.93-6.93 1.061 1.06-6.93 6.93z" /></svg></a></h2>
<ul>
<li><strong>Benchmark + methodology:</strong> <a href="https://github.com/fryanpan/rare_disease_benchmark" target="_blank">github.com/fryanpan/rare_disease_benchmark</a> (CC BY-NC-SA 4.0) — full audit and reproduction notes.</li>
<li><strong>Read the caveats first:</strong> the <a href="https://github.com/fryanpan/rare-disease-consult-plugin#caveats" target="_blank">plugin README</a> covers the full risk list. This is <strong>v0.1</strong> — it has not been validated on real patient cases.</li>
</ul>]]></content:encoded>
            <author>Bryan Chan</author>
        </item>
        <item>
            <title><![CDATA[Working with my agent team from my phone]]></title>
            <link>https://fryanpan.com/posts/agent-team/</link>
            <guid isPermaLink="false">https://fryanpan.com/posts/agent-team/</guid>
            <pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How I tuned my Claude Code agent setup to keep my side projects rolling while exploring Berlin from cafés, trains, and bike rides.]]></description>
            <content:encoded><![CDATA[<p>Was out on the Mauerweg the other day — a training ride on a cool Berlin afternoon. Paused for a banana bread break and pulled out my phone to see where my Claude Code agents were at. They run around the clock on my Mac mini.</p>
<p>Asked my team lead agent for a hit list of what needed my attention. Reviewed a draft of this blog post and sent some edit requests. Checked an interactive mockup, left some comments. Looked over some training examples for one of my projects and kicked off the next round.  Five minutes later, I was done with my banana bread, and my agents had what they needed for the next chunk of work.</p>
<p>In the past two months in Berlin, I’ve made exploring a priority. But I’ve also wanted to keep my side projects rolling, so I’ve been tuning my agent setup to let me review when my agents need input, and I have time to spare.</p>
<h2 id="what-ive-done-with-this-team-in-the-last-six-weeks">What I’ve done with this team in the last six weeks<a href="#what-ive-done-with-this-team-in-the-last-six-weeks" class="heading-anchor-link" aria-label="Link to What I’ve done with this team in the last six weeks"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M2.6 21.4c2 2 5.9 2.9 8.9 0l3.5-3.5-1-1-3.5 3.5c-1.4 1.4-4.2 1.9-6.4-.3s-1.8-5-.3-6.4l3.5-3.5-1-1-3.5 3.5c-3 3-2 6.9 0 8.9ZM21.4 2.6c2 2 2.9 5.9 0 8.9L17.9 15l-1-1 3.5-3.5c1.4-1.4 1.9-4.2-.3-6.4s-5-1.8-6.4-.3l-3.5 3.5-1-1 3.5-3.5c3-3 6.9-2 8.9 0Z" /><path d="m8.01 14.97 6.93-6.93 1.061 1.06-6.93 6.93z" /></svg></a></h2>
<p>Here’s what this workflow has helped me do since early April, with around 15 hours a week of hands-on time:</p>
<ul>
<li>Started getting back in touch with old friends and colleagues.  It really has been a joy!</li>
<li>Tested how well Claude can diagnose rare diseases (follow-up to <a href="https://www.thelancet.com/journals/landig/article/PIIS2589-7500(25)00135-9/fulltext" target="_blank">RareArena</a>)</li>
<li>Made my <a href="https://octoturtle.net/2026/04/28/family-bike-map-prototype/" target="_blank">family bike map</a> usable day-to-day in Berlin</li>
<li>Honed my approach for how I spend my time each week</li>
<li>Worked with our H&amp;R Block rep to do our taxes</li>
<li>Set up a <a href="https://fryanpan.com/" target="_blank">personal site</a> and writing workflow. I’ll try to post at least once a week!</li>
<li>Built a way to measure agent-team effectiveness and continuously improve</li>
<li>Planned many activities around Berlin with my boo on Discord</li>
<li>Started helping friends out at a nonprofit with Android development</li>
<li>And…built this agent workflow to meet my needs!</li>
</ul>
<p>I wanted to share this post as background context. After this, I promise no more agent infrastructure posts for the next two months. I think it’s more interesting to talk about what I try to do with my agents, rather than how the agents are set up.</p>
<p>If you really want to know about my evolving agent workflow, follow along in my open-source repos linked throughout this post…</p>
<h2 id="the-agent-team">The agent team<a href="#the-agent-team" class="heading-anchor-link" aria-label="Link to The agent team"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M2.6 21.4c2 2 5.9 2.9 8.9 0l3.5-3.5-1-1-3.5 3.5c-1.4 1.4-4.2 1.9-6.4-.3s-1.8-5-.3-6.4l3.5-3.5-1-1-3.5 3.5c-3 3-2 6.9 0 8.9ZM21.4 2.6c2 2 2.9 5.9 0 8.9L17.9 15l-1-1 3.5-3.5c1.4-1.4 1.9-4.2-.3-6.4s-5-1.8-6.4-.3l-3.5 3.5-1-1 3.5-3.5c3-3 6.9-2 8.9 0Z" /><path d="m8.01 14.97 6.93-6.93 1.061 1.06-6.93 6.93z" /></svg></a></h2>
<p>I run a team of long-running <a href="https://code.claude.com/" target="_blank">Claude Code</a> sessions on a Mac mini at home — one per project I care about, plus a team lead that coordinates them. Claude Code is Anthropic’s coding agent; you can run it on your own machine.</p>
<p>Keeping each session running around the clock means each agent remembers what we’ve been discussing, plus longer-term notes I keep with them in markdown files or Notion docs.</p>
<p>The team today:</p>
<ul>
<li>A <strong>writing assistant</strong> for blog posts and my personal site. Also gives guidance to other agents when they need help writing.</li>
<li>A <strong>personal assistant</strong> — an assistant that Joanna and I both have a Discord chat with. Helps us research things like what to do in Berlin, where to go for Bea’s after-school outings, or how to fix a flat tire on my Helix folding bike.</li>
<li>A <strong>personal CRM agent</strong> that helps me reconnect with people from the past — I’m finally trying to get better about that.</li>
<li>A <strong>finance agent</strong> that helps with taxes, donations, and financial planning.</li>
<li>A <strong>research team</strong> that runs on-demand investigations and scheduled monitoring of high-signal sources I care about.</li>
<li>Half a dozen <strong>coding agents</strong> for various side projects</li>
</ul>
<pre class="mermaid">flowchart TD
  subgraph User["Phone or laptop"]
    UApp["Claude app or browser"]
  end

  RC["Remote Control"]
  TS["Tailscale"]
  Events["Discord, GitHub, Notion events"]

  subgraph Mac["Mac mini at home"]
    TL["Team lead"]
    PA["Project agents"]
    LF["Live Feedback server"]
    TL &lt;--&gt;|"claude-hive"| PA
    PA --&gt;|"starts review sessions"| LF
  end

  UApp --&gt;|"chat"| RC
  RC --&gt; TL
  RC --&gt; PA
  UApp --&gt;|"review work"| TS
  TS --&gt; LF
  Events --&gt;|"event bridges"| PA

  style User fill:#fef3c7,stroke:#999
  style Mac fill:#e0f2fe,stroke:#999
</pre>
<h2 id="the-weekly-rhythm">The weekly rhythm<a href="#the-weekly-rhythm" class="heading-anchor-link" aria-label="Link to The weekly rhythm"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M2.6 21.4c2 2 5.9 2.9 8.9 0l3.5-3.5-1-1-3.5 3.5c-1.4 1.4-4.2 1.9-6.4-.3s-1.8-5-.3-6.4l3.5-3.5-1-1-3.5 3.5c-3 3-2 6.9 0 8.9ZM21.4 2.6c2 2 2.9 5.9 0 8.9L17.9 15l-1-1 3.5-3.5c1.4-1.4 1.9-4.2-.3-6.4s-5-1.8-6.4-.3l-3.5 3.5-1-1 3.5-3.5c3-3 6.9-2 8.9 0Z" /><path d="m8.01 14.97 6.93-6.93 1.061 1.06-6.93 6.93z" /></svg></a></h2>
<p>Each week, the team lead and I plan major goals. The plan goes to Notion. The team lead sends it to the team to vet; I leave comments in Notion; the plan adjusts from there.</p>
<p>When the plan looks good, the team lead kicks off the work.</p>
<p>And then throughout the week, whenever I have time to help, I ask the team lead what needs my attention, and in what order.</p>
<h2 id="the-tools-that-let-me-work-on-the-go">The tools that let me work on the go<a href="#the-tools-that-let-me-work-on-the-go" class="heading-anchor-link" aria-label="Link to The tools that let me work on the go"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M2.6 21.4c2 2 5.9 2.9 8.9 0l3.5-3.5-1-1-3.5 3.5c-1.4 1.4-4.2 1.9-6.4-.3s-1.8-5-.3-6.4l3.5-3.5-1-1-3.5 3.5c-3 3-2 6.9 0 8.9ZM21.4 2.6c2 2 2.9 5.9 0 8.9L17.9 15l-1-1 3.5-3.5c1.4-1.4 1.9-4.2-.3-6.4s-5-1.8-6.4-.3l-3.5 3.5-1-1 3.5-3.5c3-3 6.9-2 8.9 0Z" /><path d="m8.01 14.97 6.93-6.93 1.061 1.06-6.93 6.93z" /></svg></a></h2>
<p>I don’t sit at the Mac mini anymore. I tap into it from wherever I am. Here are the pieces that make it work:</p>
<h3 id="remote-control--chat-with-my-agents-on-the-go">Remote Control — chat with my agents on the go<a href="#remote-control--chat-with-my-agents-on-the-go" class="heading-anchor-link" aria-label="Link to Remote Control — chat with my agents on the go"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M2.6 21.4c2 2 5.9 2.9 8.9 0l3.5-3.5-1-1-3.5 3.5c-1.4 1.4-4.2 1.9-6.4-.3s-1.8-5-.3-6.4l3.5-3.5-1-1-3.5 3.5c-3 3-2 6.9 0 8.9ZM21.4 2.6c2 2 2.9 5.9 0 8.9L17.9 15l-1-1 3.5-3.5c1.4-1.4 1.9-4.2-.3-6.4s-5-1.8-6.4-.3l-3.5 3.5-1-1 3.5-3.5c3-3 6.9-2 8.9 0Z" /><path d="m8.01 14.97 6.93-6.93 1.061 1.06-6.93 6.93z" /></svg></a></h3>
<p>Claude Code sessions run around the clock on the Mac mini. To connect from a laptop or phone via the official Claude app, I’ve set <a href="https://code.claude.com/docs/en/remote-control#enable-remote-control-for-all-sessions" target="_blank">Remote Control</a> to on for all sessions in my Claude Code configuration.</p>
<h3 id="the-team-lead-coordinates-the-fleet">The team lead coordinates the fleet<a href="#the-team-lead-coordinates-the-fleet" class="heading-anchor-link" aria-label="Link to The team lead coordinates the fleet"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M2.6 21.4c2 2 5.9 2.9 8.9 0l3.5-3.5-1-1-3.5 3.5c-1.4 1.4-4.2 1.9-6.4-.3s-1.8-5-.3-6.4l3.5-3.5-1-1-3.5 3.5c-3 3-2 6.9 0 8.9ZM21.4 2.6c2 2 2.9 5.9 0 8.9L17.9 15l-1-1 3.5-3.5c1.4-1.4 1.9-4.2-.3-6.4s-5-1.8-6.4-.3l-3.5 3.5-1-1 3.5-3.5c3-3 6.9-2 8.9 0Z" /><path d="m8.01 14.97 6.93-6.93 1.061 1.06-6.93 6.93z" /></svg></a></h3>
<p>One of those Claude Code sessions is the team lead. It works with me each week to set shared goals across the whole agent team.  And then the team lead keeps everyone moving on tasks, troubleshoots issues, and relays context between teammates.  That makes it easier for me to work on the go since I can write a brief request to the team lead, and it handles the rest.</p>
<p>The team lead also helps the team reflect and improve using months of Claude Code transcripts.</p>
<p>The closest existing tool is <a href="https://support.claude.com/en/articles/13947068-assign-tasks-from-anywhere-in-claude-cowork" target="_blank">Claude Cowork</a>, Anthropic’s agentic tool for non-technical users.  My team lead running in Claude Code is more customizable.</p>
<p>Open source team lead: <a href="https://github.com/fryanpan/ai-team-lead" target="_blank">fryanpan/ai-team-lead</a></p>
<p>Under the hood, the team lead and agents on the team use <a href="https://github.com/KevinLyxz/claude-hive-mcp" target="_blank">claude-hive</a> to message each other.</p>
<h3 id="live-feedback--review-docs-mockups-and-dev-servers-from-any-device">Live Feedback — review docs, mockups, and dev servers from any device<a href="#live-feedback--review-docs-mockups-and-dev-servers-from-any-device" class="heading-anchor-link" aria-label="Link to Live Feedback — review docs, mockups, and dev servers from any device"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M2.6 21.4c2 2 5.9 2.9 8.9 0l3.5-3.5-1-1-3.5 3.5c-1.4 1.4-4.2 1.9-6.4-.3s-1.8-5-.3-6.4l3.5-3.5-1-1-3.5 3.5c-3 3-2 6.9 0 8.9ZM21.4 2.6c2 2 2.9 5.9 0 8.9L17.9 15l-1-1 3.5-3.5c1.4-1.4 1.9-4.2-.3-6.4s-5-1.8-6.4-.3l-3.5 3.5-1-1 3.5-3.5c3-3 6.9-2 8.9 0Z" /><path d="m8.01 14.97 6.93-6.93 1.061 1.06-6.93 6.93z" /></svg></a></h3>
<p>Before this plugin, reviewing what Claude sent me was tedious.  Claude would send me markdown docs or interactive mockups during planning, or dev server links while implementing and testing.  I’d have to figure out how to access these links remotely, and then jump between the link and chatting with Claude to give feedback.</p>
<p>My live feedback plugin collapses that loop. Now I can comment directly on the doc, running app, or mockup; the agent on the other side makes updates, and they show up immediately while I’m still reviewing.</p>
<p>Open source feedback plugin: <a href="https://github.com/fryanpan/claude-live-feedback-plugin" target="_blank">fryanpan/claude-live-feedback-plugin</a></p>
<p>The plugin uses <a href="https://code.claude.com/docs/en/channels" target="_blank">Claude Channels</a> (Anthropic’s real-time notification feature), released in March 2026, for pushing notifications into a running Claude session.</p>
<h3 id="tailscale--the-private-network-underneath">Tailscale — the private network underneath<a href="#tailscale--the-private-network-underneath" class="heading-anchor-link" aria-label="Link to Tailscale — the private network underneath"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M2.6 21.4c2 2 5.9 2.9 8.9 0l3.5-3.5-1-1-3.5 3.5c-1.4 1.4-4.2 1.9-6.4-.3s-1.8-5-.3-6.4l3.5-3.5-1-1-3.5 3.5c-3 3-2 6.9 0 8.9ZM21.4 2.6c2 2 2.9 5.9 0 8.9L17.9 15l-1-1 3.5-3.5c1.4-1.4 1.9-4.2-.3-6.4s-5-1.8-6.4-.3l-3.5 3.5-1-1 3.5-3.5c3-3 6.9-2 8.9 0Z" /><path d="m8.01 14.97 6.93-6.93 1.061 1.06-6.93 6.93z" /></svg></a></h3>
<p><a href="https://tailscale.com" target="_blank">Tailscale</a> is a private mesh network between my devices. My phone, laptop, and the Mac mini all show up on the same network without a public tunnel between them. Live Feedback and any dev servers I spin up on the Mac mini are reachable from anywhere I am. No port-forwarding, no public exposure, no surprise scanners.</p>
<h3 id="responding-to-other-events-discord-github">Responding to Other Events: Discord, GitHub<a href="#responding-to-other-events-discord-github" class="heading-anchor-link" aria-label="Link to Responding to Other Events: Discord, GitHub"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M2.6 21.4c2 2 5.9 2.9 8.9 0l3.5-3.5-1-1-3.5 3.5c-1.4 1.4-4.2 1.9-6.4-.3s-1.8-5-.3-6.4l3.5-3.5-1-1-3.5 3.5c-3 3-2 6.9 0 8.9ZM21.4 2.6c2 2 2.9 5.9 0 8.9L17.9 15l-1-1 3.5-3.5c1.4-1.4 1.9-4.2-.3-6.4s-5-1.8-6.4-.3l-3.5 3.5-1-1 3.5-3.5c3-3 6.9-2 8.9 0Z" /><path d="m8.01 14.97 6.93-6.93 1.061 1.06-6.93 6.93z" /></svg></a></h3>
<p>Three other pieces let the team pick up events and kick off work on their own, without me having to relay a prompt.</p>
<ul>
<li>A <a href="https://claude.com/plugins/discord" target="_blank"><strong>Discord plugin</strong></a> lets Joanna and me chat with the personal assistant agent from anywhere.</li>
<li>A <a href="https://github.com/fryanpan/github-claude-channel" target="_blank"><strong>GitHub event bridge</strong></a> lets coding agents take a feature all the way from code review through addressing reviewer comments to merging and deploying — similar to Claude’s Automerge feature but covering more steps.</li>
<li>A <a href="https://github.com/fryanpan/notion-channel-mcp" target="_blank"><strong>Notion bridge</strong></a> lets the agents listen to pages or whole sections in Notion and react to comments and edits on those pages.</li>
</ul>
<h2 id="what-this-setup-gives-me">What this setup gives me<a href="#what-this-setup-gives-me" class="heading-anchor-link" aria-label="Link to What this setup gives me"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M2.6 21.4c2 2 5.9 2.9 8.9 0l3.5-3.5-1-1-3.5 3.5c-1.4 1.4-4.2 1.9-6.4-.3s-1.8-5-.3-6.4l3.5-3.5-1-1-3.5 3.5c-3 3-2 6.9 0 8.9ZM21.4 2.6c2 2 2.9 5.9 0 8.9L17.9 15l-1-1 3.5-3.5c1.4-1.4 1.9-4.2-.3-6.4s-5-1.8-6.4-.3l-3.5 3.5-1-1 3.5-3.5c3-3 6.9-2 8.9 0Z" /><path d="m8.01 14.97 6.93-6.93 1.061 1.06-6.93 6.93z" /></svg></a></h2>
<p>This setup lets me work from anywhere and give input in batches — no more constantly juggling open chats.</p>
<p>It does not, however, make me any more productive.  I’ve measured my team’s output using historical transcripts. For each hour of hands-on effort I put in, my agents produce about the same as they would if I only worked from my desk — the setup doesn’t change the per-hour ratio, it just lets me work on the move.</p>
<h2 id="whats-still-hard">What’s still hard<a href="#whats-still-hard" class="heading-anchor-link" aria-label="Link to What’s still hard"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M2.6 21.4c2 2 5.9 2.9 8.9 0l3.5-3.5-1-1-3.5 3.5c-1.4 1.4-4.2 1.9-6.4-.3s-1.8-5-.3-6.4l3.5-3.5-1-1-3.5 3.5c-3 3-2 6.9 0 8.9ZM21.4 2.6c2 2 2.9 5.9 0 8.9L17.9 15l-1-1 3.5-3.5c1.4-1.4 1.9-4.2-.3-6.4s-5-1.8-6.4-.3l-3.5 3.5-1-1 3.5-3.5c3-3 6.9-2 8.9 0Z" /><path d="m8.01 14.97 6.93-6.93 1.061 1.06-6.93 6.93z" /></svg></a></h2>
<p>Multi-agent setups introduce flakiness. This is more stable than my March setup (custom-built agents running on cloud servers, chatted to through Slack, before Remote Control and Dispatch existed), but it still pulls 1–2 hours of orchestration and maintenance time out of my week. The hive messaging went down a few days ago due to a bad configuration change; for a few hours, all my agents were sending each other messages with no deliveries, which led to mass confusion until I asked the team lead what was up and went to fix it. Plus, several Claude components I depend on, like Remote Control or Channels, are flaky too and seem to fail once a week or so. Over time, I’ll make these pieces more stable, or hopefully, can depend on 3rd parties to build more robust versions!</p>
<p>Managing the agents’ memory is an ongoing challenge. With sessions running for days, the conversation history piles up. That history costs money, plus it isn’t organized in a way that will work as I dump more knowledge in.  When I feel this is painful enough, I’ll bring in more complicated memory structures — everyone seems to be working on these.</p>
<h2 id="whats-next">What’s next<a href="#whats-next" class="heading-anchor-link" aria-label="Link to What’s next"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M2.6 21.4c2 2 5.9 2.9 8.9 0l3.5-3.5-1-1-3.5 3.5c-1.4 1.4-4.2 1.9-6.4-.3s-1.8-5-.3-6.4l3.5-3.5-1-1-3.5 3.5c-3 3-2 6.9 0 8.9ZM21.4 2.6c2 2 2.9 5.9 0 8.9L17.9 15l-1-1 3.5-3.5c1.4-1.4 1.9-4.2-.3-6.4s-5-1.8-6.4-.3l-3.5 3.5-1-1 3.5-3.5c3-3 6.9-2 8.9 0Z" /><path d="m8.01 14.97 6.93-6.93 1.061 1.06-6.93 6.93z" /></svg></a></h2>
<p>I’m happy so far with how smoothly this setup lets me work on the go. In the coming weeks, I’ll keep reviewing with the team to see what’s worth improving next.</p>
<p>A few areas already on my list:</p>
<ul>
<li>Making as-good-or-better decisions with less hands-on time from me</li>
<li>Organizing my work so I stay in flow and focus on one area at a time</li>
<li>Measuring and honing how the team delivers value (this will be hard!)</li>
<li>Fixing infrastructure reliability or usability</li>
</ul>
<p>I’ll start writing more about what I’ve been doing with my agents — rare disease diagnosis is probably up next.</p>]]></content:encoded>
            <author>Bryan Chan</author>
        </item>
        <item>
            <title><![CDATA[Welcome to fryanpan.com]]></title>
            <link>https://fryanpan.com/posts/welcome/</link>
            <guid isPermaLink="false">https://fryanpan.com/posts/welcome/</guid>
            <pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[I've wanted to have a place on the web that makes it easier to connect with people (and agents).  This is the start of a basic personal site where I hope to do that!]]></description>
            <content:encoded><![CDATA[<p>I’ve wanted to have a place on the web that makes it easier to connect with people (and agents).  This is the start of a basic personal site where I hope to do that!</p>
<p>I’ll continue to post to <a href="https://octoturtle.net/" target="_blank">Octoturtle blog</a> for things related to the family, but this blog will have more personal or technical topics for friends, family, and anyone interested in following along.</p>
<p>Plus for anyone who might want to work with me, there’s an “About Me” page in human-readable format.</p>]]></content:encoded>
            <author>Bryan Chan</author>
        </item>
        <item>
            <title><![CDATA[Building A Better Family Bike Map Prototype]]></title>
            <link>https://fryanpan.com/posts/family-bike-map-prototype/</link>
            <guid isPermaLink="false">https://fryanpan.com/posts/family-bike-map-prototype/</guid>
            <pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Navigating Berlin with our four-year-old, the "good" bike routes from Google Maps kept dropping us onto painted bike lanes on major roads. So I spent about 32 hours over a few weeks building a prototype that finds actually-quiet routes for families with young kids.]]></description>
            <author>Bryan Chan</author>
        </item>
        <item>
            <title><![CDATA[Choose Where Your Money Goes (Beyond Taxes!)]]></title>
            <link>https://fryanpan.com/posts/beyond-taxes/</link>
            <guid isPermaLink="false">https://fryanpan.com/posts/beyond-taxes/</guid>
            <pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Notes on how I structure my charitable giving — donating appreciated stock through a Donor Advised Fund, why I weight international causes more heavily than domestic, and what the tax mechanics actually are. Written for friends who've asked how this works.]]></description>
            <author>Bryan Chan</author>
        </item>
    </channel>
</rss>