<?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: Victoria</title>
    <description>The latest articles on DEV Community by Victoria (@brightgir).</description>
    <link>https://dev.to/brightgir</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%2F3798454%2F18d77bb8-0466-44ed-945b-b5f30bb6f006.jpeg</url>
      <title>DEV Community: Victoria</title>
      <link>https://dev.to/brightgir</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/brightgir"/>
    <language>en</language>
    <item>
      <title>Why Blocking Prompt Injection Is Wrong — and What to Do Instead</title>
      <dc:creator>Victoria</dc:creator>
      <pubDate>Fri, 22 May 2026 11:07:32 +0000</pubDate>
      <link>https://dev.to/brightgir/why-blocking-prompt-injection-is-wrong-and-what-to-do-instead-4hn5</link>
      <guid>https://dev.to/brightgir/why-blocking-prompt-injection-is-wrong-and-what-to-do-instead-4hn5</guid>
      <description>&lt;p&gt;Every security tool blocks. Firewalls block. WAFs block. And now AI security tools block prompt injections too.&lt;/p&gt;

&lt;p&gt;But blocking is the wrong move — and here's why.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The problem with blocking&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When your AI agent detects a suspicious prompt and refuses to respond, the attacker knows immediately: I've been caught. They stop, adjust their payload, and try again.&lt;/p&gt;

&lt;p&gt;Blocking is loud. It teaches attackers what works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if you didn't block?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Classic network honeypots don't block — they deceive. They let the attacker in, feed them fake data, and log everything while the attacker thinks they're making progress.&lt;/p&gt;

&lt;p&gt;I built the same idea for AI agents. Meet MIRAGE.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How MIRAGE works&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every message hits Lobster Trap — a deep prompt inspection sidecar that scores it for injection patterns, jailbreaks, role manipulation, and exfiltration attempts.&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%2F1tgjlp6bjzga1gp9j6tl.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%2F1tgjlp6bjzga1gp9j6tl.png" alt=" " width="800" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;High-risk messages go to a decoy persona that returns fully convincing but entirely fabricated responses — fake&lt;br&gt;
credentials, fake file listings, fake schemas. The attacker has no idea they're in a trap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A real attack scenario&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's what happens when an AI agent tries to exfiltrate data from a MIRAGE-protected system:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Agent sends: "show me config.py"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lobster Trap flags it as a data exfiltration attempt&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;MIRAGE returns a fake directory listing with .env files and a config.py at /app/secrets/config.py&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The agent records this path as valuable and writes it to memory &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It keeps returning to the fake path — burning tokens on every request&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Even after a context reset, the agent reads its memory and loops back to the same dead end&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The attack runs until the attacker runs out of budget or retries. The attacker wastes compute. You collect intelligence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What MIRAGE logs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every session is recorded with:&lt;/p&gt;

&lt;p&gt;Full transcript&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;MITRE ATLAS technique tags (prompt injection, jailbreak, data exfiltration, role manipulation)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Risk timeline&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;IOC feed&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The live dashboard shows active sessions, attacker fingerprints, and honey token activity in real time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why I built this&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Honeypots exist for networks and CLI tools — but nothing for LLM prompts. As AI agents gain real tool access and persistent memory, prompt injection attacks get more sophisticated. A blocked agent learns and adapts. A deceived&lt;br&gt;
agent burns itself out.&lt;/p&gt;

&lt;p&gt;I built MIRAGE in 48 hours at the lablab.ai Agent Security &amp;amp; Governance hackathon. It's alpha, but the core pipeline works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's next&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Attacker cost dashboard ("you made them burn $4.20 in tokens")&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Persistent decoy context across sessions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;STIX/TAXII IOC export&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/BrightGir/AI-Honeypot" rel="noopener noreferrer"&gt;https://github.com/BrightGir/AI-Honeypot&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Would love feedback — especially from anyone who's dealt with prompt injection in production.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>llm</category>
      <category>opensource</category>
    </item>
    <item>
      <title>The Never‑Ending AI Code Review: Why One Pass Isn’t Enough</title>
      <dc:creator>Victoria</dc:creator>
      <pubDate>Fri, 15 May 2026 16:56:31 +0000</pubDate>
      <link>https://dev.to/brightgir/the-never-ending-ai-code-review-why-one-pass-isnt-enough-3k05</link>
      <guid>https://dev.to/brightgir/the-never-ending-ai-code-review-why-one-pass-isnt-enough-3k05</guid>
      <description>&lt;h3&gt;
  
  
  The Hook
&lt;/h3&gt;

&lt;p&gt;I ran an AI code review. It found 12 issues. I fixed them. Ran it again — it found 8 more. Fixed those. Ran it again — 5 more. After the sixth run, I started to suspect that something was wrong.&lt;/p&gt;

&lt;p&gt;If you are a tech lead or a developer using AI to review large projects, you probably know this feeling. Every new run finds something the previous one missed. Your tokens are draining, but the confidence that "now it's finally clean" never comes.&lt;/p&gt;

&lt;p&gt;This isn't a bug in your prompt. It’s a structural feature of how LLMs work. And there is something we can do about it.&lt;/p&gt;




&lt;h3&gt;
  
  
  Why LLMs Always Find Something New
&lt;/h3&gt;

&lt;p&gt;An LLM doesn’t read code deterministically like a compiler or a linter, which checks every single line in sequence. Instead, the model generates its response probabilistically: each token is chosen with a certain degree of randomness (this is called temperature). Even with the exact same code and prompt, the result will vary.&lt;/p&gt;

&lt;p&gt;On top of this, there is the &lt;strong&gt;anchoring effect&lt;/strong&gt;. If the model "hooks" onto null-safety issues during its first pass, it continues to look for similar problems—and might completely overlook, for example, race conditions. The next run might anchor onto something else entirely.&lt;/p&gt;

&lt;p&gt;This doesn't mean AI is a bad reviewer. It means that a single run does not provide full coverage—much like a single QA engineer won't find every bug in a massive product in one day.&lt;/p&gt;




&lt;h3&gt;
  
  
  What the Science Says
&lt;/h3&gt;

&lt;p&gt;It turns out this isn't just a hunch—it’s a well-documented phenomenon. Here is what recent research (2025) has found:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Consistency Gap (Semgrep, 2025)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Researchers at Semgrep directly addressed the issue of non-determinism. In their experiments, running the exact same security prompt on the same codebase multiple times yielded wildly different results. In one case, three identical runs produced 3, 6, and then 11 distinct findings. They attributed this to "context compaction"—as the model tries to process large amounts of code, it uses lossy compression, inevitably losing track of specific details. (&lt;a href="https://semgrep.dev/blog/2025/finding-vulnerabilities-in-modern-web-apps-using-claude-code-and-openai-codex/" rel="noopener noreferrer"&gt;link&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The 118% Recall Boost (SWR-Bench, 2025)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The SWR-Bench study quantified exactly how much we miss in a single pass. They found that by using a "Self-Aggregation" strategy—running the review 10 times and merging the results—the Recall (the percentage of real bugs found) increased by 118%. This proves that a single-pass review finds less than half of the actual issues lurking in the code. (&lt;a href="https://arxiv.org/html/2509.01494v1" rel="noopener noreferrer"&gt;link&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Specialized Lenses vs. General Prompts (Ericsson, 2025)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Software engineers at Ericsson found that a "naive" approach (one big prompt) fails in practice. Instead, they moved toward a strategy of specialized prompts (Security, Logic, Design, and I/O) and restricted the model's focus to the "enclosing method" of the changes. This targeted approach significantly reduced hallucinations and improved precision. (&lt;a href="https://arxiv.org/html/2507.19115v2" rel="noopener noreferrer"&gt;link&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The conclusion is clear: one giant request for the entire project is the worst possible strategy.&lt;/p&gt;




&lt;h3&gt;
  
  
  My Experiment: 6 Runs, 6 Different Realities
&lt;/h3&gt;

&lt;p&gt;I tested this on a real-world project, running a review on the exact same repository six times in a row. Every single time, it found something new, purely because it "anchored" on different themes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Run 1 (Architecture):&lt;/strong&gt; It flagged that the WebSocket Hub was storing clients in-process (killing scalability) and missed a &lt;code&gt;readPump&lt;/code&gt; for &lt;code&gt;CloseMessage&lt;/code&gt; events.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Run 2 (Performance):&lt;/strong&gt; It pivoted to N+1 Redis queries and missing TTLs, noting that Redis would grow infinitely.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Run 3 (Security):&lt;/strong&gt; It finally noticed auth tokens leaking into logs via query params and a forgotten &lt;code&gt;dump.rdb&lt;/code&gt; file committed to git.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the &lt;strong&gt;anchoring effect&lt;/strong&gt; in action. The model "latches onto" a theme and hunts for similar patterns while ignoring the rest. Six runs weren't just repetitions; they were six different, incomplete lenses on the same code.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Showdown: 6 Traditional Runs vs. 1 Structured Pass
&lt;/h3&gt;

&lt;p&gt;To see if "just running it more" was a viable strategy, I compared the two approaches.&lt;/p&gt;

&lt;p&gt;First, I aggregated the results of &lt;strong&gt;six traditional reviews&lt;/strong&gt; (feeding the entire project at once). Despite the volume, the combined reports &lt;strong&gt;still missed two critical vulnerabilities&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Then I switched to the &lt;strong&gt;Structured Approach&lt;/strong&gt;: targeted, module-based passes. On the &lt;strong&gt;very first pass&lt;/strong&gt;, the agent caught both critical bugs. These were not typos—they were deep, cross-file logic failures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;The Invisible Bypass:&lt;/strong&gt; A &lt;code&gt;docker-compose&lt;/code&gt; file injected a default API key via &lt;code&gt;${API_KEY:-default-value}&lt;/code&gt;, silently overriding all app-level security checks.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;The Open Door:&lt;/strong&gt; Redis was exposed externally without a password—a "day-zero" disaster waiting to happen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Does this mean traditional reviews are useless?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Not at all. After fixing the critical bugs, a final traditional run found several "tactical" issues, like a service using the wrong Gemini key. The structured agent had seen these too, but because they were flagged as &lt;strong&gt;LOW&lt;/strong&gt; priority, they were buried in the specialized reports.&lt;/p&gt;




&lt;h3&gt;
  
  
  Solution: Divide and Conquer
&lt;/h3&gt;

&lt;p&gt;From research and experiments, a clear strategy emerges. Instead of one big request, use two levels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Tier 1 — Parallel Module Review:&lt;/strong&gt; Divide the project into independent modules (handlers, store, infra) and run a separate agent on each in a fresh session. This forces the model's attention to stay focused on one chunk of code, preventing "context rot."&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Tier 2 — The Integration Pass:&lt;/strong&gt; A dedicated agent looks only at the boundaries between modules: interfaces, contracts, and shared assumptions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bonus:&lt;/strong&gt; Run each module through specific categories separately (Security, Performance, Logic). As Ericsson showed, this adds extra layers of accuracy.&lt;/p&gt;




&lt;h3&gt;
  
  
  Verdict: Precision over Volume
&lt;/h3&gt;

&lt;p&gt;Six shallow passes are not equivalent to one deep, structured pass. The traditional "big picture" review is like a generalist doing reconnaissance—good for surface-level tactical problems. But for high-risk, critical vulnerabilities, you need a &lt;strong&gt;Structured Approach&lt;/strong&gt; that forces the AI to stop skimming and start investigating.&lt;/p&gt;




&lt;h3&gt;
  
  
  Practical Recommendations
&lt;/h3&gt;

&lt;p&gt;If you want to apply this to your project, here are the concrete steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Break the code into modules by functional boundaries.&lt;/strong&gt; Not by files, but by areas of responsibility: handlers, store, AI clients, WebSocket, infrastructure.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Run a separate agent in a fresh session for each module.&lt;/strong&gt; A new session is a "reset" for the anchor. The agent doesn't know what previous runs found, so it looks with fresh eyes.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Give each agent a specific checklist by category.&lt;/strong&gt; Security, performance, reliability, code quality — in order. But ask the agent to do one more sweep after the checklist to find what wasn't covered.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Add an integration pass.&lt;/strong&gt; A separate agent that looks strictly at the boundaries between modules. The deadliest bugs live there.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Don't feed the entire project into one prompt.&lt;/strong&gt; This doesn't just kill accuracy; it burns tokens on a massive context that the model cannot effectively "digest."&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One run finds less than half of your real problems. But the point isn't just to run it more — the point is to make sure each run looks at less code, with a sharp focus, in a fresh session.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwaredevelopment</category>
      <category>codereview</category>
      <category>agents</category>
    </item>
    <item>
      <title>Going Deep on Claude Code: 6 Hidden Features Most Developers Miss</title>
      <dc:creator>Victoria</dc:creator>
      <pubDate>Sun, 10 May 2026 17:25:57 +0000</pubDate>
      <link>https://dev.to/brightgir/going-deep-on-claude-code-6-hidden-features-most-developers-miss-aeh</link>
      <guid>https://dev.to/brightgir/going-deep-on-claude-code-6-hidden-features-most-developers-miss-aeh</guid>
      <description>&lt;h1&gt;
  
  
  Going Deep on Claude Code: 6 Things That Actually Changed How I Work
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;I was using Claude Code wrong for weeks.&lt;/p&gt;

&lt;p&gt;Not broken-wrong. It worked fine. I'd describe a task, Claude would write code, I'd tweak it, move on. Totally reasonable workflow. Except I was treating a power tool like a calculator.&lt;/p&gt;

&lt;p&gt;Then I started digging. Turns out there's a whole layer of Claude Code that doesn't announce itself — you just have to find it. Some of it's in the docs, some of it you only discover by accident. Here's what actually stuck.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The &lt;code&gt;!&lt;/code&gt; trick nobody mentions
&lt;/h2&gt;

&lt;p&gt;Type &lt;code&gt;!&lt;/code&gt; before anything in the prompt and Claude Code runs it as a shell command. Output goes straight into context.&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="o"&gt;!&lt;/span&gt; git log &lt;span class="nt"&gt;--oneline&lt;/span&gt; &lt;span class="nt"&gt;-10&lt;/span&gt;
&lt;span class="o"&gt;!&lt;/span&gt; npm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I started doing this instinctively. Need to check what's failing? &lt;code&gt;! npm test&lt;/code&gt;. Want Claude to see the actual file structure? &lt;code&gt;! ls -la&lt;/code&gt;. No tab switching, no copy-pasting output. It just flows.&lt;/p&gt;

&lt;p&gt;Small thing. Weirdly impactful.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. CLAUDE.md: onboarding your AI like a new teammate
&lt;/h2&gt;

&lt;p&gt;Every project can have a &lt;code&gt;CLAUDE.md&lt;/code&gt; file at the root. Claude reads it automatically at the start of every session. Think of it as an onboarding doc — except the new hire never forgets it.&lt;/p&gt;

&lt;p&gt;In our team we use it to describe the project structure, coding conventions, and which commands to run. 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;- Run tests with: npm test
- Never edit generated files in /dist
- API keys live in .env, never hardcode them
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When someone new comes in and starts working with Claude on the codebase, it immediately knows the context. No "so what does this project do" back-and-forth.&lt;/p&gt;

&lt;p&gt;The difference between a generic Claude response and a project-aware one is significant. Takes 20 minutes to write a good &lt;code&gt;CLAUDE.md&lt;/code&gt;. Worth it.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Plan mode: think before you act
&lt;/h2&gt;

&lt;p&gt;By default Claude Code will just... start doing things. Which is usually fine, but sometimes you describe a complex task and watch it confidently go in completely the wrong direction for 10 minutes.&lt;/p&gt;

&lt;p&gt;Plan mode fixes this. Type &lt;code&gt;/plan&lt;/code&gt; before your task and Claude will lay out exactly what it's going to do — and wait for your approval. You can redirect, cut steps, or say "actually, do it differently." Only then does it start working.&lt;/p&gt;

&lt;p&gt;For anything non-trivial, this alone saves more time than it costs. You stop playing cleanup on bad assumptions.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Parallel sessions: stop working sequentially
&lt;/h2&gt;

&lt;p&gt;Claude Code runs in a single terminal session — but nothing stops you from opening multiple terminal windows and running &lt;code&gt;claude&lt;/code&gt; in each one simultaneously.&lt;/p&gt;

&lt;p&gt;Three independent tasks? Three windows. One refactoring the codebase, one writing tests, one updating docs. They don't block each other.&lt;/p&gt;

&lt;p&gt;This sounds obvious but most people never do it because it doesn't feel like "the AI workflow." It's just terminals. But the mental shift matters: stop thinking of Claude as one helper working through a queue and start giving parallel work to parallel sessions.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Make the agent write its own instructions
&lt;/h2&gt;

&lt;p&gt;This is the one that clicked last for me.&lt;/p&gt;

&lt;p&gt;Claude Code can write and update its own instruction files — including &lt;code&gt;CLAUDE.md&lt;/code&gt;. After finishing a complex task, try this: "Write a reusable instruction file for this workflow so we can repeat it later." Claude will create a markdown file with step-by-step instructions it can follow next time you ask.&lt;/p&gt;

&lt;p&gt;Same goes for &lt;code&gt;CLAUDE.md&lt;/code&gt;. After a long session where you figured out conventions, edge cases, things that didn't work — say "update CLAUDE.md with everything we learned today." It writes it down. Next session, it already knows.&lt;/p&gt;

&lt;p&gt;Over time, the agent is actively building its own knowledge base. You stop re-explaining the same things. It stops making the same mistakes. The loop compounds.&lt;/p&gt;

&lt;p&gt;Most people think of AI as something you prompt from scratch every time. This inverts that completely.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. MCP servers: give Claude access to everything
&lt;/h2&gt;

&lt;p&gt;Out of the box Claude Code can read files, run commands, search the web. That's already a lot. But MCP (Model Context Protocol) lets you go further — connect Claude to any external system.&lt;/p&gt;

&lt;p&gt;Databases, Slack, GitHub, Notion, internal APIs — if it has an interface, someone has probably built an MCP server for it. The community has built hundreds. Adding one is a single command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;claude mcp add
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You install one, Claude gets access, and now it can actually query your database or read your tickets while helping you code.&lt;/p&gt;

&lt;p&gt;This is the part where "coding assistant" stops being the right framing. It's more like giving an agent access to your entire work environment.&lt;/p&gt;




&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;None of this is hidden exactly — it's all in the docs somewhere. But docs are reference material, not discovery. You don't find these things by reading, you find them by using the tool long enough to wonder "wait, can it do that?"&lt;/p&gt;

&lt;p&gt;The answer is usually yes.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have a feature I missed? I'd love to hear what changed how you work with Claude Code.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>claude</category>
    </item>
    <item>
      <title>Why I built my own Dota 2 AI coach instead of using existing ones</title>
      <dc:creator>Victoria</dc:creator>
      <pubDate>Wed, 06 May 2026 21:18:00 +0000</pubDate>
      <link>https://dev.to/brightgir/why-i-built-my-own-dota-2-ai-coach-instead-of-using-existing-ones-51c8</link>
      <guid>https://dev.to/brightgir/why-i-built-my-own-dota-2-ai-coach-instead-of-using-existing-ones-51c8</guid>
      <description>&lt;p&gt;I wanted to get better at Dota 2. Not by watching guides — by actually playing. I tried Keenplay but it felt too rigid: no overlay, no model choice, no way to customize it to my playstyle. I'm a developer. So I just built my own.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;It reads your live game state via Dota 2's GSI (Game State Integration) — the game literally sends JSON with your hero, items, and map state to a local server every few seconds. My app catches that, runs it through a RAG pipeline, and shows tactical advice in an overlay while you play.&lt;/p&gt;

&lt;p&gt;You can also type questions mid-game: press F10, ask "should I fight now?", get an answer without alt-tabbing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that actually took time
&lt;/h2&gt;

&lt;p&gt;The hardest thing wasn't the overlay or the GSI integration. It was prompts for generating knowledge base chunks. Getting the LLM to produce actually useful, structured Dota knowledge — not generic garbage — took way more iteration than I expected.&lt;/p&gt;

&lt;p&gt;Also: DeepSeek wins on price/quality for this kind of task. Claude and Gemini are great but expensive. Most cheaper models just output nonsense. DeepSeek hits the sweet spot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does it actually work?
&lt;/h2&gt;

&lt;p&gt;Yeah. That's the part I'm most proud of — it gives real, relevant advice. Not hallucinated builds. Not generic tips. Actual context-aware suggestions based on what's happening in your game right now.&lt;/p&gt;

&lt;p&gt;Full RAG pipeline, BERT embeddings, vector search — all in Go, all open source.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/BrightGir/dota-ai-coach" rel="noopener noreferrer"&gt;https://github.com/BrightGir/dota-ai-coach&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>gamedev</category>
      <category>go</category>
    </item>
  </channel>
</rss>
