<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: J Now</title>
    <description>The latest articles on Forem by J Now (@palo_alto_ai).</description>
    <link>https://forem.com/palo_alto_ai</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3875408%2F4401de35-525d-496b-b2fb-347e8052bfa1.png</url>
      <title>Forem: J Now</title>
      <link>https://forem.com/palo_alto_ai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/palo_alto_ai"/>
    <language>en</language>
    <item>
      <title>Why I don't know if I'm actually getting better at using Claude</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Tue, 26 May 2026 19:58:23 +0000</pubDate>
      <link>https://forem.com/palo_alto_ai/why-i-dont-know-if-im-actually-getting-better-at-using-claude-e15</link>
      <guid>https://forem.com/palo_alto_ai/why-i-dont-know-if-im-actually-getting-better-at-using-claude-e15</guid>
      <description>&lt;p&gt;Months of daily Claude Code sessions, and I had no reliable signal on whether my collaboration patterns were improving or just calcifying. I was faster, probably. But faster at what?&lt;/p&gt;

&lt;p&gt;Anthropic published a study in February 2026 measuring 11 observable collaboration behaviors across 9,830 Claude conversations. I wanted to run that same classification on my own session history and see which behaviors I never touch.&lt;/p&gt;

&lt;p&gt;So I built skill-tree: it reads your Claude Code or Cowork session files, classifies those 11 behaviors from Anthropic's AI Fluency Index, assigns one of seven archetype cards (rendered as tarot cards with curated museum art, see live example at skill-tree-ai.fly.dev/fixture/illuminator), and surfaces one behavior you haven't tried as a growth quest for your next session.&lt;/p&gt;

&lt;p&gt;The orchestration is 7 steps — find session files, extract user messages, remote classifier (Claude Haiku on Fly.io), archetype assignment, narrative synthesis, render, return URL — and runs in 30–60 seconds end-to-end.&lt;/p&gt;

&lt;p&gt;The interesting design problem was persistence. Growth quests need to survive across sessions, which is straightforward in Claude Code: write state to &lt;code&gt;~/.skill-tree/&lt;/code&gt; and it's there next time. Cowork is different. Its &lt;code&gt;$HOME&lt;/code&gt; is ephemeral — anything you write there is gone when the session ends. So the tool splits paths: Claude Code uses &lt;code&gt;~/.skill-tree/&lt;/code&gt;, Cowork uses &lt;code&gt;$CLAUDE_PLUGIN_ROOT/.user-state/&lt;/code&gt; because that volume persists across sessions even though &lt;code&gt;$HOME&lt;/code&gt; doesn't.&lt;/p&gt;

&lt;p&gt;One path per client, both resolve to the same data structure. The SessionStart hook reads from whichever path is populated and injects the active quest into the session context before you type anything.&lt;/p&gt;

&lt;p&gt;Install in Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude plugin marketplace add robertnowell/ai-fluency-skill-cards
claude plugin &lt;span class="nb"&gt;install &lt;/span&gt;skill-tree-ai@ai-fluency-skill-cards
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Cowork, install via &lt;code&gt;skill-tree-ai.zip&lt;/code&gt;. Also available as an MCP server (&lt;code&gt;npm install skill-tree-ai&lt;/code&gt;) for Cursor, VS Code, and Windsurf.&lt;/p&gt;

&lt;p&gt;The behavior taxonomy comes from Dakan &amp;amp; Feller's 4D AI Fluency Framework — Description, Discernment, Delegation are the three axes visible in chat logs. Diligence is the fourth axis but doesn't surface in conversation data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/robertnowell/ai-fluency-skill-cards" rel="noopener noreferrer"&gt;https://github.com/robertnowell/ai-fluency-skill-cards&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Terminal themes are tuned for syntax. Mine are tuned for prose.</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Tue, 26 May 2026 17:23:08 +0000</pubDate>
      <link>https://forem.com/palo_alto_ai/terminal-themes-are-tuned-for-syntax-mine-are-tuned-for-prose-247f</link>
      <guid>https://forem.com/palo_alto_ai/terminal-themes-are-tuned-for-syntax-mine-are-tuned-for-prose-247f</guid>
      <description>&lt;p&gt;Spend a few hours in an AI coding assistant and count what's actually on screen. Tool output confirming a file write. A reasoning block working through a refactor. A permission prompt asking if you want to run bash. It's paragraphs — body-size prose, not syntax-highlighted code. Standard terminal themes are built for token colorization. That optimization is largely irrelevant when your screen is 80% English sentences.&lt;/p&gt;

&lt;p&gt;I built klein-blue around that mismatch. Four &lt;code&gt;.terminal&lt;/code&gt; profile variations for macOS Terminal.app, anchored on Yves Klein's IKB pigment, with contrast verified using APCA rather than WCAG ratios. APCA distinguishes between body text, subtle annotations, and decorative accents — WCAG doesn't, and the difference matters when you're reading prose for hours.&lt;/p&gt;

&lt;p&gt;One concrete detail worth knowing: pure IKB (hex 002FA7) fails as readable text on dark ground — APCA Lc -12, effectively invisible. So I split it across two ANSI slots. The &lt;code&gt;ansi:blue&lt;/code&gt; slot gets the pure IKB pigment for decorative borders and highlights where legibility isn't the point. The &lt;code&gt;ansi:blueBright&lt;/code&gt; slot gets a lifted Klein-family &lt;code&gt;A8BEF0&lt;/code&gt; that clears the Lc 60 accent gate and lands on the permission-prompt text you actually need to read.&lt;/p&gt;

&lt;p&gt;The four variations differ on one decision: what to do with &lt;code&gt;ansi:redBright&lt;/code&gt;, which is the slot Claude Code uses for its claude-sand brand color. Klein Void Sand &amp;amp; Sea accepts it as a second hero color alongside IKB. Klein Void Refined neutralizes it so IKB is the only color competing for attention. Klein Void Prot is the strict version — every accent slot passes APCA gates, body text hits Lc 90+, subtle text Lc 75+. Klein Void Gallery pushes toward maximum void: one blue, everything else near-neutral.&lt;/p&gt;

&lt;p&gt;Installation requires one non-obvious step: Claude Code's &lt;code&gt;/theme&lt;/code&gt; picker must be set to &lt;code&gt;dark-ansi&lt;/code&gt;. If it's left on the default, Claude Code ignores the Terminal.app ANSI profile entirely and uses its own hardcoded RGB palette.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/robertnowell/klein-void
&lt;span class="nb"&gt;cd &lt;/span&gt;klein-void
bash install.sh
&lt;span class="c"&gt;# then in Claude Code: /theme -&amp;gt; dark-ansi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rollback is &lt;code&gt;bash restore.sh&lt;/code&gt; — it writes back whatever Terminal.app profile was active before install.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/robertnowell/klein-void" rel="noopener noreferrer"&gt;https://github.com/robertnowell/klein-void&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Terminal themes optimize for syntax highlighting; that's the wrong target</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Tue, 26 May 2026 12:35:53 +0000</pubDate>
      <link>https://forem.com/palo_alto_ai/terminal-themes-optimize-for-syntax-highlighting-thats-the-wrong-target-58i</link>
      <guid>https://forem.com/palo_alto_ai/terminal-themes-optimize-for-syntax-highlighting-thats-the-wrong-target-58i</guid>
      <description>&lt;p&gt;Spend a few hours in Claude Code and count what you actually read: tool output, reasoning traces, permission prompts, explanations. Maybe 20% is code. The rest is English at body size, continuous, for hours. Standard terminal themes are built around syntax highlighting — they're solving a different problem.&lt;/p&gt;

&lt;p&gt;klein-blue is four Terminal.app themes built around Yves Klein's IKB pigment, tuned specifically for the ANSI slots Claude Code assigns to prose-heavy output. The APCA contrast gates are set per role: body text ≥ Lc 90, subtle text ≥ 75, muted ≥ 45. Those aren't aesthetic choices — Lc 90 is roughly where body-size text stops being fatiguing over a long session.&lt;/p&gt;

&lt;p&gt;The IKB detail worth knowing: pure Klein blue (hex 002FA7) fails as text on dark ground at APCA Lc -12 — effectively invisible. The themes split it across two ANSI slots: pure IKB in &lt;code&gt;ansi:blue&lt;/code&gt; for decorative borders and highlights where legibility isn't the requirement, and a lifted Klein-family blue (A8BEF0) in &lt;code&gt;ansi:blueBright&lt;/code&gt; for permission-prompt text that actually needs to be read. Keeping IKB somewhere in the palette was the constraint the whole thing was built around.&lt;/p&gt;

&lt;p&gt;The four variations differ mainly in how they handle &lt;code&gt;ansi:redBright&lt;/code&gt; — the slot Claude Code uses for its claude-sand brand color. Two variations neutralize it to avoid competing with Klein blue as a second hero; two accept it and build a two-color palette around the tension.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/robertnowell/klein-void
&lt;span class="nb"&gt;cd &lt;/span&gt;klein-void &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ./install.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After install, set Claude Code's &lt;code&gt;/theme&lt;/code&gt; to &lt;code&gt;dark-ansi&lt;/code&gt; — without that, Claude Code ignores the ANSI profile entirely and falls back to its hardcoded RGB palette.&lt;/p&gt;

&lt;p&gt;MIT. &lt;a href="https://github.com/robertnowell/klein-void" rel="noopener noreferrer"&gt;https://github.com/robertnowell/klein-void&lt;/a&gt;&lt;/p&gt;

</description>
      <category>claude</category>
      <category>cli</category>
      <category>design</category>
      <category>ux</category>
    </item>
    <item>
      <title>Reading online without a dictionary open is a compromise</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Mon, 25 May 2026 19:17:08 +0000</pubDate>
      <link>https://forem.com/palo_alto_ai/reading-online-without-a-dictionary-open-is-a-compromise-5dgn</link>
      <guid>https://forem.com/palo_alto_ai/reading-online-without-a-dictionary-open-is-a-compromise-5dgn</guid>
      <description>&lt;p&gt;Half the value of a dense article lives in the terms you almost understand. You scan past them because stopping costs too much — new tab, search, read, return, lose your place, repeat. After a few of those you stop bothering and accept a shallower read than the piece deserved.&lt;/p&gt;

&lt;p&gt;rabbitholes is a Chrome extension that lets you highlight any text and get an inline explanation rendered in a shadow-DOM tooltip next to your cursor — no new tab, no page pollution. The explanation comes from Claude Haiku 4.5. Click any word in the response to explore it further, or drag across a phrase to treat it as a new query.&lt;/p&gt;

&lt;p&gt;Two things make it less like a dictionary lookup and more like actually following a thread:&lt;/p&gt;

&lt;p&gt;First, every answer surfaces two suggested rabbit-hole topics — the most interesting threads branching from wherever you are. One click continues without breaking your reading context.&lt;/p&gt;

&lt;p&gt;Second, a globe icon re-runs the query enriched with Brave Search results. If you're reading about a recent event or a contested claim, you get source chips alongside the explanation, clickable without leaving the page.&lt;/p&gt;

&lt;p&gt;A rabbit-hole counter tracks how many hops deep you've gone. If you chase a chain far enough to land on philosophy — the Wikipedia game — you get a shareable trail of the path.&lt;/p&gt;

&lt;p&gt;No intermediary server. Requests go directly from your browser to api.anthropic.com and api.search.brave.com. Zero telemetry, Manifest V3, API key stored in chrome.storage.sync.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// The shadow DOM approach: explanations attach to document.body via&lt;/span&gt;
&lt;span class="c1"&gt;// a closed shadow root so host-page CSS can't bleed in or out.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;div&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;shadow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;host&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;attachShadow&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;closed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;host&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That boundary matters: iframes would've required cross-origin gymnastics and still couldn't match host-page font rendering reliably. Shadow DOM keeps the tooltip visually coherent across Wikipedia, Substack, arxiv, wherever you're reading.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/robertnowell/rabbitholes" rel="noopener noreferrer"&gt;https://github.com/robertnowell/rabbitholes&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Why I stopped using Google Translate to write in my girlfriend's language</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Mon, 25 May 2026 16:16:14 +0000</pubDate>
      <link>https://forem.com/palo_alto_ai/why-i-stopped-using-google-translate-to-write-in-my-girlfriends-language-2le4</link>
      <guid>https://forem.com/palo_alto_ai/why-i-stopped-using-google-translate-to-write-in-my-girlfriends-language-2le4</guid>
      <description>&lt;p&gt;For months I was sending my girlfriend messages in Farsi that technically said the right words but read like a tax form. Google Translate gave me one option, no indication of whether it sounded tender or transactional, and no audio — so I had no idea if my vowel lengths were off enough to change the meaning.&lt;/p&gt;

&lt;p&gt;I built konid to fix this for myself and anyone translating into a language they're still learning.&lt;/p&gt;

&lt;p&gt;The core behavior: you give it a phrase you want to say, it returns three versions ordered casual to formal, with a note on what register each one occupies and how the choices differ culturally — not just lexically. For languages with tone or vowel-length sensitivity (Mandarin, Arabic, Japanese, Hindi), it plays the audio directly through your speakers using node-edge-tts, no API key required. Hearing the actual tone contour once is worth more than reading a phonetic transcription five times. The difference between a short and long vowel in Arabic, or a rising vs. falling tone in Mandarin, doesn't stick from text — it sticks from sound.&lt;/p&gt;

&lt;p&gt;The audio isn't decorative. It's the part that changes what you remember.&lt;/p&gt;

&lt;p&gt;Installation in Claude Code is one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add konid-ai &lt;span class="nt"&gt;--&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; konid-ai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It also runs in Cursor, VS Code Copilot, Windsurf, Zed, JetBrains, and Claude Cowork. If you're on ChatGPT, Developer mode lets you add the endpoint &lt;code&gt;https://konid.fly.dev/mcp&lt;/code&gt; directly.&lt;/p&gt;

&lt;p&gt;Supports 13+ languages: Mandarin, Japanese, Korean, Spanish, French, German, Portuguese, Italian, Russian, Arabic, Hindi, and others.&lt;/p&gt;

&lt;p&gt;MIT licensed. &lt;a href="https://github.com/robertnowell/konid-language-learning" rel="noopener noreferrer"&gt;https://github.com/robertnowell/konid-language-learning&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Distribution Infrastructure for MCP Servers and Agent Tools That Have None</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Mon, 25 May 2026 12:57:09 +0000</pubDate>
      <link>https://forem.com/palo_alto_ai/distribution-infrastructure-for-mcp-servers-and-agent-tools-that-have-none-650</link>
      <guid>https://forem.com/palo_alto_ai/distribution-infrastructure-for-mcp-servers-and-agent-tools-that-have-none-650</guid>
      <description>&lt;p&gt;The MCP ecosystem moves fast. New servers, new Claude Code skills, new agent frameworks every week. The distribution infrastructure for indie builders in that space is basically nonexistent — no curated channels, no automated submission pipelines, no recurring visibility mechanism. You ship, you post once, you move on.&lt;/p&gt;

&lt;p&gt;marketing-pipeline fills that gap. One command onboards a project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;marketing onboard &lt;span class="nt"&gt;--name&lt;/span&gt; my-tool &lt;span class="nt"&gt;--repo&lt;/span&gt; owner/repo &lt;span class="nt"&gt;--kind&lt;/span&gt; mcp-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It fetches the README, extracts the problem and key facts, and saves everything to &lt;code&gt;projects.yml&lt;/code&gt;. After that, a GitHub Actions cron at 14:00 UTC on weekdays handles the rest: rotating posts across Bluesky, Mastodon, Dev.to, and Hashnode, and submitting to type-specific directories — MCP Registry, Smithery, Glama, and PulseMCP for &lt;code&gt;mcp-server&lt;/code&gt; projects; awesome-claude-code for &lt;code&gt;claude-skill&lt;/code&gt; projects.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;kind&lt;/code&gt; field is doing real work here. It routes each project to the directories that actually matter for that category rather than dumping everything into the same generic buckets.&lt;/p&gt;

&lt;p&gt;One specific detail worth calling out: there's a hard antislop gate in &lt;code&gt;pipeline/antislop.py&lt;/code&gt; that rejects posts before publication if they contain tokens like 'excited', 'game-changer', 'AI-powered', emoji, hashtags, or exclamation points. This matters because generated marketing copy defaults to that register and it reads as noise in developer communities. The gate isn't optional — it runs before every post.&lt;/p&gt;

&lt;p&gt;The tradeoff I haven't automated away: awesome-claude-code requires human submission via their GitHub issue form. The pipeline generates the payload; you submit it once per project. That's the right constraint on their end.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/robertnowell/marketing-pipeline" rel="noopener noreferrer"&gt;https://github.com/robertnowell/marketing-pipeline&lt;/a&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>automation</category>
      <category>marketing</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Seven archetypes, 11 behaviors, one mirror for your Claude habits</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sun, 24 May 2026 19:04:28 +0000</pubDate>
      <link>https://forem.com/palo_alto_ai/seven-archetypes-11-behaviors-one-mirror-for-your-claude-habits-3dlm</link>
      <guid>https://forem.com/palo_alto_ai/seven-archetypes-11-behaviors-one-mirror-for-your-claude-habits-3dlm</guid>
      <description>&lt;p&gt;I kept noticing I'd ask Claude Code to write things, then rewrite them, then ask again with slightly different wording. Months in, I couldn't tell whether that loop was refinement or just repetition dressed up as iteration.&lt;/p&gt;

&lt;p&gt;Anthropomorphic published a study in February across 9,830 Claude conversations, classifying 11 observable collaboration behaviors. I wanted to know which ones showed up in my sessions — and which ones I never touched.&lt;/p&gt;

&lt;p&gt;So I built skill-tree: it reads your Claude Code or Cowork session history, classifies those same 11 behaviors against Anthropic's AI Fluency Index baseline, and assigns you one of seven archetype cards rendered as tarot cards with curated museum art. There's also a growth quest — one behavior you haven't used, surfaced at the start of your next session via a SessionStart hook.&lt;/p&gt;

&lt;p&gt;The archetypes (Illuminator, Navigator, Alchemist, and four others) aren't cosmetic. They map to three axes from Dakan and Feller's 4D AI Fluency Framework: Description (how well you frame problems), Discernment (how you evaluate outputs), Delegation (how you structure work handoffs). The fourth axis, Diligence, doesn't appear in chat logs so skill-tree leaves it unscored.&lt;/p&gt;

&lt;p&gt;The card renders live — see the Illuminator at skill-tree-ai.fly.dev/fixture/illuminator. Each analysis runs a 7-step orchestration (find session files, extract messages, remote classifier on Claude Haiku via Fly.io, archetype assignment, narrative synthesis, render, return URL) in roughly 30–60 seconds.&lt;/p&gt;

&lt;p&gt;Install in Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude plugin marketplace add robertnowell/ai-fluency-skill-cards
claude plugin &lt;span class="nb"&gt;install &lt;/span&gt;skill-tree-ai@ai-fluency-skill-cards
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Cowork, drop in &lt;code&gt;skill-tree-ai.zip&lt;/code&gt;. If you're on Cursor, VS Code, or Windsurf, the MCP server is &lt;code&gt;npm install skill-tree-ai&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Growth quest state persists in &lt;code&gt;~/.skill-tree/&lt;/code&gt; for Claude Code (Cowork uses &lt;code&gt;$CLAUDE_PLUGIN_ROOT/.user-state/&lt;/code&gt; because its &lt;code&gt;$HOME&lt;/code&gt; is ephemeral).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/robertnowell/ai-fluency-skill-cards" rel="noopener noreferrer"&gt;https://github.com/robertnowell/ai-fluency-skill-cards&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Klein Blue looked right in Figma. On a dark terminal, it vanished.</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sun, 24 May 2026 16:54:46 +0000</pubDate>
      <link>https://forem.com/palo_alto_ai/klein-blue-looked-right-in-figma-on-a-dark-terminal-it-vanished-27bn</link>
      <guid>https://forem.com/palo_alto_ai/klein-blue-looked-right-in-figma-on-a-dark-terminal-it-vanished-27bn</guid>
      <description>&lt;p&gt;Yves Klein's IKB — hex 002FA7 — has an APCA lightness contrast of Lc -12 on a dark background. That's not low contrast. That's below the threshold where the human visual system registers a meaningful edge at all. Paste it as text on dark ground and you get something that looks like a shadow of a letter rather than a letter.&lt;/p&gt;

&lt;p&gt;I ran into this building klein-void, a set of terminal themes for Claude Code tuned for prose legibility. Claude Code's output is mostly English — tool output, reasoning traces, permission prompts — not syntax-highlighted code. Most terminal themes ignore that; they're tuned for &lt;code&gt;const&lt;/code&gt; and bracket matching. I wanted something optimized for hours of paragraph reading, anchored to Klein's pigment because that blue is genuinely irreplaceable.&lt;/p&gt;

&lt;p&gt;The constraint was real: you can't just swap in a lighter blue and call it IKB. The whole point of the pigment is the specific depth of that particular 002FA7. Lightening it to pass contrast gates produces something that reads as cornflower or periwinkle — similar family, different object.&lt;/p&gt;

&lt;p&gt;The fix was a two-slot split. Claude Code maps its decorative borders and highlights to &lt;code&gt;ansi:blue&lt;/code&gt;. It maps its permission-prompt text — the prose you actually read and respond to — to &lt;code&gt;ansi:blueBright&lt;/code&gt;. Those are separate ANSI slots. So: pure IKB (002FA7) lives in &lt;code&gt;ansi:blue&lt;/code&gt;, where it renders as a deep decorative border that you look at rather than read. A lifted Klein-family blue (A8BEF0) lives in &lt;code&gt;ansi:blueBright&lt;/code&gt;, where APCA scores it readable at body size.&lt;/p&gt;

&lt;p&gt;The four variations in klein-void each handle the trade-off differently. Klein Void Prot is the strict version — every accent slot passes APCA gates (body &amp;gt;= 90, subtle &amp;gt;= 75, muted &amp;gt;= 45, accent &amp;gt;= 60). Klein Void Gallery goes the other way: maximum void, one blue, decorative IKB everywhere the theme can plausibly use it, at the cost of some strict-gate compliance on accent roles.&lt;/p&gt;

&lt;p&gt;All four ship as &lt;code&gt;.terminal&lt;/code&gt; profile files for macOS Terminal.app, built from a variation-aware Objective-C builder, installable via &lt;code&gt;install.sh&lt;/code&gt; with a working &lt;code&gt;restore.sh&lt;/code&gt; if you want out. One prerequisite worth noting: Claude Code must have &lt;code&gt;/theme&lt;/code&gt; set to &lt;code&gt;dark-ansi&lt;/code&gt;, otherwise it ignores the ANSI palette entirely and falls back to hardcoded RGB values.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/robertnowell/klein-void" rel="noopener noreferrer"&gt;https://github.com/robertnowell/klein-void&lt;/a&gt;&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>cli</category>
      <category>design</category>
      <category>ux</category>
    </item>
    <item>
      <title>rabbitholes: how I built a Chrome extension with no server to touch your data</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sun, 24 May 2026 14:56:53 +0000</pubDate>
      <link>https://forem.com/palo_alto_ai/rabbitholes-how-i-built-a-chrome-extension-with-no-server-to-touch-your-data-1bph</link>
      <guid>https://forem.com/palo_alto_ai/rabbitholes-how-i-built-a-chrome-extension-with-no-server-to-touch-your-data-1bph</guid>
      <description>&lt;p&gt;Most browser extensions that call external APIs route your data through a developer-controlled server first. That's not a conspiracy — it's the path of least resistance. You stand up a backend, proxy requests through it, log errors, maybe cache responses. The problem is that everything you highlight and every question you ask passes through infrastructure you don't control and the extension author probably didn't design for privacy from the start.&lt;/p&gt;

&lt;p&gt;rabbitholes does something different by construction: requests go directly from your browser to &lt;code&gt;api.anthropic.com&lt;/code&gt; and &lt;code&gt;api.search.brave.com&lt;/code&gt;. There is no intermediary server. There is nothing to log because there's nothing in the middle.&lt;/p&gt;

&lt;p&gt;This wasn't a late decision. The extension renders explanations in a shadow-DOM tooltip next to your cursor — the shadow DOM means the tooltip doesn't pollute the host page's styles or scripts. The same isolation principle runs through the data flow. Your Anthropic API key lives in &lt;code&gt;chrome.storage.sync&lt;/code&gt;, which Chrome encrypts and syncs to your account. It never leaves the browser.&lt;/p&gt;

&lt;p&gt;The architecture made Manifest V3 compliance straightforward rather than painful. MV3 restricts remotely-hosted code and tightens background-service-worker lifetimes precisely because extensions were being used as attack surface. Building direct-to-API meant there was no server-side component to audit or trust.&lt;/p&gt;

&lt;p&gt;What the extension actually does: highlight any text on any page, get an explanation inline. Click any word in the explanation to go deeper — drag across words to pick a phrase. Every answer surfaces two suggested rabbit-hole topics. Hit the globe icon to re-answer enriched with Brave Search results, with source chips. A counter tracks how many hops deep you've gone.&lt;/p&gt;

&lt;p&gt;The privacy architecture isn't a feature I added. It's what you get when you start from "no server" and build outward.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/robertnowell/rabbitholes" rel="noopener noreferrer"&gt;https://github.com/robertnowell/rabbitholes&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>javascript</category>
      <category>privacy</category>
      <category>showdev</category>
    </item>
    <item>
      <title>When 'I missed you' sounds like a business memo</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sun, 24 May 2026 13:03:11 +0000</pubDate>
      <link>https://forem.com/palo_alto_ai/when-i-missed-you-sounds-like-a-business-memo-3eeg</link>
      <guid>https://forem.com/palo_alto_ai/when-i-missed-you-sounds-like-a-business-memo-3eeg</guid>
      <description>&lt;p&gt;The phrase 'I missed you today' has at least three versions in Japanese, and they don't feel the same. One is what you'd text a close friend. One is what you'd say out loud, face to face. One tips into something almost literary — tender in a way that would read strange in a casual message but lands exactly right said quietly at the end of the day.&lt;/p&gt;

&lt;p&gt;Literal translation tools give you one. Usually the neutral one. Which is fine if you're filling out a form, but if you're trying to say something real to someone you care about, neutral isn't what you meant.&lt;/p&gt;

&lt;p&gt;I built konid after a specific failure: I told my girlfriend something in her first language and it landed cold. Not wrong, exactly — grammatically correct, probably — but register-wrong. The word choice signaled distance I didn't intend.&lt;/p&gt;

&lt;p&gt;The tool returns three options per query, ordered casual to formal, with the register explained for each. Not just 'this is more polite' — actual notes on when you'd use it, what relationship it implies, where it would sound strange. For that 'I missed you' case, it also plays audio pronunciation through your speakers directly (via node-edge-tts, no external API key).&lt;/p&gt;

&lt;p&gt;It supports 13+ languages: Mandarin, Japanese, Korean, Spanish, French, German, Portuguese, Italian, Russian, Arabic, Hindi, and more.&lt;/p&gt;

&lt;p&gt;Installs as an MCP server, so it works inside Claude Code, Cursor, VS Code Copilot, Windsurf, Zed, JetBrains, and Claude Cowork:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add konid-ai &lt;span class="nt"&gt;--&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; konid-ai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also available as a ChatGPT app via Developer mode at &lt;code&gt;https://konid.fly.dev/mcp&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The name is Farsi — konid (کنید) means 'do.' Take action.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/robertnowell/konid-language-learning" rel="noopener noreferrer"&gt;https://github.com/robertnowell/konid-language-learning&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>nlp</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>Designing email campaigns blind: building a design scorer into kopi</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sun, 24 May 2026 11:09:19 +0000</pubDate>
      <link>https://forem.com/palo_alto_ai/designing-email-campaigns-blind-building-a-design-scorer-into-kopi-143e</link>
      <guid>https://forem.com/palo_alto_ai/designing-email-campaigns-blind-building-a-design-scorer-into-kopi-143e</guid>
      <description>&lt;p&gt;Every email tool I'd used handed me a blank canvas or a dated template and called it a starting point. The actual work — getting the layout hierarchy right, checking CTA contrast on mobile, making sure the campaign looked like it came from the same brand as the last one — happened in my head, or not at all, until the send report came back with a 14% click rate and I couldn't tell why.&lt;/p&gt;

&lt;p&gt;kopi generates a complete HTML email from a text prompt in under 5 minutes. That part isn't the interesting bit. The interesting bit is what happens before export: every email gets scored against 12+ design criteria — layout hierarchy, mobile readability, CTA contrast, spacing — on a 0–100 scale. You see the critique before the campaign goes anywhere.&lt;/p&gt;

&lt;p&gt;The design system piece took longer to get right than the generation itself. The problem with AI-generated email is brand drift: the output looks fine in isolation but nothing like your site or your last campaign. kopi handles this by learning your fonts, colors, and layout preferences and baking them into every generation. It's not a style guide you maintain manually — it's inferred from what you've already built and enforced at generation time, not after.&lt;/p&gt;

&lt;p&gt;For teams running Klaviyo, export is direct. For anyone working in Claude Code or Cursor, it runs as an MCP server. The public gallery at trykopi.ai/emails has 400+ emails that scored 80 or above — useful as a reference for what the scorer actually rewards.&lt;/p&gt;

&lt;p&gt;The repo isn't public, but the tool is at &lt;a href="https://trykopi.ai" rel="noopener noreferrer"&gt;https://trykopi.ai&lt;/a&gt; if you want to run a prompt through it and see what the scorer returns on your first draft.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>design</category>
      <category>html</category>
      <category>marketing</category>
    </item>
    <item>
      <title>The growth quest picks what you avoid, not what you're already good at</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sat, 23 May 2026 18:58:02 +0000</pubDate>
      <link>https://forem.com/palo_alto_ai/the-growth-quest-picks-what-you-avoid-not-what-youre-already-good-at-4hl9</link>
      <guid>https://forem.com/palo_alto_ai/the-growth-quest-picks-what-you-avoid-not-what-youre-already-good-at-4hl9</guid>
      <description>&lt;p&gt;Anthropics February 2026 study classified 11 observable collaboration behaviors across 9,830 Claude conversations. After months of daily Claude Code use I wanted to know which of those 11 behaviors showed up in my sessions — and which ones never appeared.&lt;/p&gt;

&lt;p&gt;The answer was uncomfortable. I was running three behaviors on repeat: decomposing tasks, specifying output format, providing context. The other eight barely registered.&lt;/p&gt;

&lt;p&gt;skill-tree analyzes your Claude Code or Cowork session history, classifies all 11 behaviors against the Fluency Index baseline, and assigns you one of seven archetype cards rendered as tarot-style images with curated museum art. The live example at skill-tree-ai.fly.dev/fixture/illuminator shows what a full result looks like.&lt;/p&gt;

&lt;p&gt;The part I want to explain is the growth quest mechanic, because it's doing something specific: it doesn't pick a behavior you're close to improving. It picks the behavior you avoid most. The logic is that if you're already fast at decomposing tasks, doing more decomposition doesn't expand your range — it deepens a rut. The Dakan &amp;amp; Feller 4D Fluency Framework (Description, Discernment, Delegation, Diligence) covers behaviors that don't compose neatly. Getting better at delegation looks nothing like getting better at discernment. So picking the furthest behavior, not the nearest, is the only way to break out of a local optimum.&lt;/p&gt;

&lt;p&gt;The quest persists across sessions via a SessionStart hook so Claude Code surfaces it at the start of the next conversation — stored in &lt;code&gt;~/.skill-tree/&lt;/code&gt; on Claude Code, &lt;code&gt;$CLAUDE_PLUGIN_ROOT/.user-state/&lt;/code&gt; on Cowork because Cowork's &lt;code&gt;$HOME&lt;/code&gt; is ephemeral.&lt;/p&gt;

&lt;p&gt;End-to-end analysis takes 30–60 seconds: find session files, extract user messages, remote classifier (Claude Haiku on Fly.io), archetype assignment, narrative synthesis, render, return a stable URL.&lt;/p&gt;

&lt;p&gt;Install in Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude plugin marketplace add robertnowell/ai-fluency-skill-cards
claude plugin &lt;span class="nb"&gt;install &lt;/span&gt;skill-tree-ai@ai-fluency-skill-cards
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also available as an MCP server (&lt;code&gt;npm install skill-tree-ai&lt;/code&gt;) for Cursor, VS Code, and Windsurf.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/robertnowell/ai-fluency-skill-cards" rel="noopener noreferrer"&gt;https://github.com/robertnowell/ai-fluency-skill-cards&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
