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
setup GitHub mirror
create repo at https://github.com/sublimates/obsidian
push current code (excluding node_modules)
set up a workflow to mirror from sublimated.com to GitHub (manual push or automated)
add GitHub release workflow for Obsidian plugin submission (main.js, manifest.json, styles.css as release assets)
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"