Midland is a shared context layer for the unstructured content created in AI sessions and automated agent runs. It gives that content a structure that people and agents can understand, update and use across different AI tools.
Problem
None of the memory solutions worked multiplayer, and all eventually drifted, bloated and went stale.
Approach
A Linear-inspired typed data model served over MCP, tested against several models in a harness.
Outcome
Continuous experimentation to build self-improving workflows and accumulated knowledge.
Sarah Miller
Records a voice session on ChatGPT mobile on her walk home, about two billing complaints support flagged today.
Read Capture ideas· Product Skill
Read Product feedback· Product Collection
Write Usage alerts· Product feedback
Write Surprise invoices cost more trust than revenue· Blog ideas
ChatGPT
Saved Usage alerts to Product feedback, since nothing like it was there yet. The trust angle is in Blog ideas.
David Chen
Asks Claude to save his 9,239-word Acme renewal call from Granola to Midland, which sets off the call-notes processing.
Write Acme renewal call· Customer transcripts
Read Process call notes· Customers Skill
Update Usage alerts· Product feedback
Write CSV export times out on large projects· Bug reports
Claude
Acme asked for the same warning Sarah logged yesterday, so they’re now the third case on Usage alerts. The export bug is in Bug reports with Rose’s description.
Laura Bennett
Sees David’s Claude read “admin” as whoever created the project, and saves the team’s own definition.
Read Usage alerts· Product feedback
Create Admin· Product Term
Update Usage alerts· Product feedback
Claude
Admin now means members who manage billing and seats. Usage alerts links to it, so every agent sends alerts to the same people.
Sarah Miller
Settles what’s decided on usage alerts with ChatGPT before her week off.
Read Usage alerts· Product feedback
Update Usage alerts· Product feedback
Laura Bennett
Picks up usage alerts in Cursor on Monday without needing to reach Sarah.
Read Usage alerts· Product feedback
Read Acme renewal call· Customer transcripts
Cursor
Alerts go out at 80% and 100%, to admins. Three customers asked for them. The email wording is still open, as Sarah noted.
James Carter
Runs sprint planning, which fills in each task with the customer context and the outcome it should reach.
Read Plan a sprint· Engineering Skill
Read CSV export times out on large projects· Bug reports
Read Usage alerts· Product feedback
Write Sprint 43· Sprint plans
Claude
Moved the export fix ahead of the dashboard tweak, since Acme splits projects every week to work around it. Each task links its sources. The export fix lists Acme’s 12,000-row project as test data. Saved to Sprint plans.
Laura Bennett
Has Cursor scope usage alerts against what the team already decided, before writing any code.
Read Sprint 43· Sprint plans
Read Pricing· Sales File
Read Admin· Product Term
Update Sprint 43· Sprint plans
Cursor
Limits come from Pricing, not hard-coded plan amounts. Emails go to admins, as defined. Added tests for the 80% and 100% thresholds to the sprint.
Emma Wilson
Writes up October’s release for the website, and adds the post Sarah suggested.
Read October release· Release notes
Read Surprise invoices cost more trust than revenue· Blog ideas
Read Brand voice· Marketing File
Update What’s new· Website copy
Lovable
Added usage alerts and the export fix to What’s new. Drafted the post from Sarah’s angle, with Acme’s case as the example.
I designed and built a typed data model inspired by Linear, served over MCP, and a visual application. I test it against several models in a harness that agentic loops maintain.
Finding a structure agents could understand
Local markdown files worked reasonably well at first, until they began to drift and maintaining them became a growing task. With other memory tools, I found it difficult to understand where information ended up and whether an agent would find it when needed.
While working on a farm data project with Agronod and my brother, who isn't technical, I tried to share the context I'd developed with my agents. That was much harder than expected. My setup worked for me because I understood how it was organized, but he couldn't pick it up and continue where I'd left off.
At the same time, I was spending hours in AI sessions doing research, making decisions and working through problems. These sessions produced information I wanted to keep somewhere another agent or person could find it.
My first idea was to fetch information from existing systems and serve it to agents over one MCP. Over time, I became more interested in saving what AI sessions themselves produced. That was increasingly where my work was happening.
Of the systems I used during development, Linear over MCP was often the most reliable source of information for agents. Its issues had identities, states, relationships and owners. An agent could discover those properties rather than infer them from loosely organized documents. I wanted to see whether a similar approach would work for other kinds of context.
Midland took shape around terms and metrics, files, collections and skills, each with rules about how information should be saved and used. A metric, for example, has a definition and a source. I wanted the agent to retrieve those along with the number, rather than work out what it meant from whatever documents happened to be available.
I also experimented with connecting instructions to the context they required, so a skill describing how to perform a task could point to the definitions, metrics or documents needed to complete it.
Designing an interface for agents
I spent a considerable amount of time working on Midland's MCP tools. Each tool had a name, description, arguments and possible errors. An agent had to interpret these and decide when to use the tool, what information to provide and how to respond to the result.
Relatively small changes to the descriptions could have a large effect on behaviour, so I built a test system to investigate this more systematically. I compared phrasing, the number of tools and the order instructions were loaded, then added checks that ran across models when I changed the code.
When an agent failed to retrieve information or answered incorrectly, I could change a description, instruction or part of the data structure and run the test again. Smaller models were particularly useful here. They often struggled with instructions that more capable models could interpret correctly.
I found this interesting from a design perspective because the tools and instructions were an interface agents interpreted on behalf of people. I could observe where they misunderstood it and revise the interface based on their behaviour. I logged every agent mistake in Midland, which created few-shot examples used to improve tool descriptions.
Checksfoundation · pull request5 checks
ci / verifyPassed
ci / rlsPassed
code review / reviewPassed
security review / reviewPassed
control questions3 agents · Claude Opus 5.559 of 74
What does “admin” mean on this team?
Which plan limits do usage alerts read from?
Is the session-start briefing being built?
Who owns the brand voice guide?
Who can narrow an item's access?
Which skill processes call notes?
Automated checks run on every change to Midland. The last one asks three agents the same questions and scores their answers. Two fell short. The answer had changed, and the agents gave the old one.
Letting loops keep it current
The checks above run when I change the code. The content changes far more often, and it drifts the same way my local markdown files once did. So Midland runs loops: scheduled agent runs that act as their own member of the workspace. Each loop follows a skill, writes through the same tools as any other agent and records what it did. Its changes show in an item's history like anyone else's.
Ask the control questions
A loop asks a fixed set of questions with known answers, across several models, and scores the answers. It's the same harness, pointed at the content instead of the code. When an answer drifts, the loop records which item misled the agent and why, so a wrong answer becomes something I can fix.
Push it to git
A loop exports the workspace to a git repository daily. I wanted the context to be backed up outside Midland, with history but no conflicts to resolve. Owning the content is a must for this product category.
Flag what no longer holds
Some drift is quieter. A decision gets superseded, or a text still quotes something that was archived. A loop reads across items for those and for plain contradictions. It doesn't rewrite anything. It adds a flag the next reader sees, agent or person, and the owner decides.
Run custom jobs
Most upkeep is specific to a workspace, so any skill can run as a loop. One completes records that were saved half-finished. Another breaks up long content, like call transcripts, into specific knowledge such as decisions, product feedback and customer relationships.
Trying to remove the interface
Initially, I wanted people to work through the AI tools they already used. They could ask an agent to save information, retrieve it later or share it with another person.
This let me concentrate on the data model and agent tools, but people outside my own workflow had difficulty understanding what was happening. Through a conversation, they could retrieve individual pieces of information. They couldn't easily see what existed, what was missing or whether an agent had organized something incorrectly.
I knew the model and its assumptions, so I could usually work out what was going on. Someone encountering Midland for the first time didn't have that understanding.
I eventually built a visual application for inspecting and maintaining the context. I started with the questions I kept asking myself: what was in the workspace, what my agents relied on, what needed attention and who had changed what.
The overview groups items by category and type, with activity showing what gets read and updated. Opening an item shows its content, owner, permissions and writing conventions. Its history records who read or changed it, through which AI tool and when.
I still wanted agents to handle most of the interaction, but people needed a way to inspect and correct what they were doing.
Overview
Acme742 items1.5M tokens
Blog post ideas
Collection
Blog post ideas
Ideas for blog posts, one file per post. Each file is an outline: suggested headings with a short note under each on what the post should say. Read when picking the next post to write. Holds outlines only, never finished drafts.
Sarah
Marketing
No update expectation
All members
All members
All settings
ActivityView
RelatedBrand voice and Positioning
Writing conventionsView
6 entries
What a shared context layer changes for a five-person team2d ago by Sarah
Lessons from wiring three AI tools to one source of truth5d ago by David
Why we stopped syncing skill files by hand1w ago by Sarah
The metrics our agents read before they answer2w ago by Marcus
How we set up a new teammate's tools in ten minutes3w ago by Priya
Notes on writing definitions an agent can use1mo ago by Sarah
Architecture decisions
Collection
Architecture decisions
One file per decision on how the system is built: the context, the options weighed, what was chosen and why. Read before proposing a change to the architecture. A reversal is a new decision, never an edit.
David
Engineering
No update expectation
All members
All members
All settings
ActivityView
RelatedEngineering principles and Tech stack
Writing conventionsView
6 entries
ADR 018: Serve context over MCP, not per-tool plugins4d ago by David
ADR 017: One Postgres database with row-level security2w ago by David
ADR 016: Keep every write as a new version3w ago by Priya
ADR 015: Background jobs in the database, no queue1mo ago by David
ADR 014: Magic-link sign-in only1mo ago by Priya
ADR 013: Markdown as the only body format2mo ago by David
Customer meeting transcripts
Collection
Customer meeting transcripts
One file per customer call, saved when the call ends: a short summary on top, then the full transcript. Read before any call with the same customer.
Marcus
Customers
Daily
All members
All members
All settings
ActivityView
RelatedAccounts and Support escalations
Writing conventionsView
6 entries
Acme: quarterly review1h ago by Marcus
Acme: onboarding check-inYesterday by Emma
Acme: renewal call2d ago by Marcus
Acme: questions on pricing4d ago by Emma
Acme: integration walkthrough1w ago by David
Acme: kickoff2w ago by Marcus
Plan sprint
Skill
Plan sprint
Turns the roadmap and open bugs into a two-week sprint: what goes in, who owns it and what is left out. Run it at the start of every sprint, from any AI tool.
James
Product
Every 2 weeks
All members
All members
All settings
ActivityView
RelatedQ4 roadmap and Open bugs
Writing conventionsView
SKILL.md3 files
Version 745m ago
When to use
A new sprint starts, every other Monday.
The roadmap changes mid-sprint and the plan needs another look.
Not for hotfixes: those go straight to whoever is on call.
Read first
Q4 roadmap, for this quarter's goals and what is promised.
Open bugs, sorted by how many customers reported each.
The last two files in Sprint plans, for pace and carryover.
Who is out. Ask if the calendar is not connected.
Steps
Work out the room: the last two sprints' pace, less time off.
Keep 20% of it free for what comes up.
Put carryover in first, then urgent bugs, then roadmap work.
Leave out anything that still needs discovery, and say why.
Give every task an owner and a done line.
Write the sprint goal in one sentence.
Save the plan to Sprint plans and post it in Slack.
Output
The sprint goal, then a table: task, owner, size, done line.
What was left out and why, under its own heading.
Risks: work that waits on another team or on one person.
Rules
Every bug in the plan links the customer calls that raised it.
Ask before moving work another team depends on.
Never post the plan before the team lead says yes.
Overview
Most read161 items528k tokens
Blog post ideas
Collection
Blog post ideas
Ideas for blog posts, one file per post. Each file is an outline: suggested headings with a short note under each on what the post should say. Read when picking the next post to write. Holds outlines only, never finished drafts.
Sarah
Marketing
No update expectation
All members
All members
All settings
ActivityView
RelatedBrand voice and Positioning
Writing conventionsView
6 entries
What a shared context layer changes for a five-person team2d ago by Sarah
Lessons from wiring three AI tools to one source of truth5d ago by David
Why we stopped syncing skill files by hand1w ago by Sarah
The metrics our agents read before they answer2w ago by Marcus
How we set up a new teammate's tools in ten minutes3w ago by Priya
Notes on writing definitions an agent can use1mo ago by Sarah
Architecture decisions
Collection
Architecture decisions
One file per decision on how the system is built: the context, the options weighed, what was chosen and why. Read before proposing a change to the architecture. A reversal is a new decision, never an edit.
David
Engineering
No update expectation
All members
All members
All settings
ActivityView
RelatedEngineering principles and Tech stack
Writing conventionsView
6 entries
ADR 018: Serve context over MCP, not per-tool plugins4d ago by David
ADR 017: One Postgres database with row-level security2w ago by David
ADR 016: Keep every write as a new version3w ago by Priya
ADR 015: Background jobs in the database, no queue1mo ago by David
ADR 014: Magic-link sign-in only1mo ago by Priya
ADR 013: Markdown as the only body format2mo ago by David
Customer meeting transcripts
Collection
Customer meeting transcripts
One file per customer call, saved when the call ends: a short summary on top, then the full transcript. Read before any call with the same customer.
Marcus
Customers
Daily
All members
All members
All settings
ActivityView
RelatedAccounts and Support escalations
Writing conventionsView
6 entries
Acme: quarterly review1h ago by Marcus
Acme: onboarding check-inYesterday by Emma
Acme: renewal call2d ago by Marcus
Acme: questions on pricing4d ago by Emma
Acme: integration walkthrough1w ago by David
Acme: kickoff2w ago by Marcus
Plan sprint
Skill
Plan sprint
Turns the roadmap and open bugs into a two-week sprint: what goes in, who owns it and what is left out. Run it at the start of every sprint, from any AI tool.
James
Product
Every 2 weeks
All members
All members
All settings
ActivityView
RelatedQ4 roadmap and Open bugs
Writing conventionsView
SKILL.md3 files
Version 745m ago
When to use
A new sprint starts, every other Monday.
The roadmap changes mid-sprint and the plan needs another look.
Not for hotfixes: those go straight to whoever is on call.
Read first
Q4 roadmap, for this quarter's goals and what is promised.
Open bugs, sorted by how many customers reported each.
The last two files in Sprint plans, for pace and carryover.
Who is out. Ask if the calendar is not connected.
Steps
Work out the room: the last two sprints' pace, less time off.
Keep 20% of it free for what comes up.
Put carryover in first, then urgent bugs, then roadmap work.
Leave out anything that still needs discovery, and say why.
Give every task an owner and a done line.
Write the sprint goal in one sentence.
Save the plan to Sprint plans and post it in Slack.
Output
The sprint goal, then a table: task, owner, size, done line.
What was left out and why, under its own heading.
Risks: work that waits on another team or on one person.
Rules
Every bug in the plan links the customer calls that raised it.
Ask before moving work another team depends on.
Never post the plan before the team lead says yes.
Overview
Most read161 items528k tokens
Blog post ideas
Collection
Blog post ideas
Ideas for blog posts, one file per post. Each file is an outline: suggested headings with a short note under each on what the post should say. Read when picking the next post to write. Holds outlines only, never finished drafts.
Sarah
Marketing
No update expectation
All members
All members
All settings
ActivityView
RelatedBrand voice and Positioning
Writing conventionsView
6 entries
What a shared context layer changes for a five-person team2d ago by Sarah
Lessons from wiring three AI tools to one source of truth5d ago by David
Why we stopped syncing skill files by hand1w ago by Sarah
The metrics our agents read before they answer2w ago by Marcus
How we set up a new teammate's tools in ten minutes3w ago by Priya
Notes on writing definitions an agent can use1mo ago by Sarah
Architecture decisions
Collection
Architecture decisions
One file per decision on how the system is built: the context, the options weighed, what was chosen and why. Read before proposing a change to the architecture. A reversal is a new decision, never an edit.
David
Engineering
No update expectation
All members
All members
All settings
ActivityView
RelatedEngineering principles and Tech stack
Writing conventionsView
6 entries
ADR 018: Serve context over MCP, not per-tool plugins4d ago by David
ADR 017: One Postgres database with row-level security2w ago by David
ADR 016: Keep every write as a new version3w ago by Priya
ADR 015: Background jobs in the database, no queue1mo ago by David
ADR 014: Magic-link sign-in only1mo ago by Priya
ADR 013: Markdown as the only body format2mo ago by David
Customer meeting transcripts
Collection
Customer meeting transcripts
One file per customer call, saved when the call ends: a short summary on top, then the full transcript. Read before any call with the same customer.
Marcus
Customers
Daily
All members
All members
All settings
ActivityView
RelatedAccounts and Support escalations
Writing conventionsView
6 entries
Acme: quarterly review1h ago by Marcus
Acme: onboarding check-inYesterday by Emma
Acme: renewal call2d ago by Marcus
Acme: questions on pricing4d ago by Emma
Acme: integration walkthrough1w ago by David
Acme: kickoff2w ago by Marcus
Plan sprint
Skill
Plan sprint
Turns the roadmap and open bugs into a two-week sprint: what goes in, who owns it and what is left out. Run it at the start of every sprint, from any AI tool.
James
Product
Every 2 weeks
All members
All members
All settings
ActivityView
RelatedQ4 roadmap and Open bugs
Writing conventionsView
SKILL.md3 files
Version 745m ago
When to use
A new sprint starts, every other Monday.
The roadmap changes mid-sprint and the plan needs another look.
Not for hotfixes: those go straight to whoever is on call.
Read first
Q4 roadmap, for this quarter's goals and what is promised.
Open bugs, sorted by how many customers reported each.
The last two files in Sprint plans, for pace and carryover.
Who is out. Ask if the calendar is not connected.
Steps
Work out the room: the last two sprints' pace, less time off.
Keep 20% of it free for what comes up.
Put carryover in first, then urgent bugs, then roadmap work.
Leave out anything that still needs discovery, and say why.
Give every task an owner and a done line.
Write the sprint goal in one sentence.
Save the plan to Sprint plans and post it in Slack.
Output
The sprint goal, then a table: task, owner, size, done line.
What was left out and why, under its own heading.
Risks: work that waits on another team or on one person.
Rules
Every bug in the plan links the customer calls that raised it.
Ask before moving work another team depends on.
Never post the plan before the team lead says yes.
Taking it outside my own workflow
I got six companies to try Midland in small groups, to see whether it could solve a problem beyond my own use. The pilots exposed weaknesses my technical experiments hadn't.
Setup was difficult. Some participants got started independently, while others needed substantial help. Most people I spoke with preferred a hosted product they could sign into over a project they could download and adapt, which was a parallel thesis I wanted to test.
The companies also wanted different things. A “company brain” could mean answers from internal documents, preserving knowledge or making workflows available to agents. In several cases, the immediate problem could probably have been addressed with something simpler than Midland (or not by any AI at all).
The problems I focused most on solving were for people who had already adopted AI into their day 2 day. Working with companies at different stages of adoption pulled me toward a broader set of needs, including helping people get started with AI at all. Understanding where they were required conversations and earned trust, and I had to decide how much of that work I wanted to take on.
I closed the pilots and settled on the technical side of managing shared context. I was building Midland as a side project, and the broader adoption work was taking me toward running a consultancy.
What I would do differently
Because building software with AI had become faster and cheaper, I allowed myself to explore too many possibilities. There was always another experiment worth running, another tool to refine or another part of the model to improve. Since I was learning from each one, it was easy to justify continuing.
I don't think that exploration was wasted. I needed to understand data modelling and agent behaviour well enough to make informed decisions, particularly because I was working alone in an unfamiliar field, and to build intuition and taste for agentic work. But I would spend less time accommodating hypothetical uses before establishing that someone needed them.
Starting over, I'd work with a few like-minded people who have the same context maintenance problems and focus on a smaller set of things to solve. I'd revisit those problems as the models improved and keep track of which ones still needed Midland. These are hard to convert as design partners though (I tried with a few).
My interest was in building a shareable, adaptable system. I'd keep the work closer to that purpose, with less time spent trying to turn it into a company.
Where Midland is now
Midland is a continuous experiment in self-improving workflows and knowledge that accumulates. A hosted beta is live, and the source opens in December. It's also something I use in my own work. I can move between AI tools without rebuilding my context. When I first connected a new agent to Midland, it could access information I'd accumulated through months of work with other tools. A few friends are connected to my workspace, and we collaborate asynchronously through it.
I'd like to extend that experience to teams, where a new person or agent could start working with an understanding of what others have already established. Making that work across people has been harder than making it work across agents.