<?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: Michael Boiman</title>
    <description>The latest articles on DEV Community by Michael Boiman (@mboiman).</description>
    <link>https://dev.to/mboiman</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%2F1007132%2Fa3c029e5-e263-4822-8057-54626c4a5947.jpeg</url>
      <title>DEV Community: Michael Boiman</title>
      <link>https://dev.to/mboiman</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mboiman"/>
    <language>en</language>
    <item>
      <title>Your AI coding agent forgets everything every session. I fixed it with markdown and YAML.</title>
      <dc:creator>Michael Boiman</dc:creator>
      <pubDate>Tue, 23 Jun 2026 12:53:04 +0000</pubDate>
      <link>https://dev.to/mboiman/your-ai-coding-agent-forgets-everything-every-session-i-fixed-it-with-markdown-and-yaml-12od</link>
      <guid>https://dev.to/mboiman/your-ai-coding-agent-forgets-everything-every-session-i-fixed-it-with-markdown-and-yaml-12od</guid>
      <description>&lt;p&gt;Every time I opened a fresh session with my coding agent, it started from zero. Which repos am I working across? Which client is this for? Where did we leave off yesterday? I'd re-explain the same context, the agent would occasionally load the wrong project, and nothing I decided last week survived into this one. A "re-explain myself" tax on every single session.&lt;/p&gt;

&lt;p&gt;I tried the obvious fix first — a better prompt, a longer system message. It didn't hold. Context that has to &lt;em&gt;persist&lt;/em&gt; can't live inside the chat; the chat is the thing that resets.&lt;/p&gt;

&lt;p&gt;What actually worked: give the agent a place &lt;strong&gt;outside&lt;/strong&gt; the chat to read and write — and make it the most boring, durable thing I could. Plain files in a git repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  The substrate: markdown + YAML the agent reads at session start
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/bks-lab/open-bridge" rel="noopener noreferrer"&gt;open-bridge&lt;/a&gt; is a plain git repo of markdown and YAML. At the start of every session the agent reads it, so it begins already knowing my world. No database, no SaaS, no daemon, nothing to host — the substrate itself runs &lt;em&gt;nothing&lt;/em&gt;. It's just files the agent reads.&lt;/p&gt;

&lt;p&gt;That "just files" choice is the whole point:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agents can read a file but can't hold an API key.&lt;/strong&gt; What I write today, the agent still reads in six months — no migration, no second app, no vendor lock-in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's auditable.&lt;/strong&gt; Clone it and &lt;code&gt;cat&lt;/code&gt; anything the agent reads. No black box.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's model- and tool-agnostic.&lt;/strong&gt; Plain text is something every agent runtime can read.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A tiny slice of what that looks like (from the repo's &lt;code&gt;examples/agency&lt;/code&gt; setup — fictional "Acme Dev"):&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;# ecosystem.yaml — the repos/clients the agent should know about&lt;/span&gt;
&lt;span class="na"&gt;projects&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;bigcorp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;    &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;display_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BigCorp&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;E-Commerce"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;repos&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;bigcorp-api&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;bigcorp-frontend&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;startupxyz&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;display_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;StartupXYZ&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;MVP"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;     &lt;span class="nv"&gt;repos&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;startupxyz-app&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt; &lt;span class="pi"&gt;}&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;# work/board.md — generated from the task dirs, read every session
## Doing
| bigcorp-api-payment-retry | incident | P1 | Stripe webhook retries failing |
| startupxyz-onboarding     | feature  | P2 | guided signup flow             |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So when I say &lt;em&gt;"good morning, briefing"&lt;/em&gt;, the agent doesn't ask "GitHub or Jira?" or load the wrong client. It already knows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two things this gives you
&lt;/h2&gt;

&lt;p&gt;I lean on two ideas — both honestly just names for behaviours the files enable:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context that's always there.&lt;/strong&gt; The agent reads a persistent, structured layer every session: your repos, your clients, your conventions, what you did yesterday. A third side beside the model and the tool. It stops asking, stops guessing, stops reloading the wrong thing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structure instead of a pile.&lt;/strong&gt; Most of my AI work used to be a bare My-Documents folder — every conversation a fresh heap. open-bridge ships a plain-text work system: a board, a daily log, and per-task status (&lt;code&gt;backlog → doing → review → done&lt;/code&gt;). Decisions and findings get filed as you go, in text the agent reads back later. Unstructured sessions become a filed, compounding record.&lt;/p&gt;

&lt;h2&gt;
  
  
  One convention, several agents
&lt;/h2&gt;

&lt;p&gt;Because it's plain text, it isn't tied to one tool. A single &lt;code&gt;skills/&lt;/code&gt; tree is discovered by Claude Code, Codex, and Copilot CLI through the standard skill symlinks. The substrate stays the same; the agent on top is swappable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest about where this is
&lt;/h2&gt;

&lt;p&gt;The part I want to be straight about: it's &lt;strong&gt;one self-hosted instance — mine&lt;/strong&gt; (built at BKS-Lab), with no external users yet. I'm sharing the method and the substrate, not an adoption story. The README is upfront about what's proven, what's a bet, and what isn't built yet. If you try it, I genuinely want to hear where it breaks.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;20-second walkthrough&lt;/strong&gt; (a real session, replayed): &lt;a href="https://bks-lab.github.io/open-bridge/demo.html" rel="noopener noreferrer"&gt;https://bks-lab.github.io/open-bridge/demo.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repo (MIT):&lt;/strong&gt; &lt;a href="https://github.com/bks-lab/open-bridge" rel="noopener noreferrer"&gt;https://github.com/bks-lab/open-bridge&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;There's a complete worked setup in &lt;a href="https://github.com/bks-lab/open-bridge/tree/main/examples/agency" rel="noopener noreferrer"&gt;&lt;code&gt;examples/agency/&lt;/code&gt;&lt;/a&gt;. Clone it, open it in your agent, and ask it — without pasting any context — to summarize the repos, the clients, and how the task board is organized. That's the whole pitch in one prompt.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's markdown and YAML. That's the entire trick — and kind of the point.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
