Formats & Platform

The .obsidian config directory, JSON Canvas and Bases file formats, the obsidian:// URI scheme, Sync/Publish internals, the platform matrix, and changelog evolution v1.5 to v1.13.

Research compiled 2026-06-10 from official Obsidian sources: help.obsidian.md (now served at obsidian.md/help/... — the old help.obsidian.md/<path> URLs 301-redirect), docs.obsidian.md (developer docs), jsoncanvas.org (the open JSON Canvas spec Obsidian published), obsidian.md/changelog, obsidian.md/pricing, obsidian.md/sync, and obsidian.md/publish.

Provenance notes are flagged inline: [documented] = stated verbatim in official docs; [observed] = stable, widely-known on-disk behavior of the shipping app that official docs do not enumerate (safe to treat as de-facto format, but verify against a live vault before freezing the Geode spec).


1. Vault Internals: the .obsidian Directory

1.1 Vault model [documented]

  • A vault is “a folder on your local file system, including any subfolders.” Notes are “Markdown-formatted plain text files.”
  • Obsidian watches the filesystem: edits made by external editors are picked up automatically.
  • Multiple folders can be opened as separate vaults; each vault is fully independent.
  • Obsidian creates a .obsidian folder in the vault root containing vault-specific preferences (docs explicitly call out hotkeys, themes, community plugins, and the workspace files).

1.2 Config folder override [documented]

  • Settings → Files and Links → Override config folder lets the user rename .obsidian to any dot-prefixed name (e.g. .obsidian-awesome); requires app relaunch.
  • Settings do not migrate to the new folder automatically; the old folder is left in place.
  • Primary use case: keeping separate device-specific configs while using a third-party file syncing service.
  • Access on mobile: iOS/iPadOS has no built-in way to see the folder (third-party file apps like Taio/Textastic needed); Android requires “Show hidden files” in the file manager.

1.3 Per-vault vs. global settings [documented]

Per-vault settings live in <vault>/.obsidian/. Global (per-machine, per-OS-user) settings live outside the vault:

OSGlobal settings location
macOS~/Library/Application Support/obsidian
Windows%APPDATA%\Obsidian\
Linux$XDG_CONFIG_HOME/obsidian/ or ~/.config/obsidian/

Global state includes the vault list/registry (obsidian.json [observed]), license/Catalyst info, window state, and the app updater cache. Additionally, Obsidian keeps an IndexedDB per vault — “a low-level, client-side database” that stores the metadata cache (powers Graph, Outline, backlinks, search) and Obsidian Sync connection state. The cache can be rebuilt from settings; it is derived data, never the source of truth. [documented]

1.4 File inventory of .obsidian/

Official help does not publish an exhaustive schema for these files; the inventory below is the de-facto format of current Obsidian. Everything is JSON. Files are created lazily — a fresh vault contains only a few of them; each appears when the corresponding feature/plugin is first configured.

FileOwnerContents
app.jsonCoreGeneral editor/files settings [observed]
appearance.jsonCoreTheme, fonts, CSS snippet toggles [observed]
core-plugins.jsonCoreEnabled/disabled state of core plugins [observed]
community-plugins.jsonCoreArray of enabled community plugin IDs [observed]
hotkeys.jsonCoreUser hotkey overrides only (deltas from defaults) [observed]
workspace.jsonCoreCurrent window/pane layout; “store[s] the current workspace layout and update[s] whenever you open a new file” [documented]
workspaces.jsonWorkspaces core pluginNamed saved layouts [documented name]
graph.jsonGraph viewGraph display settings (filters, groups, forces) [observed]
canvas.jsonCanvas pluginCanvas plugin settings (snap-to-grid etc.) [observed]
types.jsonPropertiesVault-wide property-name → property-type assignments [observed] (help docs confirm the behavior: “Once a property type is assigned to a property name, all properties with that name across your vault will use the same type” — types.json is where that assignment persists)
bookmarks.jsonBookmarks core pluginBookmark tree (files, folders, searches, headings, blocks, graphs) [observed]
daily-notes.jsonDaily notes core pluginDate format, folder, template path [observed]
templates.jsonTemplates core pluginTemplate folder, date/time formats [observed]
backlink.json, page-preview.json, switcher.json, command-palette.json, zk-prefixer.json, note-composer.json, file-recovery.json, sync.json, publish.jsonPer core pluginEach core plugin persists its own settings file named after the plugin [observed pattern]

Subdirectories:

DirectoryContents
.obsidian/plugins/<plugin-id>/One folder per community plugin: main.js, manifest.json, optional styles.css, and data.json (the plugin’s saved settings) [documented in developer docs]
.obsidian/themes/<Theme Name>/theme.css + manifest.json; “the name of the theme directory must exactly match the name property in manifest.json[documented]
.obsidian/snippets/Loose *.css files toggled individually in Settings → Appearance [documented behavior]

Example shapes [observed — verify against a live vault]:

// .obsidian/community-plugins.json
["dataview", "obsidian-git", "templater-obsidian"]
// .obsidian/hotkeys.json — only overrides are stored
{
  "editor:toggle-bold": [{ "modifiers": ["Mod"], "key": "B" }],
  "app:toggle-left-sidebar": []
}
// .obsidian/types.json
{
  "types": {
    "due": "date",
    "rating": "number",
    "done": "checkbox",
    "related": "multitext"
  }
}
// .obsidian/daily-notes.json
{ "format": "YYYY-MM-DD", "folder": "Daily", "template": "Templates/Daily" }

workspace.json stores a recursive split/tabs tree: a root main split containing tabs groups whose children are leaf views (type: markdown, canvas, graph, …) plus left/right sidebar trees, active leaf id, and lastOpenFiles. [observed]

1.5 Properties / frontmatter format [documented]

Properties are YAML frontmatter delimited by --- at the top of the file. “Property names are separated from their values by a colon followed by a space.” Names are unique per note.

Property types (assigned vault-wide per property name):

TypeFormat / notes
TextSingle-line; markdown not rendered; “Hashtags do not create tags when used in text properties”; internal links allowed but “must be surrounded with quotes”
ListYAML sequence (- item per line)
Number“must always be a literal number, not an expression”; ints and decimals
Checkboxtrue/false
DateYYYY-MM-DD; rendered per OS locale; acts as a link to the daily note when Daily notes is enabled
Date & timeYYYY-MM-DDTHH:MM:SS
TagsSpecial list type reserved for the tags property only

Default properties: tags, aliases, cssclasses (all lists). Publish-specific properties: publish, permalink, description, image, cover. Deprecated singular forms tag/alias/cssclass were deprecated in v1.4 and dropped in v1.9.

JSON frontmatter is accepted as input and rewritten as YAML:

---
{ "tags": ["journal"], "publish": false }
---

Intentional limitations: no nested properties (source-mode only), no markdown rendering in values, no built-in bulk editing. As of v1.11, Markdown links are supported in text and list properties (changelog).


2. JSON Canvas Format (.canvas)

Source: jsoncanvas.org — “An open file format for infinite canvas data.” Created by Obsidian (announced with Obsidian 1.5-era Canvas), version 1.0, MIT licensed, extension .canvas. Design goals: “longevity, readability, interoperability, and extensibility.”

2.1 Top level

A .canvas file is a single JSON object with two optional arrays:

{ "nodes": [], "edges": [] }

nodes are ordered by z-index: first = bottom, last = top.

2.2 Nodes

All nodes share:

AttributeTypeRequiredNotes
idstringyesUnique identifier
typestringyestext | file | link | group
x, yintegeryesPosition in pixels
width, heightintegeryesSize in pixels
colorcanvasColornoSee §2.4

Per-type additions:

  • texttext (string, required): “plain text with Markdown syntax.”
  • filefile (string, required): path to the file within the system; subpath (string, optional): heading/block reference, always starts with # (e.g. #Heading, #^block-id).
  • linkurl (string, required).
  • grouplabel (string, optional); background (string, optional, image path); backgroundStyle (string, optional): cover | ratio | repeat.

2.3 Edges

AttributeTypeRequiredValues / default
idstringyes
fromNode / toNodestringyesNode ids
fromSide / toSidestringnotop | right | bottom | left
fromEnd / toEndstringnonone | arrow; defaults: fromEnd: none, toEnd: arrow
colorcanvasColorno
labelstringno

2.4 Color (canvasColor)

Either a hex string ("#FF0000") or a preset string "1""6": 1 red, 2 orange, 3 yellow, 4 green, 5 cyan, 6 purple. Preset values are “intentionally undefined” in exact rendering so apps can theme them.

2.5 Example

{
  "nodes": [
    { "id": "a1", "type": "text", "text": "# Idea\nSome **markdown**", "x": -200, "y": -100, "width": 360, "height": 180, "color": "4" },
    { "id": "b2", "type": "file", "file": "Notes/Plan.md", "subpath": "#Goals", "x": 300, "y": -100, "width": 400, "height": 300 },
    { "id": "c3", "type": "link", "url": "https://jsoncanvas.org", "x": 300, "y": 260, "width": 400, "height": 240 },
    { "id": "g1", "type": "group", "label": "Research", "x": -260, "y": -160, "width": 1040, "height": 720, "backgroundStyle": "cover" }
  ],
  "edges": [
    { "id": "e1", "fromNode": "a1", "fromSide": "right", "toNode": "b2", "toSide": "left", "toEnd": "arrow", "color": "#888888", "label": "expands on" }
  ]
}

3. Bases Format (.base)

Bases is “a core plugin that lets you create database-like views of your notes” (introduced v1.9, May 2025). Crucially: “All the data in Obsidian Bases is stored in your local Markdown files and their properties” — the .base file is only a view definition, in YAML. Views can also be embedded as ```base code blocks inside Markdown notes, and a saved base embeds with ![[File.base]] or ![[File.base#ViewName]].

3.1 Top-level keys

KeyPurpose
filtersGlobal filter applied to all views
formulasNamed computed properties shared by all views
propertiesPer-property display config (e.g. displayName)
summariesCustom aggregation formulas
viewsArray of view definitions

3.2 Full example (from help docs, verbatim structure)

filters:
  or:
    - file.hasTag("tag")
    - and:
        - file.hasTag("book")
        - file.hasLink("Textbook")
    - not:
        - file.hasTag("book")
        - file.inFolder("Required Reading")

formulas:
  formatted_price: 'if(price, price.toFixed(2) + " dollars")'
  ppu: "(price / age).toFixed(2)"

properties:
  status:
    displayName: Status
  formula.formatted_price:
    displayName: "Price"
  file.ext:
    displayName: Extension

summaries:
  customAverage: 'values.mean().round(3)'

views:
  - type: table
    name: "My table"
    limit: 10
    groupBy:
      property: note.age
      direction: DESC
    filters:
      and:
        - 'status != "done"'
        - or:
            - "formula.ppu > 5"
            - "price > 2.1"
    order:
      - file.name
      - file.ext
      - note.age
      - formula.ppu
      - formula.formatted_price
    summaries:
      formula.ppu: Average

3.3 Filters

  • Boolean combinators and / or / not take heterogeneous lists of filter statements or nested combinators.
  • Filter statements are expressions evaluating to true/false: comparisons (==, !=, >, <, >=, <=), inline boolean operators (!, &&, ||), or boolean-returning functions (file.hasTag(), file.hasLink(), file.inFolder()).
  • View-level filters are AND-ed onto the global filters.

Property namespaces:

  • note.<prop> or bare <prop> — frontmatter properties
  • file.<field> — intrinsic file data: name, basename, path, folder, ext, size, properties, tags, links, ctime, mtime (plus file.backlinks, added v1.9.7)
  • formula.<name> — formulas defined in the file

3.4 Views

View object keys: type (built-in or plugin-provided), name, limit (row cap), groupBy (property + direction: ASC|DESC; one property only), filters, order (column/property ordering), summaries (property → aggregation name).

Built-in view types:

TypeSinceDescription
table1.9“Display files as rows in a table. Columns are populated from properties.” Row-height option; column summaries; multi-row paste from Excel/Sheets; copy/CSV export
cards1.9.3“Gallery-like views with images”; optional cover-image property; card-size slider
list1.10Bulleted/numbered/no markers; selected properties render as indented sub-items
map1.10“Display files as pins on an interactive map. Requires the Maps plugin”

Sorting: one or more properties asc/desc, type-aware (alphabetical/numerical/temporal). Views can be renamed (links/embeds auto-update since 1.10.2). Canvas can embed a base and “Pin view” (1.9.5). A Bases API for plugin-defined view types shipped with 1.10.

Built-in summary aggregations: numeric — Average, Min, Max, Sum, Range, Median, Stddev; date — Earliest, Latest, Range; boolean — Checked, Unchecked; any — Empty, Filled, Unique.

3.5 Formula syntax

  • Expression language with arithmetic + - * / % ( ), string concatenation via +, date arithmetic with duration strings (date + "1M", date - "2h").
  • Object-oriented and chainable (price.toFixed(2), values.mean().round(3)) — this OO syntax was a breaking change in 1.9.2; functions were renamed snake_case → camelCase in 1.9.1.
  • String literals in single or double quotes inside YAML strings.

3.6 Function reference (complete as of 1.13)

Global: escapeHTML(html), date(string), duration(string), file(path), html(string), if(cond, true, false?), image(path), icon(name) (Lucide), link(path, display?), list(any), max(...), min(...), now(), number(any), today(), random()

Any: isTruthy(), isType(type), toString()

String: contains, containsAll, containsAny, endsWith, isEmpty, lower, replace(pattern|Regexp, replacement), repeat(n), reverse, slice(start, end?), split(sep|Regexp, n?), startsWith, title, trim; field length

Number: abs, ceil, floor, isEmpty, round(digits), toFixed(precision)

Date: date() (strip time), format(momentFormat), time(), relative(), isEmpty(); fields year month day hour minute second millisecond

List: contains, containsAll, containsAny, filter(expr), flat, isEmpty, join(sep), map(expr), reduce(expr, acc), reverse, slice, sort, unique; field length

Link: asFile(), linksTo(file)

File: asLink(display?), hasLink(otherFile), hasProperty(name), hasTag(...values), inFolder(folder); fields listed in §3.3

Object: isEmpty(), keys(), values()

Regexp: matches(value)


4. Obsidian URI Scheme (obsidian://)

All parameter values must be URI-encoded (/%2F, space → %20). Heading/block targets are encoded into file: Note%23Heading, Note%23%5EBlock (#, #^).

4.1 Actions

open — open vault or file

  • vault — vault name or ID (omit to use most-recent vault)
  • file — vault-relative path; .md optional
  • path — absolute filesystem path (overrides vault+file)
  • prepend / append — add content at top/bottom; merges properties
  • paneTypetab | split | window (desktop only; added 1.11.2)
  • x-success, x-error — x-callback-url

new — create note

  • vault; name (respects default new-note location); file (vault-relative path incl. filename); path (absolute)
  • content — note body; clipboard — use clipboard contents instead
  • silent — create without opening; append — append if file exists; overwrite — replace if exists (ignored when append set)
  • paneType; x-success

daily — open/create today’s daily note (requires Daily notes plugin). Accepts all new parameters.

unique — create unique note (requires Unique note creator plugin): vault, paneType, content, clipboard, x-success.

search — open search: vault, query.

choose-vault — opens the vault manager/switcher (added ~1.11.7).

hook-get-address — Hook app integration: vault (optional), x-success, x-error.

4.2 Shorthands

obsidian://vault/my vault/my note      ≡ obsidian://open?vault=my%20vault&file=my%20note
obsidian:///absolute/path/to/note     ≡ obsidian://open?path=%2Fabsolute%2Fpath%2Fto%2Fnote

4.3 x-callback-url responses

With x-success, the callback receives: name (filename w/o extension), url (an obsidian:// URI), file (a file:// URL, desktop only).

4.4 Registration & security

  • Windows/macOS: protocol registered on first launch. Linux: needs obsidian.desktop with Exec=executable %u; AppImage may require unpacking.
  • Since 1.13, incoming URIs show a confirmation dialog with an allow-list. [changelog]

5. Obsidian Sync (add-on service)

“An add-on service that allows you to privately sync your notes across devices” via an off-site remote vault; every device keeps a full local copy.

5.1 Plans & limits

FeatureStandardPlus
Price$4/user/mo annual, $5 monthly$8/user/mo annual, $10 monthly
Synced vaults110
Total storage (account-wide)1 GB10 GB, purchasable up to 100 GB
Max file size5 MB200 MB
Version history1 month12 months
DevicesUnlimitedUnlimited
Shared (collaborative) vaultsYesYes

Version history and attachments count toward storage. When over quota, sync halts and prompts for cleanup. 40% education/non-profit discount.

5.2 Encryption [documented]

  • End-to-end (default): AES-256 in GCM mode; key derived from a user-held encryption password via scrypt with salt. “The data is encrypted from the moment it leaves your device, and can only be decrypted using your encryption key.” Lost password = unrecoverable data.
  • Standard encryption (optional): key managed by Obsidian; protects in transit and at rest, comparable to “Google Docs, Dropbox, and iCloud (without Advanced Data Protection).”
  • Encrypted: remote vault contents and all server communication. Not encrypted: local vault; and some metadata — “which device uploaded or deleted a file, when it was uploaded, and the mapping between encrypted file paths and encrypted content.”
  • File-name encryption strengthened to AES-SIV in 1.9.11 (Aug 2025); a migration assistant for encryption upgrades and region switching shipped in 1.9.12.
  • Servers: DigitalOcean in 4 regions — Singapore, Frankfurt, San Francisco, Sydney. Third-party security audit completed (report on the Security page).

5.3 Selective sync [documented]

  • File-type toggles: Images, Audio, Videos, PDFs, plus a “Sync all other types” toggle for everything else.
  • Excluded folders list (Settings → Sync → Excluded folders → Manage). Caveat: “Adding a file to the Excluded files list does not remove it from the remote vault if it has already been synced.”
  • Always excluded: File Recovery snapshots; hidden dot-files/folders (.git, .vscode, …) — except .obsidian, which does sync.
  • Vault-config sync categories (defaults): Main settings, Appearance, Themes and snippets, Hotkeys, Active core plugin list, Core plugin settings. Opt-in: Active community plugin list, Installed community plugins. “Sync settings do not sync across devices” — configured per device.
  • Conflict handling: “Conflict resolution” setting (1.9.7) — merge vs. conflict-file creation. Collaboration: Sync History view (1.7), “Hide my changes” (1.8).

5.4 Third-party sync alternatives [documented]

iOS/iPadOS officially supports only Obsidian Sync and iCloud (vault must live at iCloud Drive/Obsidian/<Vault>); “iCloud Drive on Windows may lead to file duplication or corruption.” Google Drive: no iOS support; OneDrive: limited Android; Syncthing/Git are community paths. Mixing multiple sync services risks corruption; cloud “Files On-Demand”/offloading breaks Obsidian.

Geode’s near-term plan is to document Git/Syncthing workflows rather than build a hosted sync service — see the Overview & Roadmap.


6. Obsidian Publish (add-on service)

“A cloud-based hosting service that lets you publish your notes as a wiki, knowledge base, documentation, or digital garden” at publish.obsidian.md/<your-site>. $8/site/mo annual, $10 monthly; hosting up to 4 GB; 7-day refund; 40% edu/non-profit discount.

6.1 Components & reading experience

  • Graph view — “Visually explore the connections between the pages on your site”
  • Backlinks — “Automatically list links to pages that reference the current page”
  • Outline / table of contents, search (full-text since 2024-03), hover previews, stacked pages (horizontal sliding panes)
  • All toggleable per-site under Site options → Reading experience / Components.

6.2 Customization

  • publish.css published to vault root → full custom styling; community theme CSS can be renamed to publish.css.
  • publish.js for custom JavaScript — requires a custom domain.
  • Favicons: publish favicon-32x32.png, favicon.ico, etc., anywhere in the vault.
  • Navigation: reorder, hide/unhide sidebar items, restore alphabetical default.
  • “First-class SEO”, customizable metadata; optional Google Analytics or privacy-friendly alternatives (Plausible, Fathom). Publish sites score “100% Lighthouse accessibility” by default.

6.3 Frontmatter controls

publish (include/exclude), permalink (custom slug: turns /username/Company/About+us into /username/about; old URL auto-redirects), description, image/cover (social metadata). Redirects for moved/deleted notes: add the old note’s full path to the destination note’s alias/aliases property.

6.4 Password protection & domains

  • Site-wide password(s): Publish changes → Change site options → Other site settings → Passwords → Manage; multiple passwords supported; removing all makes the site public. Per-note passwords are not supported.
  • Custom domains: CNAME to publish-main.obsidian.md (“Don’t include your personal sub-URL”); Cloudflare is “the only officially supported provider” (proxy on, SSL mode “Full”). Obsidian does not provision SSL certificates.
  • Subpath hosting via reverse proxy to https://publish.obsidian.md/serve?url=yourdomain.com/path/ (documented configs for NGINX, Apache, Netlify, Vercel, Caddy, Traefik), or the x-obsidian-custom-domain header.

7. Platform Matrix

DesktopMobile
OSesWindows, macOS, LinuxiOS/iPadOS, Android
RuntimeElectron (Chromium + Node.js)Capacitor WebView (WKWebView on iOS) — same core web codebase
Node.js / Electron APIsAvailable to pluginsNot available — “Any calls to these libraries… can cause your plugin to crash”; plugins can set isDesktopOnly: true in manifest
Platform detectionPlatform.isIosApp, Platform.isAndroidApp; desktop can emulate mobile via this.app.emulateMobile(true)same API
URI paneTypetab / split / windowNot supported (desktop only)
.obsidian accessNormal hidden folderiOS: needs 3rd-party file app; Android: “show hidden files”
StorageAnywhere on diskAndroid 1.8.10+: works without “All files” permission using app-private storage; iOS: local or iCloud Drive/Obsidian/
JS engine caveatsRegex lookbehind requires iOS 16.4+; remote debugging: Chrome DevTools (chrome://inspect) on Android, Safari Web Inspector on iOS 16.4+/macOS
Mobile-only UX (1.11–1.13)iOS Lock Screen/Control Center/Home Screen widgets, Siri + Spotlight actions, iOS Share Sheet (1.12.4/1.13); Android widgets + Quick Settings Tile; auto-hiding navigation, full-screen mode, tab switcher; shake-to-debug (1.10)
CLIObsidian CLI binary bundled since 1.12 (autocompletion 1.12.5+)n/a

Feature parity is otherwise near-total: editor, Canvas, Bases, properties, plugins all run on mobile. Geode currently targets desktop (macOS) only — see the Overview & Roadmap for the mobile item on the priority list.


8. Feature Evolution — Changelog Scan (mid-2024 → June 2026)

Current version at time of writing: 1.13.1 (June 9, 2026). The changelog at obsidian.md/changelog paginates (24 pages); below are the major-feature milestones a current-Obsidian clone must target.

VersionDateHeadline features
1.5.xFeb–Mar 2024Table editor maturity: auto-formatting while typing, mobile table editor, RTL in tables, drag-drop into cells; “Save layout” command; Publish full-text search (2024-03)
1.6May–Jun 2024RTL language support w/ per-line direction detection; redesigned left sidebar + vault profile/switcher; hideable ribbon; selection-aware word count; footnote hover previews + [^ autocomplete; better Sync defaults; editor parsing performance
1.7Aug–Oct 2024Deferred-view lazy workspace loading (faster startup); editable page previews; Sync History view; mobile tab switcher; app load-time monitoring screen
1.8Dec 2024–Jan 2025Web viewer core plugin (in-app browser, “Save to vault”); Sync “Hide my changes”; auto-reveal file in explorer; insert-footnote command; download-attachments command; guided mobile onboarding
1.9May–Sep 2025Bases core plugin (tables, filters, formulas; Cards view 1.9.3; formula editor 1.9.5; OO formula syntax 1.9.2); Footnotes view core plugin; dropped tag/alias/cssclass; Sync AES-SIV filename encryption + migration assistant
1.10Oct–Nov 2025Bases: Group by, summaries, List view, Maps plugin/view, Bases API, keyboard nav + copy/paste, CSV-ish paste from Excel/Sheets; toggle light/dark command; mobile shake-to-debug
1.11Dec 2025–Feb 2026Markdown links in text/list properties; predefined daily-note formats; Keychain (encrypted secret storage for plugins, at-rest encryption 1.11.5); URI paneType + choose-vault; auto plugin-update checks; mobile: iOS widgets/Siri/Spotlight, Android widgets, interface refresh, full-screen mode, Restricted Mode per-vault
1.12Feb–Mar 2026Obsidian CLI (terminal control/scripting, bundled binary, autocompletion); image drag-resize in Live Preview; automatic attachment cleanup on delete; Bases search toolbar; iOS Share extension; system-language onboarding
1.13May–Jun 2026Settings overhaul: separate window, built-in search, keyboard navigation; URI confirmation dialogs + allow-list; Bookmarks search; drag-drop folder import preserving structure; Note Composer link rewriting; Sync view file drag + search; mouse back-button navigation

Pre-2024 context (for completeness): Canvas (1.1, 2022), Properties UI (1.4, Jul 2023), new CM6 editor/Live Preview (1.0/1.5 era), Table editor (1.5, Dec 2023).


9. Licensing & Commercial Model (what the OSS clone replaces)

  • App is free for both personal and commercial use — “No sign-up required. No strings attached.” Commercial users are encouraged, not required, to buy a license. The app itself is proprietary/closed-source (this is the gap an OSS clone fills); the formats (Markdown, JSON Canvas/MIT) are open.
  • Catalyst — $25 one-time supporter license: early beta (“Insider”) builds, community badges, VIP channels.
  • Commercial license — $50/user/year, optional, for organizational use; non-refundable.
  • Sync — $4–5 (Standard) / $8–10 (Plus) per user/month (see §5).
  • Publish — $8–10 per site/month (see §6).
  • 40% discount on Sync/Publish for students, faculty, non-profit employees; 7-day refunds for Sync/Publish only.

For Geode: the clone replaces the free app; Sync ≈ any E2E file-sync backend honoring §5 semantics; Publish ≈ static-ish hosted rendering honoring §6 components. Geode is MIT-licensed and free for any use — there is no equivalent commercial-license tier.


10. Performance & Accessibility

10.1 Performance characteristics (as documented/changelog)

Obsidian publishes no hard vault-size guarantees; documented performance commitments are incremental:

  • Metadata cache in IndexedDB persists across launches so big vaults don’t re-index on every start; manual “rebuild cache” option (1.6.5).
  • 1.6: “improved editor parsing performance” and faster workspace loading; 1.7: deferred (lazy) view loading — tabs hydrate on focus, plus a load-time monitoring screen in settings showing per-plugin startup cost.
  • 1.9.13/1.9.14: Quick Switcher / Command Palette performance for large vaults; 1.10.3 mobile: faster launch by opening last file in background; 1.5.9: faster community plugin/theme browsing.
  • Sync practical scale bounds come from plan limits (§5.1), not engine limits.
  • Implication for Geode: lazy view instantiation + persistent derived-metadata cache are the two load-bearing performance architecture features to replicate.

10.2 Accessibility

There is no dedicated accessibility page in official help (the accessibility slug 404s) — a documentation gap worth noting. Documented accessibility-relevant capabilities:

  • Full RTL interface mirroring and per-line text-direction detection (1.6+).
  • Extensive hotkey customization (every command bindable; hotkeys.json); 1.13 adds full keyboard navigation of settings, Alt-Arrow reordering, searchable settings.
  • Bases full keyboard navigation (1.10); themes/CSS snippets allow arbitrary contrast/font adjustments; system-default font options (1.5.11); adjustable base font size and zoom.
  • Obsidian Publish sites: “100% Lighthouse accessibility score by default.”
  • Community forum threads document ongoing screen-reader gaps (NVDA blank-text issues, unlabeled buttons) — an area where an OSS clone can differentiate.

Source Index

  • JSON Canvas: https://jsoncanvas.org / https://jsoncanvas.org/spec/1.0/
  • Help (new base URL https://obsidian.md/help/...): configuration-folder; Files and folders/How Obsidian stores data; Editing and formatting/Properties; bases, bases/syntax, bases/functions, bases/views; Extending Obsidian/Obsidian URI; sync/settings; Obsidian Sync/Security and privacy; Obsidian Sync/Plans and storage limits; publish/domains, publish/permalinks, publish/security; Getting started/Sync your notes across devices
  • Developer docs: https://docs.obsidian.md (Mobile development; Build a theme)
  • Marketing/commerce: https://obsidian.md/pricing, /sync, /publish, /changelog (pages 1–9 scanned, v1.5.8 → v1.13.1)