MonoMind AI Lab · The owner's deck

Project Hub

A central hub for the owner of many projects. Author the global knowledge once, set the guardrails that apply everywhere, and keep the latest context from every repository in a single private workspace — without ever asking a builder for access.

v0.2.0 What it is · What you get · How it works · How to use it github.com/monomind-ai-lab/project-hub

Part 1 · What it is

You administer the repositories. You do not work in them daily.

Each project already keeps its own record — its own state, its own decisions, its own learnings — and that is right: the people doing the work own the record of the work. What is missing is the other two halves.

Missing half one · authorship

Guardrails, workflows and the skills your agents use apply everywhere, so they get retyped everywhere — six repositories, six slightly different versions, and no answer to which one is current.

Missing half two · sight

Seeing every project at once means cloning six repositories and reading six NOW.md files, one at a time, in six checkouts you do not otherwise keep.

A Hub is both halves and nothing more. One place the tier that applies everywhere is authored, and one place every project can be read together.

Part 1 · What it is

Plain Markdown in a Git repository.

No database, no service to log into, no runtime dependency. An agent reads it; so can you.

  • One private repository, owned by one person. It is not a project repository, and it is not a second knowledge base sitting beside your projects.
  • It holds three kinds of thing: the global tier you author, one folder per project you oversee, and a working space that is only yours.
  • Every command plans first. --dry-run prints exactly what would happen and writes nothing; --apply does it and prints the same report refreshed. Re-runs are idempotent.
  • If the commands were deleted the Hub would still work, because it is a folder of Markdown and everything above is still true of it.

Part 1 · What it is

The scaffold is not a Hub. This is the thing everyone gets backwards.

The scaffold · public

The repository anyone can read. It is a template: the commands, the record templates, and the onboarding material. It contains no organisation's records — not yours, not anyone's.

Your Hub · private, and stays private

The repository you make from the scaffold. It holds your guardrails and a folder for every project. Builders hold no permission on it — not write, not read.

That last sentence is the whole governance model. There is no permission system to configure and no approval gate to trust: a builder cannot change a guardrail because they cannot see the file. It works on a free plan, where a private repository has no code owners, no protected branches and no required reviewers.

Part 1 · What it is

Two products, split by role rather than by format.

Project Context is the other half of the pair, and this deck assumes it. A repository with no Hub is a complete product; nothing on the repository side requires one.

Project Context
Installed in each project repository, serving the people building that project.
NOW.md · PLAN.md

Their state, their milestone

DECISIONS · LEARNINGS

Their constraints and lessons

same parser · same schema
One record model, validated once
Both sides check records with the same parser, the same schema and the same doctor — because a Hub is itself a Project Context install. The shared code arrives there by the ordinary create-only install rather than being vendored a second time.

Plain Markdown · Git-tracked · no runtime dependency · portable

same doctor
Project Hub
One private repository, administered by the organisation's owner.
global/

The tier that applies everywhere

projects/<id>/

A folder per project overseen

Different role, different audience, different repository — one record model underneath both, so nothing has to be translated at the boundary.

Part 2 · What you get

Four things you did not have, and one thing you never acquire.

01

One place the global tier is authored

Identity, guardrails, workflows, goals, resources. Written once, in global/, and pushed into the repositories that need them.

02

A folder per project

Its mark — remote, branch, visibility, who builds it — your summary of it, and the blueprint you author: the goal it serves and the shape it has to keep.

03

The builders' own records, brought to you

A pull copies each repository's plan, tasks, decisions, learnings and open questions into pulled/. You read them here, together, without cloning anything.

04

A window of your own

owners_window/ is where you write about what is coming: half-formed projects, reflections, an argument with yourself.

No transcripts anywhere. Sessions stay on the machine they happened on. What travels is a short capsule, and only if the builder chose to write one.

Part 2 · What you get

The whole folder, on one page.

  • your-org/your-hub/Private. Builders are not invited
  • global/The tier you author — what reaches repositories
    • SUMMARY.md · GUARDRAILS.md · WORKFLOWS.mdPushed by default
    • skills/ · shared/Pushed by default
    • GOALS.md · RESOURCES.md · people/ · agents/Opt-in, per project
    • IDENTITY.mdNever pushed, at any setting
  • projects/<id>/One folder per project you oversee
    • MARK.mdRemote, default branch, host, visibility, builders, tracker and CI links
    • SUMMARY.mdYour summary of the project
    • blueprint/EPIC.md · ARCHITECTURE.mdAuthored here, pushed down, read-only there
    • pulled/A stamped copy of that repository's own records. Never edited here
  • owners_window/Yours. Never pushed, never linted, never pulled into
  • registry.mdEvery known repository · project, path, remote, branch, last pull, last push
  • guides/Six short guides, one question each
  • skills/The init, pull and push commands · the same code as the slash commands
  • AGENTS.md · .project-hub.json · VERSIONThe contract · the marker, allow-list and budgets · the one version number

Part 3 · How it works

Everything moves by the owner's hand, and only in the direction their access allows.

Nothing in a project repository ever reaches out to a Hub. There is no call home, no registration, no credential. The direction is one way by construction: you have access to their repository because you administer it, and they have none to yours.

Your Hub · private
A project repository · theirs
global/ — the subset the allow-list names
project-context/global/, stamped and read-only
projects/<id>/blueprint/
project-context/blueprint/, stamped and read-only
projects/<id>/pulled/, stamped by hash
Their authored set: plan, tasks, decisions, learnings, questions, inbox
owners_window/
·
Nothing. It moves in neither direction, ever
project-hub push

Hub → repository. Branch only, diff shown, you confirm

project-hub pull

Repository → Hub. Read-only against their repository

project-hub init

Marks a repository, installs Project Context, then pushes

All three are run by the owner, from inside the Hub. Both directions require one of --dry-run or --apply, so nothing writes by accident.

Part 3 · How it works

A push arrives as a pull request, never as a commit on their main branch.

It is the only command that writes into a repository the Hub does not live in, so it is gated every single time.

Gate
before a byte moves
1

The Hub must be clean

A stamp naming a commit that does not contain those bytes is a false provenance record. --allow-dirty overrides.

2

Budgets and the doctor pass

An over-budget file is refused by name; so is a Hub whose own doctor reports errors. --skip-doctor overrides that one.

3

Their tree must be clean

Uncommitted changes there stop it. The default branch is refused outright as a write target.

4

You see the diff and say yes

The prompt says plainly that this writes, pushes and opens a pull request. --yes skips it; a non-interactive session without it is declined, not assumed.

Land
on one branch
5

It commits to hub-sync

Switches to that branch, writes, stages only its own paths, and commits with Source-Commit: and Project-Id: trailers.

6

It pushes that branch

--set-upstream, and never --force. A repeated sync adds a commit rather than rewriting one, so a reviewer's place in an open request survives.

7

It opens the pull request

Against the default branch. An already-open request for that branch is updated, not duplicated.

One long-lived branch per repository, not one per push — repeated syncs stack commits on the same pull request rather than scattering dated branches. Merging stays with the repository; the tool has no path to it.

Part 3 · How it works

What reaches a repository, and what never does.

This is the decision worth understanding, because it is about exposure rather than convenience. Push works from an allow-list, never a deny-list — so any folder you add to the Hub later is non-pushed by default, and needs no special case to stay put.

Setting Files Why
Pushed by defaultSUMMARY.md, GUARDRAILS.md, WORKFLOWS.md, skills/, shared/ — and that project's blueprint/What a builder needs to do the work correctly
Opt-in per projectGOALS.md, RESOURCES.md, people/, agents/Objectives across every project, internal dashboards, and a roster of people are each more sensitive than the guardrails a builder actually needs. Name one in that project's allow-list when you want it there
Never, at any settingIDENTITY.mdA project repository may have collaborators outside the organisation. A Hub whose configuration lists it does not get to push it — the entry is dropped and you are told
Filtered automaticallyAny README.md; any file still carrying the unfilled-seed markerA README explains the Hub, not your organisation. An unfilled seed is a placeholder, and an empty guardrail in front of an agent is worse than no guardrail

Part 3 · How it works

Five numbers, checked rather than suggested.

Every record you push is loaded on every session in every repository that has it. You pay for what you keep, so the budget is enforced at the boundary rather than left to discipline.

RecordWordsScope
global/SUMMARY.md150The global tier in one page
any one global/ file400Per file, whichever record it is
the whole pushed global subset2,000Everything the allow-list sends, added up
blueprint/EPIC.md600Per project — what it is for, and what must be true when it is done
blueprint/ARCHITECTURE.md1,200Per project — the shape it has to keep
What happens when one is exceeded

Push refuses before anything is written, and names the offending file with its word count and its limit. No branch is created, nothing reaches the repository, and no partial sync is left behind.

How a word is counted

Frontmatter, fenced code and HTML comments are stripped first — otherwise a short record with a long example looks over budget while a wall of prose stays under it. Every number is overridable in the Hub's marker file; the identity rule is not.

Part 3 · How it works

The only part of the Hub defined by what does not happen to it.

owners_window/ is your room: future projects, reflections, the thing you will regret not writing down. No template, no naming convention, no schema.

Three negatives
  • Never pushed. The allow-list guarantees it structurally, not by a rule someone has to remember.
  • Never linted. The doctor excludes it by name. No frontmatter, no schema, no word budget, no link validation — a place to think stops being one the moment it reports errors.
  • Never pulled into. A pull writes only to projects/<id>/pulled/.

It is not in the read order either. An agent working in the Hub opens it only when you name it.

Promotion · the way out
It has becomeWrite it as
A project that should existprojects/<id>/MARK.md, then blueprint/EPIC.md
A rule that applies everywhereA record in global/ — usually GUARDRAILS.md or WORKFLOWS.md
A change of directionAn edit to that project's blueprint/EPIC.md

Freeform in, structured out. Promotion is a deliberate act and an ordinary edit — nothing automates it, and nothing should.

Part 4 · How to use it

Four moves, and then you ask.

1

Make a private repository from the scaffold

Clone or fork it. Private, and it stays private — that is the governance model, not a setting you revisit.

2

Clone it and open the folder in the tool you already work in

Claude Code or Codex is where the onboarding agent runs. No Obsidian plugin is needed to start.

3

Ask for it

The scaffold ships the agent, so “set this up”, “activate the hub” or “onboard me” is enough. In a host with no agent format, paste the adapter prompt instead — it is the same seven steps.

4

Answer one round of questions

It identifies the host, writes a thin pointer file for it, helps you seed the global tier, registers your first project, and offers to configure Obsidian. Then it reports what it wrote, what it skipped, and what is still empty.

In any other tool

Read ADAPTER-PROMPT.md at the root of this folder and follow it.

Why it cannot touch Git

The agent runs with file tools only — no shell, no network. “Never runs git init, never adds a remote, never pushes” is a fact about what it is able to do, not a promise it makes. Anything touching Git is yours to run, or belongs to the commands.

Running it again is safe: it checks before every write and skips anything you have changed.

Part 4 · How to use it

What your work buys the people in the repositories.

They can answer without editing

A builder who disagrees with a guardrail, an epic item or an architecture record files a question, or captures a proposal capsule. Both sit in their repository until your next pull — they cost no permission, no fork, and no pull request against a repository they cannot see.

Their plan is checked against your epic

Each milestone item carries a Serves: line naming the blueprint/EPIC.md item it advances, and their doctor errors on one that names none. The asymmetry is deliberate: an epic item no plan serves is only a warning, because your epic is allowed to run ahead of the milestone in front of them.

They have a standing review

Their own review lists what is waiting on a person, oldest first — including a stale-snapshot finding when the global tier you pushed has not been refreshed in ninety days. That one is aimed at you.

Pull is your inbox, and its one weakness is latency. Nothing a builder raises moves until you pull, so make pulling every registered repository routine — and read the oldest unanswered question first.

Part 4 · How to use it

The cost, stated plainly.

What it costs you
  • A guardrail change means touching every repository. Pushing to all of them is one command, but it is N branches and N pull requests.
  • A repository nobody has pushed to lately is quietly stale — though the doctor reports stamp age, so “quietly” overstates it.
  • Nothing a builder raises reaches you until you pull. The latency is yours to manage.
What you buy
  • Builders hold no permission on the Hub — not even read. Nothing to configure, nothing to audit, nothing to trust.
  • A project repository needs no network at all to work. Nothing there calls home, registers, or holds a credential.
Both columns are the same design decision seen from two sides. The cost is the price of the guarantee, not a defect waiting to be fixed.

Part 4 · How to use it

Designed, and honestly not built yet.

A guide that documents commands you cannot run is worse than one carrying a short list like this. Everything else in this deck is built and tested against v0.2.0.

Cross-project assembler

Asking the Hub a question that spans every project. Retrieval works inside a repository today, and a builder's packet sees their project plus the global snapshot — the correct blast radius. Reading across the projects folder is the Hub's job, and is not built.

A Hub-side review

The pending list, oldest unanswered first, across every project. The repository-side review is built; the Hub does not yet aggregate them, so today you read what a pull brought up.

A SQLite cache

Deliberately deferred until an automated query proves slow. Never in a project repository.

Four commands exist today: init, pull, push and doctor. The doctor is the shared Project Context one, read-only, with your window excluded.

Get started

One folder. Everything you oversee.

Make a private repository from the scaffold, open it, and ask it to set itself up. Then register one project and push once — you will know inside an afternoon whether it earns its place.

Made with Hi Ted, Meet Lisa

1 / 4
← / → · scroll · swipe