File format reference

Everything Fable writes is a plain, documented format you could parse with a script. This page is the compatibility contract: what each file is, and what guarantees Fable makes about reading and writing it.

Notes: .md

A note is a UTF-8 plain-text Markdown file. The flavor is Obsidian Flavored Markdown: CommonMark, plus the GFM additions Obsidian adopts (tables, task lists, strikethrough, autolinks), plus the extensions covered in basic and advanced syntax: ==highlights==, callouts, [[wikilinks]], embeds, #tags, block ids, comments and math.

  • An optional YAML frontmatter block, fenced by --- lines at the very top, carries properties. The file always stores YAML even though the app shows a typed editor.
  • All formatting is derived from the markup at load time. There is no hidden rich-text state anywhere.

Canvas: .canvas (JSON Canvas 1.0)

A canvas is a JSON file following the open JSON Canvas 1.0 specification: two optional arrays, nodes and edges.

Node fields

FieldTypeRequiredNotes
idstringyesUnique within the file
typestringyestext, file, link or group
x, yintegeryesPosition in pixels
width, heightintegeryesSize in pixels
colorstringnoPreset "1" to "6", or hex like "#FF5500"

Per type: text nodes carry a required text field of Markdown; file nodes a required vault-relative file path plus an optional subpath beginning with #; link nodes a required url; group nodes an optional label, and optionally a background image path with a backgroundStyle of cover, ratio or repeat. Nodes render in array order: the first node is drawn beneath all others.

Edge fields

FieldTypeRequiredNotes
idstringyesUnique within the file
fromNode, toNodestringyesNode ids
fromSide, toSidestringnotop, right, bottom or left
fromEnd, toEndstringnonone or arrow; defaults none and arrow
colorstringnoSame values as node colors
labelstringnoCaption drawn on the edge

Fable preserves fields it does not recognize when saving, so files round-trip safely with other JSON Canvas tools.

Configuration: the .obsidian folder

Per-vault settings live in the hidden .obsidian folder as JSON files, written only when you change something. The ones you are most likely to meet:

FileHolds
workspace.jsonThe window layout: open tabs, splits, sidebar state, the active file. Rewritten as you work.
app.jsonEditor and file/link preferences, such as attachment location and default view.
appearance.jsonColor scheme, accent, fonts, and which CSS snippets are on.
core-plugins.jsonWhich core plugins are enabled.
hotkeys.jsonYour custom shortcuts. {} when untouched.
graph.jsonSaved graph settings.
types.jsonManually assigned property types.
bookmarks.json, daily-notes.json, templates.json, …Per-plugin settings, each named after its plugin, present only once configured.

Subfolders: snippets/ for CSS snippets, themes/<Theme Name>/ for installed themes, and plugins/ where Obsidian keeps community plugins (which Fable leaves untouched).

A note on stability

Of these config files, only workspace.json is an officially documented name in the Obsidian ecosystem; the rest are widely observed conventions. Fable reads and writes them tolerantly, preserves unknown keys, and never treats config files as the source of truth for your content.

Themes: folder + manifest

A theme is a folder in .obsidian/themes/ named exactly after the theme, containing:

.obsidian/themes/My Theme/
  manifest.json    name, version, minAppVersion, author
  theme.css        the stylesheet, pure CSS

The portability guarantees

  • Read tolerantly, write conservatively. Fable accepts both wikilink and Markdown link styles, legacy and current config shapes, and JSON it does not fully recognize, and it writes clean, standard forms.
  • Unknown data survives. Unrecognized keys in .canvas and config files are preserved on save.
  • No lock-in. Delete the .obsidian folder and you lose only settings, never content. Your notes remain a folder of Markdown.
  • Two-way with Obsidian. A vault can move between Fable and Obsidian in either direction, at any time, with no conversion.