Title: Feature Discussion: File Sync for Note-Taking Apps (Logseq) via LDP · Issue #102 · JavaScriptSolidServer/JavaScriptSolidServer · GitHub
Open Graph Title: Feature Discussion: File Sync for Note-Taking Apps (Logseq) via LDP · Issue #102 · JavaScriptSolidServer/JavaScriptSolidServer
X Title: Feature Discussion: File Sync for Note-Taking Apps (Logseq) via LDP · Issue #102 · JavaScriptSolidServer/JavaScriptSolidServer
Description: Summary Proposing a pattern for using JSS as a sync backend for local-first note-taking applications like Logseq, Obsidian, and similar markdown-based tools. This would leverage Solid's existing LDP capabilities for HTTP-based file synch...
Open Graph Description: Summary Proposing a pattern for using JSS as a sync backend for local-first note-taking applications like Logseq, Obsidian, and similar markdown-based tools. This would leverage Solid's existing LD...
X Description: Summary Proposing a pattern for using JSS as a sync backend for local-first note-taking applications like Logseq, Obsidian, and similar markdown-based tools. This would leverage Solid's existin...
Opengraph URL: https://github.com/JavaScriptSolidServer/JavaScriptSolidServer/issues/102
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Feature Discussion: File Sync for Note-Taking Apps (Logseq) via LDP","articleBody":"## Summary\n\nProposing a pattern for using JSS as a sync backend for local-first note-taking applications like Logseq, Obsidian, and similar markdown-based tools. This would leverage Solid's existing LDP capabilities for HTTP-based file synchronization.\n\n## Use Case\n\nUsers want to sync their Logseq/Obsidian graphs across multiple devices:\n- Desktop (Linux/Mac/Windows)\n- Mobile (Android/iOS via Termux or apps)\n- Web interfaces\n\nCurrently, options are:\n- Proprietary sync (Logseq Sync, Obsidian Sync) - paid, closed\n- Git - requires SSH setup, not mobile-friendly\n- rsync over SSH - requires key management\n- Cloud storage (Dropbox, iCloud) - sync conflicts, not self-hosted\n\n**Solid/JSS could provide a self-hosted, HTTP-based alternative.**\n\n## Proposed Architecture\n\n```\nDevice A (Logseq)\n ↓ HTTP PUT\nJSS Pod (/user/logseq/)\n ↑ HTTP GET\nDevice B (Logseq)\n```\n\n## Technical Implementation\n\n### 1. Basic Sync with LDP\n\nJSS already supports GET/PUT for files. A sync script can:\n\n```bash\n# Pull file\ncurl -H \"Authorization: Bearer $TOKEN\" https://pod.example/user/logseq/journals/2026_01_19.md\n\n# Push file \ncurl -X PUT -H \"Authorization: Bearer $TOKEN\" \\\n --data-binary \"@file.md\" https://pod.example/user/logseq/journals/2026_01_19.md\n```\n\n### 2. Efficient Sync with ETags\n\nJSS supports conditional requests:\n\n```bash\n# Only download if changed\ncurl -H \"If-None-Match: \\\"abc123\\\"\" \"$POD_URL/file.md\"\n# Returns 304 Not Modified if unchanged\n\n# Only upload if not modified remotely (conflict detection)\ncurl -X PUT -H \"If-Match: \\\"abc123\\\"\" --data-binary \"@file.md\" \"$POD_URL/file.md\"\n# Returns 412 Precondition Failed if remote changed\n```\n\n### 3. Real-Time Notifications\n\nFor instant sync across devices:\n\n**Option A: WebSocket Pub/Sub**\n\n```javascript\nconst ws = new WebSocket('wss://pod.example/ws');\nws.send(JSON.stringify({ subscribe: '/user/logseq/' }));\nws.onmessage = (e) =\u003e { /* pull changed file */ };\n```\n\n**Option B: Nostr Ephemeral Events**\n\nUsing Nostr (kind 21000) for decentralized sync signals - works across different servers without requiring WebSocket support:\n\n```javascript\n// After PUT, publish sync notification to Nostr relay\n// Other devices subscribe and trigger pull\n```\n\n## Potential JSS Enhancements\n\n### 1. Sync Metadata Endpoint\n\n```http\nGET /user/logseq/.sync-status\n\n{\n \"files\": {\n \"journals/2026_01_19.md\": { \"etag\": \"abc123\", \"modified\": \"2026-01-19T18:00:00Z\" }\n }\n}\n```\n\n### 2. Batch Operations\n\n```http\nPOST /user/logseq/.batch\n{ \"operations\": [{ \"method\": \"PUT\", \"path\": \"file1.md\", \"body\": \"...\" }, ...] }\n```\n\n## Benefits Over Existing Solutions\n\n| Feature | Git | rsync | Solid/HTTP |\n|---------|-----|-------|------------|\n| No SSH keys | ❌ | ❌ | ✅ |\n| Works through firewalls | ❌ | ❌ | ✅ |\n| Mobile-friendly | ❌ | ⚠️ | ✅ |\n| Conflict detection | ✅ | ❌ | ✅ (ETags) |\n| Self-hosted | ✅ | ✅ | ✅ |\n\n## Questions\n\n1. Should JSS provide a `.sync-status` endpoint for efficient change detection?\n2. Would WebSocket pub/sub be valuable for real-time sync?\n3. Interest in a reference Logseq plugin that syncs to Solid pods?\n\nHappy to implement a proof-of-concept sync client if there's interest.","author":{"url":"https://github.com/melvincarvalho","@type":"Person","name":"melvincarvalho"},"datePublished":"2026-01-19T17:37:12.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},"url":"https://github.com/102/JavaScriptSolidServer/issues/102"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:c6bdcb40-09b6-e1f7-1c17-4725ac9bf73c |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | A722:DE06B:41600E:5A59AA:69774E11 |
| html-safe-nonce | 6718e884827962b9409d71cd293c9f2938b51242277e2da545845386b75fce9a |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJBNzIyOkRFMDZCOjQxNjAwRTo1QTU5QUE6Njk3NzRFMTEiLCJ2aXNpdG9yX2lkIjoiNjQ4NjIzMTY0MzM2MTU5NDg5NyIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 906c5197e24bc086d2940bdfb18412bd288fe5740bfa6c59ed53a9fce8efee14 |
| hovercard-subject-tag | issue:3830655291 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/JavaScriptSolidServer/JavaScriptSolidServer/102/issue_layout |
| twitter:image | https://opengraph.githubassets.com/3a2221c6145e9f133fe892d3ce593d4cbe9b3c8ecd39c51b40125acfda677eb5/JavaScriptSolidServer/JavaScriptSolidServer/issues/102 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/3a2221c6145e9f133fe892d3ce593d4cbe9b3c8ecd39c51b40125acfda677eb5/JavaScriptSolidServer/JavaScriptSolidServer/issues/102 |
| og:image:alt | Summary Proposing a pattern for using JSS as a sync backend for local-first note-taking applications like Logseq, Obsidian, and similar markdown-based tools. This would leverage Solid's existing LD... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | melvincarvalho |
| hostname | github.com |
| expected-hostname | github.com |
| None | 3310064f35a62c06a4024ba37f41c06836f39376a095c2dfd2c4b693c34965be |
| turbo-cache-control | no-preview |
| go-import | github.com/JavaScriptSolidServer/JavaScriptSolidServer git https://github.com/JavaScriptSolidServer/JavaScriptSolidServer.git |
| octolytics-dimension-user_id | 205442424 |
| octolytics-dimension-user_login | JavaScriptSolidServer |
| octolytics-dimension-repository_id | 958025407 |
| octolytics-dimension-repository_nwo | JavaScriptSolidServer/JavaScriptSolidServer |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 958025407 |
| octolytics-dimension-repository_network_root_nwo | JavaScriptSolidServer/JavaScriptSolidServer |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 67d5f8d1d53c3cc4f49fc3bb8029933c3dc219e6 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width