Apr 8, 2026 7.8 KB markdown of v23

obsidian plugin

Obsidian community plugin for sublimated. reads file metadata directly from xattrs set by FileProvider. no signup required for core features.

consistency rule: VS Code plugin (src/vscode-sublimated/) is the reference implementation. both plugins must show the same information in the same format, adapted to each platform's UI.

macOS only for now. iOS later. no Windows/Linux — sublimated itself is macOS/iOS only.


xattrs

FileProvider writes these on every synced file (all implemented and working):

  • com.sublimated.version#PS — version number (integer)

  • com.sublimated.commit#PS — last commit hash

  • com.sublimated.url#PS — web link (sublimated.com/anton/blog/readme_md)

  • com.sublimated.content-hash#PS — BLAKE3 hash

  • com.sublimated.id#PS — item ID (stable across renames)

  • com.sublimated.created-by#PS — original author name

  • com.sublimated.modified-by#PS — last author name

  • com.sublimated.modified-by-type#PS — person/ai_agent/bot

  • com.sublimated.sync-status#PS — synced/uploading/downloading/error

  • com.sublimated.space#PS — space slug

  • com.sublimated.branch#PS — current branch name

  • com.sublimated.modified-at#PS — server-side timestamp of last change

plugin reads these directly from filesystem. no API calls, no token, no signup for core features.

done

  • status bar (basic): text showing version, sync status, author. click to open on web. updates on file change

  • version history sidebar: version list with number/author/timestamp, "view on web" link

  • view on web: command palette + status bar click opens sublimated.com URL from xattr

  • copy web link: command to copy sublimated.com URL to clipboard

  • open in Obsidian: URI handler (obsidian://sublimated?action=open&file=path), OAuth token flow (action=auth), URLHandler.swift, SharePopup.astro OPEN IN section

  • welcome modal: first-run with setup steps, links, hasSeenWelcome flag

  • settings page: API token input, test connection, workspace detection (.sbl/ folder), links

todo: immediate (VS Code parity)

status bar update

current: sublimated: v12 · synced · by anton target: sublimated: v12 · ✓ synced · by anton · feature-x · 🌐 (matches VS Code)

  • add sync status icons: ✓ synced, ↑ uploading, ↓ downloading, ! error, ⚠ conflict

  • add visibility indicator: 🌐 public, 👥 shared, 🔒 private

  • add branch display (hide when main)

  • add AI agent prefix: by AI: name when modifiedByType === "ai_agent"

  • add visibility field to FileMetadata in xattr.ts (VS Code has it, Obsidian doesn't yet)

cache layer

VS Code has cache.ts with in-memory cache. Obsidian re-reads all xattrs on every file switch.

  • add TTL-based cache for xattr reads (avoid shelling out xattr 12 times per tab switch)

  • cache API responses (folder context, file context)

  • invalidate on file save events

workspace detection

done: checks for .sbl/ folder missing:

  • CloudStorage mount path detection: ~/Library/CloudStorage/Sublimated-{space}/ (prod) and ~/Library/CloudStorage/sublimated-dev-{space}/ (dev)

  • .sbl/config or .sbl/config.yml parsing for space slug

  • detection result: space slug, folder path, root path, detection mode

file explorer decorations

VS Code shows sync status badges on files in the explorer tree. Obsidian equivalent:

  • use FileExplorerPlugin API or CSS-based decorations on file tree items

  • read sync-status xattr per file, show badge/icon next to filename

  • ✓ synced, ↑ uploading, ↓ downloading, ! error, ⚠ conflict

version history improvements

  • group versions by day: "Today", "Yesterday", "X days ago", "Mon DD"

  • show commit message per version

  • diff viewer (click version to see diff against current)

OAuth sign-in

add one-click sign-in instead of pasting API tokens:

  1. user clicks "Sign in with sublimated" in settings

  2. browser opens id.sublimated.com/auth/obsidian

  3. user signs in, server redirects to obsidian://sublimated?action=auth&token={token}

  4. plugin stores token, API calls use Authorization: Bearer {token}

plugin-side: main.ts already handles the URI. settings.ts needs a "Sign in" button. server-side: add GET /auth/obsidian route to id.sublimated.com. bearer plugin already set up. keep manual API token input as fallback. token should be long-lived.

todo: later

comments and threads

VS Code has full CommentController (513 lines) with gutter "+", threading, resolve, reactions.

Obsidian equivalent:

  • sidebar view: list comments anchored to specific text

  • author, timestamp, quoted text, resolved/unresolved status

  • threaded replies inline

  • clicking a comment scrolls to anchored text

  • anchor resolution: text search (quote+prefix+suffix) -> blockIndex -> orphaned

  • "resolve" button (API call)

  • new comment creation on sublimated.com (no input forms in plugin)

  • API: GET /v1/spaces/{slug}/items/{id}/context

reactions

  • show reactions on file or section level in sidebar or status bar

  • hover/click to see who reacted

  • adding reactions on sublimated.com — plugin links to web UI

section-level history

VS Code has CodeLens above headings. Obsidian has no CodeLens.

  • command palette: "sublimated: show section history"

  • per heading: last author, edit count, actor count

  • API: file context endpoint (sections array)

hover and diagnostics

VS Code: wikilink hovers (versions, comments, backlinks), broken link warnings, unresolved comment indicators. Obsidian equivalent:

  • render broken [[links]] with visual indicator

  • list unresolved comments in sidebar

  • hover on wikilinks if Obsidian API supports it

block attribution (PM JSON)

  • per-paragraph attribution: original author, creation date, edit count, last editor

  • requires PM JSON representation (block IDs stable across edits)

character-level attribution (Loro)

  • percentage breakdown of who wrote what

  • human vs AI edits

  • colored highlights in reading view per author

@mention rendering

  • render @username as styled inline elements

  • autocomplete when typing @

  • API provides user list via folder context endpoint

stale content detection

  • check embedded files (![[data.csv]]) for staleness via content-hash xattr

  • show notice if referenced file changed since current file was last edited

  • sidebar: files linking to current file via [[wikilinks]]

  • sublimated adds over native Obsidian backlinks: version count, author info, comment count

  • flag [[links]] to nonexistent files

  • offer to create missing file

  • detect broken embeds (![[missing.png]])

API endpoints

plugin uses these (shared with VS Code extension and language server):

  • GET /v1/spaces/:slug/items/:folderId/context — folder context (items, links, users)

  • GET /v1/spaces/:slug/items/:id/context — file context (comments, versions, sections, blocks, attribution, reactions)

  • POST /v1/spaces/:slug/items/:id/events — editor events

  • POST /v1/spaces/:slug/messages — comment resolve

submission

open questions

sharing and access visibility

  • status bar: show sharing status alongside sync info

  • file explorer: icons next to shared/public files

  • command: "sublimated: show access" — who has access, roles, visibility

  • needs: com.sublimated.visibility#PS xattr, GET /v1/items/{id}/access endpoint

promotion

  • r/ObsidianMD

  • Obsidian Forum "Share & showcase"

  • Obsidian Discord #updates

  • twitter #ObsidianMD

  • blog post: "how to use Obsidian with sublimated"