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 hashcom.sublimated.url#PS— web link (sublimated.com/anton/blog/readme_md)com.sublimated.content-hash#PS— BLAKE3 hashcom.sublimated.id#PS— item ID (stable across renames)com.sublimated.created-by#PS— original author namecom.sublimated.modified-by#PS— last author namecom.sublimated.modified-by-type#PS— person/ai_agent/botcom.sublimated.sync-status#PS— synced/uploading/downloading/errorcom.sublimated.space#PS— space slugcom.sublimated.branch#PS— current branch namecom.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 sectionwelcome 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: namewhenmodifiedByType === "ai_agent"add
visibilityfield 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
xattr12 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/configor.sbl/config.ymlparsing for space slugdetection 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:
user clicks "Sign in with sublimated" in settings
browser opens
id.sublimated.com/auth/obsidianuser signs in, server redirects to
obsidian://sublimated?action=auth&token={token}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 indicatorlist 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
@usernameas styled inline elementsautocomplete when typing
@API provides user list via folder context endpoint
stale content detection
check embedded files (
![[data.csv]]) for staleness via content-hash xattrshow notice if referenced file changed since current file was last edited
backlinks
sidebar: files linking to current file via
[[wikilinks]]sublimated adds over native Obsidian backlinks: version count, author info, comment count
broken link detection
flag
[[links]]to nonexistent filesoffer 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
source of truth: https://sublimated.com/sublimated/code/obsidian
GitHub mirror for submission: https://github.com/sublimates/obsidian — required for Obsidian community plugins. keep sublimated.com as primary, push to GitHub for releases
PR to obsidianmd/obsidian-releases adding entry to community-plugins.json
automated validation + manual review
README with screenshots, description, setup instructions
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#PSxattr,GET /v1/items/{id}/accessendpoint
promotion
r/ObsidianMD
Obsidian Forum "Share & showcase"
Obsidian Discord #updates
twitter #ObsidianMD
blog post: "how to use Obsidian with sublimated"