<?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>Eleven behaviors Anthropic measured. Which ones do you actually use?</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Wed, 06 May 2026 19:24:30 +0000</pubDate>
      <link>https://forem.com/palo_alto_ai/eleven-behaviors-anthropic-measured-which-ones-do-you-actually-use-40jj</link>
      <guid>https://forem.com/palo_alto_ai/eleven-behaviors-anthropic-measured-which-ones-do-you-actually-use-40jj</guid>
      <description>&lt;p&gt;In February 2026, Dakan and Feller published an AI Fluency Index built from 9,830 Claude conversations, classifying 11 observable collaboration behaviors across three axes: Description, Discernment, and Delegation. I ran their taxonomy against my own Claude Code sessions and found I was hitting maybe four of the eleven with any regularity. The rest were behaviors I'd read about but never actually triggered in practice.&lt;/p&gt;

&lt;p&gt;That gap is what skill-tree is for.&lt;/p&gt;

&lt;p&gt;The tool installs as a Claude Code plugin — &lt;code&gt;claude plugin marketplace add robertnowell/ai-fluency-skill-cards &amp;amp;&amp;amp; claude plugin install skill-tree-ai@ai-fluency-skill-cards&lt;/code&gt; — and on each session analyzes your message history against those same 11 behaviors. It assigns one of seven archetype cards (rendered as tarot cards with museum art, live example at skill-tree-ai.fly.dev/fixture/illuminator) and designates one behavior you haven't touched as a growth quest for your next session. That quest persists via a SessionStart hook so Claude surfaces it when you open a new conversation.&lt;/p&gt;

&lt;p&gt;The classification runs remotely on Fly.io in 30–60 seconds: extract user messages, classify against the fluency framework, assign archetype, synthesize narrative, render, return a stable URL.&lt;/p&gt;

&lt;p&gt;The archetype isn't the point. The point is the gap list — behaviors you're systematically skipping without knowing it. Seeing "Discernment" axis behaviors at near-zero across 40 sessions is harder to ignore than a vague sense that you might be in a rut.&lt;/p&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;github.com/robertnowell/skill-tree&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>productivity</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Why WCAG failed my terminal theme and what I used instead</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Wed, 06 May 2026 17:29:00 +0000</pubDate>
      <link>https://forem.com/palo_alto_ai/why-wcag-failed-my-terminal-theme-and-what-i-used-instead-1h8g</link>
      <guid>https://forem.com/palo_alto_ai/why-wcag-failed-my-terminal-theme-and-what-i-used-instead-1h8g</guid>
      <description>&lt;p&gt;Spent an afternoon watching pure IKB disappear against a dark ground. WCAG 2.1 contrast ratio for IKB (hex 002FA7): 3.2:1 — technically a pass for large text. APCA Lc score: -12 — effectively invisible. WCAG uses a symmetric formula that assumes light backgrounds; on dark ground it systematically overstates how readable dark colors are. APCA accounts for polarity, so the score for dark-on-dark reflects what actually happens.&lt;/p&gt;

&lt;p&gt;That failure drove most of the design decisions in klein-blue, a set of four Terminal.app themes for Claude Code tuned for prose legibility over long sessions.&lt;/p&gt;

&lt;p&gt;The split that came out of it: pure IKB lives in the &lt;code&gt;ansi:blue&lt;/code&gt; slot — decorative borders and highlights where it reads as color, not text. A lifted Klein-family blue (A8BEF0) goes in &lt;code&gt;ansi:blueBright&lt;/code&gt; — the slot Claude Code uses for permission-prompt text, where you actually need to read it. Same hue family, but the lifted value passes the body-prose gate (Lc &amp;gt;= 90) instead of sitting at -12.&lt;/p&gt;

&lt;p&gt;APCA gates I used per role:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;body text:   Lc &amp;gt;= 90
subtle text: Lc &amp;gt;= 75
muted text:  Lc &amp;gt;= 45
accent:      Lc &amp;gt;= 60
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Of the four variations, only Klein Void Prot passes every gate strictly. The others make deliberate tradeoffs — Klein Void Gallery accepts maximum IKB presence at the cost of some accent scores; Klein Void Sand &amp;amp; Sea lets the claude-sand &lt;code&gt;ansi:redBright&lt;/code&gt; slot compete as a second hero color instead of neutralizing it.&lt;/p&gt;

&lt;p&gt;One setup requirement worth knowing: Claude Code has to be set to dark-ansi in its &lt;code&gt;/theme&lt;/code&gt; picker. If you leave it on the default, Claude Code overrides everything with its hardcoded RGB palette and the ANSI theme does nothing.&lt;/p&gt;

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

</description>
      <category>a11y</category>
      <category>cli</category>
      <category>design</category>
      <category>ui</category>
    </item>
    <item>
      <title>Every work email in French was a task. Now it's a lesson.</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Wed, 06 May 2026 13:47:52 +0000</pubDate>
      <link>https://forem.com/palo_alto_ai/every-work-email-in-french-was-a-task-now-its-a-lesson-2348</link>
      <guid>https://forem.com/palo_alto_ai/every-work-email-in-french-was-a-task-now-its-a-lesson-2348</guid>
      <description>&lt;p&gt;I was writing a work email in French — intermediate level, still learning — and needed to say something like "I'll follow up with you next week." Google Translate gave me one option. I used it. I have no idea if it sounded like a colleague or a legal document.&lt;/p&gt;

&lt;p&gt;konid returns three options for anything you want to say, ordered casual to formal, with a note on when each one fits. For that French sentence, the difference between option one and option three is the difference between how you'd write to a teammate versus a client you've never met. That gap is exactly what daily translation tasks contain — and what literal tools throw away.&lt;/p&gt;

&lt;p&gt;The audio pronunciation plays through your speakers via node-edge-tts, no API key required. 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 in 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;Works in Cursor, VS Code Copilot, Windsurf, Zed, JetBrains, and Claude Cowork. Also runs as a ChatGPT app via Developer mode with the endpoint &lt;code&gt;https://konid.fly.dev/mcp&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The idea is that if you're already translating work emails every day, you're sitting on 5–10 moments per day where you could either get an answer and move on, or get an answer plus understand the register tradeoff. konid tries to make those moments the latter.&lt;/p&gt;

&lt;p&gt;MIT licensed. github.com/robertnowell/konid-language-learning&lt;/p&gt;

</description>
      <category>learning</category>
      <category>productivity</category>
      <category>showdev</category>
      <category>writing</category>
    </item>
    <item>
      <title>Designing email campaigns blind: how a design score changes the loop</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Wed, 06 May 2026 11:45:19 +0000</pubDate>
      <link>https://forem.com/palo_alto_ai/designing-email-campaigns-blind-how-a-design-score-changes-the-loop-3k8a</link>
      <guid>https://forem.com/palo_alto_ai/designing-email-campaigns-blind-how-a-design-score-changes-the-loop-3k8a</guid>
      <description>&lt;p&gt;Spent two years watching email marketers do the same thing: drag blocks around in Klaviyo for an hour, send a test, squint at it on mobile, change the CTA button color, send another test. No feedback until the open rate came back three days later.&lt;/p&gt;

&lt;p&gt;kopi generates a complete HTML email from a text brief in under 5 minutes, then runs an automated design critique before anything ships. Every email gets scored 0-100 across 12+ criteria: layout hierarchy, CTA contrast, mobile readability, whitespace distribution, font legibility. The score isn't decorative — it tells you which specific element is dragging the number down.&lt;/p&gt;

&lt;p&gt;A flash-sale email from the public gallery at trykopi.ai/emails scored 91/100. The critique flagged one thing: secondary CTA was competing visually with the primary button at near-identical contrast ratios. That's the kind of feedback that used to require a senior designer on a review call.&lt;/p&gt;

&lt;p&gt;The critique runs on the same criteria every time, which means you're not getting a different answer depending on who reviewed it last Tuesday versus today.&lt;/p&gt;

&lt;p&gt;If you're already in Klaviyo, there's a direct export. If you work in Claude Code or Cursor, kopi runs as an MCP server so you can generate and critique inside your existing editor. Brand-specific design systems are supported — it learns your fonts, colors, and layout preferences so generated emails don't need to be re-styled to match your kit.&lt;/p&gt;

&lt;p&gt;The gallery has 400+ emails all scoring 80+: trykopi.ai/emails&lt;/p&gt;

&lt;p&gt;Repo and docs: trykopi.ai&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Why my Claude Code skill-tree plugin has two state paths</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Tue, 05 May 2026 19:07:32 +0000</pubDate>
      <link>https://forem.com/palo_alto_ai/why-my-claude-code-skill-tree-plugin-has-two-state-paths-1kj1</link>
      <guid>https://forem.com/palo_alto_ai/why-my-claude-code-skill-tree-plugin-has-two-state-paths-1kj1</guid>
      <description>&lt;p&gt;Built skill-tree to answer a specific question: am I actually developing new collaboration behaviors with Claude, or just running the same handful faster? Anthropic published a study in February (9,830 conversations, 11 observable behaviors) and I wanted my own sessions classified against that baseline.&lt;/p&gt;

&lt;p&gt;The plugin classifies those same 11 behaviors from the Dakan &amp;amp; Feller 4D AI Fluency Framework, assigns one of seven archetype cards (rendered as tarot cards with museum art), and picks a behavior you haven't tried as a growth quest for your next session. The quest persists across sessions via a SessionStart hook.&lt;/p&gt;

&lt;p&gt;That persistence is where the interesting constraint showed up.&lt;/p&gt;

&lt;p&gt;Claude Code has a stable home directory, so state goes to &lt;code&gt;~/.skill-tree/&lt;/code&gt; and that's that. Cowork's &lt;code&gt;$HOME&lt;/code&gt; is ephemeral — anything written there is gone when the session ends. Which means a growth quest written to &lt;code&gt;$HOME/.skill-tree/quest.json&lt;/code&gt; after session one doesn't exist when session two starts. The plugin never fails loudly; it just silently loses your state and picks a new quest as if you're a first-time user.&lt;/p&gt;

&lt;p&gt;The fix is one conditional and one env var:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CLAUDE_PLUGIN_ROOT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;state_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CLAUDE_PLUGIN_ROOT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.user-state&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;state_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;home&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.skill-tree&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;$CLAUDE_PLUGIN_ROOT&lt;/code&gt; is durable in Cowork even when &lt;code&gt;$HOME&lt;/code&gt; isn't, so quest state survives there. Claude Code doesn't set that variable, so it falls back to the home directory path.&lt;/p&gt;

&lt;p&gt;Small thing, but it's the kind of environmental difference that only bites you after you've watched a user lose their progress and gone looking for why.&lt;/p&gt;

&lt;p&gt;Install in Claude Code: &lt;code&gt;claude plugin marketplace add robertnowell/ai-fluency-skill-cards &amp;amp;&amp;amp; claude plugin install skill-tree-ai@ai-fluency-skill-cards&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Example archetype card: skill-tree-ai.fly.dev/fixture/illuminator&lt;/p&gt;

&lt;p&gt;github.com/robertnowell/skill-tree&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>cli</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Klein-blue: four terminal themes tuned for prose, not syntax</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Tue, 05 May 2026 17:16:15 +0000</pubDate>
      <link>https://forem.com/palo_alto_ai/klein-blue-four-terminal-themes-tuned-for-prose-not-syntax-1hib</link>
      <guid>https://forem.com/palo_alto_ai/klein-blue-four-terminal-themes-tuned-for-prose-not-syntax-1hib</guid>
      <description>&lt;p&gt;Most terminal themes were built for code. When your screen is 80% tool output, reasoning blocks, and permission prompts, you're reading paragraphs — not syntax. The contrast relationships that matter are different: body text needs to hold up at 11–13px over a four-hour session, not just pop on a hero slide.&lt;/p&gt;

&lt;p&gt;klein-blue ships four variations, each making a different call about one specific question: what do you do with the &lt;code&gt;ansi:redBright&lt;/code&gt; slot?&lt;/p&gt;

&lt;p&gt;Claude Code uses that slot for its claude-sand brand color — a warm amber that appears on certain UI elements. That's the fork in the road. Neutralize it so nothing competes with Klein blue, or accept it as a second hero and let the two colors coexist. The four variations are four answers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Klein Void Refined&lt;/strong&gt; — balanced, sand neutralized, no strong brand color presence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Klein Void Sand &amp;amp; Sea&lt;/strong&gt; — accepts claude-sand as a second hero alongside IKB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Klein Void Prot&lt;/strong&gt; — fully APCA-verified; every accent role passes strict gates (body Lc &amp;gt;= 90, subtle &amp;gt;= 75, muted &amp;gt;= 45, accent &amp;gt;= 60)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Klein Void Gallery&lt;/strong&gt; — maximum void, one blue, everything else steps back&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The IKB problem is real: pure International Klein Blue on a dark ground measures Lc -12 under APCA — effectively invisible as body text. The fix is a split across two ANSI slots. Pure IKB stays in &lt;code&gt;ansi:blue&lt;/code&gt; for decorative borders and highlights. Readable permission-prompt text moves to &lt;code&gt;ansi:blueBright&lt;/code&gt;, lifted to a Klein-family hue that actually passes body-size gates.&lt;/p&gt;

&lt;p&gt;Ships as macOS Terminal.app &lt;code&gt;.terminal&lt;/code&gt; profiles with CommitMono-Regular and IBM Plex Mono bundled to &lt;code&gt;~/Library/Fonts/&lt;/code&gt;. One prerequisite: Claude Code's &lt;code&gt;/theme&lt;/code&gt; picker must be set to &lt;code&gt;dark-ansi&lt;/code&gt;, otherwise Claude Code ignores the ANSI layer entirely and renders from its 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-blue
&lt;span class="nb"&gt;cd &lt;/span&gt;klein-blue
bash install.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

</description>
      <category>cli</category>
      <category>design</category>
      <category>showdev</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Inline context without losing your place in the article</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Tue, 05 May 2026 15:31:08 +0000</pubDate>
      <link>https://forem.com/palo_alto_ai/inline-context-without-losing-your-place-in-the-article-4i9i</link>
      <guid>https://forem.com/palo_alto_ai/inline-context-without-losing-your-place-in-the-article-4i9i</guid>
      <description>&lt;p&gt;I was reading about the Dreyfus affair and hit "syndicalism" — a word I'd skimmed past a dozen times. I knew the shape of it, not the substance. Opening a new tab meant losing the paragraph I was in, reorienting, reading something adjacent, and coming back with my thread broken.&lt;/p&gt;

&lt;p&gt;rabbitholes is a Chrome extension that solves the specific version of this problem: you want the context, but you don't want to leave.&lt;/p&gt;

&lt;p&gt;Highlight any text and a shadow-DOM tooltip renders an explanation next to your cursor — Claude Haiku 4.5, direct from your browser to api.anthropic.com, no intermediary server. Shadow DOM means the tooltip doesn't touch the host page's styles or DOM; you can close it and the page is exactly as you left it.&lt;/p&gt;

&lt;p&gt;The part I use most: every word in the response is itself clickable. You can drag across a phrase to select it. So when the explanation of "syndicalism" mentions "anarcho-syndicalism" and you want that too, you don't open a tab — you click the word. The extension tracks depth with a hop counter. Go far enough and you get a shareable trail of what you followed.&lt;/p&gt;

&lt;p&gt;There's also a globe icon that re-answers the query enriched with Brave Search results, with clickable source chips. That's useful when you want primary sources rather than an explanation.&lt;/p&gt;

&lt;p&gt;The architecture choice I'd defend: storing your Anthropic key in chrome.storage.sync (encrypted, never leaves the browser) and routing directly to Anthropic's API instead of proxying through a server. It's slightly more setup friction for the user, but zero telemetry and no service dependency felt like the right trade for something that runs on every page you read.&lt;/p&gt;

&lt;p&gt;Manifest V3 throughout.&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 container stays isolated from the host page&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;hostElement&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tooltip&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="nx"&gt;shadow&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;tooltip&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Host page styles never bleed in; extension styles never bleed out&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;github.com/robertnowell/rabbitholes&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>Three translations instead of one: what I learned building konid</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Tue, 05 May 2026 13:17:15 +0000</pubDate>
      <link>https://forem.com/palo_alto_ai/three-translations-instead-of-one-what-i-learned-building-konid-10b4</link>
      <guid>https://forem.com/palo_alto_ai/three-translations-instead-of-one-what-i-learned-building-konid-10b4</guid>
      <description>&lt;p&gt;Literal translation tools give you one answer. That answer has no register, no cultural context, and no way to know whether you're being warm or clinical.&lt;/p&gt;

&lt;p&gt;I was writing a message to my girlfriend in Farsi — something small, about missing her during the day — and every tool I tried handed me back a single string with no indication of whether it would land tender or transactional. Native speakers don't think in one-answer phrases. They pick from a register range depending on who they're talking to and what they want to convey.&lt;/p&gt;

&lt;p&gt;So I built konid: it returns 3 options per query, ordered casual to formal, with the register of each one explained and a cultural note comparing them. It also plays audio pronunciation through your speakers via node-edge-tts — no external API key, no browser tab, just audio.&lt;/p&gt;

&lt;p&gt;The MCP setup 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;Works in Claude Code, Cursor, VS Code Copilot, Windsurf, Zed, JetBrains, and Claude Cowork. Also installs 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;Supports 13+ languages: Mandarin, Japanese, Korean, Spanish, French, German, Portuguese, Italian, Russian, Arabic, Hindi, Farsi, and more.&lt;/p&gt;

&lt;p&gt;The name is Farsi — كنيد means "do." MIT licensed.&lt;/p&gt;

&lt;p&gt;github.com/robertnowell/konid-language-learning&lt;/p&gt;

</description>
      <category>learning</category>
      <category>node</category>
      <category>programming</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Why MCP servers die six days after launch</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Tue, 05 May 2026 11:12:42 +0000</pubDate>
      <link>https://forem.com/palo_alto_ai/why-mcp-servers-die-six-days-after-launch-2d9p</link>
      <guid>https://forem.com/palo_alto_ai/why-mcp-servers-die-six-days-after-launch-2d9p</guid>
      <description>&lt;p&gt;The MCP ecosystem is moving fast enough that a useful server can go from "published" to "effectively abandoned" in a week — not because it broke, but because you posted once on launch day and never again. Most indie builders don't have a distribution habit. They have a shipping habit.&lt;/p&gt;

&lt;p&gt;I built marketing-pipeline to handle the recurring work I kept skipping: rotating posts across channels, keeping directory listings current, showing up consistently without me thinking about it.&lt;/p&gt;

&lt;p&gt;The mechanics: onboarding a project takes one command.&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;That fetches the README, sends it to Claude, and writes &lt;code&gt;problem&lt;/code&gt;, &lt;code&gt;facts&lt;/code&gt;, and &lt;code&gt;angles&lt;/code&gt; to &lt;code&gt;projects.yml&lt;/code&gt;. From there, a daily GitHub Actions cron at 14:00 UTC picks the least-recently-used angle per project and drafts posts at per-channel length limits — 300 chars for Bluesky, 280 for X, 150–400 words for Dev.to and Hashnode.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;kind&lt;/code&gt; field does the routing. Tag something &lt;code&gt;mcp-server&lt;/code&gt; and it targets MCP Registry, Smithery, Glama, and PulseMCP. Tag it &lt;code&gt;claude-skill&lt;/code&gt; and it goes toward awesome-claude-code (the pipeline generates the payload; their rules require a human to submit via their GitHub issue form, so that step stays manual). Tag it &lt;code&gt;browser-extension&lt;/code&gt; and it routes to Chrome Web Store, Firefox AMO, and Edge Add-ons.&lt;/p&gt;

&lt;p&gt;The part I spent the most time on is &lt;code&gt;pipeline/antislop.py&lt;/code&gt; — a hard-reject gate that runs before any post is published. It blocks specific tokens: &lt;code&gt;excited&lt;/code&gt;, &lt;code&gt;game-changer&lt;/code&gt;, &lt;code&gt;unlock&lt;/code&gt;, &lt;code&gt;empower&lt;/code&gt;, &lt;code&gt;AI-powered&lt;/code&gt;, emoji, hashtags, exclamation points, rhetorical questions. Soft filtering wasn't enough; I needed something that would fail loudly rather than let a garbage post through at 2am.&lt;/p&gt;

&lt;p&gt;Required credentials: Anthropic API key, plus Bluesky, Dev.to, and Hashnode tokens. Mastodon and Slack are optional.&lt;/p&gt;

&lt;p&gt;If you've shipped an MCP server or Claude Code skill and the launch-day post was the last one, this is the part of the stack that was missing.&lt;/p&gt;

&lt;p&gt;github.com/robertnowell/marketing-pipeline&lt;/p&gt;

</description>
      <category>automation</category>
      <category>marketing</category>
      <category>mcp</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Mapping 11 AI collaboration behaviors across your own Claude sessions</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Mon, 04 May 2026 19:16:09 +0000</pubDate>
      <link>https://forem.com/palo_alto_ai/mapping-11-ai-collaboration-behaviors-across-your-own-claude-sessions-20kb</link>
      <guid>https://forem.com/palo_alto_ai/mapping-11-ai-collaboration-behaviors-across-your-own-claude-sessions-20kb</guid>
      <description>&lt;p&gt;Anthropics February 2026 study classified 11 observable collaboration behaviors across 9,830 Claude conversations. I wanted to run the same classification on my own sessions — not to benchmark myself against other users, but to see which behaviors I was avoiding entirely.&lt;/p&gt;

&lt;p&gt;The pattern I kept finding: heavy on Description (context-setting, explaining requirements), almost nothing on Delegation (trusting Claude to make structural decisions autonomously). I had optimized for speed at the exact same habits.&lt;/p&gt;

&lt;p&gt;skill-tree pulls your Claude Code or Cowork session history, runs the same 11-behavior taxonomy from Dakan &amp;amp; Feller's 4D AI Fluency Framework, and returns a stable URL with your results. The classifier runs on Fly.io (~30–60 seconds end-to-end), and the visualization is stored on a volume so the URL persists.&lt;/p&gt;

&lt;p&gt;The output includes a skill radar across three visible axes (Description, Discernment, Delegation — Diligence is the fourth axis but isn't recoverable from chat logs), one of seven archetype cards rendered as tarot cards with curated museum art, and a growth quest: a specific behavior from the 11 you haven't touched recently, surfaced as a prompt for your next session. The quest persists across sessions via a SessionStart hook.&lt;/p&gt;

&lt;p&gt;The archetypes — Illuminator, Navigator, Alchemist, and four others — aren't just labels. Each maps to a specific behavioral signature across the three axes. You can see what the Illuminator card looks like rendered at skill-tree-ai.fly.dev/fixture/illuminator.&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 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; 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 works in Cowork via &lt;code&gt;skill-tree-ai.zip&lt;/code&gt;, and as an MCP server (&lt;code&gt;npm install skill-tree-ai&lt;/code&gt;) for Cursor, VS Code, or Windsurf.&lt;/p&gt;

&lt;p&gt;github.com/robertnowell/skill-tree&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Terminal themes optimize for syntax. Claude Code isn't syntax.</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Mon, 04 May 2026 17:24:01 +0000</pubDate>
      <link>https://forem.com/palo_alto_ai/terminal-themes-optimize-for-syntax-claude-code-isnt-syntax-h69</link>
      <guid>https://forem.com/palo_alto_ai/terminal-themes-optimize-for-syntax-claude-code-isnt-syntax-h69</guid>
      <description>&lt;p&gt;After a few weeks of heavy Claude Code sessions, I noticed the thing that was actually tiring wasn't the work — it was reading. Tool output, permission prompts, reasoning traces, explanations. Paragraphs. Most of my screen at any given moment is English prose at body size, not syntax-highlighted Python. Every terminal theme I tried was optimizing for the wrong workload.&lt;/p&gt;

&lt;p&gt;So I built klein-blue: four Terminal.app themes tuned specifically for prose legibility in Claude Code, anchored to Yves Klein's IKB pigment.&lt;/p&gt;

&lt;p&gt;The core design problem: pure IKB fails as readable text on dark ground. APCA scores it Lc -12 — effectively invisible. The fix was to split it across two ANSI slots. The plain blue slot gets pure IKB for decorative borders and highlights where legibility doesn't matter. The bright blue slot gets a lifted Klein-family blue (hex A8BEF0) for permission-prompt text that actually needs to be read. You keep the pigment; you don't go blind.&lt;/p&gt;

&lt;p&gt;Contrast is enforced per semantic role using the APCA Lc metric, not WCAG ratios. WCAG was designed for static web content at display sizes; APCA is perceptually uniform and handles body text on dark backgrounds more honestly. The gates: body &amp;gt;= 90, subtle &amp;gt;= 75, muted &amp;gt;= 45, accent &amp;gt;= 60. The third variation, Klein Void Prot, is the only one where every accent slot clears strict gates — the others make deliberate tradeoffs for visual character.&lt;/p&gt;

&lt;p&gt;The fourth slot Claude Code uses heavily is ansi:redBright — its claude-sand brand color. That slot became the differentiating axis between variations: neutralize it to let IKB dominate, or accept it as a second hero. Klein Void Sand &amp;amp; Sea takes the two-hero approach; Klein Void Gallery maximizes the void.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install&lt;/span&gt;
git clone https://github.com/robertnowell/klein-blue
&lt;span class="nb"&gt;cd &lt;/span&gt;klein-blue &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ./install.sh
&lt;span class="c"&gt;# Then in Claude Code: /theme -&amp;gt; dark-ansi&lt;/span&gt;
&lt;span class="c"&gt;# (without dark-ansi, Claude Code ignores the ANSI palette entirely)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Built for macOS Terminal.app; ships as &lt;code&gt;.terminal&lt;/code&gt; profile files with CommitMono and IBM Plex Mono depending on variation. Full rollback via &lt;code&gt;restore.sh&lt;/code&gt;.&lt;/p&gt;

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

</description>
      <category>claude</category>
      <category>cli</category>
      <category>showdev</category>
      <category>ui</category>
    </item>
    <item>
      <title>rabbitholes: inline Wikipedia for any word on any page</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Mon, 04 May 2026 15:55:41 +0000</pubDate>
      <link>https://forem.com/palo_alto_ai/rabbitholes-inline-wikipedia-for-any-word-on-any-page-34af</link>
      <guid>https://forem.com/palo_alto_ai/rabbitholes-inline-wikipedia-for-any-word-on-any-page-34af</guid>
      <description>&lt;p&gt;Reading a long-form piece on, say, the Peloponnesian War. Thucydides gets mentioned as a primary source. I half-know who he is — historian, Athenian, that's about it — but not enough to understand why the author is citing him specifically over Herodotus. Opening a new tab means I lose the sentence I was in. Skipping it means I read shallower than the text deserves.&lt;/p&gt;

&lt;p&gt;rabbitholes is a Chrome extension that solves this with a shadow-DOM tooltip. Highlight any text, get an inline explanation from Claude next to your cursor. The host page is untouched — shadow DOM keeps the overlay isolated so it doesn't conflict with the site's styles or scripts.&lt;/p&gt;

&lt;p&gt;The part I use most: every word in the explanation is itself clickable. Highlight "Thucydides," get an answer that mentions "the Peloponnesian War," click that phrase to go deeper. Each answer also surfaces two suggested rabbit-hole topics — the most interesting threads from where you currently are. A counter tracks how many hops you've taken; if you tunnel far enough you hit philosophy, and it generates a shareable trail of your path.&lt;/p&gt;

&lt;p&gt;For cases where the base explanation isn't enough, a globe icon re-runs the query enriched with Brave Search results, with clickable source chips. A pencil icon opens a free-form follow-up that inherits the current context.&lt;/p&gt;

&lt;p&gt;No analytics, no telemetry, no proxy server. Requests go directly from your browser to api.anthropic.com and api.search.brave.com. Your Anthropic API key lives in chrome.storage.sync, encrypted, never touches an intermediary.&lt;/p&gt;

&lt;p&gt;Manifest V3 throughout.&lt;/p&gt;

&lt;p&gt;github.com/robertnowell/rabbitholes&lt;/p&gt;

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