<?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>The growth quest picks what you avoid, not what you're already good at</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sun, 03 May 2026 18:45:46 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/the-growth-quest-picks-what-you-avoid-not-what-youre-already-good-at-n6j</link>
      <guid>https://dev.to/palo_alto_ai/the-growth-quest-picks-what-you-avoid-not-what-youre-already-good-at-n6j</guid>
      <description>&lt;p&gt;Most feedback loops optimize for your strengths. You get fast at the things you do — then you do those things more because they feel productive. Local optimum, no escape route.&lt;/p&gt;

&lt;p&gt;skill-tree does the opposite. After classifying your Claude Code sessions against the 11 behaviors in Anthropic's AI Fluency Index (February 2026, 9,830 conversations studied), it looks at which behaviors you never touch and assigns one of those as a growth quest for your next session.&lt;/p&gt;

&lt;p&gt;The taxonomy comes from Dakan &amp;amp; Feller's 4D AI Fluency Framework — Description, Discernment, Delegation, and Diligence. Diligence doesn't appear in chat logs, so the classifier works across the other three axes. If you're heavy on Description (explaining your problem in detail) but never use Discernment behaviors (questioning the output, asking for alternatives, pushing back on reasoning), the quest targets Discernment — not because you're bad at it, but because you've never tried it.&lt;/p&gt;

&lt;p&gt;The archetype cards are rendered as tarot cards with curated museum art. You can see a live example at skill-tree-ai.fly.dev/fixture/illuminator. Each run takes 30–60 seconds: session files get extracted, classified remotely via Claude Haiku on Fly.io, assigned to one of seven archetypes, and returned as a stable hosted URL.&lt;/p&gt;

&lt;p&gt;The quest persists across sessions via a SessionStart hook, stored at &lt;code&gt;~/.skill-tree/&lt;/code&gt; in Claude Code so it survives restarts.&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 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>learning</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why IKB fails as readable text — and what I did about it</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sun, 03 May 2026 16:39:12 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/why-ikb-fails-as-readable-text-and-what-i-did-about-it-ic7</link>
      <guid>https://dev.to/palo_alto_ai/why-ikb-fails-as-readable-text-and-what-i-did-about-it-ic7</guid>
      <description>&lt;p&gt;Yves Klein registered International Klein Blue as a pigment in 1960. Pure IKB (hex 002FA7) on a dark terminal ground measures Lc -12 on the APCA contrast scale — effectively invisible as text. That's the central problem I had to solve when building klein-blue.&lt;/p&gt;

&lt;p&gt;Claude Code uses specific ANSI slots for specific jobs: &lt;code&gt;ansi:blue&lt;/code&gt; for decorative borders, &lt;code&gt;ansi:blueBright&lt;/code&gt; for permission-prompt text you actually need to read. So I split IKB across both slots. Pure 002FA7 goes into the decorative slot where legibility doesn't matter. A lifted Klein-family blue (A8BEF0) goes into the readable slot where APCA body contrast gates apply.&lt;/p&gt;

&lt;p&gt;The four variations each handle this trade-off differently. Klein Void Prot is the strictest: every accent passes APCA gates (body &amp;gt;= 90, subtle &amp;gt;= 75, muted &amp;gt;= 45, accent &amp;gt;= 60). Klein Void Gallery pushes maximum void — one blue, minimal interruption. Klein Void Sand &amp;amp; Sea accepts Claude's &lt;code&gt;ansi:redBright&lt;/code&gt; slot as a second hero color instead of neutralizing it. Klein Void Refined splits the difference.&lt;/p&gt;

&lt;p&gt;All of them are tuned for prose, not syntax. Claude Code is paragraphs of tool output, reasoning, and permission prompts for hours at a stretch. Standard themes optimize for the 20% that's code.&lt;/p&gt;

&lt;p&gt;Ships as macOS Terminal.app &lt;code&gt;.terminal&lt;/code&gt; profiles with CommitMono-Regular (V1, V3) and IBM Plex Mono (V2, V4) — both install to &lt;code&gt;~/Library/Fonts/&lt;/code&gt; automatically. One thing that isn't obvious: Claude Code has to be set to dark-ansi via &lt;code&gt;/theme&lt;/code&gt;, otherwise it ignores the ANSI profile entirely and uses its hardcoded RGB palette.&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>showdev</category>
    </item>
    <item>
      <title>rabbitholes: inline explanations without leaving the page</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sun, 03 May 2026 14:42:41 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/rabbitholes-inline-explanations-without-leaving-the-page-2bpl</link>
      <guid>https://dev.to/palo_alto_ai/rabbitholes-inline-explanations-without-leaving-the-page-2bpl</guid>
      <description>&lt;p&gt;Reading a long piece on monetary policy, I hit 'sterilization operations' — a term I half-knew. My options were: open a new tab and lose my place, or skim past it and stay shallow. I've made that tradeoff a thousand times, always in the wrong direction.&lt;/p&gt;

&lt;p&gt;rabbitholes is a Chrome extension that breaks that choice. Highlight any text, and a shadow-DOM tooltip renders an explanation from Claude Haiku 4.5 next to your cursor — no new tab, no page reload, nothing injected into the host DOM. Click any word in the explanation to keep going. Drag across a phrase to explore it as a unit.&lt;/p&gt;

&lt;p&gt;The part I use most: every explanation ends with two suggested rabbit-hole topics, the most interesting threads from wherever you landed. A hop counter tracks how deep you've gone. Follow the chain far enough and you reliably end up somewhere strange — hit 'philosophy' and it generates a shareable trail.&lt;/p&gt;

&lt;p&gt;When you want sources instead of synthesis, the globe icon re-runs the query against Brave Search and returns the same explanation enriched with source chips. When you want to push the conversation somewhere specific, the pencil icon opens a free-form input that inherits the current context.&lt;/p&gt;

&lt;p&gt;No analytics, no telemetry, no intermediary 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 and never leaves the browser. Manifest V3 throughout.&lt;/p&gt;

&lt;p&gt;I built it because I wanted Wikipedia on every page — not a Wikipedia tab, but the actual feeling of every concept being one gesture away, inline, without the context break. It's close enough now that I use it on almost everything I read.&lt;/p&gt;

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

</description>
      <category>ai</category>
      <category>learning</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Why one translation isn't enough when tone is the whole message</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sun, 03 May 2026 12:50:21 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/why-one-translation-isnt-enough-when-tone-is-the-whole-message-2ho1</link>
      <guid>https://dev.to/palo_alto_ai/why-one-translation-isnt-enough-when-tone-is-the-whole-message-2ho1</guid>
      <description>&lt;p&gt;I wanted to tell a friend "I missed you" in Mandarin. Google Translate gave me one answer. I had no idea if it was the kind of thing you'd text someone or say at a funeral.&lt;/p&gt;

&lt;p&gt;That gap is what I built konid to close.&lt;/p&gt;

&lt;p&gt;The core problem with literal translation tools: they treat every sentence as a word-matching problem. A language is a register problem. "I missed you" between close friends sounds nothing like "I missed you" in a professional apology, and the difference isn't just vocabulary — it's tone contour, vowel length, formality markers that a flat text string can't convey.&lt;/p&gt;

&lt;p&gt;So konid returns three options per query, ordered casual to formal, with the register difference explained in plain language. More importantly, it plays audio pronunciation through your speakers directly — no external API key, using node-edge-tts — because reading a Mandarin or Arabic romanization and hearing how it actually sounds are two completely different memory events. The tone contour and vowel length is what your brain needs to actually retain the phrase, not just copy-paste it.&lt;/p&gt;

&lt;p&gt;Setup for 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 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 in Cursor, VS Code Copilot, Windsurf, Zed, JetBrains, and Claude Cowork. If you're on ChatGPT, there's a Developer mode endpoint at &lt;code&gt;https://konid.fly.dev/mcp&lt;/code&gt;.&lt;/p&gt;

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

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

</description>
      <category>nlp</category>
      <category>showdev</category>
      <category>sideprojects</category>
      <category>ux</category>
    </item>
    <item>
      <title>Why Most MCP Servers Stay Invisible After Launch</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sun, 03 May 2026 10:46:23 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/why-most-mcp-servers-stay-invisible-after-launch-15fh</link>
      <guid>https://dev.to/palo_alto_ai/why-most-mcp-servers-stay-invisible-after-launch-15fh</guid>
      <description>&lt;p&gt;The MCP Registry is where tools like Claude Desktop discover servers. Smithery is where developers browse. GitHub Topics is where search lands. Getting listed in all three after shipping means three separate submissions, and most people skip at least two of them.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;marketing onboard --name my-tool --repo owner/repo --kind mcp-server&lt;/code&gt; handles all three in one step. It reads your README, extracts the problem and facts via Claude, and saves them to &lt;code&gt;projects.yml&lt;/code&gt;. The &lt;code&gt;kind: mcp-server&lt;/code&gt; flag routes the project to the MCP Registry (which Glama and PulseMCP pull from automatically), Smithery, and GitHub Topics. After that, a daily cron at 14:00 UTC picks up your project and drafts posts for Bluesky, Mastodon, Dev.to, and Hashnode — rotating through angles so the same post doesn't repeat across channels.&lt;/p&gt;

&lt;p&gt;The part I'm most opinionated about: before any post goes out, &lt;code&gt;pipeline/antislop.py&lt;/code&gt; hard-rejects 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;AI-powered&lt;/code&gt;, emoji, hashtags, exclamation points, rhetorical questions — all blocked. The gate exists because marketing copy that reads like a press release gets ignored, and ignored posts don't solve the distribution problem.&lt;/p&gt;

&lt;p&gt;Per-channel length limits are also enforced: 300 chars for Bluesky, 280 for X, 500 for Mastodon, 150–400 words for Dev.to and Hashnode. Drafts that exceed the limit don't post.&lt;/p&gt;

&lt;p&gt;One exception: awesome-claude-code requires a human to submit via their GitHub issue form. The pipeline generates the payload, but their rules block automation. Everything else runs without daily intervention.&lt;/p&gt;

&lt;p&gt;Requires an Anthropic API key plus credentials for Bluesky, Dev.to, and Hashnode at minimum.&lt;/p&gt;

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

</description>
      <category>automation</category>
      <category>cli</category>
      <category>mcp</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Mapping my Claude Code habits against 9,830-conversation baseline</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sat, 02 May 2026 18:45:00 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/mapping-my-claude-code-habits-against-9830-conversation-baseline-2196</link>
      <guid>https://dev.to/palo_alto_ai/mapping-my-claude-code-habits-against-9830-conversation-baseline-2196</guid>
      <description>&lt;p&gt;Anthropoc published a study in February that classified 11 observable collaboration behaviors across 9,830 Claude conversations. I'd been using Claude Code daily for months and wanted to know how my sessions mapped against that distribution — not a score, but a breakdown: which behaviors showed up, which were absent, which I'd apparently never tried.&lt;/p&gt;

&lt;p&gt;I built skill-tree to answer that. It reads your Claude Code session history, runs the same 11-behavior classification from the AI Fluency Index, then assigns one of seven archetype cards based on your actual distribution. More usefully: it picks the one behavior you haven't touched and surfaces it as a growth quest pinned to your next session via the SessionStart hook.&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. Diligence doesn't show up in chat logs, so the classifier works across the other three axes. The 11 behaviors are the same ones Anthropic used for the population study, which means your output is directly comparable to that baseline.&lt;/p&gt;

&lt;p&gt;End-to-end pipeline is 7 steps: find session files, extract user messages, remote classifier (Claude Haiku on Fly.io), archetype assignment, narrative synthesis, render, return a stable URL. Takes 30–60 seconds. The archetype cards are rendered as tarot cards using curated museum art — 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;Also works in Cowork via &lt;code&gt;skill-tree-ai.zip&lt;/code&gt;, and there's 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;Growth quest state persists across sessions. 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 its &lt;code&gt;$HOME&lt;/code&gt; is ephemeral.&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 for code syntax — useless when your screen is prose</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sat, 02 May 2026 16:38:14 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/terminal-themes-for-code-syntax-useless-when-your-screen-is-prose-59a4</link>
      <guid>https://dev.to/palo_alto_ai/terminal-themes-for-code-syntax-useless-when-your-screen-is-prose-59a4</guid>
      <description>&lt;p&gt;After a few weeks of heavy Claude Code sessions, I noticed my eyes were fatiguing around hour two. The theme I was using (a well-regarded dark syntax theme) was tuned for token-level contrast: keywords pop, strings pop, comments recede. That's the right hierarchy for reading code. It's the wrong hierarchy when 80% of what's on screen is tool output, reasoning blocks, and permission prompts — paragraphs of English at body size.&lt;/p&gt;

&lt;p&gt;So I built klein-blue: four Terminal.app themes for Claude Code, APCA-verified for prose legibility rather than syntax highlighting.&lt;/p&gt;

&lt;p&gt;The interesting constraint was IKB itself — Yves Klein's International Klein Blue, pure pigment hex 002FA7. It fails APCA as text on a dark ground (Lc -12, effectively invisible). To keep the anchor color while staying readable, I split it across two ANSI slots: pure IKB in &lt;code&gt;ansi:blue&lt;/code&gt; for decorative borders and highlights where it's large enough to carry, and a lifted Klein-family blue A8BEF0 in &lt;code&gt;ansi:blueBright&lt;/code&gt; for permission-prompt text that has to be read at body size.&lt;/p&gt;

&lt;p&gt;Contrast gates are set per semantic role rather than globally: body &amp;gt;= 90 Lc, subtle &amp;gt;= 75, muted &amp;gt;= 45, accent &amp;gt;= 60. Klein Void Prot is the only variation where every accent slot clears strict gates — the other three trade some accent contrast for a warmer feel or explicit brand accommodation.&lt;/p&gt;

&lt;p&gt;The four variations exist because of one specific ANSI slot: &lt;code&gt;ansi:redBright&lt;/code&gt;, which Claude Code uses for its claude-sand brand color. Depending on whether you want that second hero color competing with the blue or not, you pick Klein Void Sand &amp;amp; Sea (accepts it) or Klein Void Gallery (neutralizes it, maximum void).&lt;/p&gt;

&lt;p&gt;One thing worth knowing before installing: Claude Code has to be set to &lt;code&gt;dark-ansi&lt;/code&gt; via its &lt;code&gt;/theme&lt;/code&gt; picker. If it's on any other setting it ignores your Terminal.app ANSI palette entirely and renders its hardcoded RGB values instead.&lt;/p&gt;

&lt;p&gt;Ships as &lt;code&gt;.terminal&lt;/code&gt; profile files, installed via &lt;code&gt;install.sh&lt;/code&gt;, rollback via &lt;code&gt;restore.sh&lt;/code&gt;. Includes CommitMono-Regular and IBM Plex Mono depending on variation.&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>ux</category>
    </item>
    <item>
      <title>Why rabbitholes sends your API key directly to Anthropic</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sat, 02 May 2026 14:42:03 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/why-rabbitholes-sends-your-api-key-directly-to-anthropic-5h31</link>
      <guid>https://dev.to/palo_alto_ai/why-rabbitholes-sends-your-api-key-directly-to-anthropic-5h31</guid>
      <description>&lt;p&gt;Most browser extensions that call an LLM route your requests through the developer's server. That means your queries — every term you look up, every concept you're half-embarrassed not to know — pass through infrastructure you don't control, get logged at some layer, and fund somebody's inference costs until the startup pivots or shuts down.&lt;/p&gt;

&lt;p&gt;rabbitholes doesn't work that way. When you highlight a word, the request goes from your browser directly to &lt;code&gt;api.anthropic.com&lt;/code&gt;. No intermediary. No proxy. No backend I'm running.&lt;/p&gt;

&lt;p&gt;This wasn't a late-stage privacy checkbox. It was the first architectural decision, because it's the only design that's actually private. An intermediary server that promises not to log is still a server that &lt;em&gt;can&lt;/em&gt; log. Direct-to-API means the topology itself is the guarantee.&lt;/p&gt;

&lt;p&gt;The implementation consequences are real. Your Anthropic API key lives in &lt;code&gt;chrome.storage.sync&lt;/code&gt;, encrypted by Chrome, never transmitted anywhere except the Anthropic endpoint. Same for the optional Brave Search key — if you hit the globe icon to enrich an answer with live search results, that request goes direct to &lt;code&gt;api.search.brave.com&lt;/code&gt;. Zero analytics, zero telemetry, nothing phoning home to me.&lt;/p&gt;

&lt;p&gt;The tradeoff: you need your own API keys. Haiku 3.5 is cheap enough that a few hundred lookups per day runs well under a dollar, but it's not zero-config out of the box. I decided that was the right tradeoff. A free tier that routes through my server would be a worse product even if it felt more convenient at install time.&lt;/p&gt;

&lt;p&gt;The shadow DOM tooltip is the other structural choice worth noting. Explanations render in an isolated DOM tree next to your cursor, so rabbitholes can't leak styles into the host page or break layouts on pages with aggressive CSS resets. You can click any word in the explanation to explore it further, or drag across a phrase to narrow the query. Every answer ends with two suggested rabbit-hole topics. A counter tracks how many hops deep you've gone.&lt;/p&gt;

&lt;p&gt;None of that data leaves your browser.&lt;/p&gt;

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

</description>
      <category>api</category>
      <category>architecture</category>
      <category>llm</category>
      <category>privacy</category>
    </item>
    <item>
      <title>When one translation isn't enough: building konid for real language learning</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sat, 02 May 2026 12:50:39 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/when-one-translation-isnt-enough-building-konid-for-real-language-learning-56lk</link>
      <guid>https://dev.to/palo_alto_ai/when-one-translation-isnt-enough-building-konid-for-real-language-learning-56lk</guid>
      <description>&lt;p&gt;I was helping a friend draft a work email in French — a language he's been studying for two years. He typed his sentence into a translation tool, got one answer, and had no way to know if it read as formal, casual, brusque, or warm. He sent it. His French colleague later told him it was technically correct but oddly stiff.&lt;/p&gt;

&lt;p&gt;That's the gap literal translation tools leave. One answer, no register, no sense of what it signals to the person reading it.&lt;/p&gt;

&lt;p&gt;konid returns three options for anything you want to say, ordered casual to formal, with the register explained and a comparison of the nuance between them. It also plays the pronunciation out loud through your speakers using node-edge-tts — no external API key needed.&lt;/p&gt;

&lt;p&gt;The register distinction matters more than people expect. In Japanese, whether you say 「会いたかった」or 「お会いしたかった」or something in between isn't just politeness level — it signals the relationship, the setting, the emotional weight you're putting on the words. A phrasebook gives you the polite form and calls it done. That's fine for ordering coffee; it's not fine for texting your partner or writing to a colleague you want to actually impress.&lt;/p&gt;

&lt;p&gt;Same thing in Arabic: the same sentiment in Modern Standard Arabic versus a colloquial dialect reads completely differently to a native speaker. konid flags that.&lt;/p&gt;

&lt;p&gt;The tool runs as an MCP server, so it works inside Claude Code (&lt;code&gt;claude mcp add konid-ai -- npx -y konid-ai&lt;/code&gt;), Cursor, VS Code Copilot, Windsurf, Zed, JetBrains, and Claude Cowork. It 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 including Mandarin, Japanese, Korean, Spanish, French, German, Portuguese, Italian, Russian, Arabic, and Hindi.&lt;/p&gt;

&lt;p&gt;The intent was never just translation — it's that each query teaches you something about how the language actually works, not just what the words technically mean.&lt;/p&gt;

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

</description>
      <category>learning</category>
      <category>node</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>Building email campaigns by hand is a design QA problem</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sat, 02 May 2026 10:44:05 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/building-email-campaigns-by-hand-is-a-design-qa-problem-14jh</link>
      <guid>https://dev.to/palo_alto_ai/building-email-campaigns-by-hand-is-a-design-qa-problem-14jh</guid>
      <description>&lt;p&gt;Last quarter I watched a teammate spend four hours in Mailchimp — dragging blocks, tweaking padding, checking the preview on mobile — then ship a campaign that had a CTA button with contrast so low it was basically invisible on dark mode. No tool flagged it. She found out from replies.&lt;/p&gt;

&lt;p&gt;Kopi generates a complete HTML email from a text prompt in under 5 minutes, then runs an automated design critique before anything ships. Every email gets scored 0–100 across 12+ criteria: layout hierarchy, mobile readability, CTA contrast, and others. The score isn't decorative — it surfaces the specific element failing and why.&lt;/p&gt;

&lt;p&gt;The public gallery at trykopi.ai/emails has 400+ emails that scored 80 or above, which is useful if you want to see what the scorer actually rewards before you trust it with your brand.&lt;/p&gt;

&lt;p&gt;Two implementation details worth knowing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Klaviyo integration
Generate email -&amp;gt; review score -&amp;gt; export directly to Klaviyo campaign draft.
No copy-paste, no HTML file handling.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It also runs as an MCP server, so if you live in Claude Code or Cursor you can generate and score emails without leaving your editor. Brand-specific design systems are supported — feed it your fonts, colors, and layout preferences once and every generation pulls from that context.&lt;/p&gt;

&lt;p&gt;The contrast scoring alone has caught things I would have shipped. That's the part I use it for most.&lt;/p&gt;

&lt;p&gt;trykopi.ai&lt;/p&gt;

</description>
      <category>ai</category>
      <category>design</category>
      <category>marketing</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Claude Code gave me no mirror. I built one.</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Fri, 01 May 2026 18:59:24 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/claude-code-gave-me-no-mirror-i-built-one-404a</link>
      <guid>https://dev.to/palo_alto_ai/claude-code-gave-me-no-mirror-i-built-one-404a</guid>
      <description>&lt;p&gt;Anthropics February 2026 study classified 11 observable collaboration behaviors across 9,830 Claude conversations. I had been using Claude Code daily for months and assumed I was improving. When I actually ran my sessions against that taxonomy, I found I was clustering hard around two behaviors and had never once triggered five others.&lt;/p&gt;

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

&lt;p&gt;It reads your Claude Code or Cowork session history, runs a remote classifier (Claude Haiku on Fly.io, takes 30-60 seconds end-to-end), and scores your sessions against the same 11 behaviors from the AI Fluency Index. Then it assigns one of seven archetype cards — rendered as tarot cards with museum art — and picks a single behavior you haven't touched as a growth quest for your next session. The quest persists via a SessionStart hook so Claude Code surfaces it at the top of every new conversation until you try it.&lt;/p&gt;

&lt;p&gt;The behavior taxonomy comes from Dakan and Feller's 4D AI Fluency Framework, organized across three axes visible in chat logs: Description, Discernment, and Delegation. A fourth axis (Diligence) exists in the framework but isn't observable from message history, so it's excluded.&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;. For Cursor, VS Code, or Windsurf, the MCP server is on npm as &lt;code&gt;skill-tree-ai&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Live archetype example: &lt;a href="https://skill-tree-ai.fly.dev/fixture/illuminator" rel="noopener noreferrer"&gt;https://skill-tree-ai.fly.dev/fixture/illuminator&lt;/a&gt;&lt;/p&gt;

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

</description>
      <category>ai</category>
      <category>claude</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Why IKB Fails as Terminal Text (and the Two-Slot Fix)</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Fri, 01 May 2026 16:46:59 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/why-ikb-fails-as-terminal-text-and-the-two-slot-fix-4096</link>
      <guid>https://dev.to/palo_alto_ai/why-ikb-fails-as-terminal-text-and-the-two-slot-fix-4096</guid>
      <description>&lt;p&gt;Yves Klein's International Klein Blue is hex 002FA7. On a dark terminal background, APCA scores it Lc -12 — not low-contrast, effectively invisible. I found this out after building the first draft of klein-blue and noticing permission prompts had vanished into the void they were supposed to evoke.&lt;/p&gt;

&lt;p&gt;The fix isn't to abandon IKB. It's to stop treating it as a single color with one job.&lt;/p&gt;

&lt;p&gt;Claude Code maps its interface elements onto specific ANSI slots. The &lt;code&gt;ansi:blue&lt;/code&gt; slot handles decorative elements — borders, structural highlights, things you glance at rather than read. The &lt;code&gt;ansi:blueBright&lt;/code&gt; slot carries permission-prompt text, the phrases you actually need to parse before hitting enter. These are different legibility requirements and they can hold different colors.&lt;/p&gt;

&lt;p&gt;So klein-blue splits the pigment across both slots: raw IKB (002FA7) in &lt;code&gt;ansi:blue&lt;/code&gt; for decoration, and a lifted Klein-family blue (A8BEF0) in &lt;code&gt;ansi:blueBright&lt;/code&gt; for anything that needs to be read at body size. The decorative slot gets the real IKB — chromatic fidelity where it costs nothing. The readable slot gets a tint that passes APCA Lc ≥ 90 for body text.&lt;/p&gt;

&lt;p&gt;The strictest variation, Klein Void Prot, applies this logic across every ANSI slot Claude Code touches: per-role contrast gates at body ≥ 90, subtle ≥ 75, muted ≥ 45, accent ≥ 60. It's the only variation where every accent passes those gates without exception.&lt;/p&gt;

&lt;p&gt;The broader problem this responds to: Claude Code is prose-heavy. Tool output, reasoning traces, permission prompts — most of what fills the screen is English paragraphs, not syntax-highlighted code. Standard terminal themes optimize for code; klein-blue optimizes for comfortable reading over long sessions, with IKB as the anchor color rather than a chromatic accident.&lt;/p&gt;

&lt;p&gt;Ships as macOS Terminal.app &lt;code&gt;.terminal&lt;/code&gt; profiles, installed via &lt;code&gt;install.sh&lt;/code&gt;, rollback-able via &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; — without that, Claude Code ignores the ANSI layer entirely and applies its hardcoded RGB palette.&lt;/p&gt;

&lt;p&gt;Four variations total, two font options (CommitMono-Regular, IBM Plex Mono).&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>
    </item>
  </channel>
</rss>
