Documentation that is not on the server and not in a repository: drop it onto the dashboard. Files, whole folders with their structure, and archives are unpacked and stored server-side.
This is the right source for a zip someone emailed you, an export from another tool, or a folder on your laptop that has no other home.
Adding one
Add source → Upload files
| Field | Notes |
|---|---|
| Name | The mount prefix. Immutable |
| Content type | Plain Markdown / text, Notion export for a Notion Export → Markdown & CSV zip, or OpenAPI / Swagger for uploaded specifications |
| File types | .md and .mdx by default; .txt, .html/.htm, .csv, .docx and .pdf can be selected too — anything else in the upload is dropped |
Then drop files onto the dropzone, or use Choose folder / Choose files. Folders keep their structure. Progress is shown per file, and large folders are split across several requests automatically.
Finally choose how the upload is applied:
| Mode | Effect |
|---|---|
| Add to existing files | Merges into what the source already holds; same-path files are overwritten |
| Replace all files | The source’s contents become exactly what you uploaded |
Saving commits the upload and queues an index run.
Archives
.zip, .tar, .tar.gz / .tgz and .rar are unpacked on the server. Extraction is deliberately
strict:
- entries that would escape the destination are rejected;
- dot-directories (
.git/,.obsidian/, …) are dropped; - names that are not portable across platforms are rejected;
- files whose extension the source does not index are skipped;
- the entry count and total size are capped (
ARCHIVE_MAX_ENTRIES,ARCHIVE_MAX_TOTAL_BYTES); - archives inside the archive are unpacked one level deep — which is what a Notion export needs, since
it ships
Part-1.zipinside the zip.
Anything skipped is reported back to you rather than silently dropped, so you can see exactly what was and was not taken.
Managing the files
Files on an upload source row lists what the source currently holds. Individual files can be deleted from there, which re-indexes the project.
The files live under DATA_DIR inside the container (/data by default), in a directory belonging to
that source. They are deleted with the source and with the project — see
Backup and Data for how to back them up.
An upload source is the only copy of its content. Unlike a git source (re-clonable) or a Notion source (re-pullable), a deleted upload source’s files are gone. Include the
contextator-datavolume in your backups.
Keeping it up to date
There is nothing to sync — upload again when the content changes, choosing Add or Replace.
If the same content also lives in a repository or on the server, prefer a git source or a local directory instead: both update themselves.
Limits
| Setting | Default |
|---|---|
UPLOAD_MAX_FILE_BYTES |
50 MB per file |
UPLOAD_MAX_FILES_PER_REQUEST |
500 files per request (the dashboard splits larger folders) |
UPLOAD_MAX_ARCHIVE_BYTES |
256 MB per archive |
ARCHIVE_MAX_ENTRIES |
20 000 entries |
ARCHIVE_MAX_TOTAL_BYTES |
1 GB extracted |
All of them are configurable — see Configuration.
Uploading a vault or an export
- Obsidian vault — use the dedicated Obsidian vault tab; it is an upload source with the right content type already selected. See Obsidian Vaults.
- Notion export zip — use Upload files with content type Notion export, which strips the 32-character page ids Notion appends to every file and folder name. See Content Types.