<?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>DEV Community: J Now</title>
    <description>The latest articles on DEV Community by J Now (@palo_alto_ai).</description>
    <link>https://dev.to/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>DEV Community: J Now</title>
      <link>https://dev.to/palo_alto_ai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/palo_alto_ai"/>
    <language>en</language>
    <item>
      <title>Why your AI coding habits calcify (and one way to break them)</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sun, 14 Jun 2026 18:27:26 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/why-your-ai-coding-habits-calcify-and-one-way-to-break-them-3cch</link>
      <guid>https://dev.to/palo_alto_ai/why-your-ai-coding-habits-calcify-and-one-way-to-break-them-3cch</guid>
      <description>&lt;p&gt;Six months of daily Claude Code sessions and I kept reaching for the same three moves: ask a question, get code, iterate on the output. My velocity went up. My range didn't.&lt;/p&gt;

&lt;p&gt;The thing I was missing is measurable. Anthropic published a study in February 2026 across 9,830 Claude conversations, classifying 11 distinct collaboration behaviors — things like delegating multi-step tasks, exercising discernment on outputs, or co-constructing plans rather than just querying for results. Most users cluster hard in two or three behaviors and never touch the rest. I wanted to know which ones I was avoiding.&lt;/p&gt;

&lt;p&gt;So I built skill-tree: it reads your Claude Code session history, classifies your messages against those same 11 behaviors, and assigns you one of seven archetype cards (rendered as tarot cards using curated museum art — live example at skill-tree-ai.fly.dev/fixture/illuminator). That part is diagnostic. The part I actually care about is the growth quest.&lt;/p&gt;

&lt;p&gt;The quest logic has one rule: it never picks a behavior you already do. It finds the 11-behavior slot you've touched zero times or close to it, and surfaces that as your target for the next session. The anti-local-optimum rule. If you're already good at iterative critique, doing more iterative critique isn't growth — it's just confirming what you know. The quest forces you sideways.&lt;/p&gt;

&lt;p&gt;The quest persists via a SessionStart hook in &lt;code&gt;~/.skill-tree/&lt;/code&gt;, so Claude Code surfaces it at the top of your next conversation without you having to remember.&lt;/p&gt;

&lt;p&gt;Install inside 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, and as a zip plugin for Cowork.&lt;/p&gt;

&lt;p&gt;The full analysis — classifier, archetype assignment, narrative, rendered card — runs in 30–60 seconds and returns a stable URL.&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>Prose legibility in a syntax-tuned medium</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sun, 14 Jun 2026 16:31:56 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/prose-legibility-in-a-syntax-tuned-medium-2b2n</link>
      <guid>https://dev.to/palo_alto_ai/prose-legibility-in-a-syntax-tuned-medium-2b2n</guid>
      <description>&lt;p&gt;Yves Klein registered his ultramarine as a pigment in 1960 — IKB 79, a specific formulation that reads as depth rather than surface. I wanted that color anchoring my terminal. The problem: the hex value 002FA7 on a dark background measures Lc -12 on the APCA scale. That's below the threshold where text registers as readable at all.&lt;/p&gt;

&lt;p&gt;So it splits across two ANSI slots. The &lt;code&gt;ansi:blue&lt;/code&gt; slot gets pure IKB for decorative borders and structural highlights — anything that signals without needing to be read. The &lt;code&gt;ansi:blueBright&lt;/code&gt; slot — the one Claude Code routes permission-prompt text through — gets a lifted Klein-family blue, A8BEF0, that clears Lc 60. The color family stays coherent; the contrast math works.&lt;/p&gt;

&lt;p&gt;The reason this matters: Claude Code renders mostly prose. Tool output, reasoning steps, permission dialogs with three lines of explanation before the yes/no. I was reading paragraphs of English for hours against a theme tuned for syntax — one optimizing &lt;code&gt;string&lt;/code&gt; and &lt;code&gt;keyword&lt;/code&gt; slots that almost never fire in a Claude Code session. The slots that fire constantly are the UI slots: tool output, reasoning trace, the claude-sand brand accent in permission flows.&lt;/p&gt;

&lt;p&gt;Klein Void ships as four variations for macOS Terminal.app:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Refined&lt;/strong&gt; — balanced, IKB anchor, neutral stance on the Claude-sand accent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sand &amp;amp; Sea&lt;/strong&gt; — accepts &lt;code&gt;ansi:redBright&lt;/code&gt; (the claude-sand color) as a second hero alongside IKB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prot&lt;/strong&gt; — every role passes strict APCA gates: body &amp;gt;= 90, subtle &amp;gt;= 75, muted &amp;gt;= 45, accent &amp;gt;= 60&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gallery&lt;/strong&gt; — maximum void, one blue, minimal everything else&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Prot is the only variation where every accent slot clears its gate without exception. The others make deliberate tradeoffs toward aesthetics where the math allows.&lt;/p&gt;

&lt;p&gt;Install via &lt;code&gt;install.sh&lt;/code&gt;, fully reversible with &lt;code&gt;restore.sh&lt;/code&gt;. Requires Claude Code's &lt;code&gt;/theme&lt;/code&gt; picker set to &lt;code&gt;dark-ansi&lt;/code&gt; — otherwise Claude Code ignores the ANSI palette entirely and falls back to hardcoded RGB.&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>Inline context without the tab spiral</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sun, 14 Jun 2026 14:45:43 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/inline-context-without-the-tab-spiral-421p</link>
      <guid>https://dev.to/palo_alto_ai/inline-context-without-the-tab-spiral-421p</guid>
      <description>&lt;p&gt;Reading a dense article about monetary policy, I hit 'Triffin dilemma.' Half-knew it. Enough to keep going, not enough to actually follow the argument. My options were: open a new tab and lose my place in the piece, or skim past it and stay shallow. Neither is good.&lt;/p&gt;

&lt;p&gt;rabbitholes is a Chrome extension that renders an explanation in a shadow-DOM tooltip next to your cursor when you highlight text — no new tab, no page pollution. The shadow DOM matters because it can't accidentally inherit or clobber the host page's styles.&lt;/p&gt;

&lt;p&gt;The part I use most: click any word in the explanation to explore it further. That's the actual rabbit hole. You're reading about Triffin, the explanation mentions Bretton Woods, you click it, another layer opens. A counter tracks how many hops deep you've gone.&lt;/p&gt;

&lt;p&gt;Every response ends with two suggested threads — the most interesting places to go from here. If you want to pull in live sources, 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 everything you've already read as context.&lt;/p&gt;

&lt;p&gt;Zero telemetry, no intermediary server. Your API key lives in &lt;code&gt;chrome.storage.sync&lt;/code&gt; — encrypted, never leaves the browser. Requests go directly to &lt;code&gt;api.anthropic.com&lt;/code&gt; and &lt;code&gt;api.search.brave.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The constraint that shaped the design: you never leave the page. The thread you were actually reading is still there, undisturbed, when you close the tooltip.&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>Translating 'I missed you' so it doesn't land like a form letter</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sun, 14 Jun 2026 12:36:36 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/translating-i-missed-you-so-it-doesnt-land-like-a-form-letter-2lj4</link>
      <guid>https://dev.to/palo_alto_ai/translating-i-missed-you-so-it-doesnt-land-like-a-form-letter-2lj4</guid>
      <description>&lt;p&gt;I was trying to tell someone something real in her first language — not "I missed you" from a dropdown, but the version that sounds like a person said it. Google Translate gave me one answer. No indication whether it was what you'd text at midnight or what you'd write in a letter to someone's grandmother.&lt;/p&gt;

&lt;p&gt;That's the failure mode of literal translators: one output, no register, no sense of what you're actually choosing between.&lt;/p&gt;

&lt;p&gt;konid returns 3 options per query, ordered casual to formal, with the register explained and a cultural note on the difference between them. For Mandarin or Japanese, audio plays through your speakers via node-edge-tts — no API key, no browser tab — because reading a pinyin romanization and actually hearing the tone contour are two different things. The vowel length in Korean, the pitch drop in Japanese, the stress pattern in Arabic: you don't internalize those from text. You internalize them from hearing them repeated back while you're still in the context of trying to say something.&lt;/p&gt;

&lt;p&gt;The setup for 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 runs as an MCP server, so it works in Cursor, VS Code Copilot, Windsurf, Zed, JetBrains, and Claude Cowork. Also installs as a ChatGPT app via Developer mode using the endpoint &lt;code&gt;https://konid.fly.dev/mcp&lt;/code&gt;. Supports 13+ languages: Mandarin, Japanese, Korean, Spanish, French, German, Portuguese, Italian, Russian, Arabic, Hindi, and more.&lt;/p&gt;

&lt;p&gt;The name is Farsi — konid (کنید) means "do." MIT licensed.&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>nlp</category>
      <category>node</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>Why MCP servers die in obscurity (and how I automated the fix)</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sun, 14 Jun 2026 10:57:29 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/why-mcp-servers-die-in-obscurity-and-how-i-automated-the-fix-4j0d</link>
      <guid>https://dev.to/palo_alto_ai/why-mcp-servers-die-in-obscurity-and-how-i-automated-the-fix-4j0d</guid>
      <description>&lt;p&gt;Publishing an MCP server to npm or GitHub and waiting for adoption is a losing strategy. The official MCP Registry, Smithery, Glama, PulseMCP, and GitHub Topics all index separately, and hitting each one manually — then remembering to post to Bluesky, Dev.to, and Mastodon — is an afternoon you lose once and then never repeat.&lt;/p&gt;

&lt;p&gt;So I built marketing-pipeline to do the recurring work.&lt;/p&gt;

&lt;p&gt;Onboarding a new project is 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;It fetches your README, extracts the problem statement and key facts via Claude, and writes them to &lt;code&gt;projects.yml&lt;/code&gt;. From that point, a daily GitHub Actions cron at 14:00 UTC rotates through your registered projects, picks the least-recently-used angle, drafts channel-appropriate posts, and publishes them — Bluesky (≤300 chars), X (≤280), Mastodon (≤500), Dev.to and Hashnode (150–400 words with code blocks). The &lt;code&gt;kind: mcp-server&lt;/code&gt; flag routes the launch step to the MCP Registry (which Glama and PulseMCP pull from automatically), Smithery, and GitHub Topics.&lt;/p&gt;

&lt;p&gt;The part I spent the most time on: an antislop gate in &lt;code&gt;pipeline/antislop.py&lt;/code&gt; that hard-rejects any draft containing 'excited', 'game-changer', 'unlock', 'AI-powered', emoji, hashtags, or exclamation points before anything gets published. Every MCP tool announcement sounds identical right now. This was my attempt to not add to that.&lt;/p&gt;

&lt;p&gt;One caveat worth naming: awesome-claude-code can't be automated. Their rules require a human to submit via their GitHub issue form. The pipeline generates the payload; you paste it once.&lt;/p&gt;

&lt;p&gt;Requirements: an Anthropic API key plus credentials for Bluesky, Dev.to, and Hashnode at minimum. Mastodon is optional.&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>
    </item>
    <item>
      <title>What 9,830 Claude conversations reveal about your session habits</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sat, 13 Jun 2026 18:27:32 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/what-9830-claude-conversations-reveal-about-your-session-habits-3g07</link>
      <guid>https://dev.to/palo_alto_ai/what-9830-claude-conversations-reveal-about-your-session-habits-3g07</guid>
      <description>&lt;p&gt;Anthropics February 2026 AI Fluency Index studied 9,830 Claude conversations and classified them across 11 observable collaboration behaviors — things like how often users delegate open-ended tasks versus hand-holding each step, or whether they push back on Claude's first answer at all.&lt;/p&gt;

&lt;p&gt;I read the study and immediately wanted to know where my own sessions landed. Not in aggregate intuition, but actually classified against the same taxonomy.&lt;/p&gt;

&lt;p&gt;So I built skill-tree: it reads your Claude Code or Cowork session history, runs the same 11-behavior classification against Anthropic's baseline population, assigns one of seven archetype cards rendered as tarot cards with museum art, and picks one behavior you haven't touched as a growth quest for your next session.&lt;/p&gt;

&lt;p&gt;The output is a stable URL — hosted on Fly.io — so you can share or revisit it. Here's what the archetype card looks like for the Illuminator type: skill-tree-ai.fly.dev/fixture/illuminator&lt;/p&gt;

&lt;p&gt;The behavior taxonomy comes from Dakan &amp;amp; Feller's 4D AI Fluency Framework (Description, Discernment, Delegation, and Diligence — the fourth isn't classifiable from chat logs alone). The classifier runs as Claude Haiku on Fly.io and takes 30–60 seconds end-to-end across 7 steps: find session files, extract user messages, classify, assign archetype, synthesize narrative, render, return URL.&lt;/p&gt;

&lt;p&gt;The growth quest persists across sessions via a SessionStart hook. Claude Code stores state at &lt;code&gt;~/.skill-tree/&lt;/code&gt;; 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;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 (npm: &lt;code&gt;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>
    </item>
    <item>
      <title>A terminal theme built for reading paragraphs, not scanning tokens</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sat, 13 Jun 2026 16:29:42 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/a-terminal-theme-built-for-reading-paragraphs-not-scanning-tokens-307j</link>
      <guid>https://dev.to/palo_alto_ai/a-terminal-theme-built-for-reading-paragraphs-not-scanning-tokens-307j</guid>
      <description>&lt;p&gt;Most of my working day is spent reading prose in a terminal. Tool output, reasoning traces, permission prompts, explanations — the text-to-code ratio runs close to 80/20 in favor of paragraphs. Every theme I tried was optimized for syntax highlighting: maximize token contrast, make keywords pop. Wrong problem.&lt;/p&gt;

&lt;p&gt;So I built klein-blue: four Terminal.app themes anchored to Yves Klein's IKB pigment, with APCA contrast gates set per text role rather than per syntax class.&lt;/p&gt;

&lt;p&gt;The central constraint that shaped everything: pure IKB (the pigment's hex value, 002FA7) fails APCA contrast on a dark background — Lc -12, effectively invisible as readable text. The fix was splitting it across two ANSI slots. The blue slot gets pure IKB for borders and decorative highlights. The blueBright slot gets a lifted Klein-family value (A8BEF0) for permission-prompt text that actually needs to be read. One pigment family, two roles, two different slots.&lt;/p&gt;

&lt;p&gt;The APCA gates across variations: body &amp;gt;= 90 Lc, subtle &amp;gt;= 75, muted &amp;gt;= 45, accent &amp;gt;= 60. Klein Void Prot is the only one of four variations where every slot passes strict gates. The others make deliberate tradeoffs — more void, or a second hero color — at the cost of one or two marginal accent values.&lt;/p&gt;

&lt;p&gt;The four variations differ on one axis: what to do with the ANSI redBright slot, which Claude Code uses for its claude-sand brand color. Refined neutralizes it so nothing competes with IKB. Sand &amp;amp; Sea accepts it as a second hero. Gallery pushes toward monochrome. Prot locks everything to verified contrast.&lt;/p&gt;

&lt;p&gt;One non-obvious install step: Claude Code's built-in theme picker must be set to dark-ansi. Any other setting and it uses hardcoded RGB values, ignoring the Terminal.app ANSI profile entirely.&lt;/p&gt;

&lt;p&gt;Ships with CommitMono-Regular and IBM Plex Mono, copied to the system font directory on install. Fully rollback-able. MIT licensed.&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>Inline Wikipedia for every page you read</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sat, 13 Jun 2026 14:43:30 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/inline-wikipedia-for-every-page-you-read-4pe0</link>
      <guid>https://dev.to/palo_alto_ai/inline-wikipedia-for-every-page-you-read-4pe0</guid>
      <description>&lt;p&gt;Reading about the Dreyfus Affair last week, I hit 'syndicalism' and made a decision I've made a thousand times: keep going and stay shallow. Opening a new tab meant losing the thread. Skipping meant half-understanding the rest of the article.&lt;/p&gt;

&lt;p&gt;So I built rabbitholes — a Chrome extension that renders an explanation next to your cursor when you highlight text, inside a shadow-DOM tooltip that doesn't touch the host page's styles or layout.&lt;/p&gt;

&lt;p&gt;The part I actually use most: every explanation ends with two suggested rabbit-hole topics. One click on either fires off the next query, inheriting the context of where you started. There's a hop counter so you can see how far you've wandered — highlight a word in a physics article, follow a thread, and you can end up at philosophy with a shareable trail of every step.&lt;/p&gt;

&lt;p&gt;If the inline explanation isn't enough, a globe icon re-runs the query enriched with Brave Search results, with source chips you can click through. A pencil icon opens a follow-up input that already knows what you were asking about.&lt;/p&gt;

&lt;p&gt;No intermediary server. Your API key lives in &lt;code&gt;chrome.storage.sync&lt;/code&gt; and requests go directly to &lt;code&gt;api.anthropic.com&lt;/code&gt;. Zero telemetry, Manifest V3.&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;// Shadow DOM prevents tooltip styles from bleeding into host pages&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;container&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="c1"&gt;// Closed mode: host page JS can't query into the tooltip at all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The closed shadow root matters specifically because some sites run scripts that walk the DOM — an open shadow root would expose the tooltip to those traversals.&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>When one translation isn't enough: building a language coach for real speech</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sat, 13 Jun 2026 12:33:44 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/when-one-translation-isnt-enough-building-a-language-coach-for-real-speech-35a4</link>
      <guid>https://dev.to/palo_alto_ai/when-one-translation-isnt-enough-building-a-language-coach-for-real-speech-35a4</guid>
      <description>&lt;p&gt;I wanted to tell my girlfriend 'I missed you today' in Farsi. Google Translate gave me one answer. It was technically correct and completely wrong for the moment — the kind of sentence you'd read off a form, not say to someone you love.&lt;/p&gt;

&lt;p&gt;That gap between technically correct and actually right is where most translation tools stop caring. They hand you a string and move on. No indication of register. No sense of whether you're being formal with a stranger or warm with a partner. No way to know if you've chosen the phrase that fits.&lt;/p&gt;

&lt;p&gt;So I built konid — an MCP server that returns three options per query, ordered casual to formal, with the register explained and a nuance comparison between them. Audio pronunciation plays directly through your speakers via node-edge-tts, no external API key.&lt;/p&gt;

&lt;p&gt;The three-option structure matters more than it sounds. In Japanese, the distance between casual and polite speech isn't vocabulary — it's verb endings and entire grammatical registers that signal relationship, hierarchy, and context. Returning one answer flattens all of that. Returning three, with the distinctions explained, forces you to make a conscious choice. That choice is the actual language skill.&lt;/p&gt;

&lt;p&gt;For translating work emails in a language you're still learning, it's the same problem in reverse: you want to get through the task &lt;em&gt;and&lt;/em&gt; understand what you just sent. konid gives you the cultural context alongside the options — why one phrasing lands as professional and another lands as distant.&lt;/p&gt;

&lt;p&gt;Installs in Claude Code with 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;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 works with Cursor, VS Code Copilot, Windsurf, Zed, JetBrains, and Claude Cowork. ChatGPT users can add it via Developer mode with the endpoint &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, and more.&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>Building email campaigns by hand while guessing if they'll actually work</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sat, 13 Jun 2026 10:47:13 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/building-email-campaigns-by-hand-while-guessing-if-theyll-actually-work-10jc</link>
      <guid>https://dev.to/palo_alto_ai/building-email-campaigns-by-hand-while-guessing-if-theyll-actually-work-10jc</guid>
      <description>&lt;p&gt;I spent a few hours last month rebuilding a promotional email in Mailchimp — drag, drop, resize, preview on mobile, tweak the CTA button color, repeat. Sent it. Conversion rate was fine. Had no idea whether the layout hierarchy was the reason or despite it.&lt;/p&gt;

&lt;p&gt;Kopi takes a text brief and returns a complete HTML email in under 5 minutes. The part I find most useful isn't the generation — it's that every output gets an automated design critique: layout hierarchy, mobile readability, CTA contrast, and 12+ other criteria scored on a 0-100 scale. You know what's weak before it ships, not after.&lt;/p&gt;

&lt;p&gt;There's a public gallery at trykopi.ai/emails with 400+ emails that scored 80 or above, which is useful for calibrating what "good" actually looks like across industries and formats — something a blank template library never gave me.&lt;/p&gt;

&lt;p&gt;If you're already running Klaviyo, it exports directly to campaigns. If you're working in Claude Code or Cursor, it runs as an MCP server. It also picks up brand-specific design systems — fonts, colors, layout preferences — so the fifth email you generate doesn't look like a fresh start.&lt;/p&gt;

&lt;p&gt;I got tired of spending a Tuesday afternoon on one campaign and still shipping something I wasn't confident in. This fixed that specific problem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://trykopi.ai" rel="noopener noreferrer"&gt;https://trykopi.ai&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Claude Code sessions: measurable fluency or just muscle memory?</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Fri, 12 Jun 2026 18:37:56 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/claude-code-sessions-measurable-fluency-or-just-muscle-memory-1cbm</link>
      <guid>https://dev.to/palo_alto_ai/claude-code-sessions-measurable-fluency-or-just-muscle-memory-1cbm</guid>
      <description>&lt;p&gt;Anthropologic published a study in February measuring 11 observable collaboration behaviors across 9,830 Claude conversations. They call it the AI Fluency Index. I read it, recognized maybe four of the behaviors in my own workflow, and had no honest answer about the other seven.&lt;/p&gt;

&lt;p&gt;skill-tree pulls your Claude Code session history, runs the same 11-behavior classification against your actual messages, and tells you which behaviors you've touched and which you've never used. The output is a character archetype card — seven possible archetypes, rendered as tarot cards with curated museum art — plus a single growth quest: one behavior from the taxonomy you haven't tried, carried forward into your next session via a SessionStart hook.&lt;/p&gt;

&lt;p&gt;The classification runs remotely on Fly.io (Claude Haiku), takes 30–60 seconds end-to-end across seven steps: find session files, extract user messages, classify behaviors, assign archetype, synthesize a narrative, render, return a stable URL. You can see a live example 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
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;The behaviors come from Dakan &amp;amp; Feller's 4D AI Fluency Framework (Description, Discernment, Delegation — Diligence is the fourth axis but isn't visible in chat logs). The study baseline is 9,830 conversations. Your card tells you where you sit against that population, not just how fast you've gotten at your current habits.&lt;/p&gt;

&lt;p&gt;Also works in Claude Cowork via &lt;code&gt;skill-tree-ai.zip&lt;/code&gt;, and available as an MCP server (npm: &lt;code&gt;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>
    </item>
    <item>
      <title>The Color I Built This Theme Around Is Invisible as Text</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Fri, 12 Jun 2026 16:58:46 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/the-color-i-built-this-theme-around-is-invisible-as-text-3kp2</link>
      <guid>https://dev.to/palo_alto_ai/the-color-i-built-this-theme-around-is-invisible-as-text-3kp2</guid>
      <description>&lt;p&gt;Yves Klein's International Klein Blue sits at hex 002FA7. On a dark terminal background, that scores Lc -12 on the APCA contrast scale — not borderline readable, actually invisible. I found this out while building a Claude Code theme anchored to it.&lt;/p&gt;

&lt;p&gt;The APCA Lc metric is worth understanding here. WCAG's 4.5:1 ratio compares luminance without accounting for polarity — dark text on light vs. light text on dark behave differently for perception. APCA measures that directionally. IKB is a dark color. On dark ground, the eye gets almost no signal. Pure IKB fails as text anywhere in the theme.&lt;/p&gt;

&lt;p&gt;The fix was structural: split the blue work across two ANSI slots that Claude Code uses differently. The &lt;code&gt;ansi:blue&lt;/code&gt; slot carries decorative elements — borders, bullets, visual chrome — where the color reads as accent and legibility is secondary. The &lt;code&gt;ansi:blueBright&lt;/code&gt; slot carries permission-prompt text that actually needs to be read. Pure IKB goes in the decorative slot. A lifted Klein-family hex A8BEF0 goes in the readable slot. Same pigment family, different luminance, different job.&lt;/p&gt;

&lt;p&gt;That split is the structural logic the whole theme set rests on. Four variations ship:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Klein Void Refined&lt;/strong&gt; — balanced daily driver&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Klein Void Sand &amp;amp; Sea&lt;/strong&gt; — accepts Claude's &lt;code&gt;ansi:redBright&lt;/code&gt; brand-sand color as a second hero&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Klein Void Prot&lt;/strong&gt; — every slot APCA-verified, per-role gates enforced (body &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; — one blue, maximum void, nothing competes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The context that made this worth building: Claude Code output is mostly prose. Tool output, reasoning traces, permission prompts — hours of English at terminal font size. Most themes optimize for syntax highlighting across code tokens. That's the wrong problem when 80% of what's on screen is paragraph text. Klein Void Prot is the variation I use for long sessions where a four-paragraph reasoning trace shows up at the end of a chain.&lt;/p&gt;

&lt;p&gt;One constraint worth flagging: Claude Code must have &lt;code&gt;/theme&lt;/code&gt; set to &lt;code&gt;dark-ansi&lt;/code&gt;, or it ignores the ANSI profile entirely and falls back to its hardcoded RGB palette. The theme is a no-op without that.&lt;/p&gt;

&lt;p&gt;Ships as &lt;code&gt;.terminal&lt;/code&gt; profile files for macOS Terminal.app, with CommitMono-Regular or IBM Plex Mono depending on variation. Install and rollback scripts included.&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>
  </channel>
</rss>
