<?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>Forem: Lars</title>
    <description>The latest articles on Forem by Lars (@lacow).</description>
    <link>https://forem.com/lacow</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%2F3735646%2Fe88e24cb-e1bf-4c0b-9cbd-c2ddaa8541cf.png</url>
      <title>Forem: Lars</title>
      <link>https://forem.com/lacow</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/lacow"/>
    <language>en</language>
    <item>
      <title>Bmalph: BMAD planning + Ralph autonomous loop, glued together in one command</title>
      <dc:creator>Lars</dc:creator>
      <pubDate>Mon, 23 Feb 2026 10:06:10 +0000</pubDate>
      <link>https://forem.com/lacow/bmalph-bmad-planning-ralph-autonomous-loop-glued-together-in-one-command-14ka</link>
      <guid>https://forem.com/lacow/bmalph-bmad-planning-ralph-autonomous-loop-glued-together-in-one-command-14ka</guid>
      <description>&lt;p&gt;I built Bmalph because I kept running into the same problem: AI coding assistants are great at writing code, but terrible at remembering why you made a decision three features ago. You re-explain context, the architecture drifts, things contradict each other. For small projects that's fine. For anything real, it's a slow disaster.&lt;/p&gt;

&lt;p&gt;bmalph is a CLI that combines two great existing open source projects: &lt;a href="https://github.com/bmad-code-org/BMAD-METHOD" rel="noopener noreferrer"&gt;BMAD-METHOD&lt;/a&gt; for structured AI planning, and &lt;a href="https://github.com/snarktank/ralph" rel="noopener noreferrer"&gt;Ralph&lt;/a&gt; for autonomous implementation. One command installs and wires them together in your project.&lt;/p&gt;

&lt;p&gt;Until last week it only worked with Claude Code. That's changed.&lt;/p&gt;




&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;The core idea is simple: separate thinking from doing.&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%2Fj02qj8neh01csbenaol1.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%2Fj02qj8neh01csbenaol1.png" alt=" " width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phases 1-3 (BMAD — Planning)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before any code gets written, you work interactively with specialized AI agents: an Analyst, a Product Manager, and an Architect. They guide you through producing a product brief, a PRD, UX specs, architecture decisions, and user stories. The AI asks questions. You make decisions. Nothing moves forward without your input.&lt;/p&gt;

&lt;p&gt;The output is a set of real planning documents that live in your repo under &lt;code&gt;_bmad-output/&lt;/code&gt;. Not chat history. Not a summary in your clipboard. Actual files that persist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 4 (Ralph — Implementation)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once planning is done, Ralph takes those docs and implements them autonomously. It picks the next story from &lt;code&gt;@fix_plan.md&lt;/code&gt;, writes tests first, implements the code, commits, and moves on to the next story. You don't babysit it. The loop runs until the board is empty or the circuit breaker trips.&lt;/p&gt;

&lt;p&gt;The key thing Ralph has that vanilla Claude Code doesn't: a persistent spec. When it implements story 8, it still knows what was decided in story 1 because the planning docs are right there.&lt;/p&gt;




&lt;h2&gt;
  
  
  Multi-platform support
&lt;/h2&gt;

&lt;p&gt;The initial release assumed Claude Code. That was limiting. This release adds support for six platforms across two tiers.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;What you get&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;td&gt;Phases 1-4, BMAD + Ralph loop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI Codex&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;td&gt;Phases 1-4, BMAD + Ralph loop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cursor&lt;/td&gt;
&lt;td&gt;Instructions-only&lt;/td&gt;
&lt;td&gt;Phases 1-3, BMAD planning only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windsurf&lt;/td&gt;
&lt;td&gt;Instructions-only&lt;/td&gt;
&lt;td&gt;Phases 1-3, BMAD planning only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Copilot&lt;/td&gt;
&lt;td&gt;Instructions-only&lt;/td&gt;
&lt;td&gt;Phases 1-3, BMAD planning only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aider&lt;/td&gt;
&lt;td&gt;Instructions-only&lt;/td&gt;
&lt;td&gt;Phases 1-3, BMAD planning only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The tier split comes down to one thing: whether the platform exposes a scriptable CLI. Ralph is a bash loop that spawns fresh AI sessions, so it needs &lt;code&gt;claude&lt;/code&gt; or &lt;code&gt;codex&lt;/code&gt; in your PATH. Cursor, Windsurf, Copilot, and Aider don't work that way, so they get the planning workflow only.&lt;/p&gt;

&lt;p&gt;That said, Phases 1-3 alone are where most of the thinking happens. If you're on an instructions-only platform you still get the full BMAD workflow: analysts, PRDs, architecture, epics, stories.&lt;/p&gt;

&lt;p&gt;Platform detection is automatic. Run &lt;code&gt;bmalph init&lt;/code&gt; and it figures out which platform you're using from project markers. Or pass &lt;code&gt;--platform &amp;lt;id&amp;gt;&lt;/code&gt; explicitly.&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="c"&gt;# auto-detect&lt;/span&gt;
bmalph init

&lt;span class="c"&gt;# or be explicit&lt;/span&gt;
bmalph init &lt;span class="nt"&gt;--platform&lt;/span&gt; codex
bmalph init &lt;span class="nt"&gt;--platform&lt;/span&gt; cursor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  How bmalph compares to just using your AI assistant directly
&lt;/h2&gt;

&lt;p&gt;This comes up a lot so let me be direct about it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Just prompting Claude Code / Cursor / Copilot directly&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fine for small tasks. A bug fix, a component, a quick script. bmalph is overkill for that. If you're reaching for bmalph on a weekend project you're over-engineering your workflow.&lt;/p&gt;

&lt;p&gt;Where it breaks down is anything with multiple moving parts spanning more than a few sessions. The AI has no memory of earlier decisions, you end up re-explaining context constantly, and the architecture slowly drifts into something nobody planned.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BMAD-METHOD standalone&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;BMAD is great but setting it up manually in each project is friction. bmalph bundles and installs it with one command, keeps it versioned, and wires it to Ralph. If you're already using BMAD standalone, &lt;code&gt;bmalph init&lt;/code&gt; is essentially a migration path — it preserves your &lt;code&gt;_bmad-output/&lt;/code&gt; artifacts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Devin, SWE-agent, and other fully autonomous systems&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Different category. Those are trying to do everything autonomously from a single prompt. bmalph keeps you in the loop during planning — you're making decisions with the AI agents, not handing off a spec and waiting. Ralph only takes over once you've explicitly approved the plan and triggered the implementation.&lt;/p&gt;




&lt;h2&gt;
  
  
  BMAD is now stable
&lt;/h2&gt;

&lt;p&gt;Earlier versions had version drift issues where the bundled BMAD could get out of sync. That's fixed. The bundled version is now pinned, tested, and the upgrade path is clean.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bmalph upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This updates the bundled BMAD and Ralph assets without touching &lt;code&gt;_bmad-output/&lt;/code&gt; — your planning artifacts are never overwritten.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;A few things on the roadmap:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Story-level diff summary.&lt;/strong&gt; After each story, Ralph automatically generates a readable summary of what changed, which files were touched, and whether tests passed. Right now that's buried in raw logs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automatic context regeneration.&lt;/strong&gt; When Ralph gets stuck, the circuit breaker detects it and stops. Instead: automatically run &lt;code&gt;GPC&lt;/code&gt; (Generate Project Context) and refresh the context before the next iteration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-agent Ralph.&lt;/strong&gt; Instead of one Claude/Codex session per story, Ralph spawns a separate session per layer: one for tests, one for implementation, one for review. More complex, but closer to how a real team works..&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&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; bmalph
bmalph init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repo: &lt;a href="https://github.com/LarsCowe/bmalph" rel="noopener noreferrer"&gt;github.com/LarsCowe/bmalph&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Questions, feedback, or war stories from using it in production — all welcome.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I got tired of copy-pasting messages from RabbitMQ to validate them, so I built an MCP server</title>
      <dc:creator>Lars</dc:creator>
      <pubDate>Sun, 15 Feb 2026 11:18:56 +0000</pubDate>
      <link>https://forem.com/lacow/i-got-tired-of-copy-pasting-messages-from-rabbitmq-to-validate-them-so-i-built-an-mcp-server-1g1n</link>
      <guid>https://forem.com/lacow/i-got-tired-of-copy-pasting-messages-from-rabbitmq-to-validate-them-so-i-built-an-mcp-server-1g1n</guid>
      <description>&lt;p&gt;If you've worked on projects where teams communicate through message brokers, you know the drill. A message lands in a queue with a broken payload. Maybe a field is the wrong type, maybe a required property is missing, maybe someone changed the schema without telling anyone.&lt;/p&gt;

&lt;p&gt;The debugging loop looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the RabbitMQ management UI&lt;/li&gt;
&lt;li&gt;Navigate to the queue&lt;/li&gt;
&lt;li&gt;Click "Get messages"&lt;/li&gt;
&lt;li&gt;Copy the payload&lt;/li&gt;
&lt;li&gt;Find the JSON Schema for that message type&lt;/li&gt;
&lt;li&gt;Paste it into some online validator&lt;/li&gt;
&lt;li&gt;Read the error&lt;/li&gt;
&lt;li&gt;Fix the publisher&lt;/li&gt;
&lt;li&gt;Repeat&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I did this dozens of times per week. So I built an MCP server that does it in one sentence.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is MCP?
&lt;/h2&gt;

&lt;p&gt;Quick context if you haven't seen it yet: MCP (Model Context Protocol) is a standard that lets AI assistants call external tools. If you use Claude Code, Cursor, VS Code Copilot, or Windsurf, you can add MCP servers that give your assistant new capabilities.&lt;/p&gt;

&lt;p&gt;Think of it like plugins, but standardized across clients.&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea
&lt;/h2&gt;

&lt;p&gt;What if I could just ask my AI assistant:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Inspect the orders queue and check if all messages are valid"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And it would connect to my broker, peek at the messages (without consuming them), validate each one against the right JSON Schema, and tell me exactly what's broken?&lt;/p&gt;

&lt;p&gt;That's what Queue Pilot does.&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%2Fk1wytveg1yeqtjbfy8we.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%2Fk1wytveg1yeqtjbfy8we.png" alt="MCP-server for RabbitMQ and Kafka" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;You define your message contracts as JSON Schema files. These are the schemas your teams already agreed on (or should agree on). Each schema has an &lt;code&gt;$id&lt;/code&gt; that matches the &lt;code&gt;type&lt;/code&gt; field on your messages.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;schemas/order.created.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"$id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"order.created"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://json-schema.org/draft-07/schema#"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Order Created"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"orderId"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"orderId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"number"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"minimum"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you add Queue Pilot to your MCP client. One command generates the config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx queue-pilot init &lt;span class="nt"&gt;--schemas&lt;/span&gt; ./schemas &lt;span class="nt"&gt;--client&lt;/span&gt; claude-code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Your assistant now has access to your broker.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you can actually do with it
&lt;/h2&gt;

&lt;p&gt;Here's where it gets practical. These are real prompts I use daily:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Debugging a broken consumer:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Show me the messages in the dead-letter queue and validate them"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Queue Pilot peeks at the messages, matches each one to its schema by the &lt;code&gt;type&lt;/code&gt; field, and returns validation errors. No more copy-pasting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before deploying a publisher change:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Publish this to the events exchange: &lt;code&gt;{ "type": "order.created", "orderId": 123, "amount": "fifty" }&lt;/code&gt;"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The &lt;code&gt;publish_message&lt;/code&gt; tool validates against the schema first. This message would be rejected because &lt;code&gt;orderId&lt;/code&gt; should be a string and &lt;code&gt;amount&lt;/code&gt; should be a number, not a string. Invalid messages never hit the broker.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Checking queue health across the board:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"List all queues and show me which ones have backed-up messages"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Setting up test infrastructure:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Create a queue called test-orders, bind it to the events exchange with routing key order.*, and publish 3 test messages"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The inspect_queue tool
&lt;/h2&gt;

&lt;p&gt;This is the one I use most. It combines peeking and validation in a single call.&lt;/p&gt;

&lt;p&gt;When you ask your assistant to inspect a queue, Queue Pilot:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fetches messages from the queue without consuming them&lt;/li&gt;
&lt;li&gt;Looks at each message's &lt;code&gt;type&lt;/code&gt; property&lt;/li&gt;
&lt;li&gt;Finds the matching schema by &lt;code&gt;$id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Validates the payload against that schema&lt;/li&gt;
&lt;li&gt;Returns a report: which messages are valid, which aren't, and exactly why&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For a queue with 5 messages where 2 have issues, you'd get 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;Messages 1, 2, 4: Valid (order.created)
Message 3: Invalid (order.created)
  - /amount: must be number, got string
Message 5: No matching schema for type "order.updated"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No browser tabs. No copy-pasting. No context switching.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kafka support
&lt;/h2&gt;

&lt;p&gt;Queue Pilot also supports Apache Kafka through a unified adapter interface. The same tools work for both brokers, plus Kafka-specific ones like &lt;code&gt;list_consumer_groups&lt;/code&gt;, &lt;code&gt;describe_consumer_group&lt;/code&gt;, &lt;code&gt;list_partitions&lt;/code&gt;, and &lt;code&gt;get_offsets&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 queue-pilot init &lt;span class="nt"&gt;--schemas&lt;/span&gt; ./schemas &lt;span class="nt"&gt;--broker&lt;/span&gt; kafka &lt;span class="nt"&gt;--client&lt;/span&gt; claude-code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Kafka adapter uses the Confluent JavaScript client and supports SASL authentication.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup in 2 minutes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Create your schemas directory&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Put your JSON Schema files in a folder. One file per message type.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Generate config for your MCP client&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;&lt;span class="c"&gt;# Claude Code&lt;/span&gt;
npx queue-pilot init &lt;span class="nt"&gt;--schemas&lt;/span&gt; /path/to/schemas &lt;span class="nt"&gt;--client&lt;/span&gt; claude-code

&lt;span class="c"&gt;# Cursor&lt;/span&gt;
npx queue-pilot init &lt;span class="nt"&gt;--schemas&lt;/span&gt; /path/to/schemas &lt;span class="nt"&gt;--client&lt;/span&gt; cursor

&lt;span class="c"&gt;# VS Code&lt;/span&gt;
npx queue-pilot init &lt;span class="nt"&gt;--schemas&lt;/span&gt; /path/to/schemas &lt;span class="nt"&gt;--client&lt;/span&gt; vscode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Start using it&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open your editor and ask your assistant about your queues. It has access to 14+ tools for inspecting, validating, publishing, and managing your message infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  The full tool list
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Universal (all brokers):&lt;/strong&gt; &lt;code&gt;list_schemas&lt;/code&gt;, &lt;code&gt;get_schema&lt;/code&gt;, &lt;code&gt;validate_message&lt;/code&gt;, &lt;code&gt;list_queues&lt;/code&gt;, &lt;code&gt;peek_messages&lt;/code&gt;, &lt;code&gt;inspect_queue&lt;/code&gt;, &lt;code&gt;get_overview&lt;/code&gt;, &lt;code&gt;check_health&lt;/code&gt;, &lt;code&gt;get_queue&lt;/code&gt;, &lt;code&gt;list_consumers&lt;/code&gt;, &lt;code&gt;publish_message&lt;/code&gt;, &lt;code&gt;purge_queue&lt;/code&gt;, &lt;code&gt;create_queue&lt;/code&gt;, &lt;code&gt;delete_queue&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RabbitMQ-specific:&lt;/strong&gt; &lt;code&gt;list_exchanges&lt;/code&gt;, &lt;code&gt;create_exchange&lt;/code&gt;, &lt;code&gt;delete_exchange&lt;/code&gt;, &lt;code&gt;list_bindings&lt;/code&gt;, &lt;code&gt;create_binding&lt;/code&gt;, &lt;code&gt;delete_binding&lt;/code&gt;, &lt;code&gt;list_connections&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kafka-specific:&lt;/strong&gt; &lt;code&gt;list_consumer_groups&lt;/code&gt;, &lt;code&gt;describe_consumer_group&lt;/code&gt;, &lt;code&gt;list_partitions&lt;/code&gt;, &lt;code&gt;get_offsets&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  When is this useful?
&lt;/h2&gt;

&lt;p&gt;Queue Pilot is designed for &lt;strong&gt;development and testing&lt;/strong&gt;, not production monitoring. It shines when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple teams publish/consume messages and schemas drift over time&lt;/li&gt;
&lt;li&gt;You're debugging why a consumer is failing on certain messages&lt;/li&gt;
&lt;li&gt;You want to validate message contracts before merging a PR&lt;/li&gt;
&lt;li&gt;You need to quickly set up queues, bindings, and test data for local development&lt;/li&gt;
&lt;li&gt;You want to catch schema violations before they reach a test environment&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;The project is at v0.5.0. Kafka support is newer and I'm looking for feedback from people who work with multi-team message contracts. If you have ideas or run into issues, open an issue on GitHub.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/LarsCowe/queue-pilot" rel="noopener noreferrer"&gt;github.com/LarsCowe/queue-pilot&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/queue-pilot" rel="noopener noreferrer"&gt;npmjs.com/package/queue-pilot&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;If you work with message queues and MCP-compatible editors, I'd love to hear how you handle schema validation in your workflow. Drop a comment or open an issue.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>rabbitmq</category>
      <category>kafka</category>
      <category>typescript</category>
    </item>
    <item>
      <title>I Glued 2 of the Best AI Dev Frameworks Together</title>
      <dc:creator>Lars</dc:creator>
      <pubDate>Thu, 12 Feb 2026 11:14:21 +0000</pubDate>
      <link>https://forem.com/lacow/i-glued-2-of-the-best-ai-dev-frameworks-together-2m0j</link>
      <guid>https://forem.com/lacow/i-glued-2-of-the-best-ai-dev-frameworks-together-2m0j</guid>
      <description>&lt;p&gt;If you've used Claude Code for anything beyond quick scripts, you know the pattern: you start prompting, things go well for 20 minutes, then your project turns into spaghetti because there was never a plan.&lt;/p&gt;

&lt;p&gt;I ran into this constantly. So I started using two open-source tools separately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/bmad-code-org/BMAD-METHOD" rel="noopener noreferrer"&gt;BMAD-METHOD&lt;/a&gt;&lt;/strong&gt;: a structured planning system with AI agents that walk you through product briefs, PRDs, architecture docs, and user stories.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/snarktank/ralph" rel="noopener noreferrer"&gt;Ralph&lt;/a&gt;&lt;/strong&gt;: an autonomous bash loop that picks up stories one by one and implements them with TDD, committing as it goes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both are solid on their own. But switching between them was friction. Copy-pasting artifacts, manually setting up Ralph's task list, keeping things in sync when plans changed. It wasn't hard, just annoying enough that I kept thinking "this should be one thing."&lt;/p&gt;

&lt;p&gt;So I spent about a month building &lt;strong&gt;&lt;a href="https://github.com/LarsCowe/bmalph" rel="noopener noreferrer"&gt;bmalph&lt;/a&gt;&lt;/strong&gt;: a CLI that installs both systems, connects them with slash commands, and handles the handoff from planning to implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&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; bmalph
&lt;span class="nb"&gt;cd &lt;/span&gt;my-project
bmalph init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This drops BMAD agents, Ralph's loop, and 50+ slash commands into your project.&lt;/p&gt;

&lt;p&gt;From there, you work through 3 planning phases in Claude Code using slash commands like &lt;code&gt;/analyst&lt;/code&gt;, &lt;code&gt;/pm&lt;/code&gt;, and &lt;code&gt;/architect&lt;/code&gt;. Each phase has specific deliverables: product brief, PRD, architecture, stories.&lt;/p&gt;

&lt;p&gt;When your plan is solid, you run &lt;code&gt;/bmalph-implement&lt;/code&gt;. This reads your BMAD stories, generates Ralph's task list (&lt;code&gt;@fix_plan.md&lt;/code&gt;), copies specs over, and you start the autonomous loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bash .ralph/ralph_loop.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ralph picks stories from the plan, implements with TDD, commits, moves to the next one. Circuit breaker stops it if something goes wrong. &lt;code&gt;Ctrl+C&lt;/code&gt; if you want to stop manually.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I actually like
&lt;/h2&gt;

&lt;p&gt;Incremental development works well. You can plan Epic 1, let Ralph build it, then go back to BMAD to plan Epic 2. When you run &lt;code&gt;/bmalph-implement&lt;/code&gt; again, it preserves completed stories and adds the new ones. A specs changelog tracks what changed so Ralph knows what's new.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I'm posting this
&lt;/h2&gt;

&lt;p&gt;I've been using bmalph on my own projects and it works for my workflow. But I'm one person with one way of working, so I'm genuinely curious:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does this workflow make sense to you, or is it overengineered for how you use Claude Code?&lt;/li&gt;
&lt;li&gt;What's missing?&lt;/li&gt;
&lt;li&gt;What would you change?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you try it, give it a star and open an issue or drop a comment. Stars help with visibility, but honest feedback is what actually makes it better.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/LarsCowe/bmalph" rel="noopener noreferrer"&gt;https://github.com/LarsCowe/bmalph&lt;/a&gt;&lt;/p&gt;




</description>
      <category>ai</category>
      <category>programming</category>
      <category>claudecode</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I combined two AI dev tools into one workflow - here's bmalph</title>
      <dc:creator>Lars</dc:creator>
      <pubDate>Tue, 27 Jan 2026 16:25:26 +0000</pubDate>
      <link>https://forem.com/lacow/i-combined-two-ai-dev-tools-into-one-workflow-heres-bmalph-5f22</link>
      <guid>https://forem.com/lacow/i-combined-two-ai-dev-tools-into-one-workflow-heres-bmalph-5f22</guid>
      <description>&lt;p&gt;I've been using Claude Code with two separate methodologies:&lt;/p&gt;

&lt;p&gt;BMAD-METHOD handles my planning. Analyst agent for requirements, PM for PRDs, architect for technical decisions. Generates thorough documentation with clear acceptance criteria.&lt;/p&gt;

&lt;p&gt;Ralph handles implementation. Autonomous TDD loop that picks up stories, writes tests first, implements, commits.&lt;/p&gt;

&lt;p&gt;The problem: they don't talk to each other. I was manually copying requirements, reformatting task lists, losing context along the way.&lt;/p&gt;

&lt;p&gt;So I built bmalph.&lt;/p&gt;

&lt;p&gt;One CLI that installs both systems and connects the workflow:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bmalph init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Now my process is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Plan with BMAD slash commands (/analyst, /pm, /architect)&lt;/li&gt;
&lt;li&gt;Run /bmalph-implement&lt;/li&gt;
&lt;li&gt;Ralph takes over with autonomous TDD&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Everything stays in my repo. Planning artifacts convert directly to implementation tasks. No manual bridging, no lost context.&lt;/p&gt;

&lt;p&gt;Best of both worlds: BMAD's planning depth combined with Ralph's autonomous execution.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/LarsCowe/bmalph" rel="noopener noreferrer"&gt;https://github.com/LarsCowe/bmalph&lt;/a&gt;&lt;/p&gt;

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