<?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>Sat, 23 May 2026 18:58:02 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/the-growth-quest-picks-what-you-avoid-not-what-youre-already-good-at-4hl9</link>
      <guid>https://dev.to/palo_alto_ai/the-growth-quest-picks-what-you-avoid-not-what-youre-already-good-at-4hl9</guid>
      <description>&lt;p&gt;Anthropics February 2026 study classified 11 observable collaboration behaviors across 9,830 Claude conversations. After months of daily Claude Code use I wanted to know which of those 11 behaviors showed up in my sessions — and which ones never appeared.&lt;/p&gt;

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

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

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

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

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

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

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

&lt;/div&gt;



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

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

</description>
      <category>ai</category>
      <category>claude</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Every work email I translated was a missed lesson</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sat, 23 May 2026 16:52:21 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/every-work-email-i-translated-was-a-missed-lesson-4hmf</link>
      <guid>https://dev.to/palo_alto_ai/every-work-email-i-translated-was-a-missed-lesson-4hmf</guid>
      <description>&lt;p&gt;Six months into learning Japanese well enough to handle vendor emails, I noticed I'd translated the same polite refusal phrase four times without retaining it once. Google Translate gave me one answer, I pasted it in, moved on. Nothing stuck.&lt;/p&gt;

&lt;p&gt;The problem isn't the translation itself — it's that a single output teaches you nothing about &lt;em&gt;why&lt;/em&gt; that phrasing works, what register you're operating in, or what a more casual version would sound like if you were writing to someone you actually knew.&lt;/p&gt;

&lt;p&gt;So I built konid as an MCP server. Every query returns three options ordered casual to formal, with the register explained and a cultural context note comparing them. For that refusal phrase, I got the stiff keigo version appropriate for a new vendor, a warmer alternative for someone I'd worked with for months, and a note on why mixing the two registers in the same email would read as odd to a native speaker.&lt;/p&gt;

&lt;p&gt;Over enough work emails, that becomes a real learning loop instead of a copy-paste utility.&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 inside Claude Code, Cursor, VS Code Copilot, Windsurf, Zed, JetBrains, and Claude Cowork. Also installs as a ChatGPT app via Developer mode at &lt;code&gt;https://konid.fly.dev/mcp&lt;/code&gt;. Audio pronunciation plays directly through speakers via node-edge-tts — no external API key.&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;&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>learning</category>
      <category>mcp</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
    <item>
      <title>The MCP Registry, Smithery, and GitHub Topics don't index themselves</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sat, 23 May 2026 14:54:45 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/the-mcp-registry-smithery-and-github-topics-dont-index-themselves-3an6</link>
      <guid>https://dev.to/palo_alto_ai/the-mcp-registry-smithery-and-github-topics-dont-index-themselves-3an6</guid>
      <description>&lt;p&gt;Shipping an MCP server means nothing if developers can't find it. The three places they actually look — the official MCP Registry, Smithery, and GitHub Topics — each require a separate submission, and the MCP Registry is what Glama and PulseMCP pull from automatically, so skipping it means skipping those too.&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 fetches your README, extracts the problem and key facts via Claude, writes them to &lt;code&gt;projects.yml&lt;/code&gt;, and files the directory submissions. After that, a GitHub Actions cron at 14:00 UTC on weekdays rotates through four social channels — Bluesky, Mastodon, Dev.to, Hashnode — picking the least-recently-used angle each run.&lt;/p&gt;

&lt;p&gt;The part I spent the most time on is the antislop gate in &lt;code&gt;pipeline/antislop.py&lt;/code&gt;. It hard-rejects specific tokens before any post goes out: &lt;code&gt;excited&lt;/code&gt;, &lt;code&gt;game-changer&lt;/code&gt;, &lt;code&gt;unlock&lt;/code&gt;, &lt;code&gt;empower&lt;/code&gt;, &lt;code&gt;AI-powered&lt;/code&gt;, emoji, hashtags, exclamation points, and rhetorical questions. Every post has to clear that filter or it doesn't ship. Per-channel length limits are enforced the same way — 300 chars for Bluesky, 280 for X, 500 for Mastodon, 150–400 words for Dev.to and Hashnode.&lt;/p&gt;

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

&lt;p&gt;You need an Anthropic API key plus credentials for at least Bluesky, Dev.to, and Hashnode to run the full pipeline. 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>
      <category>automation</category>
      <category>marketing</category>
      <category>mcp</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Why WCAG ratios misled me building a dark terminal theme</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sat, 23 May 2026 13:04:43 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/why-wcag-ratios-misled-me-building-a-dark-terminal-theme-5afp</link>
      <guid>https://dev.to/palo_alto_ai/why-wcag-ratios-misled-me-building-a-dark-terminal-theme-5afp</guid>
      <description>&lt;p&gt;I reached for WCAG contrast first. Checked IKB against my dark background, got a ratio above 3:1, and assumed it was usable. Then I actually rendered it: the blue was effectively invisible. WCAG's formula treats dark-on-dark the same as light-on-light at the same numerical ratio — it doesn't. APCA does.&lt;/p&gt;

&lt;p&gt;APCA produces a signed lightness contrast (Lc). Positive values are light-on-dark; negative are dark-on-light. Pure IKB (hex 002FA7) on a near-black ground scores Lc -12. That's not a low-contrast blue. That's a blue that doesn't exist at reading size.&lt;/p&gt;

&lt;p&gt;This distinction matters specifically for Claude Code because the tool uses ANSI slots for semantic roles — permission prompts in one slot, tool output in another, reasoning in a third. If you're calibrating a theme by WCAG, you'll pass a blue that reads as void.&lt;/p&gt;

&lt;p&gt;The fix I landed on: split IKB across two slots. Pure 002FA7 goes into &lt;code&gt;ansi:blue&lt;/code&gt;, which Claude Code only uses for decorative borders and structural chrome — things you register peripherally, not things you read. The readable slot, &lt;code&gt;ansi:blueBright&lt;/code&gt;, gets A8BEF0: still in Klein's family, still cold and high-saturation, but lifted enough to clear the Lc 75 gate I set for "subtle" text.&lt;/p&gt;

&lt;p&gt;The four variations ship with different per-role gate strictness. Klein Void Prot is the one where every single accent passes strict APCA gates — body text at Lc ≥90, subtle at Lc ≥75, muted at Lc ≥45, decorative accents at Lc ≥60. The other three trade some gate rigidity for aesthetic choices (accepting claude-sand as a second hero color, maximizing void, etc.).&lt;/p&gt;

&lt;p&gt;One practical detail: none of this matters if you haven't set Claude Code's &lt;code&gt;/theme&lt;/code&gt; picker to &lt;code&gt;dark-ansi&lt;/code&gt;. If you leave it on the default, Claude Code ignores your Terminal.app ANSI profile and uses its own hardcoded RGB palette. The theme does nothing.&lt;/p&gt;

&lt;p&gt;Installs via &lt;code&gt;install.sh&lt;/code&gt;, fully rollback-able via &lt;code&gt;restore.sh&lt;/code&gt;. macOS Terminal.app only.&lt;/p&gt;

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

</description>
      <category>a11y</category>
      <category>cli</category>
      <category>design</category>
      <category>ux</category>
    </item>
    <item>
      <title>Why shadow DOM beat iframe for inline tooltips</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Sat, 23 May 2026 11:05:38 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/why-shadow-dom-beat-iframe-for-inline-tooltips-4mcb</link>
      <guid>https://dev.to/palo_alto_ai/why-shadow-dom-beat-iframe-for-inline-tooltips-4mcb</guid>
      <description>&lt;p&gt;The iframe approach seems obvious: sandboxed, isolated, clean. I tried it first. The problem is that iframes can't inherit host-page fonts without a FOUC — you either flash unstyled content, or you hardcode a font stack and accept that your tooltip looks alien on every site with a custom typeface. On a site like Wikipedia or the NYT, that mismatch is immediately jarring.&lt;/p&gt;

&lt;p&gt;Shadow DOM solves this differently. The extension's tooltip attaches as a shadow host, which means it's structurally isolated from the page's CSS cascade but physically in the same document. The host page's font rendering applies at the OS level, so body text in the tooltip inherits the same antialiasing and subpixel rendering as the surrounding article. No flash. No mismatch.&lt;/p&gt;

&lt;p&gt;The tradeoff is that shadow DOM isolation isn't total. Some CSS custom properties (variables) can pierce the shadow boundary, so if the host page defines something like &lt;code&gt;--background: transparent&lt;/code&gt; at the &lt;code&gt;:root&lt;/code&gt; level, you need to explicitly reset inside your shadow styles. I ran into this on a few dark-mode sites where the tooltip was inheriting a near-invisible background until I added an explicit &lt;code&gt;background: white&lt;/code&gt; block scoped to the shadow root.&lt;/p&gt;

&lt;p&gt;The other thing iframes make hard: positioning. An absolutely-positioned iframe has to fight the host page's stacking context and overflow rules. I wanted the tooltip to anchor to cursor position, which means reading &lt;code&gt;mouseup&lt;/code&gt; coordinates and placing a DOM node there. With shadow DOM the placement logic is just standard &lt;code&gt;position: fixed&lt;/code&gt; math. With an iframe, you're fighting &lt;code&gt;overflow: hidden&lt;/code&gt; on parent containers on sites you don't control.&lt;/p&gt;

&lt;p&gt;For rabbitholes — a Chrome extension that renders inline explanations from Claude Haiku 4.5 for any text you highlight — the shadow DOM approach means the tooltip looks at home on every site, inherits correct fonts without polling, and doesn't trigger layout shifts when it appears.&lt;/p&gt;

&lt;p&gt;Zero telemetry, Manifest V3. Requests go directly from your browser to api.anthropic.com.&lt;/p&gt;

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

</description>
      <category>css</category>
      <category>frontend</category>
      <category>ui</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Scoring email designs before they ship, not after</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Fri, 22 May 2026 19:24:50 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/scoring-email-designs-before-they-ship-not-after-39j0</link>
      <guid>https://dev.to/palo_alto_ai/scoring-email-designs-before-they-ship-not-after-39j0</guid>
      <description>&lt;p&gt;Most email tools hand you a blank canvas and a template library. You assemble something, send it, and find out two weeks later from click data that your CTA was unreadable on mobile.&lt;/p&gt;

&lt;p&gt;Kopi runs a design critique on every email before it leaves — scoring layout hierarchy, mobile readability, CTA contrast, and 12 other criteria on a 0–100 scale. The public gallery at trykopi.ai/emails has 400+ emails that scored 80 or above, so you can see what the rubric actually rewards before you start building.&lt;/p&gt;

&lt;p&gt;The generation side works from a plain-text brief. Describe the campaign goal, your audience, any constraints — Kopi produces complete HTML in under 5 minutes. It can also learn your brand's fonts, colors, and layout preferences so you're not re-specifying them every run.&lt;/p&gt;

&lt;p&gt;For teams already on Klaviyo, there's a direct export. For devs building on top of it, it runs as an MCP server inside Claude Code, Cursor, or ChatGPT.&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;// Example: MCP integration in Cursor&lt;/span&gt;
&lt;span class="nx"&gt;kopi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Abandoned cart email for a specialty coffee brand, two CTAs, dark mode friendly&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;brand&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;roaster-co&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="c1"&gt;// returns scored HTML + critique JSON in &amp;lt;5 min&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The scoring pass alone is the thing I'd have paid for separately. Knowing a design has a 73 on CTA contrast before a campaign goes out is more useful than any A/B test you run after.&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>
      <category>ai</category>
      <category>design</category>
      <category>marketing</category>
      <category>ux</category>
    </item>
    <item>
      <title>What 9,830 Claude conversations reveal about your own habits</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Fri, 22 May 2026 16:16:51 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/what-9830-claude-conversations-reveal-about-your-own-habits-298c</link>
      <guid>https://dev.to/palo_alto_ai/what-9830-claude-conversations-reveal-about-your-own-habits-298c</guid>
      <description>&lt;p&gt;Anthropologists studying 9,830 Claude conversations published a behavioral taxonomy in February 2026 — 11 observable collaboration behaviors across three axes (Description, Discernment, Delegation) from Dakan and Feller's 4D AI Fluency Framework. Anthropic's AI Fluency Index gives you a population baseline. I wanted to know where I landed on it.&lt;/p&gt;

&lt;p&gt;The honest answer: I had no idea. I'd been using Claude Code daily for months and assumed I was improving. What I actually had was a faster version of the same four or five habits.&lt;/p&gt;

&lt;p&gt;So I built skill-tree: it pulls your Claude Code session history, runs your user messages through a remote classifier (Claude Haiku on Fly.io), scores all 11 behaviors against the population baseline, assigns one of seven archetype cards rendered as tarot cards with curated museum art, and returns a stable URL with your results. The whole pipeline — find session files, extract messages, classify, assign archetype, synthesize narrative, render, return URL — takes 30–60 seconds.&lt;/p&gt;

&lt;p&gt;The part I use most: the growth quest. It identifies a behavior you haven't touched and pins it to your next session via a &lt;code&gt;SessionStart&lt;/code&gt; hook, persisted at &lt;code&gt;~/.skill-tree/&lt;/code&gt; between sessions.&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;There's also an MCP package (&lt;code&gt;skill-tree-ai&lt;/code&gt; on npm) for Cursor, VS Code, and Windsurf, and a &lt;code&gt;skill-tree-ai.zip&lt;/code&gt; for Claude Cowork.&lt;/p&gt;

&lt;p&gt;Live example of the rendered output: skill-tree-ai.fly.dev/fixture/illuminator&lt;/p&gt;

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

</description>
      <category>ai</category>
      <category>claude</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
    <item>
      <title>When one translation isn't enough to say what you mean</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Fri, 22 May 2026 12:13:48 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/when-one-translation-isnt-enough-to-say-what-you-mean-d5b</link>
      <guid>https://dev.to/palo_alto_ai/when-one-translation-isnt-enough-to-say-what-you-mean-d5b</guid>
      <description>&lt;p&gt;I was writing a message to my girlfriend in her first language — something small, just that I'd been thinking about her. Google Translate gave me one option. It was technically correct and read like a form letter.&lt;/p&gt;

&lt;p&gt;The problem with literal translation tools isn't accuracy, it's flatness. You get the words but not the weight. There's no difference between what you'd text someone you love and what you'd write in a work email, no note on whether a phrase sounds natural or slightly stiff, no audio so you can hear whether you're about to say something embarrassing.&lt;/p&gt;

&lt;p&gt;I built konid to fix that for myself. For any phrase you want to say, it returns three versions — casual, neutral, formal — in the right order, each with a note explaining the register and how the options differ culturally, not just grammatically. It plays the pronunciation through your speakers directly using node-edge-tts, no external API key.&lt;/p&gt;

&lt;p&gt;The specific case I kept running into: saying something tender that actually lands. "I missed you" in Spanish has a few shapes — &lt;em&gt;te extrañé&lt;/em&gt;, &lt;em&gt;te he echado de menos&lt;/em&gt;, others — and which one you use signals something. konid surfaces that signal instead of collapsing it.&lt;/p&gt;

&lt;p&gt;It covers 13+ languages including Mandarin, Japanese, Korean, Spanish, French, Arabic, Hindi, and Russian. Runs as an MCP server, so it works inside Claude Code, Cursor, VS Code Copilot, Windsurf, Zed, JetBrains, and Claude Cowork:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



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

&lt;p&gt;MIT licensed. Source: &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>ai</category>
      <category>nlp</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>Cross-posting to four platforms by hand doesn't scale past week one</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Thu, 21 May 2026 19:44:45 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/cross-posting-to-four-platforms-by-hand-doesnt-scale-past-week-one-cii</link>
      <guid>https://dev.to/palo_alto_ai/cross-posting-to-four-platforms-by-hand-doesnt-scale-past-week-one-cii</guid>
      <description>&lt;p&gt;The workflow breaks down fast: you write a Bluesky post (300 chars), realize the Dev.to version needs 150+ words and a code block, forget you used the "onboarding" angle last Tuesday, and skip it because you have actual work to do. Two months later your tool has 3 stars and you've posted about it twice.&lt;/p&gt;

&lt;p&gt;I built marketing-pipeline to handle the mechanical parts. The part I want to describe specifically: angle tracking and per-channel formatting.&lt;/p&gt;

&lt;p&gt;Every project in &lt;code&gt;projects.yml&lt;/code&gt; carries a list of angles — different framings of the same tool. The daily cron at 14:00 UTC picks the least-recently-used angle for each project × channel combination and generates a post shaped to that channel's constraints. Bluesky gets ≤300 chars, X gets ≤280, Dev.to and Hashnode get 150–400 words. You don't track any of that. The pipeline does.&lt;/p&gt;

&lt;p&gt;Before anything posts, it runs through &lt;code&gt;pipeline/antislop.py&lt;/code&gt; — a hard-reject gate that kills drafts containing &lt;code&gt;excited&lt;/code&gt;, &lt;code&gt;game-changer&lt;/code&gt;, &lt;code&gt;unlock&lt;/code&gt;, &lt;code&gt;empower&lt;/code&gt;, &lt;code&gt;AI-powered&lt;/code&gt;, emoji, hashtags, exclamation points, or rhetorical questions. Not a style suggestion. A gate. Posts that fail it don't go out.&lt;/p&gt;

&lt;p&gt;Onboarding a new project:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;That command fetches the README, extracts the problem, facts, and angles, and writes them to &lt;code&gt;projects.yml&lt;/code&gt;. From there the cron handles rotation. The &lt;code&gt;kind&lt;/code&gt; field routes to type-specific directories — &lt;code&gt;mcp-server&lt;/code&gt; hits MCP Registry, Smithery, Glama, and PulseMCP; &lt;code&gt;claude-skill&lt;/code&gt; targets awesome-claude-code (generates the payload, but their rules require a human to submit via GitHub issue form).&lt;/p&gt;

&lt;p&gt;Requires 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>
      <category>automation</category>
      <category>marketing</category>
      <category>showdev</category>
      <category>tooling</category>
    </item>
    <item>
      <title>The Wikipedia-philosophy game, but for everything you read</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Thu, 21 May 2026 12:40:30 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/the-wikipedia-philosophy-game-but-for-everything-you-read-56lg</link>
      <guid>https://dev.to/palo_alto_ai/the-wikipedia-philosophy-game-but-for-everything-you-read-56lg</guid>
      <description>&lt;p&gt;There's a Wikipedia phenomenon where you start on any article, click the first linked concept you don't fully understand, repeat, and eventually land on Philosophy. The path is the point — each hop reveals how much scaffolding you were missing.&lt;/p&gt;

&lt;p&gt;I wanted that for every page on the internet, not just Wikipedia.&lt;/p&gt;

&lt;p&gt;The problem with tab-based research is the context switch. By the time you've typed a search, skimmed a result, and navigated back, you've lost the sentence you were in. So you either interrupt yourself every paragraph or skim past the gaps and finish the article knowing less than you could.&lt;/p&gt;

&lt;p&gt;rabbitholes is a Chrome extension built around staying in place. Highlight any text, and a shadow-DOM tooltip renders an explanation from Claude Haiku 4.5 next to your cursor — no new tab, no host-page pollution. Click any word in that explanation to go one level deeper. Drag across a phrase to do the same.&lt;/p&gt;

&lt;p&gt;The part I find myself using most: a rabbit-hole counter that tracks how many hops deep you've gone. Hit the right article on a topic you're genuinely curious about and you can watch it climb. It builds a shareable trail — same mechanic as the Wikipedia philosophy game, but on any page, about anything.&lt;/p&gt;

&lt;p&gt;Each answer ends with two suggested threads: the most interesting next topics from where you landed. One click continues the chain.&lt;/p&gt;

&lt;p&gt;For when inline explanation isn't enough, a globe icon re-answers the query enriched with Brave Search results, with source chips you can click through. A pencil icon opens a free-form follow-up that inherits the current context as background.&lt;/p&gt;

&lt;p&gt;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;. Zero telemetry, zero analytics. Your Anthropic API key lives in &lt;code&gt;chrome.storage.sync&lt;/code&gt; — encrypted, never leaves the browser. Manifest V3.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Highlight → explanation inline
Click word in explanation → one hop deeper
Repeat → counter increments, trail builds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

</description>
      <category>ai</category>
      <category>learning</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
    <item>
      <title>What separates a 93/100 email from a 70/100 email</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Wed, 20 May 2026 20:04:11 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/what-separates-a-93100-email-from-a-70100-email-3d6n</link>
      <guid>https://dev.to/palo_alto_ai/what-separates-a-93100-email-from-a-70100-email-3d6n</guid>
      <description>&lt;p&gt;A 70 has a CTA button that's 28px tall on mobile. A 93 has one that's 44px minimum, thumb-tappable, with contrast ≥4.5:1 against its background. That's not subjective taste — it's measurable, and most email tools never tell you which one you shipped.&lt;/p&gt;

&lt;p&gt;The blank-canvas problem in email marketing is real: Klaviyo, Mailchimp, and every tool like them hand you a template and a send button. Whether your layout hierarchy guides the reader to the CTA, whether your text is legible at 375px wide, whether your button actually gets tapped — you find out from click rate, two days after it's already in 40,000 inboxes.&lt;/p&gt;

&lt;p&gt;I built kopi to close that gap. Every email generated gets an automated design critique across 14 criteria — layout hierarchy, mobile readability, CTA contrast, whitespace, font sizing, and more — scored 0–100 before anything ships.&lt;/p&gt;

&lt;p&gt;Here's what the score actually catches:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Design critique: 71/100
- CTA contrast: 2.8:1 (target ≥4.5) [-12]
- Mobile tap target: 28px height (target ≥44px) [-8]
- Hierarchy: 3 competing H2s above the fold, no clear primary [-6]
- Image-to-text ratio: 78% image (high spam filter risk) [-3]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A 93 doesn't fail any of those. The hierarchy leads with one statement, one supporting line, one CTA. The button is large enough to tap without zooming. The contrast passes WCAG AA at minimum.&lt;/p&gt;

&lt;p&gt;The public gallery at trykopi.ai/emails has 400+ emails that scored 80 or above — browseable by industry and format, so you can see concretely what the scoring rewards before you generate your own.&lt;/p&gt;

&lt;p&gt;Generation takes under 5 minutes from a text prompt. It supports brand-specific design systems (fonts, colors, layout preferences), exports directly to Klaviyo, and runs as an MCP server for Claude Code, Cursor, and ChatGPT if you want to build it into a content pipeline.&lt;/p&gt;

&lt;p&gt;The scoring is the part I'd have paid for on its own.&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>
      <category>design</category>
      <category>marketing</category>
      <category>ui</category>
      <category>ux</category>
    </item>
    <item>
      <title>Measuring AI fluency against 9,830 conversations — including yours</title>
      <dc:creator>J Now</dc:creator>
      <pubDate>Wed, 20 May 2026 16:49:21 +0000</pubDate>
      <link>https://dev.to/palo_alto_ai/measuring-ai-fluency-against-9830-conversations-including-yours-200n</link>
      <guid>https://dev.to/palo_alto_ai/measuring-ai-fluency-against-9830-conversations-including-yours-200n</guid>
      <description>&lt;p&gt;Anthropics February 2026 study classified 11 observable collaboration behaviors across 9,830 Claude conversations and published the distribution as the AI Fluency Index. I read it and immediately wanted to know: which of these behaviors show up in my sessions, and which ones am I skipping entirely.&lt;/p&gt;

&lt;p&gt;The answer, when I actually looked, was embarrassing. I was hitting maybe 4 of the 11 behaviors on repeat. The others — things like iterative delegation and active discernment — I hadn't touched in months of daily use.&lt;/p&gt;

&lt;p&gt;skill-tree plugs into Claude Code (or Cowork, or Cursor via MCP) and runs a 7-step orchestration against your actual session history: find session files, extract your messages, classify the 11 behaviors via a remote Haiku classifier on Fly.io, assign one of seven archetype cards, synthesize a narrative, render it, and return a stable URL. End-to-end takes 30–60 seconds.&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. But the part I actually use daily is the growth quest: one behavior you haven't tried, persisted across sessions via a SessionStart hook so Claude reminds you at the top of your next conversation.&lt;/p&gt;

&lt;p&gt;The behavior taxonomy comes 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, 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;Or as an MCP server for Cursor, VS Code, Windsurf:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; skill-tree-ai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

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