modified paragraph Obsidian community plugin for sublimated. reads file metadat...
modified paragraph consistency rule: VS Code plugin (src/vscode-sublimated/) is...
modified list item https://sublimated.com/sublimated/docs/MARKETING/OBSIDIAN — ...
modified list item https://sublimated.com/sublimated/docs/MARKETING/ZED_LANGUAG...
modified list item https://sublimated.com/sublimated/docs/SDK/FILEPROVIDER_DATA...
modified list item https://sublimated.com/sublimated/docs/KNOWLEDGE_BASE/OBSIDI...
deleted heading URI scheme — DONE
deleted paragraph sublimated://open-in?tool=obsidian&type=file&path=blog/post....
deleted heading v1 scope
modified heading status bar update
modified list item status bar (basic): text showing version, sync status, autho...
modified list item add sync status icons: ✓ synced, ↑ uploading, ↓ downloading,...
modified list item add visibility indicator: 🌐 public, 👥 shared, 🔒 private
modified list item add branch display (hide when main)
modified list item add AI agent prefix: by AI: name when modifiedByType === "ai...
deleted list item visibility field missing from Obsidian's FileMetadata type (...
modified paragraph current: sublimated: v12 · synced · by anton
target: sublima...
modified heading version history improvements
modified list item version history sidebar: version list with number/author/tim...
deleted heading 3. view on web — DONE
modified list item view on web: command palette + status bar click opens sublim...
deleted heading 4. open in Obsidian (from sublimated.com) — DONE (plugin sid...
modified list item open in Obsidian: URI handler (obsidian://sublimated?action=...
deleted heading 5. welcome modal — DONE
modified list item welcome modal: first-run with setup steps, links, hasSeenWel...
deleted heading 6. settings page — DONE (basic)
modified list item settings page: API token input, test connection, workspace d...
deleted heading 7. file explorer decorations — NEW (VS Code has this)
modified paragraph VS Code shows sync status badges on files in the explorer tr...
modified list item ✓ synced, ↑ uploading, ↓ downloading, ! error, ⚠ conflict
modified list item use FileExplorerPlugin API or CSS-based decorations on file ...
deleted heading 8. cache layer — NEW (VS Code has this)
modified paragraph VS Code has cache.ts with in-memory cache. Obsidian re-reads...
modified list item add TTL-based cache for xattr reads (avoid shelling out xatt...
inserted heading done
inserted heading cache layer
modified heading workspace detection
modified paragraph done: checks for .sbl/ folder
missing:
modified list item .sbl/config or .sbl/config.yml parsing for space slug
modified list item detection result: space slug, folder path, root path, detect...
modified heading comments and threads
modified paragraph VS Code has full CommentController (513 lines) with gutter "...
modified list item sidebar view: list comments anchored to specific text
modified list item author, timestamp, quoted text, resolved/unresolved status
modified list item threaded replies inline
modified list item clicking a comment scrolls to anchored text
modified list item anchor resolution: text search (quote+prefix+suffix) -> bloc...
deleted list item unresolved comments shown as notices/callouts or gutter mark...
modified list item "resolve" button (API call)
deleted list item "reply on sublimated.com" button opens browser at the thread
modified list item new comment creation on sublimated.com (no input forms in pl...
modified list item API: GET /v1/spaces/{slug}/items/{id}/context
modified heading reactions
modified list item hover/click to see who reacted
modified list item adding reactions on sublimated.com — plugin links to web UI
deleted list item reactions are anchored to text via FileAnchor (same as comme...
modified heading section-level history
deleted paragraph VS Code: codelens.ts (157 lines) — CodeLens above headings s...
modified list item per heading: last author, edit count, actor count
deleted list item sections derived from AST (heading boundaries)
deleted list item useful for long docs — see which sections changed recently a...
modified list item API: file context endpoint (sections array)
modified paragraph VS Code has CodeLens above headings. Obsidian has no CodeLen...
modified paragraph VS Code: wikilink hovers (versions, comments, backlinks), br...
deleted paragraph Obsidian equivalent:
modified list item render broken [[links]] with visual indicator
modified list item list unresolved comments in sidebar
modified list item hover on wikilinks if Obsidian API supports it
modified heading block attribution (PM JSON)
deleted list item sidebar or hover: per-paragraph attribution
modified list item per-paragraph attribution: original author, creation date, e...
inserted heading hover and diagnostics
modified heading character-level attribution (Loro)
modified list item percentage breakdown of who wrote what
modified list item human vs AI edits
deleted list item Loro CRDT tracks character-level authorship
modified list item colored highlights in reading view per author
modified heading @mention rendering
modified list item render @username as styled inline elements
deleted list item clicking @mention opens that user's profile on sublimated.co...
modified list item autocomplete when typing @
modified heading stale content detection
modified list item check embedded files (![[data.csv]]) for staleness via conte...
modified list item show notice if referenced file changed since current file wa...
deleted list item uses content-hash xattr on referenced file vs stored hash at...
modified heading activity tracking
modified list item send editor events to API: file opened, changed, saved, clos...
modified list item API: POST /v1/spaces/{slug}/items/{id}/events
deleted list item server computes section-level focus data from change positio...
modified list item powers writing analytics and session tracking
modified heading backlinks
modified list item sidebar: files linking to current file via [[wikilinks]]
deleted list item each backlink shows: file path, link context (surrounding te...
deleted list item clicking a backlink opens that file
deleted list item data from item_dependencies table (dep_type = 'links_to')
modified list item sublimated adds over native Obsidian backlinks: version coun...
modified heading broken link detection
modified list item flag [[links]] to nonexistent files
modified list item offer to create missing file
modified list item detect broken embeds (![[missing.png]])
deleted list item uses folder context items list to check existence
deleted heading implementation work
deleted heading plugin — exists, needs updates
deleted paragraph existing: TypeScript + esbuild, main.ts + manifest.json + st...
modified heading todo: immediate (VS Code parity)
modified list item add visibility field to FileMetadata in xattr.ts (VS Code ha...
deleted list item update status bar format to match VS Code: icons, visibility...
deleted list item add cache layer (new cache.ts) for xattr reads and API respo...
deleted list item update workspace detection: CloudStorage mount path, .sbl/co...
modified heading file explorer decorations
modified heading todo: later
deleted list item comments sidebar (equivalent of VS Code's CommentController)
deleted list item section-level info (equivalent of VS Code's CodeLens)
deleted list item hover/diagnostics (equivalent of VS Code's hover + diagnosti...
modified list item GET /v1/spaces/:slug/items/:folderId/context — folder contex...
deleted heading FileProvider changes (sdk/swift/)
deleted list item add 4 new xattrs: sync-status, space, branch, modified-at
deleted list item add visibility xattr (already in VS Code constants.ts but ne...
deleted list item set sync-status during upload/download/error operations in S...
modified list item copy web link: command to copy sublimated.com URL to clipboa...
deleted list item add Obsidian to OPEN IN tools in SharePopup.astro (with Obsi...
deleted list item detect .obsidian/ folder presence to show/hide the button
deleted heading macOS app changes
deleted list item add obsidian case to URLHandler.swift tool router
deleted list item resolve path -> obsidian://open?vault={vault}&file={path}
modified heading API endpoints
modified paragraph plugin uses these (shared with VS Code extension and languag...
deleted list item plugin uses folder context on vault open, file context on no...
deleted list item editor events sent as user interacts (same as LSP)
modified paragraph add one-click sign-in instead of pasting API tokens:
deleted paragraph how it works:
modified list item user clicks "Sign in with sublimated" in settings
modified list item browser opens id.sublimated.com/auth/obsidian
deleted list item user signs in (GitHub, Apple, email — whatever id.sublimated...
modified list item user signs in, server redirects to obsidian://sublimated?act...
deleted list item plugin URI handler catches the redirect, stores the token
modified list item plugin stores token, API calls use Authorization: Bearer {to...
modified paragraph plugin-side: main.ts already handles the URI. settings.ts ne...
deleted paragraph notes:
deleted list item keep manual API token input as fallback
deleted list item token should be long-lived (months/never) since there's no s...
deleted list item consider scoped access token (read-only, specific space) vs ...
inserted list item GET /v1/spaces/:slug/items/:id/context — file context (comme...
inserted list item POST /v1/spaces/:slug/items/:id/events — editor events
inserted list item POST /v1/spaces/:slug/messages — comment resolve
modified list item source of truth: https://sublimated.com/sublimated/code/obsi...
modified list item GitHub mirror for submission: https://github.com/sublimates/...
modified paragraph macOS only for now. iOS later. no Windows/Linux — sublimated...
deleted list item stale PR policy: 30 days warning, 45 days auto-close
deleted heading platform support
deleted list item macOS only for now. sublimated's FileProvider and xattrs are...
deleted list item iOS later (Obsidian has an iOS app, FileProvider works on iO...
deleted list item no Windows/Linux support planned — sublimated itself is macO...
modified paragraph what if someone clones via git clone https://sublimated.com/...
modified list item detect .git/ with sublimated remote URL
modified list item shell out to git log, git status, git diff for version/sync ...
deleted list item show unsynced changes by running git status — dirty files = ...
deleted list item push/pull via git commands from within the plugin
modified list item separate mode from FileProvider mode
deleted heading auto-push
deleted paragraph should the plugin offer auto-push in settings? when user sav...
deleted list item run git add . && git commit -m "auto" && git push in backgro...
deleted list item or debounce: push every N minutes if there are uncommitted c...
deleted list item risk: merge conflicts if someone else pushes. how to handle?
modified list item auto-push on save (opt-in, with interval, debounce)
deleted list item only makes sense for git-clone mode — FileProvider already s...
modified heading sessions, checkpoints, focus mode
modified paragraph macOS app tracks editing sessions with checkpoints and attri...
modified list item session sidebar: elapsed time, word count delta, checkpoint ...
modified list item checkpoints: auto-snapshot at intervals or on save, "restore...
modified list item focus mode: start/stop from command palette, track uninterru...
deleted list item attribution: show which parts were edited by human vs AI age...
deleted list item this is a differentiator vs plain Obsidian — writing analyti...
modified list item differentiator vs plain Obsidian
modified list item file explorer: icons next to shared/public files
modified list item command: "sublimated: show access" — who has access, roles, ...
modified list item needs: com.sublimated.visibility#PS xattr, GET /v1/items/{id...
deleted list item API endpoint: GET /v1/items/{id}/access for detailed access ...
modified list item r/ObsidianMD
M /sublimated/undefined +32 -122
1# obsidian plugin2
3build an Obsidian community plugin as a marketing/distribution channel. no signup required — plugin reads file metadata directly from xattrs set by FileProvider.3Obsidian community plugin for sublimated. reads file metadata directly from xattrs set by FileProvider. no signup required for core features.4
5consistency rule: VS Code plugin (src/vscode-sublimated/, v0.3.5, 2,951 LOC) is the reference implementation. both plugins must show the same information in the same format, adapted to each platform's UI. when adding features to either plugin, check the other for parity.5consistency 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.6
7macOS only for now. iOS later. no Windows/Linux — sublimated itself is macOS/iOS only.8
9related docs (in main sublimated repo):8- https://sublimated.com/sublimated/docs/MARKETING/OBSIDIAN — plugin ideas, submission requirements, promotion channels, competitive research9- https://sublimated.com/sublimated/docs/MARKETING/ZED_LANGUAGE_SERVER — language server design (shared API endpoints, feature set, comment anchoring)10- https://sublimated.com/sublimated/docs/SDK/FILEPROVIDER_DATA_MODEL — FileProvider data model and sync status10- https://sublimated.com/sublimated/docs/MARKETING/OBSIDIAN — plugin ideas, submission, promotion, competitive research11- https://sublimated.com/sublimated/docs/MARKETING/ZED_LANGUAGE_SERVER — shared API endpoints, feature set12- https://sublimated.com/sublimated/docs/SDK/FILEPROVIDER_DATA_MODEL — FileProvider data model13- https://sublimated.com/sublimated/docs/DEV/OPEN_IN — "open in" deeplink design12- https://sublimated.com/sublimated/docs/KNOWLEDGE_BASE/OBSIDIAN — integration strategy, pain points, features14- https://sublimated.com/sublimated/docs/KNOWLEDGE_BASE/OBSIDIAN — integration strategy, pain points15
16## xattrs17
18FileProvider writes these on every synced file (all implemented and working):11 unmodified lines30- `com.sublimated.modified-at#PS` — server-side timestamp of last change31
32plugin reads these directly from filesystem. no API calls, no token, no signup for core features.33
32## URI scheme — DONE34## done35
34`sublimated://open-in?tool=obsidian&type=file&path=blog/post.md` — implemented in URLHandler.swift. Obsidian added to OPEN IN section in SharePopup.astro. open on web (local -> web) reads `com.sublimated.url` xattr and opens browser.36- status bar (basic): text showing version, sync status, author. click to open on web. updates on file change37- version history sidebar: version list with number/author/timestamp, "view on web" link38- view on web: command palette + status bar click opens sublimated.com URL from xattr39- copy web link: command to copy sublimated.com URL to clipboard40- open in Obsidian: URI handler (`obsidian://sublimated?action=open&file=path`), OAuth token flow (`action=auth`), URLHandler.swift, SharePopup.astro OPEN IN section41- welcome modal: first-run with setup steps, links, hasSeenWelcome flag42- settings page: API token input, test connection, workspace detection (.sbl/ folder), links43
36## v1 scope44## todo: immediate (VS Code parity)45
38### 1. sync status bar — DONE (basic), needs update46### status bar update47
40done: basic text status bar, click to open on web, updates on file change41missing (VS Code has these):42- sync status icons: checkmark synced, up-arrow uploading, down-arrow downloading, ! error, warning conflict43- visibility indicator: globe public, people shared, lock private44- branch display (hide when `main`)45- AI agent prefix: `by AI: name` when `modifiedByType === "ai_agent"` (vs plain `by name`)46- `visibility` field missing from Obsidian's FileMetadata type (VS Code has 13 fields, Obsidian has 12)47- target format: `sublimated: v12 · checkmark synced · by anton · feature-x · globe` (matches VS Code)48current: `sublimated: v12 · synced · by anton`49target: `sublimated: v12 · ✓ synced · by anton · feature-x · 🌐` (matches VS Code)50
49### 2. version history — DONE (basic), needs update51- add sync status icons: ✓ synced, ↑ uploading, ↓ downloading, ! error, ⚠ conflict52- add visibility indicator: 🌐 public, 👥 shared, 🔒 private53- add branch display (hide when `main`)54- add AI agent prefix: `by AI: name` when `modifiedByType === "ai_agent"`55- add `visibility` field to FileMetadata in xattr.ts (VS Code has it, Obsidian doesn't yet)56
51done: sidebar view, version list with number/author/timestamp, "view on web" link52missing (VS Code has these):53- group versions by day: "Today", "Yesterday", "X days ago", "Mon DD"54- show commit message per version55- diff viewer (click version to see diff against current)57### cache layer58
57### 3. view on web — DONE59VS Code has `cache.ts` with in-memory cache. Obsidian re-reads all xattrs on every file switch.60- add TTL-based cache for xattr reads (avoid shelling out `xattr` 12 times per tab switch)61- cache API responses (folder context, file context)62- invalidate on file save events63
59done: command palette + status bar click opens sublimated.com URL from xattr64### workspace detection65
61### 4. open in Obsidian (from sublimated.com) — DONE (plugin side)66done: checks for `.sbl/` folder67missing:68- CloudStorage mount path detection: `~/Library/CloudStorage/Sublimated-{space}/` (prod) and `~/Library/CloudStorage/sublimated-dev-{space}/` (dev)69- `.sbl/config` or `.sbl/config.yml` parsing for space slug70- detection result: space slug, folder path, root path, detection mode71
63done: URI handler for `obsidian://sublimated?action=open&file=path` + OAuth token `action=auth`64not done: web UI changes (add Obsidian to SharePopup.astro OPEN IN section), macOS app URLHandler.swift72### file explorer decorations73
66### 5. welcome modal — DONE74VS Code shows sync status badges on files in the explorer tree. Obsidian equivalent:75- use FileExplorerPlugin API or CSS-based decorations on file tree items76- read sync-status xattr per file, show badge/icon next to filename77- ✓ synced, ↑ uploading, ↓ downloading, ! error, ⚠ conflict78
68done: first-run modal with setup steps, links, hasSeenWelcome flag79### version history improvements80
70### 6. settings page — DONE (basic)81- group versions by day: "Today", "Yesterday", "X days ago", "Mon DD"82- show commit message per version83- diff viewer (click version to see diff against current)84
72done: API token input, test connection, workspace detection (.sbl/ folder), links73missing: OAuth sign-in button (see oauth-signin section below)85### OAuth sign-in86
75### 7. file explorer decorations — NEW (VS Code has this)87add one-click sign-in instead of pasting API tokens:881. user clicks "Sign in with sublimated" in settings892. browser opens `id.sublimated.com/auth/obsidian`903. user signs in, server redirects to `obsidian://sublimated?action=auth&token={token}`914. plugin stores token, API calls use `Authorization: Bearer {token}`92
77VS Code shows sync status badges on files in the explorer tree:78- checkmark synced (no color), up-arrow uploading (blue), down-arrow downloading (blue), ! error (red), warning conflict (red)79- Obsidian equivalent: FileExplorerPlugin API or CSS-based decorations on file tree items80- read sync-status xattr per file, show badge/icon next to filename93plugin-side: `main.ts` already handles the URI. settings.ts needs a "Sign in" button.94server-side: add GET `/auth/obsidian` route to id.sublimated.com. bearer plugin already set up.95keep manual API token input as fallback. token should be long-lived.96
82### 8. cache layer — NEW (VS Code has this)97## todo: later98
84VS Code has `cache.ts` (85 lines) with in-memory cache for xattr reads and API responses. Obsidian plugin currently re-reads all xattrs on every file switch with no caching.85- add TTL-based cache for xattr reads (avoid shelling out `xattr` 13 times on every tab switch)86- cache API responses (folder context, file context)87- invalidate on file save events99### comments and threads100
89### 9. workspace detection — needs update101VS Code has full CommentController (513 lines) with gutter "+", threading, resolve, reactions.102
91done: checks for `.sbl/` folder in vault root92missing (VS Code has these):93- CloudStorage mount path detection: `~/Library/CloudStorage/Sublimated-{space}/` (prod) and `~/Library/CloudStorage/sublimated-dev-{space}/` (dev)94- `.sbl/config` or `.sbl/config.yml` parsing for space slug (VS Code reads plain text `space=...` or YAML `space: ...`)95- detection result should include: space slug, folder path, root path, detection mode (cloud-storage vs sbl-config vs sbl-folder)96
97### 10. comments and threads (VS Code has full implementation)98
99VS Code: `comments/controller.ts` (513 lines) — native CommentController with gutter "+", threading, resolve/reopen, reactions, anchor resolution (text search -> line number -> top of file).100
103Obsidian equivalent:102- sidebar view: list all comments on the active file (anchored to specific text)103- each comment shows: author, timestamp, quoted text, resolved/unresolved status104- threaded replies shown inline under parent comment105- clicking a comment scrolls to the anchored text in the editor106- anchor resolution: same cascade as LSP — Loro cursors -> PM JSON blockId -> text search (quote+prefix+suffix) -> blockIndex -> orphaned107- unresolved comments shown as notices/callouts or gutter markers108- "resolve" button on each comment (API call, just a toggle)109- "reply on sublimated.com" button opens browser at the thread110- new comment creation happens on sublimated.com (no input forms in plugin)111- API endpoint: GET /v1/spaces/{slug}/items/{id}/context (returns comments with FileAnchor)104- sidebar view: list comments anchored to specific text105- author, timestamp, quoted text, resolved/unresolved status106- threaded replies inline107- clicking a comment scrolls to anchored text108- anchor resolution: text search (quote+prefix+suffix) -> blockIndex -> orphaned109- "resolve" button (API call)110- new comment creation on sublimated.com (no input forms in plugin)111- API: GET /v1/spaces/{slug}/items/{id}/context112
113### 11. reactions113### reactions114
115- show reactions on file or section level in sidebar or status bar116- hover or click to see who reacted117- adding reactions happens on sublimated.com — plugin links to web UI118- reactions are anchored to text via FileAnchor (same as comments)116- hover/click to see who reacted117- adding reactions on sublimated.com — plugin links to web UI118
120### 12. section-level history (VS Code has CodeLens equivalent)119### section-level history120
122VS Code: `codelens.ts` (157 lines) — CodeLens above headings showing "last: {author}, {timeAgo}" and version/comment counts. Obsidian has no CodeLens, so use different UI.123
121VS Code has CodeLens above headings. Obsidian has no CodeLens.122- command palette: "sublimated: show section history"125- for each heading in the current file, show: last author, edit count, actor count126- sections derived from AST (heading boundaries)127- useful for long docs — see which sections changed recently and by whom128- API provides this via file context endpoint (sections array with lastAuthor, editCount, actorCount)123- per heading: last author, edit count, actor count124- API: file context endpoint (sections array)125
130### 13. hover and diagnostics (VS Code has these, Obsidian needs equivalents)126### hover and diagnostics127
132VS Code: `hover.ts` (163 lines) — wikilink hovers showing file info (versions, comments, backlinks). `diagnostics.ts` (104 lines) — broken link warnings, unresolved comment indicators.133
128VS Code: wikilink hovers (versions, comments, backlinks), broken link warnings, unresolved comment indicators.129Obsidian equivalent:135- reading view: render broken `[[links]]` with visual indicator (strikethrough, red text)136- sidebar or notice: list unresolved comments with context137- hover on wikilinks (if Obsidian API supports it): show version count, last author, comment count130- render broken `[[links]]` with visual indicator131- list unresolved comments in sidebar132- hover on wikilinks if Obsidian API supports it133
139### 14. block attribution (PM JSON)134### block attribution (PM JSON)135
141- sidebar or hover: per-paragraph attribution142- each block (PM JSON blockId) shows: original author, creation date, edit count, last editor136- per-paragraph attribution: original author, creation date, edit count, last editor137- requires PM JSON representation (block IDs stable across edits)138
145### 15. character-level attribution (Loro)139### character-level attribution (Loro)140
147- deeper attribution: percentage breakdown of who wrote what in a paragraph148- distinguishes human vs AI edits149- Loro CRDT tracks character-level authorship150- could render as colored highlights in reading view (different color per author)141- percentage breakdown of who wrote what142- human vs AI edits143- colored highlights in reading view per author144
152### 16. @mention rendering145### @mention rendering146
154- render `@username` as styled inline elements (colored, linked)155- clicking @mention opens that user's profile on sublimated.com156- in editing mode: autocomplete dropdown when typing `@` (users with access to the space)147- render `@username` as styled inline elements148- autocomplete when typing `@`149- API provides user list via folder context endpoint150
159### 17. stale content detection151### stale content detection152
161- embedded files (`![[data.csv]]`, `![[report.md]]`) checked for staleness162- if referenced file changed since current file was last edited, show notice163- uses content-hash xattr on referenced file vs stored hash at embed time153- check embedded files (`![[data.csv]]`) for staleness via content-hash xattr154- show notice if referenced file changed since current file was last edited155
165### 18. activity tracking156### activity tracking157
167- plugin sends editor events to API as they happen (same as LSP):168 - file opened, content changed (with position info), file saved, file closed169- API endpoint: POST /v1/spaces/{slug}/items/{id}/events170- server computes section-level focus data from change positions171- powers writing analytics: time spent editing vs reading per section158- send editor events to API: file opened, changed, saved, closed159- API: POST /v1/spaces/{slug}/items/{id}/events160- powers writing analytics and session tracking161
173### 19. backlinks162### backlinks163
175- sidebar view: list all files that link to the current file via `[[wikilinks]]`176- each backlink shows: file path, link context (surrounding text), version count, last author177- clicking a backlink opens that file178- data from item_dependencies table (dep_type = 'links_to')179- Obsidian has native backlinks but sublimated adds: version count, author info, comment count per linking file164- sidebar: files linking to current file via `[[wikilinks]]`165- sublimated adds over native Obsidian backlinks: version count, author info, comment count166
181### 20. broken link detection167### broken link detection168
183- `[[links]]` pointing to nonexistent files flagged in reading view or sidebar184- offer to create the missing file185- also detects broken content embeds (`![[missing.png]]`)186- uses folder context items list to check existence169- flag `[[links]]` to nonexistent files170- offer to create missing file171- detect broken embeds (`![[missing.png]]`)172
188## implementation work173## API endpoints174
190### plugin — exists, needs updates175plugin uses these (shared with VS Code extension and language server):176- GET /v1/spaces/:slug/items/:folderId/context — folder context (items, links, users)177- GET /v1/spaces/:slug/items/:id/context — file context (comments, versions, sections, blocks, attribution, reactions)178- POST /v1/spaces/:slug/items/:id/events — editor events179- POST /v1/spaces/:slug/messages — comment resolve180
192existing: TypeScript + esbuild, main.ts + manifest.json + styles.css, plugin ID `sublimated`193existing: xattr.ts (reads 12 attrs), api.ts (versions + test connection), settings.ts, version-view.ts, welcome-modal.ts194
195immediate work (VS Code parity for status bar):196- add `visibility` to FileMetadata in xattr.ts (13th field, matching VS Code)197- update status bar format to match VS Code: icons, visibility, branch, AI prefix198- add cache layer (new cache.ts) for xattr reads and API responses199- update workspace detection: CloudStorage mount path, `.sbl/config` parsing200- add file explorer decorations (sync badges)201
202later work:203- comments sidebar (equivalent of VS Code's CommentController)204- section-level info (equivalent of VS Code's CodeLens)205- hover/diagnostics (equivalent of VS Code's hover + diagnostics providers)206- API client: expand to match VS Code's api.ts (folder context, file context, editor events, comments)207
208### FileProvider changes (sdk/swift/)209- add 4 new xattrs: sync-status, space, branch, modified-at210- add visibility xattr (already in VS Code constants.ts but needs FileProvider to set it)211- set sync-status during upload/download/error operations in SublimatedFileProviderExtension.swift212
213### web UI changes (sublimated.com worker)214- add Obsidian to OPEN IN tools in SharePopup.astro (with Obsidian icon)215- detect `.obsidian/` folder presence to show/hide the button216
217### macOS app changes218- add `obsidian` case to URLHandler.swift tool router219- resolve path -> `obsidian://open?vault={vault}&file={path}`220
221### API (api.sublimated.com)222- same endpoints as language server:223 - GET /v1/spaces/:slug/items/:folderId/context — folder context (items, links, users)224 - GET /v1/spaces/:slug/items/:id/context — file context (comments, versions, sections, blocks, attribution, reactions, session)225 - POST /v1/spaces/:slug/items/:id/events — editor events (open, change, save, close)226 - POST /v1/spaces/:slug/messages — comment resolve227- plugin uses folder context on vault open, file context on note open228- editor events sent as user interacts (same as LSP)229
230## OAuth sign-in231
232add OAuth redirect flow so users can sign in with one click instead of pasting API tokens.233
234how it works:2351. user clicks "Sign in with sublimated" in plugin settings2362. plugin opens browser to `id.sublimated.com/auth/obsidian`2373. user signs in (GitHub, Apple, email — whatever id.sublimated.com supports)2384. after sign-in, server redirects to `obsidian://sublimated?action=auth&token={sessionToken}`2395. plugin URI handler catches the redirect, stores the token2406. API calls use `Authorization: Bearer {token}` — same as the macOS app241
242server-side: add GET `/auth/obsidian` route to id.sublimated.com. bearer plugin already set up.243plugin-side: `main.ts` already handles `obsidian://sublimated?action=auth&token=...` in handleUri(). settings.ts needs a "Sign in" button that opens the browser URL.244
245notes:246- keep manual API token input as fallback247- token should be long-lived (months/never) since there's no session refresh in Obsidian248- consider scoped access token (read-only, specific space) vs full session249
181## submission182
252- source of truth: https://sublimated.com/sublimated/code/obsidian (dogfooded on our own platform)253- GitHub mirror for submission: https://github.com/sublimates/obsidian — Obsidian community plugins require a GitHub repo URL in community-plugins.json. keep sublimated.com as primary, push to GitHub for releases183- source of truth: https://sublimated.com/sublimated/code/obsidian184- GitHub mirror for submission: https://github.com/sublimates/obsidian — required for Obsidian community plugins. keep sublimated.com as primary, push to GitHub for releases185- PR to obsidianmd/obsidian-releases adding entry to community-plugins.json255- macOS only for now (iOS later). no Windows/Linux support planned186- automated validation + manual review187- README with screenshots, description, setup instructions258- stale PR policy: 30 days warning, 45 days auto-close188
260## platform support261
262- macOS only for now. sublimated's FileProvider and xattrs are macOS-specific263- iOS later (Obsidian has an iOS app, FileProvider works on iOS too)264- no Windows/Linux support planned — sublimated itself is macOS/iOS only265
189## open questions190
191### git-only users (no FileProvider)192
270what if someone clones via `git clone https://sublimated.com/slug.git` and opens the clone as an Obsidian vault? no FileProvider means no xattrs, no sync status, no `.sbl/` detection. options:271- plugin detects `.git/` with sublimated remote URL instead of `.sbl/` folder272- shell out to `git log`, `git status`, `git diff` to show version/sync info273- show unsynced changes by running `git status` — dirty files = unsynced274- push/pull via git commands from within the plugin275- this is a separate mode from FileProvider mode — need to detect which one we're in193what if someone clones via `git clone https://sublimated.com/slug.git` and opens as vault? no xattrs, no `.sbl/`. options:194- detect `.git/` with sublimated remote URL195- shell out to `git log`, `git status`, `git diff` for version/sync info196- auto-push on save (opt-in, with interval, debounce)197- separate mode from FileProvider mode198
277### auto-push199### sessions, checkpoints, focus mode200
279should the plugin offer auto-push in settings? when user saves a file:280- run `git add . && git commit -m "auto" && git push` in background281- or debounce: push every N minutes if there are uncommitted changes282- risk: merge conflicts if someone else pushes. how to handle?283- could be opt-in toggle in settings: "auto-sync" on/off, with interval selector284- only makes sense for git-clone mode — FileProvider already syncs automatically201macOS app tracks editing sessions with checkpoints and attribution. Obsidian surface:202- session sidebar: elapsed time, word count delta, checkpoint list203- checkpoints: auto-snapshot at intervals or on save, "restore checkpoint" command204- focus mode: start/stop from command palette, track uninterrupted writing time205- differentiator vs plain Obsidian206
286### sessions, checkpoints, and focus mode287
288the macOS app tracks editing sessions with checkpoints, focus mode, and attribution (human vs AI edits). how does this surface in Obsidian?289- session sidebar: show active session with elapsed time, word count delta, checkpoint list290- checkpoints: auto-snapshot at intervals or on save. "restore checkpoint" command to revert to a point-in-time291- focus mode: start/stop focus session from command palette. track uninterrupted writing time, words written292- attribution: show which parts were edited by human vs AI agent (inline highlights or gutter marks)293- this is a differentiator vs plain Obsidian — writing analytics and session tracking built into the sync layer294
207### sharing and access visibility208
297shared/public folders and files should be visible in Obsidian:209- status bar: show sharing status alongside sync info299- file explorer decorations: small icon (people, globe) next to shared/public files and folders300- command: "sublimated: show access" — opens panel showing who has access, roles, visibility301- needs: `com.sublimated.visibility#PS` xattr (private/shared/public) and optionally `com.sublimated.shared-with#PS`302- API endpoint: `GET /v1/items/{id}/access` for detailed access panel210- file explorer: icons next to shared/public files211- command: "sublimated: show access" — who has access, roles, visibility212- needs: `com.sublimated.visibility#PS` xattr, `GET /v1/items/{id}/access` endpoint213
214## promotion215
306- r/ObsidianMD (https://www.reddit.com/r/ObsidianMD/)216- r/ObsidianMD217- Obsidian Forum "Share & showcase"218- Obsidian Discord #updates219- twitter #ObsidianMD220- blog post: "how to use Obsidian with sublimated"