Skip to content

Conversation

@carlos-otero
Copy link

Summary

Adds bidirectional task synchronization with Vikunja, allowing tasks to sync between TaskNotes and a self-hosted or cloud Vikunja instance.

Features

  • Bidirectional sync: Push tasks to Vikunja on create/update/complete, pull changes from Vikunja on a configurable interval
  • Full field mapping: title, status, due date, scheduled date, priority, tags/labels, recurrence, reminders, description (HTML ↔ Markdown), and subtasks (via Vikunja relations API)
  • Unified settings UI: Single card in Integrations tab with master toggle that reveals sync options when enabled
  • Two-pass pull sync: Resolves race conditions where child tasks are processed before parent tasks exist locally

Field Mapping

TaskNotes Vikunja
title title
status done
due due_date
scheduled start_date
priority priority
tags labels
recurrence repeat_after
reminders reminders
projects parent task (relations API)
body description (HTML)

Changes

  • src/services/VikunjaService.ts - API client for Vikunja endpoints
  • src/services/VikunjaSyncService.ts - Sync logic with two-pass pull, field mapping, HTML/Markdown conversion
  • src/settings/tabs/integrationsTab.ts - Unified card UI for Vikunja settings
  • src/types/settings.ts - VikunjaSettings interface
  • src/settings/defaults.ts - Default settings values
  • src/main.ts - Service registration and sync interval scheduling
  • README.md - Documentation for Vikunja sync setup

Testing

  1. Configure API URL, Token, and List ID in Settings → Integrations → Vikunja Task Sync
  2. Enable sync and verify connection with "Test Connection"
  3. Create/update tasks in TaskNotes and verify they appear in Vikunja
  4. Create/update tasks in Vikunja and trigger "Sync Now" to verify they appear in TaskNotes

- Add 2-way sync for Due Date, Scheduled Date, and Priority.
- Add Recurrence synchronization (Vikunja seconds <-> RFC 5545).
- Add full Reminder sync (Absolute & Relative) with ID mapping.
- Fix date parsing issues (handle 0001-01-01).
- Implement self-healing for corrupted date fields.
- Add 'Vikunja: Sync Now' command with completion notifications.
- Update settings UI with sync options.
…sion

- Added VikunjaService and VikunjaSyncService.
- Implemented bidirectional sync for Tasks (Status, Title, Description, Dates).
- Implemented Tag/Label two-way sync.
- Added Turndown/Showdown for HTML <-> Markdown conversion.
- Fixed Push logic to detect manual file edits.
- Added Vikunja settings tab and configuration.
- Implement two-pass pull sync to resolve subtask race conditions.
- Implement bidirectional mapping between Tasknotes projects and Vikunja parenttask relations.
- Add syncParentRelation method to handle Vikunja relations API.
- Switch from subtask to parenttask relation kind for correct hierarchy.
- Remove deprecated parent_task_id usage.
- Implement HTML<->Markdown description syncing.
- Implement bidirectional Tag/Label syncing.
- Remove duplicate 'Vikunja Integration' settings section
- Create single card-based UI with master 'Enable Vikunja Sync' toggle
- Show connection settings (API URL, Token, List ID) always visible
- Show sync options (interval, triggers) only when sync is enabled
- Add dynamic status badge (Connected/Connection Error/Disabled)
- Add 'Sync Now' button only when enabled
- Follow same card design pattern as calendar integrations
- Add Vikunja Sync section with setup instructions
- Document sync options (create/update/complete, two-way sync)
- Add field mapping table between TaskNotes and Vikunja
@carlos-otero carlos-otero changed the title Feature/vikunja sync: add bidirectional Vikunja task synchronization feat: add bidirectional Vikunja task synchronization Jan 11, 2026
…ty 2 (Medium)

in Vikunja. Now they correctly use priority 0 (Unset). Also added medium as an
alias for normal and improved handling of unset priorities when syncing from Vikunja.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant