~/Projects/logseq-nextcloud-sync
This is a standalone Logseq plugin project, moved out from the earlier monorepo workspace. It is now symlinked into:
~/.logseq/plugins/logseq-nextcloud-sync
GitHub repository:
https://github.com/olterman/logseq-nextcloud-sync
Git remote origin is configured to use HTTPS:
https://github.com/olterman/logseq-nextcloud-sync.git
src/main.tsPlugin entry point, settings schema, command registration, renderer-backed UI pages, task-scope manager flow, calendar selector flow.src/caldav.tsTask collection, task sync, task-list discovery, task-list creation, task completion mirroring, scope-aware task filtering.src/calendar.tsCalendar event collection, calendar sync, calendar discovery, calendar selector support.src/types.tsShared plugin settings and domain types.
- Generic task sync, not tied to the academia plugin structure.
- Scopeable task filtering by page type and/or page tags.
- Multiple saved task scopes, each with:
- name
page-typefilter string- tag filter string
- bound Nextcloud task-list URL
- enabled flag
- Active scope selection.
- Sync-one-scope and sync-all-enabled-scopes flows.
- Discovery of Nextcloud VEVENT calendars.
- Discovery of Nextcloud VTODO task lists.
- Creation of remote Nextcloud VTODO task lists for the active scope.
- Selector/manager pages rendered inside Logseq.
- ICS export for tasks and calendar events.
- Mirroring of remote completed tasks back into matching Logseq blocks.
- Plugin metadata files now exist for Logseq UI / packaging:
manifest.jsonLICENSE- enriched metadata in
package.json
Nextcloud Tasklist ScopesMain task scope manager.Nextcloud Calendar PickerCalendar discovery and selection page.Nextcloud TasksSnapshot page for the currently refreshed/active scope.Nextcloud CalendarSnapshot page for discovered calendar events.
These pages are generated by the plugin and are rewritten by the plugin when refreshed or ensured.
There is a compatibility fallback from the older single-scope model:
- If
taskScopesJsonis empty, the plugin synthesizes a legacy default scope from:caldavTaskListUrltaskFilterPageTypestaskFilterTags
Once named scopes are created and saved, those become the primary source of truth.
The latest review surfaced a few correctness risks that have not been fixed yet:
state.tasksis shared across scopes insrc/main.ts, so previewing one scope can leave cached tasks that later get synced for another scope.- The task sync cache in
src/caldav.tsis global rather than per-scope/per-task-list, so delete tracking is unreliable across multiple saved scopes. CANCELLEDtasks are currently flattened intoCOMPLETED/DONEsemantics during sync and mirror-back.- The overview/helper pages are destructively rewritten, so custom content on those pages will be removed.
- Fix scope-specific task caching in
src/main.tsso previewing one scope cannot affect syncing another scope. - Make task sync cache storage scope-aware or task-list-aware in
src/caldav.ts. - Preserve cancellation state distinctly instead of mapping it to completion.
- Decide whether generated pages should stay destructive or move to safer append/managed-block behavior.
- Add delete/duplicate controls for task scopes in the manager UI.
- Add per-scope test-connection UI and per-scope export UI buttons.
- Consider replacing prompt-based scope editing with a richer in-page form.
./node_modules/.bin/tsc -p tsconfig.json --noEmitnode esbuild.mjs
Both were passing at the latest handoff update.