<?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.us-east-2.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>Built a Terminal Theme Around One Specific Blue From 1960</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Tue, 14 Jul 2026 15:06:30 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/built-a-terminal-theme-around-one-specific-blue-from-1960-2l9p</link>
      <guid>https://dev.to/palo_alto_ai/built-a-terminal-theme-around-one-specific-blue-from-1960-2l9p</guid>
      <description>&lt;p&gt;Yves Klein registered International Klein Blue as a pigment in 1960 — a binder formula that lets ultramarine hold its full saturation without going flat on canvas. The depth it produces reads less like a color than like an absence. That quality is the entire design rationale for this project.&lt;/p&gt;

&lt;p&gt;The reading problem it's solving: spending hours a day inside Claude Code means spending hours reading prose — tool output, reasoning traces, permission prompts, multi-paragraph explanations. The terminal themes I had were tuned for token differentiation in syntax trees. Wrong job.&lt;/p&gt;

&lt;p&gt;Klein Void ships as four macOS Terminal.app &lt;code&gt;.terminal&lt;/code&gt; profiles, built with a variation-aware Objective-C builder and installed via &lt;code&gt;install.sh&lt;/code&gt; (rollback via &lt;code&gt;restore.sh&lt;/code&gt;). Contrast verification uses APCA's Lc metric with per-role minimums: body text at Lc 90, subtle roles at 75, muted at 45, accents at 60.&lt;/p&gt;

&lt;p&gt;Pure IKB (the hex I'm not writing here because validators eat color codes as hashtags) fails as readable text on dark ground — Lc -12, effectively invisible. So it's split across two ANSI slots: &lt;code&gt;ansi:blue&lt;/code&gt; gets pure IKB for decorative borders and highlights where legibility isn't required, and &lt;code&gt;ansi:blueBright&lt;/code&gt; gets a lifted Klein-family blue, APCA-cleared for permission-prompt text.&lt;/p&gt;

&lt;p&gt;The four variants differ mainly on one slot: &lt;code&gt;ansi:redBright&lt;/code&gt;, which Claude Code routes its claude-sand brand color through. Klein Void Sand &amp;amp; Sea accepts that as a second hero alongside IKB. Klein Void Refined and Gallery suppress it; Klein Void Prot verifies every accent slot against strict APCA gates — the only variant where all accents pass.&lt;/p&gt;

&lt;p&gt;Font options: CommitMono-Regular on V1 and V3, IBM Plex Mono on V2 and V4, both installed to ~/Library/Fonts/.&lt;/p&gt;

&lt;p&gt;One non-obvious requirement: Claude Code must be set to dark-ansi via its &lt;code&gt;/theme&lt;/code&gt; picker. On any other setting it ignores the Terminal.app ANSI palette and renders its own hardcoded RGB values. The theme does nothing until that's switched.&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>When a word stops you cold, you shouldn't have to leave the page</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Tue, 14 Jul 2026 14:13:14 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/when-a-word-stops-you-cold-you-shouldnt-have-to-leave-the-page-4ddi</link>
      <guid>https://dev.to/palo_alto_ai/when-a-word-stops-you-cold-you-shouldnt-have-to-leave-the-page-4ddi</guid>
      <description>&lt;p&gt;Here's the pattern that drove me to build this: reading a dense article, hit a term I half-know — say, "apophenia" — open a new tab, read the Wikipedia entry, open two more tabs from that, come back six minutes later with no idea where I was in the original piece. The article is still there. My thread of thought isn't.&lt;/p&gt;

&lt;p&gt;rabbitholes is a Chrome extension that renders an inline explanation next to your cursor when you highlight text. The tooltip lives in a shadow DOM so it doesn't touch the host page's styles or layout. You never leave the article.&lt;/p&gt;

&lt;p&gt;The part I use most: every word in the explanation is itself clickable. Highlight "apophenia," read the explanation, notice the word "pareidolia" in the response, drag across it — new explanation, same inline panel, same page. The rabbit-hole counter ticks up. You can go six hops deep into a concept tree without a single new tab.&lt;/p&gt;

&lt;p&gt;Two suggested follow-on topics appear at the bottom of each answer — not random, but the most interesting threads from that specific explanation. There's also a globe icon that re-runs the query enriched with Brave Search results, with source chips you can open if you want to verify something.&lt;/p&gt;

&lt;p&gt;Requests go directly from your browser to &lt;code&gt;api.anthropic.com&lt;/code&gt;. No intermediary server, zero telemetry, no analytics. Your Anthropic API key lives in &lt;code&gt;chrome.storage.sync&lt;/code&gt; and never leaves the browser.&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 attachment keeps tooltip styles isolated from 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;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;open&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The reason for shadow DOM over an iframe overlay: iframes can't inherit host-page fonts without a flash of unstyled content, and matching typography matters when the tooltip is sitting inline with an article you're reading.&lt;/p&gt;

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

</description>
    </item>
    <item>
      <title>Pronunciation is how you remember what you learned</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Tue, 14 Jul 2026 12:55:03 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/pronunciation-is-how-you-remember-what-you-learned-6hg</link>
      <guid>https://dev.to/palo_alto_ai/pronunciation-is-how-you-remember-what-you-learned-6hg</guid>
      <description>&lt;p&gt;I built konid after spending six months translating work emails in French and retaining almost nothing. I'd get a translation, paste it in, move on. Same words came up two weeks later and I had to look them up again — the task got done but nothing stuck.&lt;/p&gt;

&lt;p&gt;The missing piece wasn't more vocabulary. It was audio. Hearing the actual vowel length, the liaison, the stress pattern — that's what converts a string of characters into something your brain files as language rather than text. So konid plays pronunciation through your speakers directly, using node-edge-tts with no external API key.&lt;/p&gt;

&lt;p&gt;But pronunciation alone isn't enough if the phrase is wrong for the situation. Literal translation tools return one answer with no indication of whether it sounds like a native speaker, a textbook, or someone who learned the language from a phrasebook. konid returns three options per query, ordered casual to formal, with the register explained and a cultural context note comparing the options. If you're trying to tell your partner something that sounds real in their first language — not technically correct, actually real — the difference between those three options matters.&lt;/p&gt;

&lt;p&gt;It runs as an MCP server, so it lives inside the tools you're already in. Claude Code 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;Also works in Cursor, VS Code Copilot, Windsurf, Zed, JetBrains, and Claude Cowork. If you're on ChatGPT, it installs as an app via Developer mode using the endpoint &lt;code&gt;https://konid.fly.dev/mcp&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;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>From a text brief to a scored HTML email: how Kopi works</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Tue, 14 Jul 2026 11:59:37 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/from-a-text-brief-to-a-scored-html-email-how-kopi-works-3i9h</link>
      <guid>https://dev.to/palo_alto_ai/from-a-text-brief-to-a-scored-html-email-how-kopi-works-3i9h</guid>
      <description>&lt;p&gt;Here's the brief I sent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Black Friday flash sale. 30% off all bundles. Ends Sunday midnight. Urgent tone. Brand colors: deep navy and gold. CTA button above the fold.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What came back four minutes later: a complete HTML email with a nav bar, hero section, product grid, countdown reference in the copy, and a gold CTA button sitting at 680px above the fold on desktop.&lt;/p&gt;

&lt;p&gt;That part I expected. The part that changed how I work: before I could export it, Kopi scored it. Layout hierarchy: 88. Mobile readability: 91. CTA contrast: 94. Twelve other criteria, each with a number between 0 and 100 and a short note on what pulled the score down.&lt;/p&gt;

&lt;p&gt;I'd been using Klaviyo's template builder for two years. The builder isn't bad — the problem is it starts blank. You drag in a hero block, pick a font, realize the mobile preview looks broken, fix the padding, forget to check CTA contrast, send anyway. The design feedback loop only closes after the campaign goes out and click rates tell you something was off.&lt;/p&gt;

&lt;p&gt;Kopi closes it before you hit export. The scoring runs on every generated email automatically — you're not running a separate audit tool or squinting at a contrast checker. The critique ships with the email.&lt;/p&gt;

&lt;p&gt;A few things worth knowing if you're evaluating it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It integrates directly with Klaviyo, so export is one step, not download-reupload.&lt;/li&gt;
&lt;li&gt;You can feed it your brand's fonts, colors, and layout preferences and it holds to them across campaigns.&lt;/li&gt;
&lt;li&gt;There's a public gallery at trykopi.ai/emails with 400+ emails that scored 80 or above — useful for seeing what a high-scoring brief actually produces before you write your own.&lt;/li&gt;
&lt;li&gt;It runs as an MCP server, so if you work in Claude Code or Cursor it fits into that workflow without switching tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The brief-to-scored-email flow is at trykopi.ai&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Why I Built a Skill Tracker for Claude Code Sessions</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Tue, 14 Jul 2026 11:06:10 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/why-i-built-a-skill-tracker-for-claude-code-sessions-115e</link>
      <guid>https://dev.to/palo_alto_ai/why-i-built-a-skill-tracker-for-claude-code-sessions-115e</guid>
      <description>&lt;p&gt;I've been using Claude Code daily for months. At some point I noticed I was fast — but I couldn't tell if fast meant skilled or just habitual. Same prompting patterns, same delegation moves, same blind spots I never examined.&lt;/p&gt;

&lt;p&gt;Anthropic published a study in February 2026 covering 9,830 Claude conversations, measuring 11 observable collaboration behaviors across their user base. I wanted to know what my distribution looked like against that baseline, and specifically which behaviors I was skipping entirely.&lt;/p&gt;

&lt;p&gt;skill-tree analyzes your Claude Code or Cowork session history, classifies those same 11 behaviors using the 4D AI Fluency Framework (Dakan &amp;amp; Feller), assigns one of seven archetype cards, and picks a behavior you haven't touched as a growth quest for your next session.&lt;/p&gt;

&lt;p&gt;The behavior taxonomy runs on three visible axes — Description, Discernment, Delegation — plus a fourth (Diligence) that doesn't surface in chat logs. The classifier runs on Fly.io using Claude Haiku, takes 30–60 seconds end-to-end across seven steps: find session files, extract user messages, classify, assign archetype, synthesize narrative, render, return a stable URL. The cards are rendered as tarot cards with curated museum art. You can see a live example at skill-tree-ai.fly.dev/fixture/illuminator.&lt;/p&gt;

&lt;p&gt;The design detail worth explaining: Cowork's &lt;code&gt;$HOME&lt;/code&gt; is ephemeral — anything written there doesn't survive across sessions. Growth quests need to persist, so the tool uses &lt;code&gt;~/.skill-tree/&lt;/code&gt; on Claude Code and &lt;code&gt;$CLAUDE_PLUGIN_ROOT/.user-state/&lt;/code&gt; on Cowork. Same tool, two state paths, different reasons.&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;Cowork users: &lt;code&gt;skill-tree-ai.zip&lt;/code&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>Terminal themes tune for syntax. Claude Code is 80% prose.</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Mon, 13 Jul 2026 15:29:32 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/terminal-themes-tune-for-syntax-claude-code-is-80-prose-16pk</link>
      <guid>https://dev.to/palo_alto_ai/terminal-themes-tune-for-syntax-claude-code-is-80-prose-16pk</guid>
      <description>&lt;p&gt;For hours every day I'm reading paragraphs — tool output, reasoning traces, permission prompts, explanations. Almost none of it is code. Standard terminal themes spend their contrast budget on syntax token differentiation: keywords, strings, numbers. That's the wrong allocation when your screen is 80% English at body size.&lt;/p&gt;

&lt;p&gt;So I built four Terminal.app themes tuned specifically for Claude Code's ANSI slot usage.&lt;/p&gt;

&lt;p&gt;The constraint that drove every decision: pure IKB (hex 002FA7) — Yves Klein's pigment — fails APCA contrast as text on a dark ground (Lc -12, effectively invisible). I wanted that blue in the theme because it's the right blue, so I split it. Pure IKB goes into &lt;code&gt;ansi:blue&lt;/code&gt;, which Claude Code uses for decorative borders and highlights where legibility isn't load-bearing. A lifted Klein-family &lt;code&gt;A8BEF0&lt;/code&gt; goes into &lt;code&gt;ansi:blueBright&lt;/code&gt;, which Claude Code uses for permission-prompt text that you actually need to read.&lt;/p&gt;

&lt;p&gt;Contrast targets are per-role: body &amp;gt;= 90 Lc, subtle &amp;gt;= 75, muted &amp;gt;= 45, accent &amp;gt;= 60. Klein Void Prot (V3) is the only variation where every accent slot clears strict gates — the others make deliberate tradeoffs between brand fidelity and maximum legibility.&lt;/p&gt;

&lt;p&gt;The four variations split on one specific differentiator: how they handle &lt;code&gt;ansi:redBright&lt;/code&gt;, which Claude Code maps to the claude-sand brand color. Refined and Prot neutralize it to avoid competing with IKB. Sand &amp;amp; Sea accepts it as a second hero color, which produces a warm/cool contrast that happens to mirror Claude's own brand palette.&lt;/p&gt;

&lt;p&gt;Install requires one step that's easy to miss: Claude Code's &lt;code&gt;/theme&lt;/code&gt; picker must be set to &lt;code&gt;dark-ansi&lt;/code&gt;. If it's on any other setting, Claude Code ignores the Terminal.app ANSI palette entirely and falls back to hardcoded RGB values.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Then &lt;code&gt;/theme&lt;/code&gt; → dark-ansi in Claude Code. Rollback via &lt;code&gt;restore.sh&lt;/code&gt; if it's not for you.&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 explanations on every page, without opening a new tab</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Mon, 13 Jul 2026 14:20:53 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/inline-explanations-on-every-page-without-opening-a-new-tab-5288</link>
      <guid>https://dev.to/palo_alto_ai/inline-explanations-on-every-page-without-opening-a-new-tab-5288</guid>
      <description>&lt;p&gt;Built rabbitholes because I kept half-reading articles. Technical words I sort-of knew, historical references I could have looked up — I'd skip them because opening a new tab meant losing my place and usually my thread of thought.&lt;/p&gt;

&lt;p&gt;The extension does one thing: highlight any text, and a shadow-DOM tooltip renders an explanation next to your cursor. No new tab. No page pollution. The shadow DOM is intentional — it can't bleed into the host page's styles, so it works consistently across Wikipedia, Substack, arXiv, wherever.&lt;/p&gt;

&lt;p&gt;What keeps me using it past the first day is the traversal. Click any word in the explanation to drill into that. Drag across a phrase to treat it as a new query. Every answer surfaces two suggested rabbit-hole topics — the most interesting threads from that point — one click away. There's a counter tracking how many hops deep you are.&lt;/p&gt;

&lt;p&gt;When the explanation alone isn't enough, a globe icon re-answers the query enriched with Brave Search results, with clickable source chips. The pencil icon opens a follow-up input that inherits everything you've read so far as context.&lt;/p&gt;

&lt;p&gt;No intermediary server. Requests go directly from the browser to api.anthropic.com and api.search.brave.com. Manifest V3, API key stored in chrome.storage.sync, zero telemetry.&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>Mon, 13 Jul 2026 13:20:30 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/when-one-translation-isnt-enough-building-a-language-coach-for-real-speech-l36</link>
      <guid>https://dev.to/palo_alto_ai/when-one-translation-isnt-enough-building-a-language-coach-for-real-speech-l36</guid>
      <description>&lt;p&gt;I was working on a Japanese work email last year, translating sentence by sentence, when I realized I had no idea whether my phrasing sounded junior or senior, distant or warm. Google Translate gave me one answer with no signal about where it sat on any of those axes. I sent the email and never found out if it landed wrong.&lt;/p&gt;

&lt;p&gt;That's the gap konid fills. For anything you want to say, it returns three options — casual, neutral, formal — with the register explained and a cultural note on what each choice signals to a native speaker. Not a list of synonyms. An explanation of the relationship the phrase implies.&lt;/p&gt;

&lt;p&gt;Here's what that looks like for a concrete case. Say you want to tell someone in Japanese "I missed you today." A literal tool gives you one sentence. konid gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Option 1 (casual):&lt;/strong&gt; what you'd text someone you're close to&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Option 2 (warm/neutral):&lt;/strong&gt; usable across most relationships without risking sounding cold&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Option 3 (formal/tender):&lt;/strong&gt; appropriate when the emotional weight matters and you want to be precise&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each option includes a note on when it fits and what it signals. Audio pronunciation plays directly through your speakers — no API key required, handled via node-edge-tts.&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;p&gt;It also works in Cursor, VS Code Copilot, Windsurf, Zed, JetBrains, and Claude Cowork. If you're on ChatGPT with Developer mode, the endpoint is &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;I built this because I was translating work emails in a language I'm still learning, and every translation that just got me through the task taught me nothing. Seeing three options side by side — with the cultural delta explained — is what actually built my intuition over time.&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>When the launch spike fades and you stop showing up</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Mon, 13 Jul 2026 11:36:29 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/when-the-launch-spike-fades-and-you-stop-showing-up-1b3f</link>
      <guid>https://dev.to/palo_alto_ai/when-the-launch-spike-fades-and-you-stop-showing-up-1b3f</guid>
      <description>&lt;p&gt;The post that gets traction isn't the first one — it's the fifteenth. Most tools die before anyone gets there because after the launch spike, daily distribution is just repetitive manual work: write a post, pick a channel, pick an angle, stay under 280 characters for X but 500 for Mastodon, check what you already said last week, repeat tomorrow.&lt;/p&gt;

&lt;p&gt;I built marketing-pipeline to handle that recurring work after a project ships.&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;That fetches the README, sends it to Claude, and saves a structured profile — problem statement, specific facts, rotation angles — to &lt;code&gt;projects.yml&lt;/code&gt;. After that, a GitHub Actions cron at 14:00 UTC on weekdays runs &lt;code&gt;marketing cycle&lt;/code&gt;, which picks the least-recently-used angle for each project, drafts channel-appropriate posts, and publishes across Bluesky, Dev.to, Hashnode, and Mastodon without any manual intervention.&lt;/p&gt;

&lt;p&gt;Two constraints worth knowing about. First, per-channel length limits are enforced in code: 280 chars for X, 300 for Bluesky, 500 for Mastodon, 150–400 words for Dev.to and Hashnode. Second, there's an antislop gate in &lt;code&gt;pipeline/antislop.py&lt;/code&gt; that hard-rejects specific tokens before any post goes out — "excited", "game-changer", "unlock", "AI-powered", emoji, hashtags, and exclamation points are all blocked at the gate. The drafts read like a practitioner wrote them or they don't ship.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;kind&lt;/code&gt; field routes projects to type-specific directories automatically. An &lt;code&gt;mcp-server&lt;/code&gt; hits MCP Registry, Smithery, Glama, and PulseMCP; a &lt;code&gt;claude-skill&lt;/code&gt; targets awesome-claude-code (payload generated, but their rules require a human to submit via GitHub issue — that one can't be fully automated); a &lt;code&gt;browser-extension&lt;/code&gt; covers Chrome Web Store, Firefox AMO, and Edge Add-ons.&lt;/p&gt;

&lt;p&gt;Requirements: Anthropic API key, plus credentials for at least Bluesky, Dev.to, and Hashnode. Mastodon and Slack are 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>Why IKB Fails as Terminal Text (and How I Split It Across Two ANSI Slots)</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sun, 12 Jul 2026 14:48:38 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/why-ikb-fails-as-terminal-text-and-how-i-split-it-across-two-ansi-slots-4bd</link>
      <guid>https://dev.to/palo_alto_ai/why-ikb-fails-as-terminal-text-and-how-i-split-it-across-two-ansi-slots-4bd</guid>
      <description>&lt;p&gt;Most terminal themes are built for code. Mine is built for Claude Code, which means most of what I read in it is prose — tool output, reasoning traces, permission prompts. After a few months of daily sessions, the default theme started feeling wrong in a way I couldn't immediately name.&lt;/p&gt;

&lt;p&gt;The problem I eventually landed on: no one had tuned an ANSI theme for the specific slots Claude Code actually uses. So I built klein-blue — four Terminal.app variations anchored to Yves Klein's International Klein Blue pigment.&lt;/p&gt;

&lt;p&gt;The interesting constraint is that pure IKB fails as text on a dark ground. APCA Lc -12. That's not a borderline fail — it's effectively absent. Which creates a real design problem when the whole point is IKB.&lt;/p&gt;

&lt;p&gt;The fix I settled on: split the pigment across two ANSI slots with different jobs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ansi:blue       002FA7   — decorative only: borders, dividers, highlights
ansi:blueBright A8BEF0   — readable Klein-family tone for permission-prompt text
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code routes permission-prompt text through &lt;code&gt;ansi:blueBright&lt;/code&gt;, not &lt;code&gt;ansi:blue&lt;/code&gt;. That slot assignment is the thing that makes the split workable — I'm not fighting Claude Code's rendering, I'm mapping to what it already does.&lt;/p&gt;

&lt;p&gt;The four variations use APCA Lc gates per role: body &amp;gt;= 90, subtle &amp;gt;= 75, muted &amp;gt;= 45, accent &amp;gt;= 60. Klein Void Prot (V3, CommitMono) is the only one where every accent passes strict gates. The others make deliberate tradeoffs — Klein Void Gallery pushes maximum blue presence at the cost of some accent strictness.&lt;/p&gt;

&lt;p&gt;The second design decision worth naming: &lt;code&gt;ansi:redBright&lt;/code&gt; is the slot Claude Code uses for its claude-sand brand color. That's where the variations diverge most visibly. Klein Void Sand &amp;amp; Sea accepts it as a second hero color alongside the blue. Klein Void Refined neutralizes it to avoid competition. That single slot choice accounts for most of the visual difference between variations.&lt;/p&gt;

&lt;p&gt;Ships as &lt;code&gt;.terminal&lt;/code&gt; profile files for macOS Terminal.app. 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 uses its hardcoded RGB values.&lt;/p&gt;

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

</description>
      <category>claude</category>
      <category>cli</category>
      <category>design</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I built inline Wikipedia for every page I read</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sun, 12 Jul 2026 14:04:42 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/i-built-inline-wikipedia-for-every-page-i-read-4e52</link>
      <guid>https://dev.to/palo_alto_ai/i-built-inline-wikipedia-for-every-page-i-read-4e52</guid>
      <description>&lt;p&gt;Reading a dense article about monetary policy last week, I hit "Triffin dilemma" and did what I always do: opened a new tab, read half of Wikipedia, forgot what I was originally reading, and spent twenty minutes somewhere else entirely. The context switch isn't a minor annoyance — it compounds. By the time I return, the thread I was following has gone cold.&lt;/p&gt;

&lt;p&gt;So I built rabbitholes: a Chrome extension where highlighting any text renders an explanation in a shadow-DOM tooltip next to your cursor. You never leave the page.&lt;/p&gt;

&lt;p&gt;The shadow DOM detail matters. A lot of overlay extensions inject markup directly into the host document, which breaks host styles or gets clobbered by them. Shadow DOM keeps the tooltip isolated — no style pollution in either direction.&lt;/p&gt;

&lt;p&gt;The part I actually use most: every word in the explanation is itself clickable. Highlight "Triffin dilemma," get an explanation that mentions "Bretton Woods," click that phrase, go deeper. There's a hop counter so you can see how far you've traveled from the original article. Go deep enough on almost anything and you hit philosophy — the trail is shareable.&lt;/p&gt;

&lt;p&gt;Two other features worth naming:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Globe icon → re-runs the query enriched with Brave Search results
Pencil icon → free-form follow-up that inherits the current context
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The search-enriched mode returns source chips you can click. It's useful when you want primary sources rather than an explanation.&lt;/p&gt;

&lt;p&gt;On the privacy side: zero telemetry, no intermediary server. Requests go directly from your browser to &lt;code&gt;api.anthropic.com&lt;/code&gt; and &lt;code&gt;api.search.brave.com&lt;/code&gt;. Your Anthropic API key lives in &lt;code&gt;chrome.storage.sync&lt;/code&gt; — encrypted, never leaves the browser. Manifest V3.&lt;/p&gt;

&lt;p&gt;The mental model I was chasing: every concept in every article I read should be one highlight away from becoming clear, without breaking the read. That's what it does.&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>Every work email I translated taught me nothing</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sun, 12 Jul 2026 12:51:46 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/every-work-email-i-translated-taught-me-nothing-1lnk</link>
      <guid>https://dev.to/palo_alto_ai/every-work-email-i-translated-taught-me-nothing-1lnk</guid>
      <description>&lt;p&gt;I translate work emails in French every day. For months I was copying sentences into Google Translate, getting one flat answer back, sending it, moving on. Nothing stuck. I wasn't learning registers or idioms — I was just shipping text.&lt;/p&gt;

&lt;p&gt;The problem isn't the translation. It's that literal translation tools treat every request as a one-shot task. You ask for a phrase, you get a phrase. No sense of whether it's too casual for a client, too stiff for a colleague, or just technically correct but weirdly phrased in a way a native speaker would notice.&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. Supports 13+ languages including French, Japanese, Arabic, and Korean.&lt;/p&gt;

&lt;p&gt;The difference in practice: I ask how to write a polite follow-up to a delayed supplier. I get back three versions — one I'd use with a close contact, one for a standard professional context, one for a formal or bureaucratic situation. Each one explains what makes it land at that register. I pick the one that fits, but I also now understand why the other two exist.&lt;/p&gt;

&lt;p&gt;Audio pronunciation plays directly through speakers via node-edge-tts — no external API key, no setup beyond the install.&lt;/p&gt;

&lt;p&gt;Adding it to 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;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;MIT licensed. Source at &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>
  </channel>
</rss>
