Graph Folder Layout
A local graph's folder, a Local Mirror and an EtherPK export are the same thing: one layout,
holding a graph as plain files. The layout matters to anyone editing the files by hand,
scripting over them, or pointing a coding agent at them. EtherPK writes the
same description, with the rules an agent must follow, into the folder's own AGENTS.md
(Using AI Agents With Your Notes).
The folders
<graph>/
journals/ 2026-06-02.md one file per calendar day
pages/ Quantum Mechanics.md a page, named after its title
[[Physics]] Quantum Mechanics.md a scoped concept keeps its inner brackets
assets/ diagram.a1b2c3d4.png images and files, flat
etherpk/ settings.json, quick-notes.json, graph settings, quick notes,
protection.json, theme-<id>.jsonc the wrapped protection key, website themes
AGENTS.md the folder described to coding agents
CLAUDE.md imports AGENTS.md for Claude Code
- Only
journals/andpages/are read for documents, and only.mdfiles directly in them. A subfolder inside either is ignored. assets/is flat. Files are named<name-in-kebab-case>.<8 hex characters>.<ext>when EtherPK stores them, the hex being a fingerprint of the contents, but any file name works when you add one yourself.etherpk/is app-managed.settings.jsonholds the graph's settings and favourites;quick-notes.jsonthe quick notes not yet moved into the journal;protection.jsonthe wrapped protection key, which must never be edited, moved or deleted;theme-<id>.jsonca website theme copied into the graph. A Local Mirror addsgraph.json.AGENTS.mdandCLAUDE.mdare written into a local graph's folder, not into a mirror, and are never imported as pages.- Nothing else is read. A stray
.mdat the root or inassets/is ignored here, though an import of the folder into another graph would pick it up.
Journal entries
journals/YYYY-MM-DD.md. The date is the entry's whole identity: the file name must be a real
calendar day, there is at most one file per day, and the file needs no frontmatter (a title:
in one is kept but ignored; aliases: works). Journal entries cannot be renamed.
Pages
pages/<name>.md. A page's identity is the title: in its frontmatter, not the file name. The
file name is derived from the title with the characters some filesystems refuse (`/ ? < > \ :
- | "
) replaced by_; when two titles derive the same file name the second gets a(2)suffix. A file with notitle:is named after its file name without.md`.
Names are case-insensitive: two pages whose titles differ only in case are a collision, and one silently shadows the other. Check for an existing page or alias before creating one.
To create a page, write the file with a frontmatter block:
---
title: Quantum Mechanics
aliases:
QM
---
first block
To rename a page from outside EtherPK, change title:; renaming the file alone does nothing.
Links to the old name are not rewritten by an external rename, so update them yourself or add
the old name to aliases:.
A page whose title contains a wikilink, [[Physics]] Quantum Mechanics, is a scoped concept
(Scoped Concepts). It is linked as [[[[Physics]] Quantum Mechanics]] and counts as a
reference to Physics by its name alone.
Frontmatter
Only at the very start of the file, opened and closed by a line that is exactly ---. Keys
EtherPK reads: title, aliases (a YAML list), and the publishing keys public,
publications, publication, slug, date and author. Any other key is kept verbatim and
ignored. The full meaning of each is in Titles Aliases And Frontmatter and
Publishing Your Notes As A Website.
Document syntax
Everything is GitHub-flavoured markdown; EtherPK adds nothing proprietary and derives structure from the text. Document Syntax lists every construct. The rules that matter most when writing files by hand:
- Bullets are
-(hyphen, space). Nesting is two spaces per level, and a child sits exactly one level under its parent. Lines that continue a bullet are indented to its content column, two characters right of the dash. A blank line indented to that column is a paragraph break inside the bullet; a flush-left blank line ends the group. - Wikilinks are
[[Name]], with no|labeland no#anchorform. - Tasks are
- [ ]and- [x], with their tags immediately after the checkbox. - Fences are three or more backticks, closed by a bare fence of the same length at the same column. Tildes are not fences.
- Assets are referenced by relative path,
for an image and[label](../assets/name.pdf)for a file, with an optional|300or|640x480display-size hint after the alt text.
Protected documents
A page whose entire body is one fenced block tagged etherpk-cipher is a protected document.
The block is base64 ciphertext, one envelope per line, and it is authenticated: a single changed
byte makes the whole document unreadable, with no recovery. Never edit, reformat, re-wrap,
re-indent, trim, sort or re-encode the block, never add text before or after it in the body,
and never delete the frontmatter above it. etherpk/protection.json is the wrapped key; leave
it alone. See Protected Documents.
Keeping files editable by EtherPK
- UTF-8,
LFline endings, no byte-order mark, and a single newline at the end of every file. - Spaces, not tabs, for indentation. A tab reads as one character to the editor and four columns to the importer, so a tab-indented outline is misread as soon as it is touched.
- Do not run a markdown formatter (Prettier,
mdformat, an editor's format-on-save) over the folder. They re-indent nested bullets to four spaces, re-wrap paragraphs and rewrite fences, each of which changes meaning. - Do not strip trailing whitespace or blank lines by formatter. A whitespace-only line indented to a bullet's content column is part of that bullet; flattening it splits the block.
- Keep fences balanced. An unterminated fence turns everything below it into plain text.
- Never leave two pages with the same title or alias, a page titled with a calendar day, or a journal file not named after a real day.
- Write each file once, whole, rather than in several passes, and do not hold a file open with unsaved changes in another editor while EtherPK is autosaving it. EtherPK reloads files that change on disk and asks before overwriting an edit of yours (Local Graphs).