<?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: Varsham Gupta</title>
    <description>The latest articles on DEV Community by Varsham Gupta (@varsham_gupta).</description>
    <link>https://dev.to/varsham_gupta</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%2F4058960%2Fb0a81670-79ea-492f-92ad-0feacfd199ae.jpg</url>
      <title>DEV Community: Varsham Gupta</title>
      <link>https://dev.to/varsham_gupta</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/varsham_gupta"/>
    <language>en</language>
    <item>
      <title>Stram: An Open-Source, Local-First Desktop Agent With Human Approval Gates</title>
      <dc:creator>Varsham Gupta</dc:creator>
      <pubDate>Sun, 02 Aug 2026 10:42:45 +0000</pubDate>
      <link>https://dev.to/varsham_gupta/stram-an-open-source-local-first-desktop-agent-with-human-approval-gates-2h71</link>
      <guid>https://dev.to/varsham_gupta/stram-an-open-source-local-first-desktop-agent-with-human-approval-gates-2h71</guid>
      <description>&lt;p&gt;Most "AI agents" I've tried are prompt-first: you type something, they answer, they stop. I wanted something closer to an actual assistant — one that notices what's happening on my machine and decides whether to act, without me opening a chat window first. That's why I built &lt;strong&gt;Stram&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/CodeInfinity1/Stram" rel="noopener noreferrer"&gt;https://github.com/CodeInfinity1/Stram&lt;/a&gt; (MIT licensed, v1.0.1)&lt;/p&gt;

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

&lt;p&gt;Stram is the runtime, desktop app, and release surface for &lt;strong&gt;Janus&lt;/strong&gt;, the agent that lives inside it. Janus isn't a chatbot waiting for your next message — it's designed to be always-available, context-aware, and able to take the next safe step through governed tools on its own.&lt;/p&gt;

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

&lt;p&gt;The flow looks like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;\&lt;/code&gt;&lt;code&gt;text&lt;br&gt;
stimulus&lt;br&gt;
  -&amp;gt; interaction harness&lt;br&gt;
  -&amp;gt; compact local context&lt;br&gt;
  -&amp;gt; model-led attention/planning&lt;br&gt;
  -&amp;gt; schema-validated tool calls&lt;br&gt;
  -&amp;gt; policy and approval gates&lt;br&gt;
  -&amp;gt; execution and audit timeline&lt;br&gt;
  -&amp;gt; memory, learning, recovery, and response synthesis&lt;br&gt;
\&lt;/code&gt;&lt;code&gt;\&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Broken down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Collectors&lt;/strong&gt; watch opted-in surfaces — active app, browser, files, shell output, channels, voice — and turn raw events into structured signals instead of dumping raw private data into a prompt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attention&lt;/strong&gt; ranks those signals by urgency, relevance, and risk before the model ever plans anything, so not every event becomes an action.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Janus&lt;/strong&gt; decides the right posture: respond immediately, observe quietly, ask for clarification, draft a reply, monitor a condition, or request approval.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Governance&lt;/strong&gt; means anything risky — shell execution, browser mutation, sending a message — pauses for your explicit approval, with a recorded audit trail (tool, purpose, risk, proposed arguments).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory&lt;/strong&gt; keeps goals, commitments, environment facts, and lessons durable across sessions, separated by job so the right thing gets recalled for the right reason.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything runs against your own model provider key — OpenAI, Anthropic, Groq, local Ollama, whatever you point it at. No hosted backend of mine sits in the loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;\&lt;/code&gt;&lt;code&gt;bash&lt;br&gt;
git clone https://github.com/CodeInfinity1/Stram.git&lt;br&gt;
cd Stram&lt;br&gt;
python3 -m pip install -e ".[browser,pdf,ocr,office,test]"&lt;br&gt;
python3 -m stram run "system_status {}" --workspace . --planner explicit&lt;br&gt;
\&lt;/code&gt;&lt;code&gt;\&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Or start the local API + dashboard:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;\&lt;/code&gt;&lt;code&gt;bash&lt;br&gt;
python3 -m stram serve --workspace . --port 8765&lt;br&gt;
\&lt;/code&gt;&lt;code&gt;\&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Native macOS (Swift) and Windows (.NET) desktop shells are also available in the repo under &lt;code&gt;apps/\&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it actually stands
&lt;/h2&gt;

&lt;p&gt;I'd rather be upfront about this than have you find out the hard way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;v1.0.1, early.&lt;/strong&gt; The core runtime, tool contracts, and safety gates have automated test coverage, but real collector/channel/desktop behavior depends on the credentials and platform you configure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Binaries aren't code-signed or notarized yet.&lt;/strong&gt; You'll hit a Gatekeeper warning on macOS or a SmartScreen warning on Windows on first run — there are documented workarounds in the README, real signing is on the roadmap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You need your own model API key&lt;/strong&gt; (or a local Ollama model) — nothing works out of the box without one.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where I'd love help
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Testing on macOS/Windows setups I don't have access to&lt;/li&gt;
&lt;li&gt;Poking holes in the approval/safety layer — this thing can touch your shell and browser, so I want skeptics on it before it touches anyone else's&lt;/li&gt;
&lt;li&gt;Adding collector coverage for browsers/apps I haven't wired up&lt;/li&gt;
&lt;li&gt;Docs — a lot of it is still written for people already deep in the code, not first-time readers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://github.com/CodeInfinity1/Stram/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;CONTRIBUTING.md&lt;/a&gt; has contribution priorities and PR expectations, &lt;a href="https://github.com/CodeInfinity1/Stram/blob/main/SECURITY.md" rel="noopener noreferrer"&gt;SECURITY.md&lt;/a&gt; covers the safety model in depth.&lt;/p&gt;

&lt;p&gt;Feedback - especially critical feedback, is genuinely welcome in the comments.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>showdev</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
