Ian MackinnonSheet set · Builds · 5 drawings

Builds

Things I've built, drawn as the systems they are, with what I learned building each one.

B-01 · fleet-pm

fleet-pm

How a backlog becomes merged code · select a part
  1. backlogfleet-pm starts from a backlog of feature specs for a software project, one spec per feature.
  2. dispatchIt dispatches Claude Code workers in parallel, each one on its own feature.
  3. worktreeEach worker runs in its own git worktree, so parallel agents never edit the same checkout.
  4. validateEvery result is checked before it can merge.
  5. mergeValidated work is merged, conflicts are resolved, and failures are recorded so later runs can avoid them.

I’ve used it to direct AI-assisted development of more than 10 applications, in fitness, research, education, accounting, legal and compliance, cybersecurity, and marketing.

Drawing
fleet-pm
What it is
An orchestrator that takes a backlog of feature specs, dispatches Claude Code workers in parallel, and validates and merges what they produce.
Used for
10+ applications
Stack
Python · Claude Code · git worktrees
Status
private
Sheet
B-01

B-02 · Alloybase

Alloybase

OPTIMADEdatabasedatabasedatabasedatasetv1, v2, v3pandasJupyter

OPTIMADE gives many materials databases the same query language, so one search can cover several of them. The hard part is everything after the search: keeping track of which database each row came from, versioning a dataset so a paper can cite it, and getting it into pandas or Jupyter. When a database is slow or down, Alloybase shows the results it has and says which sources are missing.

Drawing
Alloybase
What it is
A materials-science research tool that searches across materials databases through the OPTIMADE standard and builds versioned, citable datasets.
Stack
FastAPI · PostgreSQL · Flutter
Status
live
Link
alloybase.app
Sheet
B-02

B-03 · Member RAG chatbot

Member RAG chatbot

10,000members the chatbot serves

intent modelroutes each questioncommunity contentrecipesarticlescustomer supportproduct knowledgeanswer10,000 members, one dot each
An illustration of how a question flows, not live traffic.

I took over my company’s chatbot when our full-stack developer left and started over in Langflow and custom Python. We’ve since shipped tailored versions for two product launches.

The main thing I learned is where the model should and should not sit. My first version was an all-in-one agent that made decisions and ran the retrieval flows itself, and it burned through tokens and gave a mediocre experience. Now a structured-output model identifies the intent, code runs the retrieval that intent needs, and every AI feature has a defined failure mode instead of a guess.

Prompts are versioned and tested against a fixed bank of common member questions, and I think that maintenance process matters as much as the first build.

Drawing
Member RAG chatbot
What it is
A production RAG chatbot and personalization experience for a 10,000-member health and wellness community.
Serves
10,000 members
Stack
Python · Langflow · RAG
Status
in production, private
Sheet
B-03

B-04 · Adaptive Athlete

Adaptive Athlete

athleteagentagentagentprompt packversionedA/B testsin the database

Coaching runs through a multi-agent language-model pipeline. Prompts ship as versioned prompt packs, and A/B tests between versions are stored in the database, so two versions of a prompt can be compared directly. It has subscription billing and runs on DigitalOcean.

Drawing
Adaptive Athlete
What it is
An AI fitness-coaching app I co-founded with family partners.
Stack
FastAPI · PostgreSQL · Docker · Caddy
Status
alpha, private
Sheet
B-04

B-05 · Launch and content automation

Launch and content automation

Launch setup

80 → 1person-hours to set up our most complex launch

BEFORE · about 80 person-hours

AFTER · about 1 hour

Creating every workflow and task for our most complex product launch went from about 80 person-hours to about one hour over three iterations (a workflow redesign, a helper script, then a Google Apps Script orchestrator).

~600 → ~7.5person-hours a year of launch setup, about 590 hours of average projected yearly savings

BEFORE · about 600 person-hours a year

15 rows = 15 launches · 40 squares = 40 person-hours each

AFTER · about 7.5 hours

Projected from an average year of about 15 launches at about 40 person-hours each, at the same reduction as the most complex launch.

Docuseries drafting

100+hours saved drafting a docuseries

sourcemateriallocal AI pipelineruns locallydraftscripts

each dot is one hour handed back to the team

Local AI pipelines drafted the scripts for a 2025 docuseries and saved the team over 100 hours.

Both are internal tools I built at my day job, so there is nothing public to link. Launch setup went through three iterations: a workflow redesign around project phases, a helper script, then a full Google Apps Script orchestrator.

Drawing
Launch and content automation
What it is
Internal AI and automation tooling for project, launch, and content teams at my day job.
Stack
Google Apps Script · Python · local models
Status
in use, private
Sheet
B-05

Built with Astro and developed with Claude Code. All copy reviewed and approved by Ian.