<?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: massiron</title>
    <description>The latest articles on DEV Community by massiron (@massiron).</description>
    <link>https://dev.to/massiron</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%2F3973712%2F99cc8b83-c2f9-4810-9366-a4543a45a0ef.png</url>
      <title>DEV Community: massiron</title>
      <link>https://dev.to/massiron</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/massiron"/>
    <language>en</language>
    <item>
      <title>{</title>
      <dc:creator>massiron</dc:creator>
      <pubDate>Sat, 13 Jun 2026 08:02:54 +0000</pubDate>
      <link>https://dev.to/massiron/-56ho</link>
      <guid>https://dev.to/massiron/-56ho</guid>
      <description>&lt;p&gt;"title": "What your linter doesn't tell you: structural risk in legacy Python codebases",&lt;br&gt;
  "body": "You inherit a 50k-line Python monolith. &lt;code&gt;pylint&lt;/code&gt; gives you style warnings. &lt;code&gt;mypy&lt;/code&gt; catches type errors. But where's the actual danger — the function that's 80 lines, called by 15 callers, with 6 levels of nesting?\n\nLinters check text. They don't understand code structure.\n\nThis is the gap &lt;strong&gt;code-atlas-py&lt;/strong&gt; fills. Deterministic, offline, sub-second code intelligence.\n\n---\n\n### Before: grep + manual trace\n\n&lt;br&gt;
&lt;br&gt;
&lt;code&gt;bash\ngrep -r \"process_event\" src/ | wc -l\n# 27 files, guess which one is the root cause\n&lt;/code&gt;&lt;br&gt;
&lt;br&gt;
\n\nYou open files, trace call chains, build a mental map. For a 50k-line codebase, that's an afternoon. For 200k, a week.\n\n### After: atlas scan\n\n&lt;br&gt;
&lt;br&gt;
&lt;code&gt;bash\npip install code-atlas-py\natlas scan src/\n&lt;/code&gt;&lt;br&gt;
&lt;br&gt;
\n\n0.2 seconds later:\n\n&lt;br&gt;
&lt;br&gt;
&lt;code&gt;text\nTop risk functions (complexity × coupling × instability):\n───────────────────────────────────────────────────────────\n 1. src/events.py::process_event        risk: 0.87  (cyclo=14, fans=9, instability=0.73)\n 2. src/billing.py::invoice_totals      risk: 0.72  (cyclo=11, fans=6, instability=0.68)\n 3. src/api.py::handle_request          risk: 0.65  (cyclo=8,  fans=7, instability=0.55)\n&lt;/code&gt;&lt;br&gt;
&lt;br&gt;
\n\nNo guesswork. The function with 14 cyclomatic complexity, called by 9 different modules, is where every bug starts.\n\n---\n\n### Why this matters for refactoring\n\nI ran this on an internal tool before refactoring. The worst offender was &lt;code&gt;process_event&lt;/code&gt; — a 120-line function with nine callers and three mutable global state mutations.\n\nWithout atlas, I'd have refactored the wrong function first. The team would have reviewed clean style and still merged a regression.\n\nWith atlas, I split &lt;code&gt;process_event&lt;/code&gt; in 20 minutes. Test coverage stayed green because I understood the full call graph before touching a line.\n\n---\n\n### What it is / isn't\n\n*&lt;em&gt;Is:&lt;/em&gt;* A fast, deterministic code-analysis CLI. Builds a call graph, dependency graph, and risk scores using pure Python AST parsing. 100% offline. Same answer every run.\n\n*&lt;em&gt;Isn't:&lt;/em&gt;* An LLM. Not a linter. Not a type checker. It doesn't tell you &lt;em&gt;how&lt;/em&gt; to fix — it tells you &lt;em&gt;where&lt;/em&gt; the risk is.\n\n---\n\n### The CLI in practice\n\n&lt;br&gt;
&lt;br&gt;
&lt;code&gt;bash\n# One-shot scan\natlas scan .\n\n# Ask questions about a symbol\natlas ask process_event\n# → "Defined in src/events.py:42. Called by: billing.py, api.py, scheduler.py (9 total)\n#   Complexity: 14 (high). 2 mutable globals modified.\"\n\n# Interactive HTML report — clickable call graph\natlas html --open\n&lt;/code&gt;&lt;br&gt;
&lt;br&gt;
\n\nWorks on any Python project. No config file. No server. No API key.\n\n---\n\n*&lt;em&gt;Pricing:&lt;/em&gt;* Free Core Engine for small teams. Pro $12/mo (7 modules), Enterprise $29/mo (12 modules).\n\n*&lt;em&gt;Repo:&lt;/em&gt;* &lt;a href="https://github.com/mete-dotcom/code-atlas%5Cn**Site:**" rel="noopener noreferrer"&gt;https://github.com/mete-dotcom/code-atlas\n**Site:**&lt;/a&gt; &lt;a href="https://massiron.com/atlas" rel="noopener noreferrer"&gt;https://massiron.com/atlas&lt;/a&gt;",&lt;br&gt;
  "tags": ["python", "legacy-code", "refactoring", "code-intelligence", "devtools"],&lt;br&gt;
  "estimated_chars": 2157&lt;br&gt;
}&lt;br&gt;
[deepstrain] turns=1 · cost≈$0.0011 (DeepSeek-V3) · manual≈$0.0034 (3× more turns without deepstrain) · saved≈67%&lt;/p&gt;

</description>
      <category>atlas</category>
    </item>
    <item>
      <title>X-Ray Your Python Codebase in 0.2 Seconds — Without an LLM</title>
      <dc:creator>massiron</dc:creator>
      <pubDate>Sat, 13 Jun 2026 08:01:29 +0000</pubDate>
      <link>https://dev.to/massiron/x-ray-your-python-codebase-in-02-seconds-without-an-llm-1hi0</link>
      <guid>https://dev.to/massiron/x-ray-your-python-codebase-in-02-seconds-without-an-llm-1hi0</guid>
      <description>&lt;p&gt;You inherit a 50k-line Python monolith. Senior dev who wrote it left last month. No tests, no docs, no architecture diagram. Where do you even start?&lt;/p&gt;

&lt;p&gt;Grep for imports? Parse the AST yourself? Spend two days drawing boxes and arrows in Mermaid?&lt;/p&gt;

&lt;p&gt;There's a faster way. Let me show you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is code-atlas-py?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;code-atlas-py&lt;/code&gt; (CLI: &lt;code&gt;atlas&lt;/code&gt;) is a deterministic code intelligence tool. It builds a full call graph, dependency graph, and symbol index of any Python project in ~0.2 seconds. It scores every function for risk — complexity, coupling, instability — and surfaces the most dangerous spots before you touch them.&lt;/p&gt;

&lt;p&gt;No LLM. No cloud. No tokens. Same result every run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;code-atlas-py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. No config file, no server, no database. It works on any Python project out of the box.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Scan your project
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /path/to/your/project
atlas scan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll see output like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✓ Scanned 1,247 symbols in 0.19s
  Functions: 892 | Classes: 203 | Imports: 152
  Top risk: payment/processor.py:process_payment (risk: 8.7)
              - complexity: 14 | coupling: 23 | instability: 0.87
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The scan found your riskiest function before you opened a single file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Ask questions in natural language
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;atlas ask &lt;span class="s2"&gt;"which functions call process_payment?"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;process_payment
  ├─ checkout.create_order (checkout/orders.py:142)
  ├─ billing.sync_subscriptions (billing/sync.py:67)
  └─ webhooks.stripe_handler (webhooks/stripe.py:33)

3 callers, 4 callees (including 2 external API calls)
Risk impact if changed: high (3 downstream modules affected)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4: Generate an interactive HTML report
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;atlas html &lt;span class="nt"&gt;--open&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This opens a clickable, filterable call graph in your browser. Each node is colored by risk score. Click any function to see its callers, callees, and complexity breakdown. Filter to show only functions with risk &amp;gt; 7 and instantly see the 5% of your codebase you should review before making any changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Use it in CI/CD
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;atlas scan &lt;span class="nt"&gt;--fail-on-risk&lt;/span&gt; 8 &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; atlas-report.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fail a PR if it introduces code with risk score ≥ 8. No more merges that silently add coupling. Ship an HTML artifact alongside your test results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is this for?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Engineers inheriting legacy code&lt;/strong&gt;: Find the hot spots in 0.2s instead of 2 days of reading.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tech leads doing code review&lt;/strong&gt;: See risk before you read line by line — focus your attention where it matters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DevOps teams&lt;/strong&gt;: Add codebase health to your CI/CD pipeline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anyone using AI coding agents&lt;/strong&gt;: code-atlas-py integrates with deepstrain so the AI understands structure, not just text. It makes AI edits safer by showing risk impact before the tool makes a change.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How it compares
&lt;/h2&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;th&gt;Deterministic?&lt;/th&gt;
&lt;th&gt;Local?&lt;/th&gt;
&lt;th&gt;Free?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;pylint/flake8&lt;/td&gt;
&lt;td&gt;Style + lint + simple complexity&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sourcegraph&lt;/td&gt;
&lt;td&gt;Code search with indexing server&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Subscription&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM code review&lt;/td&gt;
&lt;td&gt;Ask "is this risky?"&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;td&gt;Freemium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;code-atlas-py&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Call graph + risk scoring + symbol search&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Free tier&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Limitations (honest ones)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Python only (for now).&lt;/li&gt;
&lt;li&gt;Static analysis — it can't know runtime call paths (e.g., &lt;code&gt;getattr&lt;/code&gt;-based dispatch).&lt;/li&gt;
&lt;li&gt;Risk scores are heuristics — useful for triage, not a replacement for reading the code.&lt;/li&gt;
&lt;li&gt;The free tier covers the core engine. Advanced modules (7 for Pro, 12 for Enterprise) are paid.&lt;/li&gt;
&lt;/ul&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;pip &lt;span class="nb"&gt;install &lt;/span&gt;code-atlas-py
&lt;span class="nb"&gt;cd &lt;/span&gt;your-project
docker run &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;:/code &lt;span class="nt"&gt;--rm&lt;/span&gt; code-atlas-py atlas scan
&lt;span class="c"&gt;# or just:&lt;/span&gt;
atlas scan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repo: &lt;a href="https://github.com/mete-dotcom/code-atlas" rel="noopener noreferrer"&gt;github.com/mete-dotcom/code-atlas&lt;/a&gt;&lt;br&gt;
Site: &lt;a href="https://massiron.com/atlas" rel="noopener noreferrer"&gt;massiron.com/atlas&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What's the riskiest function in your codebase right now? Run &lt;code&gt;atlas scan&lt;/code&gt; and find out.&lt;/p&gt;

</description>
      <category>atlas</category>
    </item>
    <item>
      <title>I automated my Reddit marketing so I could focus on coding — here's how adauto works</title>
      <dc:creator>massiron</dc:creator>
      <pubDate>Sat, 13 Jun 2026 08:01:27 +0000</pubDate>
      <link>https://dev.to/massiron/i-automated-my-reddit-marketing-so-i-could-focus-on-coding-heres-how-adauto-works-2dj6</link>
      <guid>https://dev.to/massiron/i-automated-my-reddit-marketing-so-i-could-focus-on-coding-heres-how-adauto-works-2dj6</guid>
      <description>&lt;h2&gt;
  
  
  The problem: building in silence
&lt;/h2&gt;

&lt;p&gt;You ship a CLI tool, a library, or a SaaS. It's genuinely useful. But nobody knows it exists.&lt;/p&gt;

&lt;p&gt;Posting on Reddit feels like spam. Writing dev.to articles takes hours. Twitter threads require a skill set most of us don't have. So you keep coding, and your project stays invisible.&lt;/p&gt;

&lt;p&gt;I built adauto because I was tired of this pattern.&lt;/p&gt;

&lt;h2&gt;
  
  
  What adauto does differently
&lt;/h2&gt;

&lt;p&gt;Most marketing tools are schedulers. They take your content and post it at 2pm because "that's optimal engagement time." That misses the real problem: &lt;strong&gt;writing the content in the first place.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;adauto is a generation-first automation tool. It:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Scans the community before writing anything&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before it creates a single post, adauto reads the hot and new sections of your target subreddit. It analyzes what's getting upvoted — tone, topics, post length, even time of day. This isn't generic SEO advice; it's real-time awareness of what that specific community is receptive to right now.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;adauto
adauto campaign create &lt;span class="nt"&gt;--target&lt;/span&gt; r/golang &lt;span class="nt"&gt;--product&lt;/span&gt; &lt;span class="s2"&gt;"my CLI tool"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first step is always a pulse scan, not content generation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Generates platform-native content via deepstrain&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once it understands the community, adauto uses deepstrain (the same engine this repo uses) to plan and write the post. A Reddit post is different from a dev.to article is different from a HackerNews submission. The tone, structure, and depth change per platform automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Filters through 3 layers of ethics checks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I didn't want another spam machine. Every generated post passes through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Illegal content filter (never-include)&lt;/li&gt;
&lt;li&gt;Spam/shilling filter (does this read like an ad?)&lt;/li&gt;
&lt;li&gt;Fake-review filter (is this claiming something untrue?)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a post fails any layer, you never see it. I'd rather generate 0 posts than 1 bad one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Requires your approval — every single time&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nothing gets posted automatically. You get a draft in the terminal or web UI. You edit, approve, or discard. The human is always in the loop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Learns from what works&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's the part I'm most proud of: when a post earns upvotes and comments, adauto saves it as a few-shot example. Future generations use your best posts as style references. The system gets better the more you use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A concrete example
&lt;/h2&gt;

&lt;p&gt;I maintain a little database migration tool. Here's roughly what happened my first week:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;adauto campaign create --target r/programming --product "db-warden"&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Pulse scan found that "lightweight alternatives to Alembic" was a recurring topic&lt;/li&gt;
&lt;li&gt;Generated a Show HN-style post: "Db-warden: a migration tool that fits in one file"&lt;/li&gt;
&lt;li&gt;I edited the title slightly, approved it&lt;/li&gt;
&lt;li&gt;42 upvotes, 15 comments — genuine discussion, not marketing&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The post didn't go viral. But 15 people tried the tool, 3 filed issues, and 1 became a regular contributor. That's real traction for a solo project.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest trade-offs
&lt;/h2&gt;

&lt;p&gt;adauto isn't magic. It won't turn a mediocre product into a hit. It won't write content that's as insightful as what you'd produce after deep thought. And the free tier is limited to one campaign (enough to test if the approach works for you).&lt;/p&gt;

&lt;p&gt;What it does well: remove the friction of starting. Most developers never make their first post. adauto gets you past that barrier in 10 minutes.&lt;/p&gt;

&lt;p&gt;Pro ($19/mo) unlocks unlimited campaigns, the scheduler (run as a daemon, post at optimal intervals), and all four platforms: Reddit, dev.to, Twitter/X, and HackerNews.&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;pip &lt;span class="nb"&gt;install &lt;/span&gt;adauto
adauto &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repo: &lt;a href="https://github.com/mete-dotcom/adauto" rel="noopener noreferrer"&gt;https://github.com/mete-dotcom/adauto&lt;/a&gt;&lt;br&gt;
Site: &lt;a href="https://deepstrain.dev/adauto" rel="noopener noreferrer"&gt;https://deepstrain.dev/adauto&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you try it, I'd love to hear what breaks. I'm still iterating.&lt;/p&gt;

</description>
      <category>adauto</category>
    </item>
    <item>
      <title>repofuse: Compress your codebase into ~1500 tokens for LLM consumption</title>
      <dc:creator>massiron</dc:creator>
      <pubDate>Sat, 13 Jun 2026 07:59:54 +0000</pubDate>
      <link>https://dev.to/massiron/repofuse-compress-your-codebase-into-1500-tokens-for-llm-consumption-bh4</link>
      <guid>https://dev.to/massiron/repofuse-compress-your-codebase-into-1500-tokens-for-llm-consumption-bh4</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;You're working on a large codebase. You want to ask an LLM a question about it — refactor this module, explain that architecture, find security issues. So you dump the relevant files into the prompt.&lt;/p&gt;

&lt;p&gt;Then your context window overflows. You hit the token limit. You trim files, lose context, get worse answers. Or you pay for GPT-4-32k tokens on every question.&lt;/p&gt;

&lt;p&gt;If you're using an AI coding assistant — Copilot, Cursor, Claude Code, whatever — your AI is either seeing a shallow slice of your repo or you're burning money on context.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Approach
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;repofuse&lt;/strong&gt; — a zero-dependency Python tool that compresses your entire codebase into a ~1500 token structured summary. It doesn't dump source files. It extracts the signals an LLM actually needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Module tree&lt;/strong&gt; — what files exist and how they're organized&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependency graph&lt;/strong&gt; — who imports what, module coupling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risk-ranked functions&lt;/strong&gt; — dead code, high cyclomatic complexity, security-sensitive patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All in a single JSON block the LLM can consume in one shot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Show, Don't Tell
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;repofuse
&lt;span class="nb"&gt;cd &lt;/span&gt;your-project
repofuse fuse &lt;span class="nt"&gt;--output&lt;/span&gt; context.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This takes a project with hundreds of files and produces ~1500 tokens. You can then feed it directly:&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;cat &lt;/span&gt;context.json | your-llm-cli &lt;span class="s2"&gt;"Find security vulnerabilities in this codebase"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or pipe it into your AI assistant's system prompt. The key insight: the LLM gets a &lt;em&gt;map&lt;/em&gt;, not a &lt;em&gt;dump&lt;/em&gt;. It knows what's there, how things connect, and where risk lives — without reading every line.&lt;/p&gt;

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

&lt;p&gt;The output is a structured JSON block. Here's a simplified version of what you get:&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tree"&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;"src/api/"&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;"routes.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"middleware.py"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"src/db/"&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;"models.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"migrations.py"&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;"dependencies"&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;"src/api/routes.py"&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;"src/db/models.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/lib/auth.py"&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;"risk"&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;span class="nl"&gt;"function"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"handle_payment"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/payments/processor.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"risk"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cyclomatic complexity 15, no input validation"&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;The LLM gets the architecture and the hotspots without wading through implementation details. If it needs more detail on a specific function, it can ask — you've already saved 95% of tokens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where It Shines
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Monorepos&lt;/strong&gt; with hundreds of files that overflow every context window&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD pipelines&lt;/strong&gt; — generate the fuse file on every commit, keep your AI assistant always in sync&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI agents&lt;/strong&gt; that need structured understanding of unfamiliar codebases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost-sensitive teams&lt;/strong&gt; — every token you don't send is money saved&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Trade-offs
&lt;/h2&gt;

&lt;p&gt;It's not a replacement for reading the code yourself. If you need line-by-line accuracy, dump the files. But if you're asking architectural questions — "how does auth work in this project?" or "which modules depend on the legacy data layer?" — the fuse file gives you better answers than a handful of files you guessed at.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;Free, open-source, pip installable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;repofuse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repo: &lt;a href="https://github.com/massiron/repofuse" rel="noopener noreferrer"&gt;https://github.com/massiron/repofuse&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Docs: &lt;a href="https://deepstrain.dev" rel="noopener noreferrer"&gt;https://deepstrain.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No registration. No API key. Just Python stdlib.&lt;/p&gt;

&lt;p&gt;I'd love to hear where it breaks for your codebase — file an issue or drop a comment.&lt;/p&gt;

</description>
      <category>repofuse</category>
    </item>
    <item>
      <title>Context Window Too Small? Compress Your Codebase to 1500 Tokens Without Losing Signal</title>
      <dc:creator>massiron</dc:creator>
      <pubDate>Sat, 13 Jun 2026 07:59:43 +0000</pubDate>
      <link>https://dev.to/massiron/context-window-too-small-compress-your-codebase-to-1500-tokens-without-losing-signal-50nl</link>
      <guid>https://dev.to/massiron/context-window-too-small-compress-your-codebase-to-1500-tokens-without-losing-signal-50nl</guid>
      <description>&lt;p&gt;If you've ever hit a token limit trying to feed a codebase to an LLM, you know the pain: truncate the files and lose critical context, or pay for more tokens than makes sense.&lt;/p&gt;

&lt;p&gt;Repofuse solves this by compressing your entire codebase into a structured &lt;strong&gt;~1500 token context pack&lt;/strong&gt; — module tree, dependency graph, and risk-ranked function list in one portable JSON block. That's a 95% token savings vs. dumping raw source files.&lt;/p&gt;

&lt;p&gt;Let's walk through it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;repofuse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Zero dependencies — pure Python, stdlib only. Works with any Python project on Linux, macOS, or Windows.&lt;/p&gt;

&lt;h2&gt;
  
  
  One-shot run
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;repofuse &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll get a JSON output in stdout. You can redirect it to a file, pipe it to a clipboard tool, or feed it directly to an LLM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;repofuse &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; context-pack.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The output
&lt;/h2&gt;

&lt;p&gt;A context pack contains three sections:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;module_tree&lt;/strong&gt; — All source files arranged as a tree, with line counts per file. Your LLM sees the project skeleton immediately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;dependency_graph&lt;/strong&gt; — Edges between modules (who imports whom). Enables reasoning about coupling and change impact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;risk_ranked_functions&lt;/strong&gt; — Functions sorted by risk indicators (complexity, cyclomatic depth, number of imports). Lets the LLM focus attention on the most critical code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example snippet:&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"module_tree"&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;"src/app.py"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"src/models.py"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;85&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;"dependency_graph"&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="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/app.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/models.py"&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;"risk_ranked_functions"&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="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"process_payment"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/payments.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"risk_score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.87&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"High cyclomatic complexity, 5 conditional branches, 3 external imports"&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;h2&gt;
  
  
  CI integration
&lt;/h2&gt;

&lt;p&gt;Add it to your CI pipeline so every commit ships an up-to-date context pack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .github/workflows/context-pack.yml&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;Update context pack&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pack&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pip install repofuse&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;repofuse . &amp;gt; context-pack.json&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;stefanzweifel/git-auto-commit-action@v5&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;commit_message&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;auto:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;update&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;context&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;pack"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  When would you use this?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Your team's monorepo has hundreds of files, and claude/gpt-4 keeps forgetting module structure after two files.&lt;/li&gt;
&lt;li&gt;You're building an AI agent that needs to understand a codebase before writing code in it. A context pack is far more reliable than a few random source files.&lt;/li&gt;
&lt;li&gt;You're onboarding to a new repo and want to dump the whole thing into an AI chat in one shot.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Limitations (honest ones)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python only&lt;/strong&gt; — repofuse parses Python AST. It won't read TypeScript, Go, or Rust (yet).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Static analysis only&lt;/strong&gt; — risk scores are based on structural metrics, not runtime data. A function with a high risk score might be perfectly safe if it's well-tested.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tree + deps + risk, not code&lt;/strong&gt; — the output replaces raw source files. You still need the actual code for line-level details. The context pack is a map, not the territory.&lt;/li&gt;
&lt;/ul&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;pip &lt;span class="nb"&gt;install &lt;/span&gt;repofuse &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; repofuse &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repo: &lt;a href="https://github.com/massiron/repofuse" rel="noopener noreferrer"&gt;github.com/massiron/repofuse&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Docs: &lt;a href="https://deepstrain.dev" rel="noopener noreferrer"&gt;deepstrain.dev&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Free and open-source.&lt;/p&gt;

</description>
      <category>repofuse</category>
    </item>
    <item>
      <title>Build a Controllable AI Agent That Plans Before It Acts: deepstrain Tutorial</title>
      <dc:creator>massiron</dc:creator>
      <pubDate>Sat, 13 Jun 2026 07:58:47 +0000</pubDate>
      <link>https://dev.to/massiron/build-a-controllable-ai-agent-that-plans-before-it-acts-deepstrain-tutorial-3kh9</link>
      <guid>https://dev.to/massiron/build-a-controllable-ai-agent-that-plans-before-it-acts-deepstrain-tutorial-3kh9</guid>
      <description>&lt;h2&gt;
  
  
  The Problem: AI Agents That Just Break Things
&lt;/h2&gt;

&lt;p&gt;Every AI coding agent I've tried follows the same pattern: you give it a task, it starts spamming tools in some invisible loop, and you pray it doesn't delete your &lt;code&gt;node_modules&lt;/code&gt; or commit garbage to &lt;code&gt;main&lt;/code&gt;. When it fails, you have no idea why — no logs, no decision trail, just a broken repo.&lt;/p&gt;

&lt;p&gt;deepstrain solves this by treating AI execution like an operating system: the agent writes a plan first, you review it, then it executes step-by-step with full inspectability. No black boxes, no vendor lock-in, no data leaving your machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We're Building
&lt;/h2&gt;

&lt;p&gt;By the end of this tutorial, you'll have a working AI agent that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reads your local codebase&lt;/li&gt;
&lt;li&gt;Generates a human-readable plan before touching any files&lt;/li&gt;
&lt;li&gt;Executes refactoring tasks with full audit logs&lt;/li&gt;
&lt;li&gt;Works with any model — local (Ollama) or cloud (GPT-4o, Claude, DeepSeek)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Install
&lt;/h2&gt;

&lt;p&gt;deepstrain is on PyPI. You need Python 3.10+.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;deepstrain
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. No Docker, no cloud account, no API key required if you use Ollama locally.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Configure a Model
&lt;/h2&gt;

&lt;p&gt;deepstrain is model-agnostic. For this tutorial, we'll use Ollama with &lt;code&gt;llama3.2&lt;/code&gt; (3B, runs on a laptop):&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;# Start Ollama if you haven't already&lt;/span&gt;
ollama serve &amp;amp;

&lt;span class="c"&gt;# Pull a model&lt;/span&gt;
ollama pull llama3.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now tell deepstrain to use it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;deepstrain config &lt;span class="nt"&gt;--model&lt;/span&gt; ollama/llama3.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or use a cloud model with your own key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;deepstrain config &lt;span class="nt"&gt;--model&lt;/span&gt; openai/gpt-4o &lt;span class="nt"&gt;--api-key&lt;/span&gt; sk-...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3: Run Your First Task
&lt;/h2&gt;

&lt;p&gt;Let's do something harmless — ask the agent to analyze a Python file in your current directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;deepstrain run &lt;span class="s2"&gt;"Analyze all .py files in this directory and summarize their functions"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll see something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[PLAN] deepstrain will:
  1. List .py files using bash tool
  2. Read each file using file I/O tool
  3. Extract function definitions using atlas (deterministic code analysis)
  4. Summarize findings in a report

Review plan? [Y/n]: 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Press &lt;code&gt;Y&lt;/code&gt; to approve. The agent then executes each step, logging every tool call with timestamps and context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Inspect the Cognition
&lt;/h2&gt;

&lt;p&gt;after execution, deepstrain writes a full session log to &lt;code&gt;~/.deepstrain/logs/&lt;/code&gt;. Open the latest one:&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;cat&lt;/span&gt; ~/.deepstrain/logs/session_&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%Y%m%d&lt;span class="si"&gt;)&lt;/span&gt;.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every decision the agent made&lt;/li&gt;
&lt;li&gt;Each tool call with input/output&lt;/li&gt;
&lt;li&gt;Stack traces for any errors (no silent crashes)&lt;/li&gt;
&lt;li&gt;The exact model response that led to each action&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 5: Try a Real Refactoring Task
&lt;/h2&gt;

&lt;p&gt;Now let's actually modify code. deepstrain has 52 built-in tools including git, bash, and file I/O. Here's a safe refactoring task:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;deepstrain run &lt;span class="s2"&gt;"In all .py files, rename all instances of 'temp_var' to 'temporary_variable'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent will:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Plan the change (e.g., "Use sed via bash, then verify with git diff")&lt;/li&gt;
&lt;li&gt;Show you the plan&lt;/li&gt;
&lt;li&gt;Execute only after your approval&lt;/li&gt;
&lt;li&gt;Log every change made&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What Makes This Different
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Plan-first execution&lt;/strong&gt;: The agent writes a plan before touching files. You approve or reject. No surprise tool-spam.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inspectable cognition&lt;/strong&gt;: Every decision is logged. You can replay the agent's reasoning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model-agnostic&lt;/strong&gt;: Use Ollama (free, local), GPT-4o, Claude, DeepSeek — swap with one config command.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Antifragile&lt;/strong&gt;: Rotating error logs, graceful degradation. If a tool fails, the agent retries or asks for help — never crashes silently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free to start&lt;/strong&gt;: &lt;code&gt;pip install deepstrain&lt;/code&gt; gives you read-only tools immediately. Pro license ($9/mo) unlocks write tools (file modification, git push) with HMAC activation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Limitations to Know
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;deepstrain is terminal-native. No GUI, no VS Code extension (yet).&lt;/li&gt;
&lt;li&gt;Complex multi-step tasks can be slow with small local models (e.g., 3B parameter models). Use GPT-4o or DeepSeek for production work.&lt;/li&gt;
&lt;li&gt;The plan-first flow adds friction. It's intentional — you're supposed to review before execution.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Browse the 19 capability domains: &lt;code&gt;deepstrain capabilities list&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Try an MCP server tool: &lt;code&gt;deepstrain run "Use MCP to query a SQLite database"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Set up CI/CD integration: deepstrain can run in GitHub Actions with a headless mode
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Start with a trial key (no credit card)&lt;/span&gt;
deepstrain auth &lt;span class="nt"&gt;--trial&lt;/span&gt;

&lt;span class="c"&gt;# Or go Pro&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;deepstrain-pro-license  &lt;span class="c"&gt;# $9/mo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repo: &lt;a href="https://github.com/mete-dotcom/deepstrain" rel="noopener noreferrer"&gt;https://github.com/mete-dotcom/deepstrain&lt;/a&gt;&lt;br&gt;
Docs: &lt;a href="https://massiron.com/deepstrain" rel="noopener noreferrer"&gt;https://massiron.com/deepstrain&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Install today and run your first controllable AI agent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;deepstrain
deepstrain run &lt;span class="s2"&gt;"What's the weather in Tokyo?"&lt;/span&gt;  &lt;span class="c"&gt;# uses web search tool&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>deepstrain</category>
    </item>
    <item>
      <title>Build a Local AI Coding Agent That Actually Plans Before Acting: Deepstrain Tutorial</title>
      <dc:creator>massiron</dc:creator>
      <pubDate>Sat, 13 Jun 2026 07:58:35 +0000</pubDate>
      <link>https://dev.to/massiron/build-a-local-ai-coding-agent-that-actually-plans-before-acting-deepstrain-tutorial-40i4</link>
      <guid>https://dev.to/massiron/build-a-local-ai-coding-agent-that-actually-plans-before-acting-deepstrain-tutorial-40i4</guid>
      <description>&lt;p&gt;Most AI coding agents are black boxes. You give them a task, they start spamming tools, and you pray they don't delete your &lt;code&gt;src/&lt;/code&gt; directory. If you've ever watched an agent blindly run &lt;code&gt;rm -rf&lt;/code&gt; or hallucinate a file rename, you know the pain.&lt;/p&gt;

&lt;p&gt;Deepstrain takes a different approach: &lt;strong&gt;plan-first execution&lt;/strong&gt;. The agent writes a human-readable plan before touching any files. You review, approve, or reject. Every step is logged with context. No surprises.&lt;/p&gt;

&lt;p&gt;And it's fully local if you want. No cloud dependency. No data leaving your machine.&lt;/p&gt;

&lt;p&gt;Let's walk through setting up a local coding agent with Ollama.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Install Deepstrain
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;deepstrain
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. It pulls 52 built-in tools for file I/O, git, bash, network, database, and MCP server support.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Configure a Local Model
&lt;/h2&gt;

&lt;p&gt;Make sure you have Ollama running with a model pulled. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull codellama
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then create a config file for Deepstrain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ~/.deepstrain/config.yaml&lt;/span&gt;
&lt;span class="na"&gt;llm&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ollama&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;codellama&lt;/span&gt;
  &lt;span class="na"&gt;base_url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http://localhost:11434&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also use OpenAI-compatible endpoints (Claude, GPT-4o, DeepSeek) or bring your own API key. Deepstrain is model-agnostic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Run a Task
&lt;/h2&gt;

&lt;p&gt;Let's ask it to refactor a Python file. First, create a messy script:&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="c1"&gt;# messy.py
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now run Deepstrain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;deepstrain run &lt;span class="s2"&gt;"Refactor messy.py: add type hints, proper function names, and docstrings. Keep the same logic."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4: Review the Plan
&lt;/h2&gt;

&lt;p&gt;Deepstrain outputs a plan before executing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;── Plan ──
1. Read messy.py to understand current code
2. Write refactored version with:
   - Type hints (int, int) -&amp;gt; tuple[int, int]
   - Rename calc to add_and_subtract
   - Add docstring
   - Remove inline prints, return values only
3. Write changes to messy.py
4. Verify file content with read tool

Review and approve? (y/n):
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You type &lt;code&gt;y&lt;/code&gt; and it executes step by step. Each tool call is logged with a stack trace. You can inspect what the agent is thinking at any time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: See the Result
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# messy.py (after refactor)
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_and_subtract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Calculate sum and difference of two integers.

    Args:
        a: First integer
        b: Second integer

    Returns:
        Tuple containing (sum, difference)
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clean. No hallucinations because Deepstrain uses &lt;strong&gt;deterministic code analysis&lt;/strong&gt; via its atlas integration when parsing and writing code.&lt;/p&gt;

&lt;h2&gt;
  
  
  What About Cost?
&lt;/h2&gt;

&lt;p&gt;If you use Ollama, it's free. If you bring your own API key (e.g., DeepSeek), each task costs roughly $0.009. Deepstrain itself is free on PyPI. A Pro license ($9/month) adds HMAC activation and priority support, but the core features work without it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trade-offs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Deepstrain is terminal-native. No GUI. If you want a clickable IDE plugin, this isn't it.&lt;/li&gt;
&lt;li&gt;Plan-first execution adds a review step. It's slower than fully autonomous agents, but safer.&lt;/li&gt;
&lt;li&gt;Local models like CodeLlama are less capable than GPT-4o for complex reasoning. You can swap backends anytime.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;Try it with a git repo for automated PR reviews, or wire it into a CI/CD pipeline for safe refactoring. The full feature list — 19 capability domains (security, verification, cloud, infra, math, media) — is documented at &lt;a href="https://massiron.com/deepstrain" rel="noopener noreferrer"&gt;massiron.com/deepstrain&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Repository: &lt;a href="https://github.com/mete-dotcom/deepstrain" rel="noopener noreferrer"&gt;github.com/mete-dotcom/deepstrain&lt;/a&gt;&lt;/p&gt;

</description>
      <category>deepstrain</category>
    </item>
    <item>
      <title>Video to Text to Video: Building LLM-Ready Pipelines from MP4 Files</title>
      <dc:creator>massiron</dc:creator>
      <pubDate>Sat, 13 Jun 2026 07:58:08 +0000</pubDate>
      <link>https://dev.to/massiron/video-to-text-to-video-building-llm-ready-pipelines-from-mp4-files-4m1c</link>
      <guid>https://dev.to/massiron/video-to-text-to-video-building-llm-ready-pipelines-from-mp4-files-4m1c</guid>
      <description>&lt;p&gt;Every LLM engineer I know has hit this wall: you have hours of video content — tutorials, meeting recordings, dashcam footage — and you want to feed it into an LLM for summarization, Q&amp;amp;A, or fine-tuning. But LLMs don't eat MP4 files. They eat text.&lt;/p&gt;

&lt;p&gt;So you write a script. &lt;code&gt;ffmpeg&lt;/code&gt; to extract frames. A loop to encode each frame as base64. A JSON blob with timestamps. It works. It's also fragile, one-off, and doesn't scale to the next project.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://github.com/massiron/video2flow" rel="noopener noreferrer"&gt;&lt;code&gt;video2flow&lt;/code&gt;&lt;/a&gt; to close that gap in a single CLI command.&lt;/p&gt;

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

&lt;p&gt;&lt;code&gt;video2flow&lt;/code&gt; extracts frames from any video file at a configurable FPS, assigns timestamps, and outputs a structured JSON "text flow" — ready to drop into any LLM prompt that supports vision.&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;# Extract 1 frame per second, describe scenes, export as JSON&lt;/span&gt;
video2flow extract demo.mp4 &lt;span class="nt"&gt;--fps&lt;/span&gt; 1 &lt;span class="nt"&gt;--describe&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; flow.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What you get back is a &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;frames: list of base64-encoded frames with their offset in seconds
&lt;/li&gt;
&lt;li&gt;scenes: automatically grouped sequences with descriptions
&lt;/li&gt;
&lt;li&gt;total_duration, fps, frame_count: everything the LLM needs to understand temporal context
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real use-case:&lt;/strong&gt; I piped this output into a GPT-4 system prompt that said "You are a meeting summarizer. These are frames from a 30-minute product demo. Summarize decisions, code snippets shown, and unresolved questions." The result was shockingly coherent — it caught details from slide 5 that appeared at minute 12.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beyond extraction: generation
&lt;/h2&gt;

&lt;p&gt;The same tool also goes the other direction. Text-to-video generation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;video2flow generate &lt;span class="s2"&gt;"A developer typing code at sunset, drone shot"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--duration&lt;/span&gt; 8 &lt;span class="nt"&gt;--output&lt;/span&gt; sunset_demo.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By default it uses OpenAI DALL-E 3 to generate frames, then stitches them with ffmpeg into an MP4. No video generation model to host. No GPU needed.&lt;/p&gt;

&lt;p&gt;Need a local-only pipeline? Use &lt;code&gt;--mode local&lt;/code&gt; for placeholder frames (colored rectangles with text overlays) — zero API calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  The slideshow trick
&lt;/h2&gt;

&lt;p&gt;For content teams: dump a folder of images into a video with crossfade transitions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;video2flow slideshow ./screenshots/ &lt;span class="nt"&gt;--transition&lt;/span&gt; crossfade &lt;span class="nt"&gt;--duration&lt;/span&gt; 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;This is not a Sora competitor. The generated videos are frame-stitched, not diffusion-native. If you need 30-second cinematic clips with coherent motion, this isn't that tool. &lt;/p&gt;

&lt;p&gt;What it &lt;em&gt;is&lt;/em&gt;: a Swiss Army knife for developers who need to bridge video content and LLMs — fast, scriptable, local-first, and free.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;video2flow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repo: &lt;a href="https://github.com/massiron/video2flow" rel="noopener noreferrer"&gt;https://github.com/massiron/video2flow&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Docs: &lt;a href="https://deepstrain.dev" rel="noopener noreferrer"&gt;https://deepstrain.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No API keys required to start. No data leaves your machine unless you choose DALL-E generation.&lt;/p&gt;

</description>
      <category>video2flow</category>
    </item>
    <item>
      <title>Extract Video Frames for LLM Vision Pipelines with video2flow</title>
      <dc:creator>massiron</dc:creator>
      <pubDate>Sat, 13 Jun 2026 07:57:56 +0000</pubDate>
      <link>https://dev.to/massiron/extract-video-frames-for-llm-vision-pipelines-with-video2flow-4a00</link>
      <guid>https://dev.to/massiron/extract-video-frames-for-llm-vision-pipelines-with-video2flow-4a00</guid>
      <description>&lt;p&gt;If you're building AI pipelines that need to understand video — captioning, RAG over video content, or multimodal dataset creation — you've likely hit the same wall: LLMs eat text, but your source material is video.&lt;/p&gt;

&lt;p&gt;You need frames as timestamped text. You need metadata. You need it without shipping your data to a cloud API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;video2flow&lt;/strong&gt; is an open-source CLI tool that does exactly this. Install it, point it at a video, and get structured JSON output ready for any LLM.&lt;/p&gt;

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

&lt;p&gt;&lt;code&gt;pip install video2flow&lt;/code&gt; gives you a &lt;code&gt;v2f&lt;/code&gt; command with four operations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;v2f extract&lt;/code&gt; — pull frames from MP4/MOV/AVI at custom FPS&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;v2f describe&lt;/code&gt; — generate timestamped text descriptions of each scene&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;v2f generate&lt;/code&gt; — create a video from a text prompt (uses DALL-E 3 or local placeholder mode)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;v2f slideshow&lt;/code&gt; — turn an image directory into a video with transitions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tutorial: Frame extraction for an LLM pipeline
&lt;/h2&gt;

&lt;p&gt;Let's say I have a 5-minute product demo and I want an LLM to answer questions about what's shown.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Install&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;pip &lt;span class="nb"&gt;install &lt;/span&gt;video2flow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2: Extract frames with metadata&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;v2f extract demo.mp4 &lt;span class="nt"&gt;--fps&lt;/span&gt; 1 &lt;span class="nt"&gt;--output&lt;/span&gt; frames/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This writes one frame per second into &lt;code&gt;frames/&lt;/code&gt; and a JSON file with timestamps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Get the JSON&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="nb"&gt;cat &lt;/span&gt;frames/metadata.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output looks like:&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="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;"frame"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"frame_0000.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"timestamp_s"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"00:00:00"&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="nl"&gt;"frame"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"frame_0001.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"timestamp_s"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"00:00:01"&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;&lt;strong&gt;Step 4: Feed into an LLM&lt;/strong&gt;&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="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;frames/metadata.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;timeline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Each entry is a frame you can pass to a vision model
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;timeline&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;timestamp&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; — &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;frame&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Where this shines
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local-first&lt;/strong&gt;: no data ever leaves your machine. The &lt;code&gt;describe&lt;/code&gt; command runs frame analysis locally.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM-ready output&lt;/strong&gt;: timestamps, paths, and metadata in one structured file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reverse pipeline&lt;/strong&gt;: use &lt;code&gt;v2f generate&lt;/code&gt; to create video from text when you need demo content.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Trade-offs to know
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Frame-by-frame processing at high FPS is I/O heavy. Start at 1 FPS and adjust up.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;v2f describe&lt;/code&gt; uses a local vision model — quality depends on the model and GPU availability.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;v2f generate&lt;/code&gt; without an OpenAI key produces placeholder frames. For production-quality generation, set &lt;code&gt;OPENAI_API_KEY&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why not just ffmpeg?
&lt;/h2&gt;

&lt;p&gt;ffmpeg extracts frames. video2flow extracts frames &lt;em&gt;and&lt;/em&gt; gives you timestamped JSON, descriptions, and LLM-ready structure in one command. If you're already piping ffmpeg output into a Python script, video2flow replaces that boilerplate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next steps
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;video2flow
v2f &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repo: &lt;a href="https://github.com/massiron/video2flow" rel="noopener noreferrer"&gt;github.com/massiron/video2flow&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Docs: &lt;a href="https://deepstrain.dev" rel="noopener noreferrer"&gt;deepstrain.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's free, open-source, and pip-installable. No API key required for basic extraction.&lt;/p&gt;

</description>
      <category>video2flow</category>
    </item>
    <item>
      <title>Your AI coding agent forgets everything between sessions. Here's how to fix that.</title>
      <dc:creator>massiron</dc:creator>
      <pubDate>Sat, 13 Jun 2026 07:54:01 +0000</pubDate>
      <link>https://dev.to/massiron/your-ai-coding-agent-forgets-everything-between-sessions-heres-how-to-fix-that-2cja</link>
      <guid>https://dev.to/massiron/your-ai-coding-agent-forgets-everything-between-sessions-heres-how-to-fix-that-2cja</guid>
      <description>&lt;p&gt;You spend 20 minutes rebuilding context every time you open a new Claude Code or Cursor session. The architecture decision from last week? Gone. The task you were halfway through? Lost. The rationale behind that weird &lt;code&gt;except: pass&lt;/code&gt; you left as a TODO? Your future self will curse past you.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;nodestone&lt;/strong&gt; — a project context memory engine that lives alongside your repo. It remembers decisions, tasks, and architecture drift across AI sessions, regardless of which agent you're using. One command, and your agent picks up exactly where it left off.&lt;/p&gt;

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

&lt;p&gt;Install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;nodestone
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start a session:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nodestone start &lt;span class="s2"&gt;"Refactor auth middleware to use JWT"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;nodestone creates a compressed context pack (~500 tokens) that captures: active tasks, recent decisions, detected drift between plan and code, and milestone status. Your agent receives this as system context on the next session. Full files stay on disk — only the signal travels.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concrete example: the drift detector
&lt;/h2&gt;

&lt;p&gt;Say you planned a three-phase refactor but your teammate hotfixed a core module mid-stream. You won't notice until CI breaks. nodestone's drift detection compares actual file changes against your plan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nodestone plan check
&lt;span class="c"&gt;# Output: DRIFT DETECTED: src/auth/jwt.py modified outside planned scope&lt;/span&gt;
&lt;span class="c"&gt;#         Expected: src/auth/middleware.py, tests/test_auth.py&lt;/span&gt;
&lt;span class="c"&gt;#         Actual:   src/auth/jwt.py (unplanned), src/auth/middleware.py&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It flags the mismatch before you waste hours debugging.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features you can use today
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Decision journal&lt;/strong&gt; — records not just what changed, but why. Every agent sees the rationale.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Task tracking&lt;/strong&gt; — dependencies, PERT durations, critical path analysis. Know which task is blocking everything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OR-Tools CP-SAT scheduler&lt;/strong&gt; — optimal task ordering with resource constraints. This isn't a toy todo list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fingerprint handoff&lt;/strong&gt; — zero-loss context transfer between Claude Code, Cursor, Gemini, or any AI tool that reads from stdin or a file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trigger system&lt;/strong&gt; — auto-actions on state changes: webhooks, CLI commands, MCP tool calls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keystone/milestone model&lt;/strong&gt; — break projects into mini-phases with clear completion criteria.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where it falls short (honest trade-offs)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Single-user today.&lt;/strong&gt; Multi-user shared context is on the roadmap but not here yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git-centric.&lt;/strong&gt; It reads git state and file hashes. Non-git projects won't benefit from drift detection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Requires buy-in.&lt;/strong&gt; Your agent needs to read the context pack. If you switch between agents, you need the same &lt;code&gt;nodestone context&lt;/code&gt; command in your session starter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No IDE plugin yet.&lt;/strong&gt; CLI and MCP tool only for now. Cursor and VS Code extensions are planned.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why not just use git commit messages?
&lt;/h2&gt;

&lt;p&gt;Git tells you &lt;em&gt;what&lt;/em&gt; changed. nodestone tells you &lt;em&gt;why&lt;/em&gt; you changed it, &lt;em&gt;what you were about to do next&lt;/em&gt;, and &lt;em&gt;whether reality matches the plan&lt;/em&gt;. They complement each other — commit messages record history, nodestone maintains forward context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not just use ChatGPT memory?
&lt;/h2&gt;

&lt;p&gt;ChatGPT memory is per-chatbot. nodestone is per-project. It works across Claude, Cursor, Gemini, and any future agent. Your context follows the repo, not the chat window.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;nodestone is free and open-source.&lt;/strong&gt; &lt;code&gt;pip install nodestone&lt;/code&gt; — check it out at &lt;a href="https://deepstrain.dev" rel="noopener noreferrer"&gt;deepstrain.dev&lt;/a&gt; or the &lt;a href="https://github.com/massiron/nodestone" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I'd love to hear what's missing for your workflow. What would make context persistence actually work for your team?&lt;/p&gt;

</description>
      <category>nodestone</category>
    </item>
    <item>
      <title>Stop pasting context every AI session: one command restores everything</title>
      <dc:creator>massiron</dc:creator>
      <pubDate>Sat, 13 Jun 2026 07:53:49 +0000</pubDate>
      <link>https://dev.to/massiron/stop-pasting-context-every-ai-session-one-command-restores-everything-28ej</link>
      <guid>https://dev.to/massiron/stop-pasting-context-every-ai-session-one-command-restores-everything-28ej</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Every AI coding session starts the same: paste the README, paste the architecture doc, paste the last error message, re-explain where you left off. If you switch between Claude Code, Cursor, and Gemini in the same project, every tool starts from zero.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;nodestone&lt;/strong&gt; fixes that. It's a project-level memory engine for AI-assisted development, and it's free.&lt;/p&gt;




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

&lt;p&gt;nodestone tracks four things across sessions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Decisions&lt;/strong&gt; — why you chose SQLite over Postgres, or that weird middleware pattern&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tasks&lt;/strong&gt; — what's done, what's next, with dependencies and critical path&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drift&lt;/strong&gt; — when you start implementing something different from what you planned&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context&lt;/strong&gt; — a compressed ~500 token pack that any AI can restore in one command&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;nodestone
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Python 3.10+.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Initialize in your project
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nodestone init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Creates a &lt;code&gt;.nodestone/&lt;/code&gt; directory in your project root.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Save your first decision
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nodestone decision add &lt;span class="s2"&gt;"Use SQLite instead of Postgres"&lt;/span&gt; &lt;span class="nt"&gt;--context&lt;/span&gt; &lt;span class="s2"&gt;"Only 3 users, no need for a server"&lt;/span&gt; &lt;span class="nt"&gt;--impact&lt;/span&gt; &lt;span class="s2"&gt;"Simpler deployment, no Docker needed"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Add a task
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nodestone task add &lt;span class="s2"&gt;"Add user authentication"&lt;/span&gt; &lt;span class="nt"&gt;--depends&lt;/span&gt; &lt;span class="s2"&gt;"Set up database schema"&lt;/span&gt; &lt;span class="nt"&gt;--effort&lt;/span&gt; 4h
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Snapshot context for the next session
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nodestone pack
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prints a ~500 token context block. Copy it, paste it at the start of your next AI session. Done.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Restore on the other side
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nodestone restore &amp;lt;fingerprint&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The other agent picks up exactly where you left off — decisions, tasks, file state, everything.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real example: cross-agent handoff
&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;# Session 1 — Claude Code&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;nodestone decision add &lt;span class="s2"&gt;"Use FastAPI over Flask"&lt;/span&gt; &lt;span class="nt"&gt;--context&lt;/span&gt; &lt;span class="s2"&gt;"Need async support for WebSockets"&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;nodestone task add &lt;span class="s2"&gt;"Build WebSocket handler"&lt;/span&gt; &lt;span class="nt"&gt;--effort&lt;/span&gt; 3h
&lt;span class="nv"&gt;$ &lt;/span&gt;nodestone pack
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Context fingerprint: ns_X7k2m9 &lt;span class="o"&gt;(&lt;/span&gt;copied to clipboard&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Session 2 — Cursor (next day)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;nodestone restore ns_X7k2m9
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Restored: 3 decisions, 4 tasks, 2 file changes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No pastebin, no markdown file, no "as I mentioned yesterday...".&lt;/p&gt;




&lt;h2&gt;
  
  
  A note on trade-offs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Works best with &lt;code&gt;pack&lt;/code&gt; + &lt;code&gt;restore&lt;/code&gt; flow. Real-time sync across agents is on the roadmap but not here yet.&lt;/li&gt;
&lt;li&gt;The scheduler (OR-Tools CP-SAT) is powerful but overkill for hobby projects — you can ignore it entirely.&lt;/li&gt;
&lt;li&gt;It's new. Documentation is good but the community is small. That said, the core loop (decisions + tasks + pack/restore) is solid.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fingerprint handoff&lt;/strong&gt; (done): zero-loss context transfer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drift detection&lt;/strong&gt; (done): alerts when implementation diverges from plan&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugins/triggers&lt;/strong&gt; (done): webhooks, MCP tools, CLI hooks on state changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time sync&lt;/strong&gt; (next): multiple agents sharing context live&lt;/li&gt;
&lt;/ul&gt;




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

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/massiron/nodestone" rel="noopener noreferrer"&gt;https://github.com/massiron/nodestone&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Site: &lt;a href="https://deepstrain.dev" rel="noopener noreferrer"&gt;https://deepstrain.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Install: &lt;code&gt;pip install nodestone&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're switching between AI tools on the same project, give it a try. Feedback and PRs welcome.&lt;/p&gt;

</description>
      <category>nodestone</category>
    </item>
    <item>
      <title>Code Analysis Without Hallucinations: Using Code Atlas for Deterministic AST Parsing</title>
      <dc:creator>massiron</dc:creator>
      <pubDate>Mon, 08 Jun 2026 14:39:46 +0000</pubDate>
      <link>https://dev.to/massiron/code-analysis-without-hallucinations-using-code-atlas-for-deterministic-ast-parsing-4i4e</link>
      <guid>https://dev.to/massiron/code-analysis-without-hallucinations-using-code-atlas-for-deterministic-ast-parsing-4i4e</guid>
      <description>&lt;p&gt;If you've ever asked an AI to find all references to a function in your codebase, only to get back a fictional method name or a path that doesn't exist, you know the pain of hallucinated code analysis. LLMs are great for summarization and generation, but they're terrible at deterministic tasks like symbol resolution or dependency graph extraction.&lt;/p&gt;

&lt;p&gt;Enter &lt;strong&gt;Code Atlas&lt;/strong&gt; (atlas). It's a deterministic, offline code intelligence engine that works purely on AST parsing — no LLM, no cloud, no hallucinations. You install it with pip, point it at a directory, and get instant, reproducible results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;code-atlas
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. No Docker, no server setup, no API keys. It runs fully offline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Index your codebase
&lt;/h2&gt;

&lt;p&gt;Navigate to your project root and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;atlas index
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This parses all supported files (Python, JavaScript, TypeScript, Go, Rust, Java, and more) into an AST-based index stored locally. The index is deterministic — same code always produces the same index.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Search for symbols
&lt;/h2&gt;

&lt;p&gt;Find every definition and reference to a function or class:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;atlas search &lt;span class="s2"&gt;"parse_config"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output includes file paths, line numbers, and the symbol type (function, class, variable). No guesswork.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Trace dependencies
&lt;/h2&gt;

&lt;p&gt;Visualize import relationships and detect circular dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;atlas graph &lt;span class="nt"&gt;--format&lt;/span&gt; mermaid
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This prints a dependency graph in Mermaid format, which you can render in your docs or CI pipeline. It's excellent for impact analysis before a refactor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Run code quality metrics
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;atlas metrics &lt;span class="nt"&gt;--risk&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Outputs complexity scores, coupling metrics, and risk predictions for each module. This is useful in CI/CD to flag high-risk changes before merging.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Integrate with AI agents (optional)
&lt;/h2&gt;

&lt;p&gt;If you use AI coding assistants, atlas can serve as a ground-truth layer via its MCP server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;atlas mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Any MCP-compatible agent can now query atlas for real symbol locations, references, and dependency info — eliminating hallucinations from the AI's code analysis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations to be honest about
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Atlas is a CLI tool, not a GUI. If you want a visual code explorer, you'll need to pipe output into something else.&lt;/li&gt;
&lt;li&gt;The free tier covers basic search and symbol lookup. Pro features like risk scoring and deep dependency graphs require a $12/month subscription.&lt;/li&gt;
&lt;li&gt;It doesn't understand dynamic code patterns (e.g., &lt;code&gt;getattr()&lt;/code&gt; in Python) — AST parsing has limits.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When to use Code Atlas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;In CI/CD pipelines where you need deterministic quality gates&lt;/li&gt;
&lt;li&gt;When refactoring large codebases and need to find all usages of a deprecated API&lt;/li&gt;
&lt;li&gt;For AI agent workflows that require factual code context alongside LLM reasoning&lt;/li&gt;
&lt;li&gt;Any time you want code analysis that is 100% reproducible and privacy-safe&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try it yourself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;code-atlas
atlas index
atlas search &lt;span class="s2"&gt;"your_function_name"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repo: &lt;a href="https://github.com/mete-dotcom/code-atlas" rel="noopener noreferrer"&gt;https://github.com/mete-dotcom/code-atlas&lt;/a&gt;&lt;br&gt;
Docs: &lt;a href="https://massiron.com/atlas" rel="noopener noreferrer"&gt;https://massiron.com/atlas&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>staticanalysis</category>
      <category>devtools</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
