<?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: Bhagyesh Jethwani</title>
    <description>The latest articles on DEV Community by Bhagyesh Jethwani (@bhagyesh_jethwani).</description>
    <link>https://dev.to/bhagyesh_jethwani</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4205859%2Fe7576b06-a339-44ee-a7e9-eb218a1a3c73.jpg</url>
      <title>DEV Community: Bhagyesh Jethwani</title>
      <link>https://dev.to/bhagyesh_jethwani</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bhagyesh_jethwani"/>
    <language>en</language>
    <item>
      <title>Argo: Your Scrum Meeting Agent</title>
      <dc:creator>Bhagyesh Jethwani</dc:creator>
      <pubDate>Sun, 25 Oct 2026 10:26:46 +0000</pubDate>
      <link>https://dev.to/bhagyesh_jethwani/argo-your-scrum-meeting-agent-1eb8</link>
      <guid>https://dev.to/bhagyesh_jethwani/argo-your-scrum-meeting-agent-1eb8</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/mlh-hackathon"&gt;MLH x DEV Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Argo&lt;/strong&gt; is a voice agent that sits in your meeting, listens, and does your Jira busywork for you. Say "Hey Argo, move ticket 12 to the next sprint" or "Hey Argo, create a ticket to fix the login bug", and it makes the change in Jira while everyone keeps talking. Every meeting is saved so the team can review what was said and what Argo did.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Listening.&lt;/strong&gt; A small Python listener on a laptop reads the meeting audio through BlackHole, a virtual audio cable for Mac, and streams it to Cartesia for live speech-to-text. Argo ignores the meeting until it hears the wake phrase "Hey Argo", then waits for the speaker to finish their thought.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Understanding.&lt;/strong&gt; The command goes to Claude, which does not touch Jira directly. It returns a structured plan: which operation, on which ticket, with what values. The plan is validated against a strict schema, and if Claude isn't sure, Argo asks a question instead of guessing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acting, safely.&lt;/strong&gt; Because a plan comes from speech through an AI, the executor treats it as untrusted. It only calls a fixed list of Jira endpoints, only touches tickets in the configured project, only sets allowed fields, and stops at the first failure. Deleting needs two separate confirmations, and voice commands run as a dry run unless real changes are switched on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Replying.&lt;/strong&gt; Argo speaks the result back with Cartesia text-to-speech ("Created ARGO-23").&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remembering.&lt;/strong&gt; Starting the listener creates a new meeting in the database. Every speech turn, every command, and every Jira change is saved under it, with timestamps. When the listener stops, Claude writes a summary with key points and decisions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Showing it.&lt;/strong&gt; A Forge app inside Jira shows meeting reports: a &lt;strong&gt;Commands executed&lt;/strong&gt; tab (what was said, how Argo understood it, the result, and the Jira changes made) and a &lt;strong&gt;Meeting notes&lt;/strong&gt; tab (summary, key points, decisions, a timestamped transcript, and a "Create ticket from notes" form for anything Argo missed).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What inspired it:&lt;/strong&gt; every standup ends with someone saying "I'll put that in Jira later", and later never comes. We wanted the ticket to update at the moment the decision is made.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/Drz3VmP_8tU" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;[Screenshots: the Argo meeting list, the Commands executed tab, and the Meeting notes tab in Jira]&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source code:&lt;/strong&gt; &lt;a href="https://github.com/Babagesh/Scrummy" rel="noopener noreferrer"&gt;https://github.com/Babagesh/Scrummy&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Partner Technologies
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cartesia&lt;/strong&gt; handles both directions of voice. Its streaming speech-to-text (ink-2) gives us live transcripts and decides when a speaker has finished a thought, which is what lets Argo hear a whole command instead of cutting people off. We use its text-to-speech to speak short acknowledgements ("Okay, I'm on it") while Claude is thinking, so there is never an awkward silence. Voice is the core of the product, not a feature added for the demo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic Claude&lt;/strong&gt; turns messy spoken sentences into structured Jira plans and writes the end-of-meeting summary. Using it to produce a validated plan, rather than letting it call Jira directly, is what made the safety rules easy to enforce.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SpacetimeDB&lt;/strong&gt; is our database and our API in one. We wrote a TypeScript module with four tables (meetings, transcript segments, commands, and Jira actions) and exposed REST routes through its HTTP handlers, hosted on Maincloud. There is no separate backend server to run. It was also where we learned the most: HTTP handlers are in beta, so there are no path parameters (we pass ids in the query string), and the module's JavaScript runtime has no &lt;code&gt;URL&lt;/code&gt; object. That crashed our meeting-detail route until we found it in the module logs and parsed the query string by hand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Atlassian Forge&lt;/strong&gt; put the whole interface inside Jira itself, built from Atlassian's own UI Kit components, so there is nothing separate to log in to. Forge's UI Kit can't hold a live connection, so the page refreshes every few seconds to show a running meeting.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Hackathon Experience
&lt;/h2&gt;

&lt;p&gt;We attended Calhacks! The atmosphere was incredible, with hackers from all around the world building such cool and different things. I went to this hackathon with my roommates, and something I will remember is getting top 16 in the Clash Royale over my friend.&lt;/p&gt;

&lt;p&gt;A few things I learned along the way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A bug that only shows in the audit trail.&lt;/strong&gt; Our successful Jira operations were being recorded as "failed" because the success flag was set one line too late. The actions had worked in Jira, but the history said otherwise. We fixed it and added a test that fails without the fix.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat AI output as untrusted input.&lt;/strong&gt; Letting a language model choose which Jira endpoint to call would have been the fastest path and the riskiest one. Limiting it to a fixed allowlist cost us little and made the demo much safer to run live.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Beta tools are fine, but read the logs.&lt;/strong&gt; Most of our surprises came from a beta feature, and nearly every one was solved by reading the platform's logs and docs.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>mlhacks</category>
      <category>devchallenge</category>
      <category>hackathon</category>
      <category>calhacks</category>
    </item>
  </channel>
</rss>
