The scaffold is public, and holds nobody's records
The scaffold holds the commands, the templates and the onboarding material. It contains no organisation's content, so reading it tells you nothing about anyone's projects.
the second half of the pair
Project Hub
one private repository for an owner — and entirely optional
Project Context installs in each project repository and belongs to the people building it. A Hub is the other side: one private repository where you author what applies everywhere, keep a folder per project, and read what the builders wrote — without ever handing them a permission on it.
Two different things share the name, and mixing them up is the misreading everyone makes first. Read this bit before anything else.
The scaffold holds the commands, the templates and the onboarding material. It contains no organisation's content, so reading it tells you nothing about anyone's projects.
You copy the scaffold into a new private repository of your own, and that repository is your Hub. It is private, and it stays private. One Hub, one owner.
The people working in your project repositories hold no permission on your Hub — not write, not read. That is not a rule you have to enforce; it is what a private repository they were never invited to already does. It works on a free plan, where private repositories have no code owners, no protected branches and no required reviewers.
Both halves are small Markdown records in Git. What separates them is who they serve — the people doing the work, or the person who oversees several repositories at once.
| Product | Where it lives | Who it serves | Who can see it |
|---|---|---|---|
| Project Context | Installed in each project repository, versioned beside the work it describes. | The builders. The people doing the work own the record of the work. | Anyone with access to that repository. |
| Project Hub | One private repository of its own, administered by one person. | The owner — the person who oversees several repositories and writes what applies to all of them. | The owner. Builders hold no permission on it, not even read. |
Both sides validate 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, so there is no second record model to learn and no second thing to keep in step.
Content moves between the two repositories in exactly two directions. There is no third path, and no builder-initiated one.
Builders hold no permission here — not even read.
Everything outside the pushed set is theirs to write.
Both arrows are started by the owner, from the Hub, and only in the direction their access already allows.
global/ and that project's blueprint/ land in the repository's project-context/, stamped. It does not write to your default branch: it commits to a long-lived hub-sync branch and opens a pull request, so what an owner sends arrives as a change the repository reviews like any other. Repeated syncs stack commits on the same branch and update the same request rather than scattering branches. Nothing force-pushes, and nothing merges — merging stays with the repository.
The repository's authored records are copied up into projects/<id>/pulled/, stamped with repository, branch, commit and time. It is read-only against the repository — it reads the git object database and writes nothing there. This is also your inbox: a question or a proposal a builder raised arrives on this path, and nothing moves until you pull.
It marks the repository, writes a first summary of it, installs Project Context into it, and then pushes — the install and the push sharing one branch and one confirmation. Refused outright when Project Context is already installed; that repository wants pull or push instead.
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: the owner has access to your repository because they administer it, and you have no access to theirs.
A project repository may have collaborators who are not in your organisation. So the question a push answers is never what would be convenient to share — it is what someone outside the organisation may end up reading.
A push copies only what the Hub's own configuration names, and nothing else. Any folder you add to the Hub later is non-pushed by default and needs no special case to stay put. The asymmetry is the whole point: forgetting to add a deny rule leaks, and forgetting to add an allow rule does not.
Most of the global tier travels — the summary, the guardrails, the workflows, the shared records a builder works against, and that project's blueprint. A few of the more sensitive files are opt-in per project rather than default, because objectives across every project, internal dashboards and a roster of people are each more sensitive than the guardrails a builder actually needs. And one file never travels at all.
IDENTITY.md never reaches a project repository, at any setting. Identity is the organisation's own voice, and it does not belong committed into someone else's checkout. It is the one rule the configuration cannot relax: a Hub whose allow-list names it does not get to push it — the entry is dropped, and you are told which one was refused.
Sessions stay on the machine they happened on. What travels is a short capsule — at most 200 words — and only when the builder chose to write one.
Four things. They are the whole product, and everything else in the scaffold is machinery for getting content into them and out again safely.
Identity, guardrails, workflows, goals, resources. You write them once, in global/, and push the shareable subset into the repositories that need it — instead of a near-copy per repository, quietly drifting apart.
Its mark — remote, default branch, visibility, who builds it — your own summary of it, and the blueprint you author for it: blueprint/EPIC.md, the goal the project serves, and blueprint/ARCHITECTURE.md, the shape it has to keep.
A pull copies each repository's plan, tasks, decisions, learnings and open questions into projects/<id>/pulled/. You read them here, side by side, without cloning anything. Do not edit that copy — the next pull overwrites it, and the record lives in the repository it came from.
owners_window/ is where you write about what is coming: half-formed projects, reflections, an argument with yourself. Never pushed, never linted, never pulled into. An idea leaves it only by being promoted by hand — into a blueprint, a global record, or a mark for a repository that does not exist yet. Freeform in, structured out.
A repository with no Hub simply has no pushed set. Every Project Context feature still works, offline, with no network at all.
A Hub never appears on its own. It is created deliberately, by someone who wants the aggregate view — so the pair is two halves you can hold separately, and a single repository needs nothing but its own install.
Worth knowing on both sides of the pair: the builder needs a way to object, and the owner needs to know where objections arrive.
The pushed set is read-only where it lands, and the marker holds each file's hash. The doctor flags the edit, and your next push refuses: one edited copy is a conflict that stops the whole push to that repository, naming the file and saying the place to change it is the Hub. So an edit does not quietly lose the argument — it blocks the sync while still telling you nothing about the objection.
File it in your own project-context/ — a question in QUESTIONS.md, or a proposal capsule in inbox/. Both belong to the authored set, so the owner's next pull brings them up alongside the project context that explains why. The owner changes the record at its source and pushes again.
Nothing moves until the owner pulls. That is the honest cost of a Hub builders cannot reach — which is why pulling every repository has to be routine, and why the oldest unanswered question is the one to read first.
Pushing to all of them is one command, but it is one branch and one pull request per repository, and each of those still has to be reviewed and merged by the people who own it. A repository nobody has pushed to lately goes stale — though the check reports how old each stamp is, so it does not go stale quietly.
Builders hold no permission on the Hub — not even read — and a project repository needs no network at all to work. There is nothing to run, nothing to log into, and no dependency to install: it is plain Markdown in a Git repository, readable in any editor, on a machine with no agent on it.
MIT with the Commons Clause v1.0 condition. You may use, copy, modify and distribute it, including inside your own organisation; you may not sell it, or sell a service whose value is substantially this software. The Commons Clause makes it not an OSI-approved open source licence, which is worth knowing before you build on it.
The scaffold ships the agent that does the setup. It identifies your tool, asks you one round of questions, writes a thin pointer file for that tool, helps you seed global/, registers your first project, and reports what it wrote against what it skipped. Running it again is safe.
Copy or fork it into a repository of your own, keep it private, and clone it. Everything after this happens inside that folder.
Claude Code or Codex — that is where the onboarding agent runs. Obsidian is one way to look at the folder afterwards and is not needed to start.
In Claude Code the scaffold ships the agent that does this, so any of these is enough:
In any other tool, paste this as your first message instead:
Read ADAPTER-PROMPT.md at the root of this folder and follow it.
It runs with file tools only — no shell, no network. It cannot run git init, add a remote, or push, because it has nothing to run them with. That is a fact about what it is able to do, not a promise it makes. Anything touching Git is yours to run.
This page is the argument. The owner's guide is the reference — the setup walkthrough, every command with its real flags and gates, the tree, the budgets, the two plans, and an honest list of what is not built yet.
Clarity comes with context.