-
Notifications
You must be signed in to change notification settings - Fork 0
Document Sources
A project's documentation rarely lives in one place. A source is one of those places, and a project can have as many as it needs — they are merged into a single searchable endpoint.
| Type | What it is | Kept in sync by | Page |
|---|---|---|---|
| Local directory | A folder mounted on the server, scanned in place. Nothing is copied | Reading it at index time | Local Directory Source |
| Git repository | A shallow checkout of one branch, optionally just one subdirectory |
git fetch at the start of every run, or a push webhook |
Git Repository Source |
| Upload | Files, folders and archives (.zip, .tar.gz, .rar) unpacked on the server |
Nothing to sync — you upload again when it changes | Upload Source |
| Notion | Pages shared with an internal integration, rendered to Markdown | The Notion API, re-rendering only pages that changed | Notion |
An Obsidian vault is a folder of Markdown, so it arrives as a local directory or as an upload — with one setting flipped. See Obsidian Vaults.
Every source has a name, and that name is the prefix of every path it contributes:
source "handbook" contains install.md → indexed as handbook/install.md
source "api-repo" contains install.md → indexed as api-repo/install.md
This is why two sources can hold the same file name without colliding, and why every search result tells you which source it came from. It is also why the name cannot be changed after creation — every indexed path and every path an agent has seen contains it. Everything else about a source can be edited.
Names follow the same rule as project names: lowercase letters, digits, - and _.
Add source on a project opens a dialog with a tab per kind. Common fields:
| Field | Notes |
|---|---|
| Name | The mount prefix. Immutable |
| Label | Free text shown in the list. Optional, changeable |
| Content type |
Plain Markdown / text, Obsidian vault or Notion export — see Content Types
|
| File types | Which extensions to index: .md and .mdx by default, optionally .txt
|
| Index now | Queue a run as soon as the source is saved |
Git and Notion sources also have a Test connection button that checks credentials and reachability without indexing anything — use it before saving.
Every source is synced at the start of every index run, one after another, and then scanned:
- git sources fetch the branch tip; Notion sources pull changed pages; local and upload sources have nothing to fetch.
- Each source's directory is walked for the file types it selected.
- Paths are prefixed with the source name and handed to the indexer.
Pressing Sync on a single source row queues the same run as Re-index in the header — there is one queue per project, not per source.
A source that cannot sync reports on its own row and the others still index. The project's status
becomes error with a summary:
2/3 sources synced; notion: API token is invalid
Crucially, a source whose content could not be read at all keeps the documents it had already contributed. A revoked Notion share or an unreachable git host makes a source stale, never empty. Fix the cause and press Sync on that row.
Changing a setting that alters what the source yields — path, branch, subdirectory, file types, content type — queues an index run automatically, so a source is never silently stale.
Deleting a source removes its documents, its chunks and the files it materialised. It is refused while the project is indexing.
Only the file types the source selected (.md, .mdx, optionally .txt). Always skipped:
- dotfiles and dot-directories (
.git/,.obsidian/, …) -
node_modules,dist,build,vendor,__pycache__ - symbolic links that point outside the source
- anything matching
IGNORE_GLOBS
Images, PDFs, Office documents and other binaries are not indexed.
Contextator · AGPL-3.0-or-later · Self-hosted MCP documentation server
Getting started
Your documentation
Using it
Operations