Git mirror
Publish your context layer to a GitHub repository you own, as linked Markdown files that stay in sync — readable, greppable, and yours to keep.
Your context layer doesn't have to stay inside Pensieve. Turn on the git mirror and the page tree is published within the mirror’s content permissions to a GitHub repository you own, as ordinary Markdown files that are rewritten every time the map changes.
It's the same map, in a form the rest of your tooling already understands: readable in a text editor, searchable with grep, diffable in a pull request, and available to any coding agent that can read a checkout.
Pensieve owns the pensieve branch and overwrites it on every sync — edit pages here, not in the repository.
meridian-labs/company-context
pensieve · Synced 6 minutes ago
Turning it on
The mirror lives under Access → Git Mirror, beside the MCP Server, and only an admin or owner can change it. For automatic editing of local files, use Local sync in a separate managed folder.
- Create an empty repository on GitHub — private is fine, and usual. Pensieve pushes to a branch of its own, so an empty repository is the cleanest start.
- Press connect. You'll install the Pensieve Mirror GitHub App and grant it whichever repositories you're willing to expose. This is a separate app from the GitHub connector that reads your code — the two are deliberately not the same grant.
- Choose the repository in Pensieve. The install decides what Pensieve could write to; the choice here decides what it does write to. You'll only ever be offered repositories you can reach with your own GitHub account.
Changing the repository later reuses the same installation and skips the authorisation step. Changing installation means disconnecting and reconnecting.
Content permissions
Choose the mirror's bucket grants on the Git mirror page. These grants are independent of the member who connects it. A Page's content is published only when the mirror holds every active bucket that matches it. With no grants, it can publish content that matches no active bucket.
The mirror waits for complete classification before publishing. Removing a grant or restricting a Page affects future syncs; it cannot erase content from previous commits or existing checkouts. See Content permissions for how buckets, titles and history are handled.
What the repository looks like
Every page is a directory, and the page's own text is the Markdown file of the same name inside it. The .md file at the root is your context overview; the branches beneath it are the directories beside it, all the way down.
├── README.md
├── .gitignore
├── overview.md ← the context overview
├── sales-revenue/
│ ├── sales-revenue.md
│ └── clients/
│ ├── clients.md
│ └── henderson-group/
│ └── henderson-group.md
└── product-engineering/
├── product-engineering.md
└── atlas-platform/
└── atlas-platform.md
A page's path does not depend on how many children it has. Adding a child creates another directory beside the parent's note. Renaming or moving a Page changes its path, and the next sync updates all generated links together. Exceptionally long filenames are shortened with a stable identifier; the full title remains inside the note.
If the complete folder path is too long for a portable checkout, that note lives under _long-paths/ with a stable identifier in its filename. These exceptional notes lose their folder ancestry; their titles and generated links remain intact.
The file carries its directory's name rather than a fixed one so that tools which title a note by its filename — Obsidian above all — show the page's name, not a hundred notes all called "page".
Inside a file:
- A short block of YAML frontmatter names the page's title, an alias, and its canonical Pensieve URL, so anything reading the file can get back to the live page.
- Links between pages are ordinary relative Markdown links, so they resolve in GitHub's viewer, in your editor, in Obsidian, and on disk.
- Every claim keeps its citations as ordinary inline Markdown links: a short Pensieve link sits beside the claim itself, opening the exact source record — the same treatment your AI gets when it reads a page over MCP. Numbered citations appear as clickable
[1]labels, with no separate reference footer. - A generated
README.mdexplains to anyone who lands in the repository what it is and where to edit it, and a generated.gitignorekeeps editor workspace files off the branch.
Opening it in Obsidian
A checkout of the mirror is a ready-made Obsidian vault. Clone the repository, check out the pensieve branch, and open the folder in Obsidian — no plugin, no conversion.
- Notes have useful filenames. Tabs and graph nodes show names such as
sales-revenue, and the note itself carries the full Page title. The directory layout works without a folder-note plugin. - Links and backlinks work as they stand. Obsidian reads the same Markdown link syntax as GitHub and MCP. Links to exported Pages open local notes; the graph reflects links in Page text, while folders show the Page hierarchy.
- Full titles appear in link suggestions. Each note's alias lets you type its full title and select it from Obsidian's suggestions. Obsidian inserts a link to the actual file with the title as its display text. An alias does not rename the file or change its tab title.
- Citations open in your browser. A source link is a short Pensieve URL, and opens the exact record behind the claim, signed in.
- Workspace state stays local. The generated
.gitignoreexcludes.obsidian/and.trash/from ordinary commits. Leave those folders untracked so pulling the mirror preserves your local workspace.
The mirror and MCP share their citation formatting. The mirror uses local paths for exported Pages and web links for everything else. Source-image embeds become links to their source records; source files and image assets are not downloaded into the vault.
Keep the checkout current with git pull. Edits belong in Pensieve: local edits can block a pull or cause a merge conflict, and edits pushed to the mirror branch are superseded by the next Pensieve sync. The vault is a read-only view of the maintained Page tree.
Existing checkouts
The next mirror publish replaces the old page.md filenames with names such as sales-revenue.md. Generated links update together, but saved bookmarks or links you wrote to the old filenames need updating. A context with no new changes keeps its existing export until its next publish; use Sync now in Pensieve to refresh it immediately, then pull the branch.
How syncing behaves
- Pensieve owns one branch, named
pensieve, and overwrites it. Your default branch is never touched. (One exception: connect a brand-new empty repository and the mirror branch becomes its default, simply by being the first branch pushed.) - Edit pages in Pensieve, not in the repository. A hand edit on the mirror branch is superseded by the next sync. Nothing is force-pushed away in the normal course of things — each sync commits on top of what's there, so the history stays intact — but the file content is Pensieve's to write.
- Commits follow settled work, not individual changes. Curation is bursty; a busy context can commit hundreds of changesets in an hour, and a commit per change would make the history unreadable. Pensieve pushes when the context's work has settled, and considers a push at most every ten minutes.
- An unchanged tree commits nothing. Quiet periods leave no empty commits behind.
- You can always push by hand. The sync control on the card runs one immediately, and shows you if the last attempt failed.
What people use it for
- Feeding coding agents. A checkout of your company's context sits next to your code, so an agent working in the repository can read the map without any network access or MCP setup at all.
- Keeping a copy you own. The map lives somewhere you control, in a format that outlives any one vendor.
- Reviewing how the map changes. Because each sync is a commit,
git logandgit difflet you review changes across the published map. For individual Page versions, use History in the app. - Search you already have.
grep,ripgrep, your editor's project search — all of it works on the whole context layer. - A company brain in Obsidian. Open the checkout as a vault and browse the map with backlinks and the graph view, kept current by the sync rather than by hand.
Up next
Members & roles