<?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: Tom Yahav</title>
    <description>The latest articles on DEV Community by Tom Yahav (@yahav10).</description>
    <link>https://dev.to/yahav10</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%2F287825%2F828ce0e6-f728-4576-a47f-24605050447d.png</url>
      <title>DEV Community: Tom Yahav</title>
      <link>https://dev.to/yahav10</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yahav10"/>
    <language>en</language>
    <item>
      <title>Claude Code Is Burning Your Tokens — And That's a Symptom, Not the Problem</title>
      <dc:creator>Tom Yahav</dc:creator>
      <pubDate>Wed, 01 Apr 2026 06:26:40 +0000</pubDate>
      <link>https://dev.to/yahav10/claude-code-is-burning-your-tokens-and-thats-a-symptom-not-the-problem-2aio</link>
      <guid>https://dev.to/yahav10/claude-code-is-burning-your-tokens-and-thats-a-symptom-not-the-problem-2aio</guid>
      <description>&lt;p&gt;There's a pattern emerging across Reddit, Hacker News, and dev blogs:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Why is Claude suddenly eating all my tokens?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At first it sounds like a pricing issue. Read enough complaints, and a deeper story appears — one about &lt;strong&gt;how&lt;/strong&gt; we're using AI to code, not just how much it costs.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Complaints Are Consistent (and Legit)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"My tokens are disappearing and I don't know why."&lt;/strong&gt;&lt;br&gt;
Sub-agents run loops. Tools get invoked repeatedly. Context expands silently. You think you're making one request — the system might be doing 20.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Simple tasks suddenly cost way more."&lt;/strong&gt;&lt;br&gt;
Behind every request: full conversation history, system prompts, tool definitions, intermediate reasoning. Thousands of tokens consumed before the model even starts answering.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"I gave it a task… and it just kept going."&lt;/strong&gt;&lt;br&gt;
Claude Code isn't a chatbot — it's an agent. It plans, executes, retries, and explores. Sometimes too much. Every extra step burns more tokens.&lt;/p&gt;


&lt;h2&gt;
  
  
  The "Vibe Coding" Trap
&lt;/h2&gt;

&lt;p&gt;The idea is seductive: write a PRD, hand it to Claude, let it build everything.&lt;/p&gt;

&lt;p&gt;In theory: productivity unlocked.&lt;br&gt;&lt;br&gt;
In practice: chaos + cost.&lt;/p&gt;

&lt;p&gt;AI doesn't have real ownership of your codebase. It doesn't understand your architecture deeply. It will happily brute-force its way to an answer — and bill you for every wrong turn.&lt;/p&gt;

&lt;p&gt;One developer who burned millions of tokens put it plainly: &lt;strong&gt;letting AI run the whole workflow doesn't work.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  The Hard Truth
&lt;/h2&gt;

&lt;p&gt;We shifted from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AI as a tool&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AI as the developer&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And that's where things break.&lt;/p&gt;

&lt;p&gt;When you let an agent write your entire project from scratch, you end up owning code you don't understand. Code you don't understand isn't an asset — it's a liability with good indentation.&lt;/p&gt;

&lt;p&gt;The token burn is a symptom. The real problem is &lt;strong&gt;delegating judgment&lt;/strong&gt;, not just keystrokes.&lt;/p&gt;


&lt;h2&gt;
  
  
  Reclaim the Keyboard
&lt;/h2&gt;

&lt;p&gt;The fix isn't "use less AI." It's use it differently.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Before:  You = spectator,  AI = entire engineering team
After:   You = tech lead,  AI = fast junior engineer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Design the architecture yourself.&lt;/strong&gt; Write the function signatures, the interfaces, the comments. Then ask AI to implement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep prompts small and scoped.&lt;/strong&gt; "Build me a full auth system" → bad. "Write a JWT middleware for Express with these constraints" → good.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reset context aggressively.&lt;/strong&gt; Start new sessions often. Don't let context balloon.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write the hard parts yourself.&lt;/strong&gt; Architecture, tradeoffs, system boundaries — that's your job, not the agent's.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use AI for acceleration, not delegation.&lt;/strong&gt; Boilerplate, refactoring, test generation: great. Autonomous iteration loops: expensive and risky.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;Claude Code is one of the most powerful coding tools we've ever had. But the more autonomy you give it, the more it costs — in tokens, in quality, and in &lt;strong&gt;your own understanding of what you're shipping&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If your tokens are burning fast, don't just optimize prompts.&lt;/p&gt;

&lt;p&gt;Reclaim ownership. Write the core logic. Let AI assist — not replace you.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Are you seeing token spikes? Have you tried vibe coding and regretted it? Drop your experience in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
      <category>discuss</category>
    </item>
    <item>
      <title>I Built a One-Command Tool to Migrate Your Entire Cursor Setup to VS Code</title>
      <dc:creator>Tom Yahav</dc:creator>
      <pubDate>Sat, 14 Mar 2026 19:56:13 +0000</pubDate>
      <link>https://dev.to/yahav10/i-built-a-one-command-tool-to-migrate-your-entire-cursor-setup-to-vs-code-8o9</link>
      <guid>https://dev.to/yahav10/i-built-a-one-command-tool-to-migrate-your-entire-cursor-setup-to-vs-code-8o9</guid>
      <description>&lt;h2&gt;
  
  
  The Problem Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;Cursor is a great editor. The AI features are genuinely impressive, and it's been a go-to choice for a lot of developers over the past couple of years.&lt;/p&gt;

&lt;p&gt;But there are plenty of reasons you might want to switch back to VS Code — team standardization, extension compatibility, personal preference, or just wanting a cleaner setup. The problem? &lt;strong&gt;Moving back is surprisingly painful.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You open VS Code and everything feels wrong. Your theme is gone. Your keybindings don't work. Your snippets aren't there. And you're staring down 20+ extensions you need to reinstall one by one.&lt;/p&gt;

&lt;p&gt;So I built a script that does it all in one command.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ The Fix: One Command
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bash &amp;lt;&lt;span class="o"&gt;(&lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/yahav10/cursor-to-vscode/main/cursor_to_vscode.sh&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Run this in your terminal and within a minute your VS Code will feel exactly like your Cursor setup.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔀 What Gets Migrated
&lt;/h2&gt;

&lt;p&gt;Here's everything the script moves over automatically:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;th&gt;How&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;⚙️ &lt;strong&gt;Settings&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Copies &lt;code&gt;settings.json&lt;/code&gt; and strips out Cursor-specific keys so VS Code stays clean&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⌨️ &lt;strong&gt;Keybindings&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Copies &lt;code&gt;keybindings.json&lt;/code&gt; as-is — the format is identical between the two editors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✂️ &lt;strong&gt;Code snippets&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Copies all your custom snippet files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧩 &lt;strong&gt;Extensions&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Reads your full Cursor extension list and installs each one into VS Code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💾 &lt;strong&gt;Backups&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Every VS Code file that gets overwritten is backed up as &lt;code&gt;.bak&lt;/code&gt; first&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🖥️ What It Looks Like in Your Terminal
&lt;/h2&gt;

&lt;p&gt;The script is designed to keep you informed at every step. Here's a real example of the output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;╔══════════════════════════════════════════════════╗
║     Cursor → VS Code Migration  •  macOS         ║
╚══════════════════════════════════════════════════╝

Checking prerequisites...

      ✔  Cursor config  →  ~/Library/Application Support/Cursor/User
      ✔  VS Code config →  ~/Library/Application Support/Code/User

[1/4] Copying settings.json
      →  Backed up existing settings → settings.json.bak
      ✔  settings.json copied (4 Cursor-specific key(s) stripped)

[2/4] Copying keybindings.json
      ✔  keybindings.json copied

[3/4] Copying code snippets
      ✔  3 snippet file(s) copied

[4/4] Re-installing extensions into VS Code

      →  Found 12 extension(s) in Cursor.

      esbenp.prettier-vscode           ✔ installed
      dbaeumer.vscode-eslint           ✔ installed
      eamodio.gitlens                  ✔ installed
&lt;/span&gt;&lt;span class="c"&gt;      ...
&lt;/span&gt;&lt;span class="go"&gt;
╔══════════════════════════════════════════════════╗
║                   Summary                        ║
╚══════════════════════════════════════════════════╝

  Config files
    ✔ Successes    3

  Extensions
    ✔ Installed    12 / 12

  Migration complete! Open VS Code and enjoy your familiar setup.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step counter, color-coded results, a live extension install feed, and a full summary at the end. You always know what's happening and what worked.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔧 One Step Before You Run It
&lt;/h2&gt;

&lt;p&gt;For the extension migration to work, both editor CLIs need to be registered in your terminal. It's a one-time setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In Cursor:&lt;/strong&gt; &lt;code&gt;Cmd+Shift+P&lt;/code&gt; → &lt;code&gt;Install 'cursor' command in PATH&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In VS Code:&lt;/strong&gt; &lt;code&gt;Cmd+Shift+P&lt;/code&gt; → &lt;code&gt;Install 'code' command in PATH&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Verify they're ready:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cursor &lt;span class="nt"&gt;--version&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; code &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the CLIs aren't set up when you run the script, it'll skip extensions and print exact instructions to fix it — then you can re-run and it'll pick up where it left off.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔒 It's Safe to Run
&lt;/h2&gt;

&lt;p&gt;A few things the script &lt;strong&gt;never&lt;/strong&gt; does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It never deletes or modifies anything in Cursor&lt;/li&gt;
&lt;li&gt;It never overwrites a VS Code file without backing it up first&lt;/li&gt;
&lt;li&gt;It's safe to run multiple times&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If something doesn't look right after migration, restoring is a single command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; ~/Library/Application&lt;span class="se"&gt;\ &lt;/span&gt;Support/Code/User/settings.json.bak &lt;span class="se"&gt;\&lt;/span&gt;
   ~/Library/Application&lt;span class="se"&gt;\ &lt;/span&gt;Support/Code/User/settings.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧠 One Interesting Challenge: The Settings File
&lt;/h2&gt;

&lt;p&gt;The most non-trivial part of this migration is &lt;code&gt;settings.json&lt;/code&gt;. Since Cursor is a VS Code fork, it shares the same format — but it adds its own keys like &lt;code&gt;cursor.general.gitGraphEnabled&lt;/code&gt; or &lt;code&gt;aipopup.enabled&lt;/code&gt; that VS Code doesn't understand.&lt;/p&gt;

&lt;p&gt;Copying the file as-is would leave a bunch of noise in your VS Code settings. So the script uses Python to parse the JSON and strip any key that starts with a known Cursor prefix before writing it out:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;CURSOR_PREFIXES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cursor.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aipopup.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cursorprediction.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cursorSonnet.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;removed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CURSOR_PREFIXES&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It also gracefully handles &lt;strong&gt;malformed JSON&lt;/strong&gt; (a trailing comma in settings is more common than you'd think). If the file can't be parsed, it copies it as-is and warns you instead of crashing.&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Get It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run directly&lt;/span&gt;
bash &amp;lt;&lt;span class="o"&gt;(&lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/yahav10/cursor-to-vscode/main/cursor_to_vscode.sh&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Or clone it&lt;/span&gt;
git clone https://github.com/yahav10/cursor-to-vscode.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The full source is on GitHub: &lt;strong&gt;&lt;a href="https://github.com/yahav10/cursor-to-vscode" rel="noopener noreferrer"&gt;yahav10/cursor-to-vscode&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If this saves you the 30 minutes of manual work it used to take me, drop a ⭐ on the repo. And if you run into issues or want to add Linux/Windows support, PRs are very welcome.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you switched between Cursor and VS Code? What was the biggest pain point for you? Let me know in the comments 👇&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>cursor</category>
      <category>productivity</category>
      <category>tooling</category>
    </item>
    <item>
      <title>I Built a Memory Layer for Claude Code — It Saves Me Hours Every Week</title>
      <dc:creator>Tom Yahav</dc:creator>
      <pubDate>Sat, 07 Mar 2026 23:11:28 +0000</pubDate>
      <link>https://dev.to/yahav10/i-built-a-memory-layer-for-claude-code-it-saves-me-hours-every-week-4c1f</link>
      <guid>https://dev.to/yahav10/i-built-a-memory-layer-for-claude-code-it-saves-me-hours-every-week-4c1f</guid>
      <description>&lt;p&gt;Every Claude Code session starts from scratch. No matter how many times you've explained your architecture, your tech stack, or why you chose JWT over sessions — &lt;strong&gt;Claude forgets all of it the moment the session ends.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I got tired of re-explaining the same decisions. So I built something about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem That Costs You More Than You Think
&lt;/h2&gt;

&lt;p&gt;Here's a conversation I was having three times a week:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Me: "Add authentication to the /orders endpoint"

Claude: "What authentication system are you using?"

Me: "JWT. We decided this in session 1."

Claude: "Got it. And what database?"

Me: "PostgreSQL with Prisma. We've been over this."

Claude: "And what middleware pattern?"

Me: [10 minutes later, still explaining context]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sound familiar?&lt;/p&gt;

&lt;p&gt;Every re-explanation burns &lt;strong&gt;tokens&lt;/strong&gt; (which cost money), &lt;strong&gt;time&lt;/strong&gt; (which you don't get back), and &lt;strong&gt;patience&lt;/strong&gt; (which is finite).&lt;/p&gt;

&lt;p&gt;I did some rough math on my own usage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;~3 Claude Code sessions per day&lt;/li&gt;
&lt;li&gt;~15 minutes wasted per session re-explaining context&lt;/li&gt;
&lt;li&gt;That's &lt;strong&gt;5+ hours per week&lt;/strong&gt; — just on context that Claude should already know&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a team of 4 developers, that's &lt;strong&gt;20 hours per week&lt;/strong&gt;. Gone.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fix: Give Claude a Memory
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/claude-session-memory" rel="noopener noreferrer"&gt;&lt;strong&gt;claude-session-memory&lt;/strong&gt;&lt;/a&gt; is an open-source MCP server that gives Claude Code a persistent, queryable memory.&lt;/p&gt;

&lt;p&gt;It works like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session 1&lt;/strong&gt; — You make a decision, Claude saves it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You: "Let's use JWT for authentication — stateless,
      scalable for our microservices."

Claude: "Saved as architectural decision #1."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Session 14&lt;/strong&gt; — You ask about it, Claude remembers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You: "Why are we using JWT?"

Claude: "You chose JWT for authentication (decision #1)
        because of stateless scalability for microservices.
        Alternatives considered: session cookies, OAuth2."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Session 27&lt;/strong&gt; — You just build:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You: "Add auth to the /orders endpoint"

Claude: [queries memory, finds JWT decision,
         knows your middleware pattern, builds it correctly]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No re-explaining. No wasted tokens. No wrong assumptions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup: 30 Seconds
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx claude-session-memory init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart Claude Code. Done.&lt;/p&gt;

&lt;p&gt;That one command:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creates a local SQLite database in &lt;code&gt;.claude/project-memory.db&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Registers the MCP server in your &lt;code&gt;.claude/settings.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Generates a memory-instructions template so Claude knows how to use it&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What It Actually Does
&lt;/h2&gt;

&lt;p&gt;Under the hood, it's an MCP server with 6 tools:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;save_decision&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Save an architectural decision with rationale, alternatives, and tags&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;query_memory&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Search past decisions using natural language&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list_recent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;See recent decisions across sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;update_decision&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deprecate or supersede outdated decisions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_stats&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Memory overview (runs automatically at session start)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sync_claude_md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Export decisions into your CLAUDE.md&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When Claude starts a new session, &lt;code&gt;get_stats&lt;/code&gt; fires automatically. Claude sees something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Decisions:  47 total (42 active, 3 deprecated, 2 superseded)
Sessions:   31
Last activity: 2 hours ago
Top tags: auth (8), database (6), api (5), performance (4)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now Claude knows this project has history — and it will query that history before making assumptions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Smart Features That Keep It Clean
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Automatic Deduplication
&lt;/h3&gt;

&lt;p&gt;Every time you save a decision, the server compares it against existing ones using Jaccard similarity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&amp;gt; 80% similar&lt;/strong&gt; — Auto-supersedes the older version (no cleanup needed)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;60-80% similar&lt;/strong&gt; — Returns a warning so you can decide&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&amp;lt; 60%&lt;/strong&gt; — Saved without warnings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means you can freely save decisions without worrying about duplicates piling up.&lt;/p&gt;

&lt;h3&gt;
  
  
  Confidence Decay
&lt;/h3&gt;

&lt;p&gt;Tag a decision as &lt;code&gt;temporary&lt;/code&gt; or &lt;code&gt;experimental&lt;/code&gt;, and it automatically fades over 30 days:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Day  0  → confidence 1.0 (full strength)
Day 15  → confidence 0.5
Day 30  → confidence 0.0 (fully faded)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Faded decisions are excluded from auto-generated docs but remain queryable. Regular decisions never decay.&lt;/p&gt;

&lt;h3&gt;
  
  
  CLAUDE.md Sync
&lt;/h3&gt;

&lt;p&gt;Export your active decisions directly into &lt;code&gt;CLAUDE.md&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx claude-session-memory sync-claudemd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It injects a structured section between markers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- DECISIONS:START --&amp;gt;&lt;/span&gt;
&lt;span class="gu"&gt;## Architectural Decisions&lt;/span&gt;
&lt;span class="ge"&gt;_Auto-generated from project memory — 5 active decisions_&lt;/span&gt;

&lt;span class="gu"&gt;### Auth&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Use JWT for authentication**&lt;/span&gt; — Stateless and scalable [auth, security]

&lt;span class="gu"&gt;### Database&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Use PostgreSQL with Prisma**&lt;/span&gt; — ACID compliance [database]
&lt;span class="c"&gt;&amp;lt;!-- DECISIONS:END --&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything outside the markers is preserved. This means Claude gets your most important decisions loaded into context automatically — zero-cost recall.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Compounding Effect
&lt;/h2&gt;

&lt;p&gt;This is the part that surprised me.&lt;/p&gt;

&lt;p&gt;The first few sessions feel normal. You save some decisions, query a couple things. Fine.&lt;/p&gt;

&lt;p&gt;But around &lt;strong&gt;session 20&lt;/strong&gt;, something shifts. You stop explaining things. You say "add caching" and Claude already knows your stack, your patterns, your conventions. It just builds correctly.&lt;/p&gt;

&lt;p&gt;By &lt;strong&gt;session 50&lt;/strong&gt;, a new team member can open Claude Code in your project and ask "how does authentication work?" — and get the full decision history, rationale, alternatives, and trade-offs. Instantly.&lt;/p&gt;

&lt;p&gt;The value compounds with every session. The more decisions you save, the smarter every future session becomes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Doesn't Do
&lt;/h2&gt;

&lt;p&gt;Let me be upfront about what this is &lt;strong&gt;not&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Not a cloud service&lt;/strong&gt; — Everything is local SQLite. Zero network calls, zero telemetry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not a CLAUDE.md replacement&lt;/strong&gt; — It complements CLAUDE.md by making it queryable and auto-generated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not magic&lt;/strong&gt; — You still need to save decisions (though Claude learns to suggest saving them proactively).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A Full Dashboard — Not Just a CLI
&lt;/h2&gt;

&lt;p&gt;You don't have to live in the terminal to use this. There's a built-in web dashboard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx claude-session-memory web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This launches a local Vue 3 + Tailwind app at &lt;code&gt;http://localhost:3850&lt;/code&gt; where you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Browse all decisions&lt;/strong&gt; with full-text search, status filters, and tag filtering&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;View decision details&lt;/strong&gt; — rationale, alternatives, consequences, linked files, and history&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explore sessions&lt;/strong&gt; — see which decisions were made in each Claude Code session&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Track analytics&lt;/strong&gt; — work patterns, decision quality metrics, codebase knowledge coverage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get AI coaching&lt;/strong&gt; — an AI-powered insights panel that analyzes your decision patterns and suggests improvements&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Import past sessions&lt;/strong&gt; — scan your &lt;code&gt;~/.claude/projects/&lt;/code&gt; directory and bulk-import decisions from old transcripts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manage settings&lt;/strong&gt; — database info, API key storage, maintenance tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything runs locally. The dashboard reads from the same SQLite database that the MCP server uses — so what you see in the browser is always in sync with what Claude sees in conversation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monorepo? One Command.
&lt;/h2&gt;

&lt;p&gt;If you have a workspace with multiple sub-projects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx claude-session-memory workspace-setup /path/to/workspace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This symlinks the MCP config into every git sub-project, so they all share the same decision history. Your auth decisions in one service are instantly available when working on another.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Query Examples
&lt;/h2&gt;

&lt;p&gt;Once you have a few sessions worth of decisions, you can ask things like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Why did we choose JWT?"
"What decisions affect src/auth.ts?"
"Compare Pinia vs Vuex"
"Show me deprecated decisions"
"What are the alternatives to Redis?"
"Show recent decisions tagged 'database'"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The query router handles natural language — you don't need exact syntax.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;p&gt;For the curious:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Storage&lt;/strong&gt;: SQLite with FTS5 full-text search, WAL mode&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transport&lt;/strong&gt;: MCP stdio (spawned by Claude Code)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search&lt;/strong&gt;: 9-pattern intent router with hybrid FTS5 fallback&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: Web dashboard with Vue 3 + Vite + Tailwind CSS + ECharts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependencies&lt;/strong&gt;: &lt;code&gt;better-sqlite3&lt;/code&gt;, &lt;code&gt;@modelcontextprotocol/sdk&lt;/code&gt;, &lt;code&gt;commander&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests&lt;/strong&gt;: 179 tests, all passing&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx claude-session-memory init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's literally it. One command, restart Claude Code, and every session from now on builds on the last.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/yahav10/claude-code-memory" rel="noopener noreferrer"&gt;github.com/yahav10/claude-code-memory&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;npm&lt;/strong&gt;: &lt;a href="https://www.npmjs.com/package/claude-session-memory" rel="noopener noreferrer"&gt;npmjs.com/package/claude-session-memory&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;License&lt;/strong&gt;: MIT&lt;/p&gt;




&lt;p&gt;If this solves a problem you've been having, give it a star on GitHub. And if you have ideas for improvements, issues and PRs are welcome.&lt;/p&gt;

&lt;p&gt;Stop re-explaining. Start remembering.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6dlxjw71rjtkc27efsux.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6dlxjw71rjtkc27efsux.png" alt="Dashboard" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2iiw2hn9pwbcfonw5w3a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2iiw2hn9pwbcfonw5w3a.png" alt="Decisions" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr7hdk9yv5tk8qbh6z0x3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr7hdk9yv5tk8qbh6z0x3.png" alt="Insights" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi53qjmw2ijq5ok1qwbj6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi53qjmw2ijq5ok1qwbj6.png" alt="Sessions" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Built a Local Analytics Dashboard for Claude Code — Here's What I Learned About My AI Coding Habits</title>
      <dc:creator>Tom Yahav</dc:creator>
      <pubDate>Mon, 23 Feb 2026 11:56:08 +0000</pubDate>
      <link>https://dev.to/yahav10/i-built-a-local-analytics-dashboard-for-claude-code-heres-what-i-learned-about-my-ai-coding-1h0f</link>
      <guid>https://dev.to/yahav10/i-built-a-local-analytics-dashboard-for-claude-code-heres-what-i-learned-about-my-ai-coding-1h0f</guid>
      <description>&lt;p&gt;You know that feeling when you check your Anthropic bill and think... &lt;em&gt;where did all those tokens go?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I've been using Claude Code daily for months. It's incredible — but it's also a black box. I had no idea which sessions were burning through Opus tokens on trivial tasks, which prompts were triggering tool loops, or how much money I was wasting by not leveraging prompt caching.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;&lt;a href="https://github.com/yahav10/claude-code-dashboard" rel="noopener noreferrer"&gt;Claude Code Dashboard&lt;/a&gt;&lt;/strong&gt; — a local-first analytics platform that reads your Claude Code session logs and turns them into actionable insights.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero telemetry. Zero outbound connections. Your data never leaves localhost.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx claude-code-insights
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That's it. One command. Dashboard opens at &lt;code&gt;localhost:3838&lt;/code&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Claude Code stores rich session logs in &lt;code&gt;~/.claude/projects/&lt;/code&gt; — every message, tool call, token count, and model used. But there's no built-in way to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;See how much you're spending per day, per model, per session&lt;/li&gt;
&lt;li&gt;Detect when Claude gets stuck in a tool loop (calling &lt;code&gt;Bash&lt;/code&gt; 12 times in a row)&lt;/li&gt;
&lt;li&gt;Know if you're actually benefiting from prompt caching&lt;/li&gt;
&lt;li&gt;Compare your Opus vs Sonnet usage patterns&lt;/li&gt;
&lt;li&gt;Watch what Claude is doing in real-time across concurrent sessions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All that data is just sitting there in JSONL files. I wanted to make it useful.&lt;/p&gt;


&lt;h2&gt;
  
  
  What It Does
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Overview Dashboard
&lt;/h3&gt;

&lt;p&gt;The landing page gives you the big picture: daily activity charts, cost trends, model distribution, and a GitHub-style activity heatmap. One glance tells you your coding rhythm with Claude.&lt;/p&gt;
&lt;h3&gt;
  
  
  Session Browser
&lt;/h3&gt;

&lt;p&gt;Every Claude Code session you've ever run, in a virtual-scrolled table with multi-column sorting. Filter by project, date range, model, or cost. Toggle columns on/off. Click into any session for the full message-by-message breakdown.&lt;/p&gt;
&lt;h3&gt;
  
  
  Live Monitor
&lt;/h3&gt;

&lt;p&gt;This one's my favorite. Real-time streaming via Server-Sent Events — you can watch Claude work as it happens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Per-session KPI counters (messages, tokens, cost, tool calls)&lt;/li&gt;
&lt;li&gt;Task progress tracking pulled from Claude's TodoWrite output&lt;/li&gt;
&lt;li&gt;A terminal-style message feed showing user/assistant/tool/system events&lt;/li&gt;
&lt;li&gt;Switch between concurrent active sessions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's like &lt;code&gt;htop&lt;/code&gt; for your AI coding sessions.&lt;/p&gt;
&lt;h3&gt;
  
  
  Cost Analytics
&lt;/h3&gt;

&lt;p&gt;This is where it gets interesting. Most tools show you "total cost." This dashboard breaks down &lt;strong&gt;four token dimensions&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;What It Is&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Input tokens&lt;/td&gt;
&lt;td&gt;What you send to Claude&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output tokens&lt;/td&gt;
&lt;td&gt;What Claude generates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cache read tokens&lt;/td&gt;
&lt;td&gt;Tokens served from Anthropic's prompt cache&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cache write tokens&lt;/td&gt;
&lt;td&gt;Tokens written to cache for future reuse&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You get per-model breakdowns, daily trends, a 30-day cost forecast, and — critically — a &lt;strong&gt;cache efficiency section&lt;/strong&gt; that shows your hit rate, estimated savings, and what you &lt;em&gt;would have paid&lt;/em&gt; without caching.&lt;/p&gt;

&lt;p&gt;If your cache hit rate is below 20%, the dashboard tells you. With a specific recommendation.&lt;/p&gt;
&lt;h3&gt;
  
  
  AI Insights — A Linter for Your AI Usage
&lt;/h3&gt;

&lt;p&gt;This is the feature I'm most proud of. 10 automated detection rules that analyze every session and flag patterns you'd never catch manually:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rule&lt;/th&gt;
&lt;th&gt;What It Catches&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost Spike&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Session costs 3x+ your average&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tool Loop&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Same tool called 5+ times with no other tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Context Bloat&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1000+ input tokens with &amp;lt; 20% cache hit rate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Error Cascade&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;30%+ tool error rate in a session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Idle Session&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1+ hour session with &amp;lt; 5 messages/hour&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Model Mismatch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Opus used for simple tasks (&amp;lt; 10 messages)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Large Output&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;50,000+ output tokens in a single session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Abandoned Session&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Only 1-2 messages sent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cache Miss Rate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;lt; 10% cache hits with 10K+ input tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Token Waste&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Average cost per message &amp;gt; $0.50&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each fires with a specific, actionable recommendation — not just a metric. "Opus used for a session with only 3 messages — consider Sonnet" is more useful than a pie chart.&lt;/p&gt;
&lt;h3&gt;
  
  
  Tools &amp;amp; Skills Analytics
&lt;/h3&gt;

&lt;p&gt;See which tools Claude uses most, their error rates, and how that changes over time. Spot patterns — are your Bash calls failing because of permission issues? Is the Read tool being called redundantly?&lt;/p&gt;
&lt;h3&gt;
  
  
  Interactive Agent
&lt;/h3&gt;

&lt;p&gt;You can run Claude Code sessions directly from the dashboard. Pick your model (Sonnet, Opus, Haiku), set a permission mode, and go. The dashboard shows real-time cost tracking and requires explicit approval for dangerous operations (file writes, shell commands).&lt;/p&gt;

&lt;p&gt;This one requires an &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; — but the key is read by the Claude Agent SDK from &lt;code&gt;process.env&lt;/code&gt;. The dashboard never reads, stores, or logs it.&lt;/p&gt;


&lt;h2&gt;
  
  
  Security: Not a Feature — An Architecture
&lt;/h2&gt;

&lt;p&gt;I'm opinionated about this: a local analytics tool that phones home is worse than useless. So security isn't a toggle — it's enforced at every layer.&lt;/p&gt;
&lt;h3&gt;
  
  
  Network Guard
&lt;/h3&gt;

&lt;p&gt;At startup, the server monkey-patches &lt;code&gt;net.Socket.prototype.connect&lt;/code&gt; to &lt;strong&gt;block all non-localhost TCP connections at the socket level&lt;/strong&gt;. This runs before any other code:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;originalConnect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;connect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parseHost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nf"&gt;isLocalhost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;host&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;destroy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`[network-guard] Blocked: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;host&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="nx"&gt;blockedAttempts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;originalConnect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If any dependency tries to phone home — analytics, error reporting, anything — the connection is destroyed and logged. Not blocked by a firewall rule. Destroyed in code.&lt;/p&gt;
&lt;h3&gt;
  
  
  PII Detection
&lt;/h3&gt;

&lt;p&gt;A regex-based scanner catches sensitive data before it reaches the browser:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API keys (Anthropic &lt;code&gt;sk-ant-*&lt;/code&gt;, OpenAI &lt;code&gt;sk-*&lt;/code&gt;, generic &lt;code&gt;pk-*&lt;/code&gt;/&lt;code&gt;rk-*&lt;/code&gt;/&lt;code&gt;ak-*&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;AWS credentials (&lt;code&gt;AKIA*&lt;/code&gt;, &lt;code&gt;ABIA*&lt;/code&gt;, &lt;code&gt;ACCA*&lt;/code&gt;, &lt;code&gt;ASIA*&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;GitHub tokens (&lt;code&gt;ghp_*&lt;/code&gt;, &lt;code&gt;gho_*&lt;/code&gt;, &lt;code&gt;ghu_*&lt;/code&gt;, &lt;code&gt;ghs_*&lt;/code&gt;, &lt;code&gt;ghr_*&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;JWTs, private key headers, emails, IP addresses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Matches are replaced with &lt;code&gt;[REDACTED:type]&lt;/code&gt; tokens. This runs at three pipeline points: before SQLite storage, before WebSocket transmission, and before SSE broadcast.&lt;/p&gt;
&lt;h3&gt;
  
  
  Everything Else
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read-only&lt;/strong&gt; — never touches your &lt;code&gt;~/.claude/&lt;/code&gt; directory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Localhost-only&lt;/strong&gt; — server binds to &lt;code&gt;127.0.0.1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CSP headers&lt;/strong&gt; — &lt;code&gt;default-src 'self'&lt;/code&gt;, &lt;code&gt;X-Frame-Options: DENY&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prepared statements&lt;/strong&gt; — all SQLite queries are parameterized&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero telemetry&lt;/strong&gt; — no analytics, no tracking, no phone-home&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;Vue 3, TypeScript, Vite, Pinia, SCSS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Charts&lt;/td&gt;
&lt;td&gt;ECharts (tree-shaken)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tables&lt;/td&gt;
&lt;td&gt;TanStack Vue Table + Vue Virtual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;Fastify 5, better-sqlite3 (WAL mode)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real-time&lt;/td&gt;
&lt;td&gt;Server-Sent Events + WebSocket&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent&lt;/td&gt;
&lt;td&gt;Claude Agent SDK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Validation&lt;/td&gt;
&lt;td&gt;Zod schemas as single source of truth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testing&lt;/td&gt;
&lt;td&gt;Vitest&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;It's a pnpm monorepo with shared packages for cost calculation, session parsing, insight detection, and TypeScript types.&lt;/p&gt;


&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;
&lt;h3&gt;
  
  
  npx (no install)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx claude-code-insights
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Global install
&lt;/h3&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; claude-code-insights
claude-code-insights
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  From source
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/yahav10/claude-code-dashboard.git
&lt;span class="nb"&gt;cd &lt;/span&gt;claude-code-dashboard
&lt;span class="o"&gt;![&lt;/span&gt; &lt;span class="o"&gt;](&lt;/span&gt;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mhskalxsfmybga7ykqz0.png&lt;span class="o"&gt;)&lt;/span&gt;
pnpm &lt;span class="nb"&gt;install
&lt;/span&gt;bash scripts/build.sh
node packages/cli/dist/index.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Opens a dashboard at &lt;code&gt;http://localhost:3838&lt;/code&gt; analyzing your sessions from &lt;code&gt;~/.claude/&lt;/code&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  What I Learned About My Own Habits
&lt;/h2&gt;

&lt;p&gt;Building this tool forced me to look at my own AI coding patterns. Some things I discovered:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;I was using Opus for trivial tasks.&lt;/strong&gt; The model-mismatch rule caught me sending 3-message sessions to Opus when Sonnet would have been identical quality at 40% the cost.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tool loops are real.&lt;/strong&gt; I had sessions where Claude called &lt;code&gt;Bash&lt;/code&gt; 8+ times in a row trying to fix a test — each attempt slightly different but fundamentally the same approach. The tool-loop detector now alerts me when this happens.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cache efficiency varies wildly.&lt;/strong&gt; Some projects had 60%+ cache hit rates (long sessions, stable context). Others were below 5% (lots of file switching, short sessions). The cache breakdown helped me restructure how I prompt.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;My most expensive sessions were rarely my most productive.&lt;/strong&gt; The cost-spike detector showed that high-cost sessions often correlated with context bloat and tool loops — not with actual feature delivery.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Contributing
&lt;/h2&gt;

&lt;p&gt;The project is MIT-licensed and open for contributions. If you use Claude Code, I'd love your feedback:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/yahav10/claude-code-dashboard" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yahav10/claude-code-dashboard/issues" rel="noopener noreferrer"&gt;Report Issues&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yahav10/claude-code-dashboard/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Contributing Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Star the repo if you find it useful — it helps others discover it.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; &lt;code&gt;npx claude-code-insights&lt;/code&gt; gives you a local, private, zero-telemetry analytics dashboard for your Claude Code usage. Costs, caching, tool patterns, AI-powered insights, live monitoring — all from one command.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/yahav10" rel="noopener noreferrer"&gt;
        yahav10
      &lt;/a&gt; / &lt;a href="https://github.com/yahav10/claude-code-dashboard" rel="noopener noreferrer"&gt;
        claude-code-dashboard
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Local-first analytics dashboard for Claude Code usage. Zero telemetry. Zero outbound connections.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;📊 Claude Code Dashboard&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Local-first analytics dashboard for Claude Code usage.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Understand your AI coding patterns, costs, and performance — all without leaving your machine.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/claude-code-insights" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/bd216eb90318b7fea4c3a43c2d23f005c9e1f2fd8edefa17910da73e56de3aa7/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f636c617564652d636f64652d696e7369676874733f636f6c6f723d626c7565266c6162656c3d6e706d" alt="npm version"&gt;&lt;/a&gt;
&lt;a href="https://github.com/yahav10/claude-code-dashboard/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/784362b26e4b3546254f1893e778ba64616e362bd6ac791991d2c9e880a3a64e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d677265656e2e737667" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://nodejs.org" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b03433887ec5d9ad2706ed113b2e763a4b23832588f1468e857d89f7b34cc2bd/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4e6f64652e6a732d25334525334432302d627269676874677265656e2e737667" alt="Node"&gt;&lt;/a&gt;
&lt;a href="https://www.typescriptlang.org" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/dc63baa72c8d42e246e791f4e625fa55d7eec24c1332fa5ce0e0d64b459f96c3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f547970655363726970742d352e782d626c75652e737667" alt="TypeScript"&gt;&lt;/a&gt;
&lt;a href="https://github.com/" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e1ac3db7e7706d8250804a967b962700b979dbe8fe1aa6eafe9b5d509400d3e2/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507269766163792d3130302532355f4c6f63616c2d707572706c65" alt="100% Local"&gt;&lt;/a&gt;
&lt;a href="https://github.com/" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7704c4e29d0d823281fe627f68388becbbad4812ab05c81213448e4bb965f944/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f54656c656d657472792d5a65726f2d6f72616e6765" alt="Zero Telemetry"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Zero telemetry. Zero outbound connections. Your data never leaves localhost.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;⚡ Quick Start&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npx claude-code-insights&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Opens a dashboard at &lt;code&gt;http://localhost:3838&lt;/code&gt; analyzing your Claude Code sessions from &lt;code&gt;~/.claude/&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Global install&lt;/strong&gt;: &lt;code&gt;npm install -g claude-code-insights&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;✨ Features&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;📈 &lt;strong&gt;Overview Dashboard&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;KPIs, daily activity charts, cost trends, model distribution, weekly heatmap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📋 &lt;strong&gt;Sessions Browser&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Virtual-scrolled table with sorting, filters (date, model, project, cost), column toggles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔍 &lt;strong&gt;Session Detail&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Message-by-message timeline, tool breakdown, cost waterfall&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🎯 &lt;strong&gt;Advanced Timeline&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Gantt-style visualization with swim lanes, zoom, minimap, click-to-inspect&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📡 &lt;strong&gt;Live Monitor&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Real-time per-session tracking via SSE with session switching and message feed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🤖 &lt;strong&gt;Interactive Agent&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Run Claude Code sessions from the dashboard (requires &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💰 &lt;strong&gt;Cost Analytics&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Per-model and per-day breakdowns with 30-day linear&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/yahav10/claude-code-dashboard" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn0vx5iu7wm14ok1qn55v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn0vx5iu7wm14ok1qn55v.png" alt="Model Usage Over Time"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhnp6in8zu1gheq3ry1ti.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhnp6in8zu1gheq3ry1ti.png" alt="Live Agent"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4zzrbshk3ksavgnv9goo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4zzrbshk3ksavgnv9goo.png" alt="Agent Session"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I Built a CLI That Turns Claude Code's /insights Report Into Actionable Skills, Rules, and Workflows</title>
      <dc:creator>Tom Yahav</dc:creator>
      <pubDate>Mon, 16 Feb 2026 20:48:42 +0000</pubDate>
      <link>https://dev.to/yahav10/i-built-a-cli-that-turns-claude-codes-insights-report-into-actionable-skills-rules-and-workflows-377</link>
      <guid>https://dev.to/yahav10/i-built-a-cli-that-turns-claude-codes-insights-report-into-actionable-skills-rules-and-workflows-377</guid>
      <description>&lt;h2&gt;
  
  
  The Problem: /insights Gives You a Report, Then What?
&lt;/h2&gt;

&lt;p&gt;Claude Code's &lt;code&gt;/insights&lt;/code&gt; command is one of its most underrated features. It analyzes your last 30 days of usage and generates a detailed HTML report: friction patterns, strengths, CLAUDE.md suggestions, workflow recommendations, and more.&lt;/p&gt;

&lt;p&gt;The problem? &lt;strong&gt;The report is read-only.&lt;/strong&gt; It's a beautiful HTML page that you read, nod at, and then close. The friction patterns it identifies are real — but translating them into CLAUDE.md rules, custom skills, and settings changes is manual, tedious work that most developers skip entirely.&lt;/p&gt;

&lt;p&gt;That's the gap &lt;code&gt;claude-insights&lt;/code&gt; fills.&lt;/p&gt;

&lt;h2&gt;
  
  
  What claude-insights Does
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;claude-insights&lt;/code&gt; is an open-source CLI tool that &lt;strong&gt;parses your &lt;code&gt;/insight&lt;/code&gt; report HTML and generates production-ready output files&lt;/strong&gt; — personalized to your specific friction patterns, not generic templates.&lt;/p&gt;

&lt;p&gt;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;npx claude-insights analyze ~/.claude/usage-data/report.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generates:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Output File&lt;/th&gt;
&lt;th&gt;What It Contains&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;insights-todo.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prioritized task table with steps, time estimates, and expected friction reduction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CLAUDE.md-additions.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ready-to-paste rules organized by section (General, CSS, Testing, Debugging)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.claude/settings-insights.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hook configurations extracted from your report&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.claude/skills/*.SKILL.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Custom skill files — one per friction pattern — with triggers, steps, rules, and verification checklists&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;insights-README.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Placement guide explaining where each file goes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Pipeline: Parse, Analyze, Generate
&lt;/h2&gt;

&lt;p&gt;The tool follows a three-stage pipeline:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Parse
&lt;/h3&gt;

&lt;p&gt;Uses &lt;a href="https://github.com/cheeriojs/cheerio" rel="noopener noreferrer"&gt;cheerio&lt;/a&gt; to extract structured data from the HTML report — stats, project areas, friction categories with examples, CLAUDE.md suggestions with rationale, feature recommendations, workflow patterns, and more.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Parsing report...

Parsed report: 982 messages, Jan 5 — Feb 3, 2026
  3 friction areas, 4 strengths, 5 CLAUDE.md suggestions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Analyze
&lt;/h3&gt;

&lt;p&gt;This is where the tool does its heavy lifting. For each friction pattern in your report, it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Generates a custom skill file&lt;/strong&gt; with YAML frontmatter containing trigger-rich descriptions extracted from your actual friction examples&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Matches friction patterns to CLAUDE.md suggestions&lt;/strong&gt; using significant-word overlap scoring&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-references workflow patterns&lt;/strong&gt; from the report to include suggested starting prompts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Builds verification checklists&lt;/strong&gt; derived from your specific failure examples — so Claude is forced to check against each one&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Derives a prioritized to-do list&lt;/strong&gt; ranked by impact: friction-derived tasks (High), CLAUDE.md rules (High), features (Medium), patterns (Medium)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Generate
&lt;/h3&gt;

&lt;p&gt;Writes all output files to your chosen directory, creating the &lt;code&gt;.claude/skills/&lt;/code&gt; structure automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Generated Skills Look Like
&lt;/h2&gt;

&lt;p&gt;This is the part that matters most. Each friction pattern becomes a structured skill file that Claude Code can invoke with a slash command.&lt;/p&gt;

&lt;p&gt;Here's a real example — generated from a report where Claude kept proposing fixes without checking the codebase first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;solutions-codebase-verification&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
  &lt;span class="s"&gt;Use when encountering premature solutions without codebase verification,&lt;/span&gt;
  &lt;span class="s"&gt;especially when adding new API endpoints to an existing controller,&lt;/span&gt;
  &lt;span class="s"&gt;or refactoring shared utility modules.&lt;/span&gt;
&lt;span class="s"&gt;---&lt;/span&gt;

&lt;span class="gu"&gt;## When to Use This Skill&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; When a task involves premature solutions without codebase verification.
&lt;span class="p"&gt;-&lt;/span&gt; When adding new API endpoints to an existing controller.
&lt;span class="p"&gt;-&lt;/span&gt; When refactoring shared utility modules.

&lt;span class="gu"&gt;## Steps&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; &lt;span class="gs"&gt;**Diagnose**&lt;/span&gt;: Read the relevant files and map the existing patterns.
   Identify boundaries, ownership, and current behavior before changing
   anything.
&lt;span class="p"&gt;2.&lt;/span&gt; &lt;span class="gs"&gt;**Identify constraints**&lt;/span&gt;: List what must NOT change, which components
   are affected, and document your assumptions. Get confirmation.
&lt;span class="p"&gt;3.&lt;/span&gt; &lt;span class="gs"&gt;**Propose approach**&lt;/span&gt;: Describe your planned fix and explain why it
   avoids the known failure patterns listed in "What Goes Wrong" below.
   Wait for approval.
&lt;span class="p"&gt;4.&lt;/span&gt; &lt;span class="gs"&gt;**Implement**&lt;/span&gt;: Apply the most minimal, narrowly-scoped change possible.
&lt;span class="p"&gt;5.&lt;/span&gt; &lt;span class="gs"&gt;**Verify**&lt;/span&gt;: Confirm the fix works AND doesn't regress related components.

&lt;span class="gu"&gt;## Rules&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Before proposing a fix, always verify the approach against the existing
  codebase patterns first
&lt;span class="p"&gt;-&lt;/span&gt; Do NOT suggest options or solutions without confirming they work in this
  specific codebase
&lt;span class="p"&gt;-&lt;/span&gt; After implementing, verify the fix doesn't regress related components

&lt;span class="gu"&gt;## What Goes Wrong&lt;/span&gt;

Review these failure patterns before implementing. Your fix must not
repeat them:
&lt;span class="p"&gt;
-&lt;/span&gt; When adding a new endpoint, Claude reused a pattern from a different
  controller that didn't match the authentication middleware in this one,
  requiring a full rewrite after review.
&lt;span class="p"&gt;-&lt;/span&gt; When refactoring the shared utility, Claude moved functions without
  checking downstream consumers, breaking two dependent services.

&lt;span class="gu"&gt;## Verification Checklist&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; [ ] Fix addresses the specific issue the user reported
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Change follows existing codebase patterns found during diagnosis
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Change is narrowly scoped — minimal blast radius
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Related/sibling components verified — no regressions
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Approach was proposed and confirmed before implementation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After placing this file in &lt;code&gt;.claude/skills/&lt;/code&gt;, you invoke it with &lt;code&gt;/solutions-codebase-verification&lt;/code&gt; at the start of any relevant task. Claude reads the skill, follows the steps, checks against your documented failure patterns, and runs through the verification checklist before claiming the work is done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The key insight: these skills aren't generic.&lt;/strong&gt; They contain &lt;em&gt;your&lt;/em&gt; friction examples, &lt;em&gt;your&lt;/em&gt; failure patterns, and &lt;em&gt;your&lt;/em&gt; codebase-specific rules. That's what makes them effective.&lt;/p&gt;

&lt;h2&gt;
  
  
  The CLAUDE.md Rules: Categorized and Annotated
&lt;/h2&gt;

&lt;p&gt;The tool doesn't just dump rules — it categorizes them by domain and includes the rationale from your report:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## General Rules&lt;/span&gt;

Before proposing a fix, always verify the approach against the existing
codebase patterns first. Do NOT suggest options or solutions without
confirming they work in this specific codebase.
&lt;span class="gt"&gt;
&amp;gt; _Why: In multiple sessions Claude suggested approaches without verifying&lt;/span&gt;
&lt;span class="gt"&gt;&amp;gt; them against the codebase, leading to wrong patterns (e.g., incorrect&lt;/span&gt;
&lt;span class="gt"&gt;&amp;gt; test setup, mismatched import conventions), requiring repeated user&lt;/span&gt;
&lt;span class="gt"&gt;&amp;gt; corrections._&lt;/span&gt;

&lt;span class="gu"&gt;## CSS &amp;amp; Styling&lt;/span&gt;

When working with CSS in component libraries (especially scoped styles
and design tokens): 1) Always scope CSS fixes narrowly to avoid breaking
other components, 2) Test that changes don't regress sibling views.

&lt;span class="gu"&gt;## Testing&lt;/span&gt;

Follow the existing test patterns in the file's directory — check sibling
test files before writing new ones. Match existing mock/setup patterns
for unit tests and page object patterns for E2E tests.

&lt;span class="gu"&gt;## Debugging&lt;/span&gt;

When debugging production or intermittent issues, do NOT jump to
conclusions. First: reproduce locally. Second: add targeted diagnostic
logging. Third: only propose a fix when the root cause is confirmed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You copy the rules you want into your project's &lt;code&gt;CLAUDE.md&lt;/code&gt;. The &lt;code&gt;_Why&lt;/code&gt; annotations help you decide which rules matter most for your workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Prioritized To-Do List
&lt;/h2&gt;

&lt;p&gt;Instead of reading a report and trying to figure out what to do first, you get a ranked action plan:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;th&gt;Est Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Address friction: "Premature Solutions Without Codebase Verification"&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;5 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Address friction: "Repeated Styling and Layout Failures"&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;5 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Address friction: "Debugging Wrong Root Causes"&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;5 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Add CLAUDE.md rule: "Before proposing a fix, always verify..."&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;2 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Set up Hooks&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;10 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Try workflow: High friction from premature solutions&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;5 min&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each task includes concrete steps: which file to copy, where to paste it, and how to test it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;The tool is built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript&lt;/strong&gt; — strict types for every data structure (ReportData, FrictionCategory, SkillFile, AnalyzerOutput)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;cheerio&lt;/strong&gt; — HTML parsing without a browser&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;commander&lt;/strong&gt; — CLI argument handling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;vitest&lt;/strong&gt; — 83 tests covering parser, analyzer, generator, and full integration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ESLint&lt;/strong&gt; with typescript-eslint — zero violations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Actions CI&lt;/strong&gt; — automated build/test/lint on Node 18 and 20&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The codebase is ~500 lines of source across 5 files. No frameworks, no runtime dependencies beyond cheerio and commander.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Compares to Existing Tools
&lt;/h2&gt;

&lt;p&gt;There are several Claude Code usage tools in the ecosystem, but they solve different problems:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Focus&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/ryoppippi/ccusage" rel="noopener noreferrer"&gt;ccusage&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Token/cost analysis from JSONL session files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/aarora79/claude-code-usage-analyzer" rel="noopener noreferrer"&gt;claude-code-usage-analyzer&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Cost breakdown by model and token type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/ComposioHQ/awesome-claude-skills" rel="noopener noreferrer"&gt;awesome-claude-skills&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Curated collections of hand-written skills&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/alirezarezvani/claude-code-skill-factory" rel="noopener noreferrer"&gt;claude-code-skill-factory&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Toolkit for manually building skills&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;claude-insights&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Automatically generates personalized skills, rules, and settings from your /insight report&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The distinction: existing tools either analyze costs or provide generic pre-built skills. &lt;code&gt;claude-insights&lt;/code&gt; bridges the gap between Anthropic's insight analysis and your project configuration — automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Install globally
&lt;/h3&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; claude-insights
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Or run directly with npx
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx claude-insights analyze ~/.claude/usage-data/report.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  With a specific output directory
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx claude-insights analyze ~/.claude/usage-data/report.html &lt;span class="nt"&gt;-o&lt;/span&gt; ./my-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Then follow the generated to-do list
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Copy CLAUDE.md rules into your project's &lt;code&gt;CLAUDE.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Merge settings into &lt;code&gt;.claude/settings.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Copy skill files to &lt;code&gt;.claude/skills/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Test with &lt;code&gt;/skill-name&lt;/code&gt; on your next task&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;npm&lt;/strong&gt;: &lt;a href="https://www.npmjs.com/package/claude-insights" rel="noopener noreferrer"&gt;npmjs.com/package/claude-insights&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/yahav10/claude-insights" rel="noopener noreferrer"&gt;github.com/yahav10/claude-insights&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  - &lt;strong&gt;License&lt;/strong&gt;: MIT
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;claude-insights is open source and MIT licensed. Contributions, issues, and feedback are welcome on GitHub.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>cli</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Closures Explained in minutes (🎒 Backpack Analogy)</title>
      <dc:creator>Tom Yahav</dc:creator>
      <pubDate>Thu, 13 Nov 2025 13:10:53 +0000</pubDate>
      <link>https://dev.to/yahav10/closures-explained-in-minutes-backpack-analogy-54k3</link>
      <guid>https://dev.to/yahav10/closures-explained-in-minutes-backpack-analogy-54k3</guid>
      <description>&lt;p&gt;Ever wondered why some functions "remember" things even after they should've been forgotten?&lt;/p&gt;

&lt;p&gt;Like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How does this function still know that variable?!" 🤯&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Congratulations — you just met one of JavaScript's most powerful (and confusing) features:&lt;/p&gt;

&lt;h2&gt;
  
  
  Closures
&lt;/h2&gt;

&lt;p&gt;Let's break it down super simply. No CS degree needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎒 Think of a Function as a Person with a Backpack
&lt;/h2&gt;

&lt;p&gt;When a function runs, it's like a person going on a trip.&lt;/p&gt;

&lt;p&gt;Before they leave, they pack a &lt;strong&gt;backpack&lt;/strong&gt; with everything they might need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Variables from their current location&lt;/li&gt;
&lt;li&gt;Variables from their parent's house (outer function)&lt;/li&gt;
&lt;li&gt;Even grandparents' stuff if needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That backpack? &lt;strong&gt;That's a closure.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The function &lt;strong&gt;carries it everywhere&lt;/strong&gt;, even after leaving home.&lt;/p&gt;




&lt;h2&gt;
  
  
  Example: Leaving Home But Keeping Memories
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;🔑 Secret key&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;child&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Child still has access!&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;child&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;myFunction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nf"&gt;myFunction&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Output: 🔑 Secret key&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What just happened?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;parent()&lt;/code&gt; created a variable called &lt;code&gt;secret&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;parent()&lt;/code&gt; returned the &lt;code&gt;child&lt;/code&gt; function&lt;/li&gt;
&lt;li&gt;Even though &lt;code&gt;parent()&lt;/code&gt; &lt;strong&gt;finished running&lt;/strong&gt;, &lt;code&gt;child&lt;/code&gt; still remembers &lt;code&gt;secret&lt;/code&gt;!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Why? Because &lt;code&gt;child&lt;/code&gt; &lt;strong&gt;packed it in its backpack&lt;/strong&gt; (closure) before leaving home.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-World Example: A Counter
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createCounter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Private variable in the backpack&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;decrement&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;getCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createCounter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// 1&lt;/span&gt;
&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// 2&lt;/span&gt;
&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decrement&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// 1&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getCount&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// 1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why is this useful?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;count&lt;/code&gt; is &lt;strong&gt;private&lt;/strong&gt; — you can't access it directly&lt;/li&gt;
&lt;li&gt;Only the functions inside the closure can modify it&lt;/li&gt;
&lt;li&gt;It's like &lt;strong&gt;data protection&lt;/strong&gt; built into JavaScript!&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Another Way to Think About It
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;Analogy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Outer function&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Your home&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inner function&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;You leaving home&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Variables&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stuff you might need&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Closure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Your backpack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Returned function&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;You at your new location, still with your backpack&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Try This in the Console
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;makeGreeting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;greeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`Hello, &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;greetAlice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;makeGreeting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;greetBob&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;makeGreeting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bob&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;greetAlice&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Hello, Alice!&lt;/span&gt;
&lt;span class="nf"&gt;greetBob&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;   &lt;span class="c1"&gt;// Hello, Bob!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why does this work?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Each time you call &lt;code&gt;makeGreeting()&lt;/code&gt;, it creates a &lt;strong&gt;new closure&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;greetAlice&lt;/code&gt; has its own backpack with "Alice"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;greetBob&lt;/code&gt; has its own backpack with "Bob"&lt;/li&gt;
&lt;li&gt;They don't interfere with each other!&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Pitfall: Loop Problem
&lt;/h2&gt;

&lt;p&gt;This is where beginners get confused:&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="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// Output: 3, 3, 3 (NOT 0, 1, 2)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;All three functions share the &lt;strong&gt;same&lt;/strong&gt; &lt;code&gt;i&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;By the time they run, &lt;code&gt;i&lt;/code&gt; is already 3!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Fix #1: Use &lt;code&gt;let&lt;/code&gt; instead of &lt;code&gt;var&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// Output: 0, 1, 2 ✅&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;let&lt;/code&gt; creates a &lt;strong&gt;new closure&lt;/strong&gt; for each iteration!&lt;/p&gt;

&lt;h3&gt;
  
  
  Fix #2: Create a closure manually
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;})(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// Output: 0, 1, 2 ✅&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  When Are Closures Useful?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Private variables&lt;/strong&gt; (like our counter example)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Factory functions&lt;/strong&gt; (creating multiple instances)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event handlers&lt;/strong&gt; (remembering context)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Callbacks&lt;/strong&gt; (preserving state)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Module pattern&lt;/strong&gt; (organizing code)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Closure&lt;/td&gt;
&lt;td&gt;Function's backpack of variables&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outer function&lt;/td&gt;
&lt;td&gt;Home where you pack stuff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inner function&lt;/td&gt;
&lt;td&gt;You with the backpack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Variables&lt;/td&gt;
&lt;td&gt;Items in the backpack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scope&lt;/td&gt;
&lt;td&gt;What you can access&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;Closures aren't magic — they're just functions &lt;strong&gt;remembering where they came from&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Every function in JavaScript has a &lt;strong&gt;built-in backpack&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
It automatically packs variables from its surroundings.&lt;br&gt;&lt;br&gt;
That backpack goes wherever the function goes.&lt;/p&gt;

&lt;p&gt;Once you understand that, closures stop being confusing and start being &lt;strong&gt;powerful&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Got questions?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Drop them in the comments! I love explaining the "why" behind the weird JavaScript behaviors we all encounter.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Speed Up Your Frontend Work: AI-Powered n8n Workflows That Write Code and Save You Time</title>
      <dc:creator>Tom Yahav</dc:creator>
      <pubDate>Thu, 23 Oct 2025 18:52:04 +0000</pubDate>
      <link>https://dev.to/yahav10/speed-up-your-frontend-work-ai-powered-n8n-workflows-that-write-code-and-save-you-time-4c7c</link>
      <guid>https://dev.to/yahav10/speed-up-your-frontend-work-ai-powered-n8n-workflows-that-write-code-and-save-you-time-4c7c</guid>
      <description>&lt;p&gt;Frontend is changing fast—&lt;strong&gt;AI automation&lt;/strong&gt; is now super useful for frontend devs, not just backend. In 2025, n8n got really popular because it lets you set up clear, visual workflows for everyday tasks. The coolest part: &lt;strong&gt;AI models like GPT-5 and Gemini now work easily with n8n to help with things frontend devs need all the time&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Use n8n for Frontend?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automate simple stuff:&lt;/strong&gt; Fetching data, processing forms, sending out notifications—do all this with easy visual steps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use AI for feedback:&lt;/strong&gt; Let AI scan user feedback and sort it, write summaries or quick replies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build smart forms:&lt;/strong&gt; AI checks if people fill out forms right before they even hit submit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Let your workflows get smarter:&lt;/strong&gt; The more your workflow runs, the more it learns and does things better&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Real Example: Using AI to Handle User Feedback
&lt;/h2&gt;

&lt;p&gt;Say you launch a new feature—lots of feedback, but sorting it all takes ages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;n8n helps:&lt;/strong&gt; Connect your feedback form to an AI sentiment checker (like OpenAI or Gemini), and n8n can spot unhappy users, let your team know in Slack, and even write a draft reply for you:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sentimentScore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sentimentResult&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;inputText&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;category&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;neutral&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sentimentScore&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;category&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;positive&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`🎉 Glad you liked it: "&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userText&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;". Anything else you'd like to see?`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sentimentScore&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;category&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;negative&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`😔 Sorry about that: "&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userText&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;". Tell us more so we can help!`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`🙏 Thanks for your feedback: "&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userText&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;". We're on it!`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;json&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;sentiment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;responseDraft&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Another Simple Thing: AI-Checked Forms
&lt;/h2&gt;

&lt;p&gt;Forget tricky regular expressions—&lt;strong&gt;let AI check forms, qualify leads, or even start the onboarding flow&lt;/strong&gt; automatically. Tools like AgentUI let you drag and drop smart fields, connect them to n8n, and start improving conversions with zero hassle.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pro Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use the visual editor:&lt;/strong&gt; Branching and looping are super easy—no messing with complicated code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webhook triggers:&lt;/strong&gt; Start automation fast, even from static sites&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control your data:&lt;/strong&gt; Want privacy? Self-host n8n and tweak it your way, no big company rules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connect to anything:&lt;/strong&gt; APIs, headless CMS, user analytics, AI models—n8n's HTTP node does it all&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Let workflows learn:&lt;/strong&gt; Feed outcome data to your AI nodes so each run gets smarter&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Ready-To-Go Ideas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Auto-move bug reports, let AI sort and send updates to Jira&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Look at session logs and let AI spot why users leave&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auto-share new content to social media and tag all contributors&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;n8n isn't just another tool—it's your automation buddy. In 2025, hooked up to AI, it saves frontend teams loads of time. Less boring tasks, more cool features. The future is visual, smart, and keeps getting better.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What quick AI-powered workflow should every frontend dev build? Share your ideas and let's swap setups!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>ai</category>
      <category>automation</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How OpenAI's Agent Platform is Revolutionizing Frontend Development</title>
      <dc:creator>Tom Yahav</dc:creator>
      <pubDate>Wed, 15 Oct 2025 10:32:51 +0000</pubDate>
      <link>https://dev.to/yahav10/how-openais-agent-platform-is-revolutionizing-frontend-development-1p1o</link>
      <guid>https://dev.to/yahav10/how-openais-agent-platform-is-revolutionizing-frontend-development-1p1o</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;As Frontend developers, we're constantly seeking tools that make our workflows faster, smarter, and more efficient. Enter &lt;strong&gt;OpenAI's Agent Platform&lt;/strong&gt;—a revolutionary ecosystem that enables developers to build, deploy, and optimize AI-powered agents that can transform how we approach frontend development.&lt;/p&gt;

&lt;p&gt;In this post, I'll walk you through how OpenAI's Agent Platform (&lt;a href="https://openai.com/agent-platform/" rel="noopener noreferrer"&gt;https://openai.com/agent-platform/&lt;/a&gt;) can be seamlessly integrated into your frontend workflow, with real-world examples that demonstrate its practical value.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the OpenAI Agent Platform?
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://openai.com/agent-platform/" rel="noopener noreferrer"&gt;OpenAI Agent Platform&lt;/a&gt; is a comprehensive suite designed to help developers &lt;strong&gt;ship production-ready agents faster and more reliably&lt;/strong&gt;. The platform includes:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;AgentKit&lt;/strong&gt; - Your Building Toolkit
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agent Builder&lt;/strong&gt;: Design agents visually with drag-and-drop nodes, versioning, and guardrails&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agents SDK&lt;/strong&gt;: Build agents in Node, Python, or Go with a type-safe library that's &lt;strong&gt;4× faster&lt;/strong&gt; than manual prompt-and-tool setups&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built-in Tools&lt;/strong&gt;: Web search, file retrieval, image generation, code execution, and even &lt;strong&gt;browser agents&lt;/strong&gt; that complete tasks on your behalf&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;ChatKit&lt;/strong&gt; - Deploy UI Instantly
&lt;/h3&gt;

&lt;p&gt;Launch fully integrated chat experiences with drag-and-drop customization—no need to spend weeks building custom front-end UI.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Evals&lt;/strong&gt; - Optimize Performance
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Run automated evaluations with custom graders&lt;/li&gt;
&lt;li&gt;Automatic prompt optimization based on eval results&lt;/li&gt;
&lt;li&gt;Trace grading for the last 100—or 1,000—executions of your workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;According to OpenAI's data, organizations using the Agent Platform have seen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;70% reduction&lt;/strong&gt; in iteration cycles&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;40% faster&lt;/strong&gt; agent evaluation timelines&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2 weeks&lt;/strong&gt; of custom front-end UI work saved&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;75% less time&lt;/strong&gt; to develop agentic workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How Frontend Developers Can Leverage Agent-Based Tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Automate Repetitive Tasks
&lt;/h3&gt;

&lt;p&gt;Agent-based tools can handle mundane tasks like code formatting, documentation generation, or dependency updates—freeing you to focus on creative problem-solving.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Improve UI Interaction
&lt;/h3&gt;

&lt;p&gt;With access to web search, file retrieval, and code execution tools, agents can provide contextual assistance directly within your development environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Browser Automation
&lt;/h3&gt;

&lt;p&gt;The platform includes &lt;strong&gt;browser agents&lt;/strong&gt; that can complete browser-related tasks on your behalf—imagine automating testing workflows, data scraping, or UI testing scenarios.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Rapid Prototyping
&lt;/h3&gt;

&lt;p&gt;Using ChatKit, you can deploy conversational interfaces in minutes, perfect for adding AI-powered support or interactive features to your applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-Life Examples for Frontend Developers
&lt;/h2&gt;

&lt;p&gt;Let's explore three practical scenarios where OpenAI's Agent Platform can supercharge your frontend workflow:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Example 1: GPT-Powered UI Element Autocompletion in React/Vue&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The Problem&lt;/strong&gt;: Writing repetitive component boilerplate is time-consuming.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Solution&lt;/strong&gt;: Build an agent using the Agents SDK that analyzes your project structure and generates context-aware component snippets.&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;// Using the Agents SDK (Node)&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Agent&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;openai-agents-sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;componentAgent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;React Component Generator&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;file_retrieval&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;code_execution&lt;/span&gt;&lt;span class="dl"&gt;'&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="s1"&gt;Analyze the existing components and generate a new component that follows the project patterns&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newComponent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;componentAgent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Create a ProfileCard component with avatar, name, and bio&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;&lt;strong&gt;Real Impact&lt;/strong&gt;: Instead of manually creating files, importing dependencies, and setting up props, your agent handles it in seconds—complete with TypeScript types and styled-components if that's your pattern.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Example 2: Automated Dashboard Data Retrieval and Visualization&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The Problem&lt;/strong&gt;: Pulling data from multiple APIs and formatting it for dashboards requires significant glue code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Solution&lt;/strong&gt;: Use a browser agent to automate data retrieval, transformation, and even generate visualization code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Workflow&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agent accesses internal APIs or web sources using web search and browser tools&lt;/li&gt;
&lt;li&gt;Data is transformed and structured based on your requirements&lt;/li&gt;
&lt;li&gt;Agent generates Chart.js or D3.js code tailored to your data&lt;/li&gt;
&lt;li&gt;You review and integrate the visualization into your dashboard&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Real Impact&lt;/strong&gt;: What typically takes hours of API documentation reading, data wrangling, and chart configuration can be reduced to a 15-minute agent-assisted workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Example 3: Agent-Based Error Detection and Prompt Optimization in Dev Tools&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The Problem&lt;/strong&gt;: Debugging cryptic error messages and optimizing user-facing prompts is tedious.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Solution&lt;/strong&gt;: Integrate the Agents SDK into your development workflow to automatically detect errors, suggest fixes, and optimize prompts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementation&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set up &lt;strong&gt;Evals&lt;/strong&gt; to run automated tests on your agent workflows&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;trace grading&lt;/strong&gt; to analyze the last 1,000 executions&lt;/li&gt;
&lt;li&gt;Apply &lt;strong&gt;automatic prompt optimization&lt;/strong&gt; based on eval results&lt;/li&gt;
&lt;li&gt;Integrate findings directly into your IDE via SDK
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Using the Agents SDK (Python)
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai_agents&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Evals&lt;/span&gt;

&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Error Detective&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;code_execution&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;web_search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Run evals with custom graders
&lt;/span&gt;&lt;span class="n"&gt;eval_results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Evals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;test_cases&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;your_test_suite&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;grader&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pass_if_no_errors&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Get optimized prompts
&lt;/span&gt;&lt;span class="n"&gt;optimized_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;optimize_from_evals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;eval_results&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Real Impact&lt;/strong&gt;: Your error detection becomes &lt;strong&gt;30% more accurate&lt;/strong&gt; (per OpenAI's benchmarks), and you spend less time debugging and more time building.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Tips for Getting Started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Start with Agent Builder&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If you're new to agentic workflows, begin with the visual-first Agent Builder. Use templates to understand common patterns before diving into code.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. Leverage Built-in Tools&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Don't reinvent the wheel—use the platform's built-in tools for web search, file retrieval, and code execution. They're optimized and production-ready.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. Experiment with ChatKit&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If you need to add a conversational interface to your app, ChatKit saves weeks of development time. Deploy a prototype in hours, not sprints.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4. Use Evals from Day One&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Set up automated evaluations early. The prompt optimization and trace grading features will help you iterate faster and catch issues before they reach production.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;5. Explore the SDKs&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The Agents SDK for Node, Python, and Go is type-safe and significantly faster than building from scratch. Check out the documentation at &lt;a href="https://openai.com/agent-platform/" rel="noopener noreferrer"&gt;https://openai.com/agent-platform/&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources for Further Learning
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Official Agent Platform&lt;/strong&gt;: &lt;a href="https://openai.com/agent-platform/" rel="noopener noreferrer"&gt;https://openai.com/agent-platform/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AgentKit Documentation&lt;/strong&gt;: Explore Agent Builder, Agents SDK, and built-in tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ChatKit Demo&lt;/strong&gt;: See live examples of deployed chat interfaces&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evals Guide&lt;/strong&gt;: Learn how to set up custom graders and optimize prompts&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Every Frontend Dev Should Explore Agent Platforms
&lt;/h2&gt;

&lt;p&gt;Here's the bottom line: the OpenAI Agent Platform helps you &lt;strong&gt;save time, increase accuracy, and deliver smarter applications&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Save Time&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;75% less time developing agentic workflows&lt;/li&gt;
&lt;li&gt;2 weeks of front-end UI work saved per project&lt;/li&gt;
&lt;li&gt;70% reduction in iteration cycles&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Increase Accuracy&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;30% increased agent accuracy with evals&lt;/li&gt;
&lt;li&gt;Built-in guardrails and versioning prevent mistakes&lt;/li&gt;
&lt;li&gt;Automatic prompt optimization based on real-world performance&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Deliver Smarter Apps&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Integrate conversational AI directly into your products&lt;/li&gt;
&lt;li&gt;Automate complex workflows that previously required manual intervention&lt;/li&gt;
&lt;li&gt;Provide users with intelligent, context-aware experiences&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The future of frontend development isn't just about writing code—it's about orchestrating intelligent systems that augment our capabilities. OpenAI's Agent Platform gives you the tools to make that future a reality, today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Join the Conversation
&lt;/h2&gt;

&lt;p&gt;Have you experimented with AI agents in your frontend projects? What tasks would you love to automate? Share your ideas, experiences, or questions in the comments below!&lt;/p&gt;

&lt;p&gt;If you've already integrated agent-based tools into your workflow, I'd love to hear about your successes (and challenges). Let's learn from each other and push the boundaries of what's possible in frontend development.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ready to get started?&lt;/strong&gt; Visit &lt;a href="https://openai.com/agent-platform/" rel="noopener noreferrer"&gt;https://openai.com/agent-platform/&lt;/a&gt; and start building today.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What agent-powered tool would make your frontend workflow 10× better? Drop your thoughts below! 👇&lt;/em&gt;&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>ai</category>
      <category>openai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Boost Your Dev Workflow: Top MCP Servers you should check now</title>
      <dc:creator>Tom Yahav</dc:creator>
      <pubDate>Mon, 14 Jul 2025 20:05:19 +0000</pubDate>
      <link>https://dev.to/yahav10/boost-your-dev-workflow-top-mcp-servers-you-should-check-now-34o4</link>
      <guid>https://dev.to/yahav10/boost-your-dev-workflow-top-mcp-servers-you-should-check-now-34o4</guid>
      <description>&lt;h2&gt;
  
  
  What Is an MCP?
&lt;/h2&gt;

&lt;p&gt;The Model Context Protocol (MCP) is an open, JSON-RPC–based standard released by &lt;em&gt;Anthropic&lt;/em&gt; in November 2024 that allows LLM-powered apps to interact with external services—like files, browsers, APIs—via standardized, tool-like servers. Think of it as the “USB‑C port for AI”: universal, plug-and-play connectivity for LLMs across platforms like &lt;em&gt;Cursor&lt;/em&gt;, &lt;em&gt;Claude&lt;/em&gt;, and &lt;em&gt;Windsurf&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Top 10 Verified MCP Servers
&lt;/h2&gt;

&lt;p&gt;Each of these has confirmed MCP support, ready for integration into your projects.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sequential Thinking&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Function&lt;/strong&gt;: Plan multi-step workflows via structured reasoning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verified&lt;/strong&gt;: Listed in Cursor/Glama MCP directories.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cursor use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install mcp-sequential-thinking
cursor --mcp stdio mcp-sequential-thinking
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Plan a 5‑stage CI/CD pipeline…"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Returns a step-by-step plan.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;Puppeteer&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Function&lt;/strong&gt;: Browser automation—scraping, UI testing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verified&lt;/strong&gt;: Official MCP reference, GitHub listings.&lt;br&gt;
Cursor use:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install mcp-puppeteer
cursor --mcp stdio mcp-puppeteer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Get all headlines from example.com…"&lt;/p&gt;
&lt;/blockquote&gt;




&lt;ol&gt;
&lt;li&gt;Memory Bank&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Function&lt;/strong&gt;: Persist chat or project context across sessions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verified&lt;/strong&gt;: Popular “memory” MCP implementations like Polymemory.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cursor use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install mcp-memory-bank
cursor --mcp stdio mcp-memory-bank
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Recall our database schema explained last session…"&lt;/p&gt;
&lt;/blockquote&gt;




&lt;ol&gt;
&lt;li&gt;Playwright&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Function&lt;/strong&gt;: Cross-browser automation (Chromium, Firefox, WebKit).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verified&lt;/strong&gt;: Listed in official GitHub MCP repos.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cursor use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install mcp-playwright
cursor --mcp stdio mcp-playwright
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Screenshot example.com in Firefox…"&lt;/p&gt;
&lt;/blockquote&gt;




&lt;ol&gt;
&lt;li&gt;GitHub&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Function&lt;/strong&gt;: Manage repos, PRs, issues, and CI.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verified&lt;/strong&gt;: Official implementation in Anthropic’s MCP repo  ￼ ￼ ￼ ￼.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cursor use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install mcp-github
GITHUB_TOKEN=… cursor --mcp stdio mcp-github
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"List open PRs in repo X…”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;ol&gt;
&lt;li&gt;DuckDuckGo&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Function&lt;/strong&gt;: Light, privacy-friendly web search.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verified&lt;/strong&gt;: Community-hosted MCP listings.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cursor use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install mcp-duckduckgo
cursor --mcp stdio mcp-duckduckgo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Search React performance best practices…"&lt;/p&gt;
&lt;/blockquote&gt;




&lt;ol&gt;
&lt;li&gt;MCP Compass&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Function&lt;/strong&gt;: Discovery assistant for MCP servers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verified&lt;/strong&gt;: Glama directory listing.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cursor use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install mcp-compass
cursor --mcp stdio mcp-compass

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Recommend an MCP for cloud SQL operations…"&lt;/p&gt;
&lt;/blockquote&gt;




&lt;ol&gt;
&lt;li&gt;Apidog&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Function&lt;/strong&gt;: API spec, testing, and SDK generation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verified&lt;/strong&gt;: Official support from API-focused MCP sources.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cursor use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install mcp-apidog
cursor --mcp stdio mcp-apidog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Test GET /users and generate client…"&lt;/p&gt;
&lt;/blockquote&gt;




&lt;ol&gt;
&lt;li&gt;File System
&lt;strong&gt;Function&lt;/strong&gt;: Read/write, refactor, and modify local files.
&lt;strong&gt;Verified&lt;/strong&gt;: Listed in MCP directories.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cursor use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install mcp-fs
cursor --mcp stdio mcp-fs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Rename variable foo ➝ bar across .js files…"&lt;/p&gt;
&lt;/blockquote&gt;




&lt;ol&gt;
&lt;li&gt;Notion&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Function&lt;/strong&gt;: Read/write Notion docs and tasks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verified&lt;/strong&gt;: Included in Anthropic’s MCP server repo.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cursor use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install mcp-notion
NOTION_TOKEN=… cursor --mcp stdio mcp-notion
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Create a meeting note under Project X…"&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🎁 &lt;strong&gt;Bonus&lt;/strong&gt;: Context7 MCP &amp;amp; More&lt;/p&gt;

&lt;p&gt;Context7&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Function&lt;/strong&gt;: Injects latest version‑specific docs and code examples directly into prompts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verified&lt;/strong&gt;: Supported in multiple MCP directories, &lt;em&gt;GitHub&lt;/em&gt;, &lt;em&gt;Upstash&lt;/em&gt;, &lt;em&gt;Apidog&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cursor integration via Smithery:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx @smithery/cli install @upstash/context7-mcp --client cursor --key YOUR_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or add in &lt;em&gt;Cursor&lt;/em&gt; settings:&lt;/p&gt;

&lt;p&gt;Settings &lt;strong&gt;→&lt;/strong&gt; MCP &lt;strong&gt;→&lt;/strong&gt; Add new global MCP &lt;strong&gt;→&lt;/strong&gt; select Context7&lt;/p&gt;

&lt;p&gt;Usage:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How do I use Next.js middleware? use context7"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Other Bonus Servers (community favorites)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Slack&lt;/strong&gt;: Read/write Slack channels (great for asking teammates)  ￼ ￼ ￼&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sentry&lt;/strong&gt;: Pull issue details for auto-debug workflows  ￼&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Vector Search&lt;/strong&gt;: Semantic search over your repos or docs  ￼&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Integration Guide: MCP + Cursor
&lt;/h2&gt;

&lt;p&gt;Add MCP servers via your ‘mcp.json’&lt;br&gt;
 or &lt;em&gt;Cursor&lt;/em&gt; GUI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
{
  "servers": [
    { "name": "context7", "path": "context7-mcp" },
    { "name": "github", "path": "mcp-github", "env": { "GITHUB_TOKEN": "…" } },
    { "name": "fs", "path": "mcp-fs" }
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or start via &lt;strong&gt;CLI&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cursor \
  --mcp stdio context7-mcp \
  --mcp stdio mcp-github \
  --mcp stdio mcp-fs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Cursor’s prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"List open GitHub PRs, then update README, and show me the latest docs for React Query — use context7."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Cursor&lt;/em&gt; orchestrates between MCP servers to deliver results, modify code, and inject fresh documentation—all in one session.&lt;/p&gt;




&lt;h2&gt;
  
  
  MCP Security &amp;amp; Trust
&lt;/h2&gt;

&lt;p&gt;MCP is open-source and adopted by &lt;em&gt;Anthropic&lt;/em&gt;, &lt;em&gt;OpenAI&lt;/em&gt;, &lt;em&gt;DeepMind&lt;/em&gt;, &lt;em&gt;Microsoft&lt;/em&gt;, etc. Still, security is vital: projects like MCP Guardian and academic audits highlight prompt/tool poisoning as major risk vectors.&lt;br&gt;
Best practices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Run servers locally or behind your firewall&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use permission scoping, token auth, and rate-limits&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Verify servers from trusted registries (e.g. modelcontextprotocol.org)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;MCP is the standardized way for LLMs to act: browse web, edit files, manage tasks, and more.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Today’s MCP ecosystem includes 10+ fully verified servers, with Context7 bringing live docs into your coding flow.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use &lt;em&gt;Cursor&lt;/em&gt; to wire up powerful toolchains in minutes. Code smarter, not harder!&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let me know if you’d like help setting up any of these in your team project 😊&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>mcp</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Why Msty Might Be the Chat Client Devs Didn’t Know They Needed</title>
      <dc:creator>Tom Yahav</dc:creator>
      <pubDate>Sun, 13 Jul 2025 12:23:21 +0000</pubDate>
      <link>https://dev.to/yahav10/why-msty-might-be-the-chat-client-devs-didnt-know-they-needed-2887</link>
      <guid>https://dev.to/yahav10/why-msty-might-be-the-chat-client-devs-didnt-know-they-needed-2887</guid>
      <description>&lt;p&gt;Let’s face it — most of us are drowning in chat tools.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Slack&lt;/em&gt; at work. &lt;em&gt;WhatsApp&lt;/em&gt; with family. &lt;em&gt;Discord&lt;/em&gt; for side projects. &lt;em&gt;Telegram&lt;/em&gt; because that one community swears by it. It’s chaos.&lt;/p&gt;

&lt;p&gt;Then you stumble across &lt;strong&gt;Msty&lt;/strong&gt; — a new chat client that doesn’t just simplify communication, it respects your time, privacy, and focus. And for developers? That’s gold.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤝 Quick Note Before We Dive In
&lt;/h2&gt;

&lt;p&gt;This is &lt;strong&gt;not&lt;/strong&gt; a sponsored post.&lt;br&gt;
I’m not affiliated with &lt;strong&gt;Msty&lt;/strong&gt;, not being paid to write this, and I didn’t get any perks or swag in return.&lt;/p&gt;

&lt;p&gt;I just tried it, liked it, and felt it deserved a proper write-up — especially for developers like me who are always hunting for tools that reduce noise and help us stay focused.&lt;/p&gt;




&lt;h2&gt;
  
  
  So, What Is &lt;strong&gt;Msty&lt;/strong&gt;?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Msty&lt;/strong&gt; is a privacy-first, distraction-free chat app that brings conversations back to basics — but with smart, modern touches.&lt;/p&gt;

&lt;p&gt;No ads. No noise. No unnecessary features.&lt;/p&gt;

&lt;p&gt;Just you, your conversations, and total control.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why It’s Worth Your Attention
&lt;/h2&gt;

&lt;h4&gt;1. Clean UI, Zero Bloat&lt;/h4&gt;

&lt;p&gt;You open &lt;strong&gt;Msty&lt;/strong&gt;, and it’s just… calm.&lt;/p&gt;

&lt;p&gt;No overloaded sidebars, no ten different tabs for “spaces,” “huddles,” “threads,” or “reactions.” The UX is crisp, minimal, and gets out of your way.&lt;/p&gt;

&lt;p&gt;It’s like the “clean code” of chat apps.&lt;/p&gt;




&lt;h4&gt;2. Built with Privacy in Mind&lt;/h4&gt;

&lt;p&gt;Everything’s end-to-end encrypted. No creepy tracking. No surprise data harvesting. You can even set messages to auto-delete after a time you choose.&lt;/p&gt;

&lt;p&gt;As devs, we know how easy it is for platforms to misuse data. &lt;strong&gt;Msty&lt;/strong&gt; flips the script.&lt;/p&gt;




&lt;h4&gt;Works Everywhere and Actually Syncs&lt;/h4&gt;

&lt;p&gt;Mac, Windows, Linux, iOS, Android, and the web — and yes, it just works.&lt;/p&gt;

&lt;p&gt;Start a chat on your laptop, continue on your phone, then finish it from your iPad — all without syncing issues or “reconnect” errors.&lt;/p&gt;




&lt;h4&gt;Focus Mode That Respects Your Flow&lt;/h4&gt;

&lt;p&gt;You’re deep in code. The last thing you need is a blinking chat icon.&lt;/p&gt;

&lt;p&gt;Msty’s Focus Mode holds your messages until you’re ready — like a “Do Not Disturb” that actually works. You can even automate it around your working hours.&lt;/p&gt;




&lt;h4&gt;5. Minimal Personalization, Maximum Clarity&lt;/h4&gt;

&lt;p&gt;Dark mode? Yep. Notification tweaks? Of course.&lt;/p&gt;

&lt;p&gt;But it never overwhelms you with too many toggles. It’s thoughtful, not over-engineered — just like your favorite clean architecture pattern.&lt;/p&gt;




&lt;h3&gt;Designed with Empathy, Not Engagement Metrics&lt;/h3&gt;

&lt;p&gt;Most apps want to hook your attention. &lt;strong&gt;Msty&lt;/strong&gt;? It lets you breathe.&lt;/p&gt;

&lt;p&gt;No engagement traps. No “You missed this!” guilt. It’s made for humans — and especially for devs who value tools that stay out of the way.&lt;/p&gt;




&lt;h2&gt;
  
  
  Should You Try It?
&lt;/h2&gt;

&lt;p&gt;If you’ve ever wished chat clients were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Less noisy&lt;/li&gt;
&lt;li&gt;More secure&lt;/li&gt;
&lt;li&gt;Actually helpful in your workflow&lt;/li&gt;
&lt;li&gt;Designed with devs (and humans) in mind&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then &lt;strong&gt;yes&lt;/strong&gt; — &lt;strong&gt;Msty&lt;/strong&gt; is worth exploring.&lt;/p&gt;




&lt;p&gt;🟣 Check out &lt;a href="https://msty.app/" rel="noopener noreferrer"&gt;Msty&lt;/a&gt; — and let me know what you think in the comments. I’m genuinely curious how others use it in their workflow.&lt;/p&gt;




&lt;p&gt;Want more tools that make your dev life better? Follow me &lt;a href="https://dev.to/yahav10"&gt;here&lt;/a&gt; on Dev.to — I write about AI, UI/UX for devs, and modern tooling that respects your brain.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>development</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>AI‑Enhanced React: Build Your First Chatbot in less than 10 Minutes 🚀</title>
      <dc:creator>Tom Yahav</dc:creator>
      <pubDate>Wed, 09 Jul 2025 19:00:00 +0000</pubDate>
      <link>https://dev.to/yahav10/ai-enhanced-react-build-your-first-chatbot-in-less-than-10-minutes-15mf</link>
      <guid>https://dev.to/yahav10/ai-enhanced-react-build-your-first-chatbot-in-less-than-10-minutes-15mf</guid>
      <description>&lt;p&gt;Want a hands-on tutorial that shows you exactly how to build a React chatbot powered by OpenAI? Let’s dive in!&lt;/p&gt;




&lt;h2&gt;
  
  
  🧰 Why Do This?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Adds real AI interaction capability to your front-end.&lt;/li&gt;
&lt;li&gt;Teaches prompt chaining and handling context.&lt;/li&gt;
&lt;li&gt;Great portfolio piece and learning experience.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔧 What You’ll Need
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;OpenAI API key&lt;/li&gt;
&lt;li&gt;Node.js &amp;amp; npm or yarn&lt;/li&gt;
&lt;li&gt;Create React App or Vite setup&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;strong&gt;1. Set Up Your React Project&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-react-app ai-chatbot
cd ai-chatbot
npm install openai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;2. Secure Your API Key&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create &lt;code&gt;.env.local&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;REACT_APP_OPENAI_KEY=your_api_key_here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;⚠️ Never commit this file.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;3. Create a Simple Backend Proxy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Since we don’t want to expose API keys in the client, create a quick Express server:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install express openai dotenv&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// server.js
import express from 'express'
import OpenAI from 'openai'
import 'dotenv/config'

const app = express()
app.use(express.json())
const openai = new OpenAI({ apiKey: process.env.OPENAI_KEY })

app.post('/chat', async (req, res) =&amp;gt; {
  const { messages } = req.body
  const resp = await openai.chat.completions.create({
    model: 'gpt-3.5-turbo',
    messages,
  })
  res.json({ reply: resp.choices[0].message.content })
})

app.listen(6000, () =&amp;gt; console.log('API ready!'))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;4. Connect Front‑end Chat UI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;src/App.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useState } from 'react'

function App() {
  const [msg, setMsg] = useState('')
  const [history, setHistory] = useState([])

  const sendMsg = async () =&amp;gt; {
    const userMsg = { role: 'user', content: msg }
    const updated = [...history, userMsg]
    setHistory(updated)
    setMsg('')

    const resp = await fetch('/chat', {
      method: 'POST',
      headers: {'Content-Type':'application/json'},
      body: JSON.stringify({ messages: updated })
    }).then(r =&amp;gt; r.json())

    setHistory([...updated, { role: 'assistant', content: resp.reply }])
  }

  return (
    &amp;lt;div&amp;gt;
      {history.map((m,i) =&amp;gt;
        &amp;lt;div key={i} className={m.role}&amp;gt;{m.content}&amp;lt;/div&amp;gt;
      )}
      &amp;lt;input value={msg} onChange={e =&amp;gt; setMsg(e.target.value)} /&amp;gt;
      &amp;lt;button onClick={sendMsg}&amp;gt;Send&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  )
}

export default App
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;5. Improve the UX&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add a system message for personality&lt;/li&gt;
&lt;li&gt;Show loading state&lt;/li&gt;
&lt;li&gt;Add auto-scroll to the bottom&lt;/li&gt;
&lt;li&gt;Style the chat bubbles&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;✅ Customizing Tips&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Switch model to &lt;strong&gt;gpt-4&lt;/strong&gt; if you have access.&lt;/li&gt;
&lt;li&gt;Stream responses for a “typewriter effect” (like this tutorial suggests)&lt;/li&gt;
&lt;li&gt;Consider deploying the Express server with &lt;em&gt;Vercel&lt;/em&gt; or &lt;em&gt;Heroku&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;👏 What You’ve Built&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You now have a chat interface that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Takes input from the user&lt;/li&gt;
&lt;li&gt;Sends prompts (with conversation history) to OpenAI&lt;/li&gt;
&lt;li&gt;Receives and displays AI responses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All in a modern React app with clean separation of front/back-end logic.&lt;/p&gt;




&lt;p&gt;🚀 What’s Next?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add message persistence (localStorage or a DB)&lt;/li&gt;
&lt;li&gt;Improve accessibility and UX&lt;/li&gt;
&lt;li&gt;Integrate with &lt;em&gt;React&lt;/em&gt; frameworks like &lt;em&gt;Next.js&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Deploy your chatbot and show it off!&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>ai</category>
      <category>openai</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>From Static to Adaptive: How AI is Changing Responsive UI Design</title>
      <dc:creator>Tom Yahav</dc:creator>
      <pubDate>Mon, 07 Jul 2025 19:45:00 +0000</pubDate>
      <link>https://dev.to/yahav10/from-static-to-adaptive-how-ai-is-changing-responsive-ui-design-2m5n</link>
      <guid>https://dev.to/yahav10/from-static-to-adaptive-how-ai-is-changing-responsive-ui-design-2m5n</guid>
      <description>&lt;p&gt;For years, we’ve relied on &lt;strong&gt;responsive design&lt;/strong&gt; to make sure our websites and apps look great on every screen. Media queries, flexible grids, and breakpoints have been our best friends.&lt;/p&gt;

&lt;p&gt;But what if we could go one step further — and make our UIs &lt;strong&gt;adapt not just to screen size, but to what our users actually need in the moment?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That’s where &lt;strong&gt;AI-powered adaptive UIs&lt;/strong&gt; come in. And it’s not science fiction anymore — it’s already starting to happen.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s the Difference?
&lt;/h2&gt;

&lt;p&gt;You’ve probably heard these terms tossed around interchangeably, but they’re not the same:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Responsive UI&lt;/strong&gt; adjusts layouts to the device — like a phone vs. a laptop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adaptive UI&lt;/strong&gt; adjusts layouts, content, or features based on &lt;strong&gt;how the user is behaving&lt;/strong&gt;, &lt;strong&gt;where they are&lt;/strong&gt;, or &lt;strong&gt;what they’re trying to do&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of it like this:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Responsive: “Hey, you’re on a smaller screen — let me shrink things!”
&lt;/li&gt;
&lt;li&gt;Adaptive: “Hey, you seem lost — let me give you a hand.”&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How Does AI Make UIs Smarter?
&lt;/h2&gt;

&lt;p&gt;Modern AI models can look at &lt;em&gt;how&lt;/em&gt; people use your app in real-time: Are they scrolling quickly up and down? Do they hover indecisively over buttons? Are they hesitating at checkout?&lt;/p&gt;

&lt;p&gt;By analyzing these patterns, AI can &lt;strong&gt;predict what a user might want next&lt;/strong&gt; — and adjust the UI accordingly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Examples in the wild:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;An online store that shows faster checkout options if you usually buy the same thing.
&lt;/li&gt;
&lt;li&gt;An educational site that simplifies exercises if it notices you struggling.
&lt;/li&gt;
&lt;li&gt;A dashboard that brings forward your most-used tools when you’re in a rush.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Let’s Build a Tiny Demo: Adaptive “Need Help?” Button
&lt;/h2&gt;

&lt;p&gt;To see this in action, here’s a simple Vue 3 app that tracks your scrolling and shows a “Need Help?” button if you scroll like you’re lost. It’s not a production-level AI, but it shows the concept beautifully.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;template&amp;gt;
  &amp;lt;div class="container" ref="scrollContainer" @scroll="handleScroll"&amp;gt;
    &amp;lt;h1&amp;gt;Adaptive UI Demo&amp;lt;/h1&amp;gt;
    &amp;lt;p v-for="i in 100" :key="i"&amp;gt;Line {{ i }}&amp;lt;/p&amp;gt;
    &amp;lt;button v-if="showHelp" class="help-button"&amp;gt;Need Help?&amp;lt;/button&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/template&amp;gt;

&amp;lt;script setup&amp;gt;
import { ref } from 'vue';

const scrollEvents = ref([]);
const showHelp = ref(false);

function handleScroll() {
  const now = Date.now();
  scrollEvents.value.push(now);

  if (scrollEvents.value.length &amp;gt; 10) scrollEvents.value.shift();

  const interval = scrollEvents.value[scrollEvents.value.length - 1] - scrollEvents.value[0];

  // If 10 scrolls happened in under 3 seconds, user might be lost
  showHelp.value = interval &amp;lt; 3000;
}
&amp;lt;/script&amp;gt;

&amp;lt;style scoped&amp;gt;
.container {
  height: 300px;
  overflow-y: scroll;
  border: 1px solid #ccc;
  padding: 1rem;
}
.help-button {
  position: fixed;
  bottom: 1rem;
  right: 1rem;
  padding: 0.8rem 1.2rem;
  background: #007acc;
  color: white;
  border: none;
  border-radius: 4px;
}
&amp;lt;/style&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What’s happening here?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Every time you scroll, it logs the timestamp.&lt;/li&gt;
&lt;li&gt;If you scroll quickly (lots of events in a short time), it shows the “Need Help?” button.&lt;/li&gt;
&lt;li&gt;Replace this simple logic with a real AI call to predict user intent and you’ve got an adaptive UI.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What’s the Big Deal?
&lt;/h2&gt;

&lt;p&gt;Adaptive UIs can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make your app feel more personal and helpful.&lt;/li&gt;
&lt;li&gt;Reduce user frustration by offering the right help at the right time.&lt;/li&gt;
&lt;li&gt;Boost engagement and conversions by removing friction before it becomes a problem.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And best of all: &lt;strong&gt;You can start small&lt;/strong&gt;, like in the example above.&lt;/p&gt;




&lt;h2&gt;
  
  
  Don’t Forget the Human Side
&lt;/h2&gt;

&lt;p&gt;As exciting as adaptive UIs are, remember:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Be transparent: Let users know if you’re personalizing their experience.&lt;/li&gt;
&lt;li&gt;Respect privacy: Collect only what you need, and store it securely.&lt;/li&gt;
&lt;li&gt;Give users control: Let them opt out if they prefer a static experience.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Ready to Explore?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Start by looking at your own app: Where do users drop off or get stuck?&lt;/li&gt;
&lt;li&gt;Identify signals you’re already tracking — like clicks, scrolls, or time on page.&lt;/li&gt;
&lt;li&gt;Experiment with small adaptations, measure their impact, and iterate.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
