<?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>Three months of running a consultancy out of a git repo our coding agents read</title>
      <dc:creator>Michael Boiman</dc:creator>
      <pubDate>Wed, 30 Sep 2026 19:41:20 +0000</pubDate>
      <link>https://dev.to/mboiman/three-months-of-running-a-consultancy-out-of-a-git-repo-our-coding-agents-read-ncm</link>
      <guid>https://dev.to/mboiman/three-months-of-running-a-consultancy-out-of-a-git-repo-our-coding-agents-read-ncm</guid>
      <description>&lt;p&gt;In June I wrote about &lt;a href="https://dev.to/mboiman/your-ai-coding-agent-forgets-everything-every-session-i-fixed-it-with-markdown-and-yaml-12od"&gt;the repo that stops my coding agent from forgetting everything overnight&lt;/a&gt;. Three months later the four of us at BKS-Lab run our daily work on it, and we run closed instances of it for other companies. This is what held up and what did not.&lt;/p&gt;

&lt;p&gt;Some numbers from my own instance, measured on 24 September: 4,072 work-log rows since 4 July, 164 closed tasks, 2,426 commits since 20 June.&lt;/p&gt;

&lt;p&gt;## What it is, in one paragraph&lt;/p&gt;

&lt;p&gt;open-bridge is a git repo of markdown and YAML. Claude Code, Codex or Copilot CLI read it at the start of every session: which repos and clients exist, which tasks are open, what happened yesterday. There is no database and no service to host. When I say "good morning", the agent answers from those files: which client is mid-incident, what the next step is, what waits for review.&lt;/p&gt;

&lt;p&gt;I run my whole working day from it: client projects, repos, my machines, mail, even the paperwork at home. From a meeting recording it writes minutes, tasks and a draft mail. It wakes my home server, checks that the backups are fresh, and tells me in the morning what matters today. It knows which client I am working for and which signature I write with, because all of that is a file in the repo.&lt;/p&gt;

&lt;p&gt;## What held up&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The daily log is the real memory.&lt;/strong&gt; Every unit of work gets one row: date and time, a glyph, the project, what happened. Nothing clever. The morning briefing reads the last few days of it, and that removes most of the "where was I" friction. The rule that made it work: a row is written the moment the work lands, never batched at the end of the day.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One folder per task beats one big notes file.&lt;/strong&gt; Each task has a STATUS.md with a small YAML header (status, priority, where it came from) and free text below. The board is generated from those folders and never edited by hand, so it cannot drift from the truth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Private data and the shared template never touch.&lt;/strong&gt; My data lives on a private user branch, the template lives on main. They use disjoint paths, so pulling template updates is a plain merge. A pre-push hook refuses to push the private branch to a public remote.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The agent proposes, I press the button.&lt;/strong&gt; Mails are drafts, merges are mine, deletes need a yes. This sounds slow. In practice it is what lets me hand the agent real work.&lt;/p&gt;

&lt;p&gt;## The part a notes vault does not cover&lt;/p&gt;

&lt;p&gt;There are good projects that wire an Obsidian-style notes vault to a coding agent. They remember well for one person. Our problem was different: several clients, several roles, and a team.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One instance per company.&lt;/strong&gt; Client data never sits in the same repo as another client's. The agent is the same, the instance it reads decides what it knows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A shared layer for the team.&lt;/strong&gt; Our company skills, accounts, projects and rules live in a separate overlay repo that every instance subscribes to. When someone new joins, they get a Bridge on day one that already knows our clients and our routines. Their own data stays on their own branch.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we had to fix
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Context grows until it hurts.&lt;/strong&gt; After a few months, the files an agent reads before its first answer had quietly grown far past what anyone had decided to load. We now keep a byte budget for that always-loaded part, and CI fails when it is exceeded. Everything else is an index: one line per repo or client, the full entry fetched only when a name comes up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Where does this live?" became the most common question.&lt;/strong&gt; So there is now a plain table that maps questions in everyday words to the file that answers them, and a check that every link in it resolves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One size did not fit.&lt;/strong&gt; Our first worked example was a two-client agency. The instance that got the most use belongs to one person wearing several hats: consultancy partner, freelancer, household, home server. That shape now ships as a second example.&lt;/p&gt;

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

&lt;p&gt;You do not need to clone anything by hand. Copy the setup prompt from &lt;a href="https://bks-lab.github.io/open-bridge/#get-started" rel="noopener noreferrer"&gt;https://bks-lab.github.io/open-bridge/#get-started&lt;/a&gt; and paste it into Claude Code, Codex or Copilot CLI. The agent checks your tools, shows you its plan and waits for your go, creates your own private repo, and then walks you through onboarding: who you are, which repos and clients you work with, and a first briefing built from your own setup.&lt;/p&gt;

&lt;p&gt;Want to look around first? The first option onboarding offers is a two-minute live demo: a fictional two-client agency with a P1 incident in flight. Say "good morning" there, and everything it answers comes from markdown files next to you.&lt;/p&gt;

&lt;p&gt;The repo is MIT: &lt;a href="https://github.com/bks-lab/open-bridge" rel="noopener noreferrer"&gt;https://github.com/bks-lab/open-bridge&lt;/a&gt;. The first outside contributions landed in the last two weeks: a GitLab tracker playbook, a French locale theme, and a tested Cursor setup on Windows. More good first issues are open if you want to help, for example a Spanish locale theme, a Jira or Linear tracker playbook, and testing the demo in Gemini CLI: &lt;a href="https://github.com/bks-lab/open-bridge/labels/good%20first%20issue" rel="noopener noreferrer"&gt;https://github.com/bks-lab/open-bridge/labels/good%20first%20issue&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The longer story of why we opened it: &lt;a href="https://bks-lab.com/en/blog/open-bridge-open-source/" rel="noopener noreferrer"&gt;https://bks-lab.com/en/blog/open-bridge-open-source/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How do you keep a coding agent oriented across several projects or clients? What broke for you?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>productivity</category>
      <category>claudecode</category>
    </item>
    <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>
