super-productivity/docs/wiki/4.24-Integrations.md
Johannes Millan 03572c3f2c
Feat/start of next day (#6565)
* feat: add label to heatmap for repeat task

* style(e2e): fix prettier formatting in planner spec

* fix(focus-mode): clear stale _isResumingBreak flag when isPauseTrackingDuringBreak is enabled (#6534)

When both isSyncSessionWithTracking and isPauseTrackingDuringBreak are
enabled, pausing and resuming a break left _isResumingBreak stale,
causing the next manual tracking start to dispatch clearResumingBreakFlag
instead of skipBreak. Refactor syncSessionResumeToTracking$ to explicitly
dispatch clearResumingBreakFlag in this case.

* refactor(sync): unify JWT expiry to 365 days for all auth methods

Replace separate JWT_EXPIRY_MAGIC_LINK (365d) and JWT_EXPIRY_PASSKEY (7d)
constants with a single JWT_EXPIRY (365d). The auth method only matters
during login — once a JWT is issued, it represents a verified session
regardless of how the user authenticated.

* feat(start-of-next-day): respect startOfNextDayDiff offset in today view

Thread startOfNextDayDiffMs through AppState, selectors, meta-reducers,
and task component so that "today" membership correctly accounts for the
user's configured day-start offset. When startOfNextDay=4 (4 AM), at
2:30 AM the app now correctly treats the previous calendar day as "today".

- Add isTodayWithOffset utility for offset-aware date comparison
- Store startOfNextDayDiffMs in AppState alongside todayStr
- Update all selectors (work-context, planner, task, overdue) to use offset
- Update meta-reducers with defensive fallbacks for state access
- Fix task component computed signals (isOverdue, isScheduledToday, etc.)
- Add 48 new tests covering offset boundary conditions

* style(planner): remove unused eslint-disable directive

* fix(start-of-next-day): use offset-aware date in ensureTasksDueTodayInTodayTag effect

Replace raw getDbDateStr() and getDateRangeForDay(Date.now()) with
store-derived todayStr and offset-adjusted range in task-due.effects.ts.
Without this, the effect would use the wrong day between midnight and
the configured startOfNextDay hour.

Also add selectOverdueTasks offset boundary tests.

* refactor(start-of-next-day): use DateService for offset-aware today checks

Add DateService.isToday() method that encapsulates the startOfNextDayDiff
offset logic, replacing scattered isToday()/getDbDateStr() calls across
effects, services, and components.

- Add isToday(date) to DateService for DRY offset-aware checks
- Fix task-repeat-cfg.effects.ts: 6 isToday/getDbDateStr calls
- Fix task-repeat-cfg.service.ts: isToday call
- Fix task-context-menu-inner.component.ts: 6 isToday/getDbDateStr calls
- Fix task-related-model.effects.ts: getDbDateStr call
- Fix work-context.service.ts: getDbDateStr call
- Remove duplicate planTaskForDay handler from tag.reducer.ts
  (already handled by planner-shared meta-reducer with offset)

* refactor(start-of-next-day): migrate remaining isToday() calls to offset-aware DateService

Replace 6 call sites still using the non-offset isToday()/isYesterday()
with DateService methods that respect startOfNextDayDiff. Also adds
isYesterday() to DateService and uses isTodayWithOffset in legacy backup
migration. Behavior is identical at offset=0 (default).

* fix(start-of-next-day): fix offset bugs, sync regression, and code quality issues

- Fix wrong config path in legacy backup migration (misc.startOfNextDay)
- Restore sync readiness check (filter+first instead of take(1))
- Restore SYNC_AFTER_ENABLE in setInitialSyncDone conditions
- Use offset-aware dates in addAllDueToday/addAllDueTomorrow
- Make isSameDay offset-aware and pass offset through planner selectors
- Fix TagSettingsPageComponent selector from 'project-settings' to 'tag-settings'
- Hide settings link for virtual TODAY tag
- Revert direct ru.json edits (only en.json should be edited)
- Add standalone:true and use takeUntilDestroyed in settings components
- Restore Math.max(duration,1) for zero-duration overlap detection
- Remove dead code, stale CSS, and commented-out HTML
- Add input validation clamping in DateService.setStartOfNextDayDiff

* fix(start-of-next-day): fix offset bugs in overdue detection, planner display, and LWW sync

- Fix isOverdue ignoring offset for dueWithTime tasks in task.component
- Remove duplicate moveBeforeTask handler from tag.reducer (handled by meta-reducer)
- Add skip(1) and hydration guard to setTodayStr$ effect to prevent race condition
- Move side effects from map() to tap() in global-config.effects
- Fix isSameDay double-offset bug in planner.selectors for scheduled tasks/events
- Replace unsafe `as any` casts with proper PlannerState types
- Use safe optional chaining for todayStr access in meta-reducers
- Refactor handlePlanTaskForDay to use helper functions with hasChanges optimization
- Extend syncTodayTagTaskIds in LWW meta-reducer to handle dueWithTime changes
- Fix absolute import path in global-config.effects
- Add @deprecated to isToday() in favor of offset-aware alternatives

* fix(config): migrate task dueDays when startOfNextDay offset changes

When the "start of next day" offset changes and causes todayStr to shift,
existing tasks with dueDay matching the old todayStr are now migrated to
the new todayStr so they remain classified as "today" tasks.

* refactor(config): use switchMap and document archive task exclusion

Replace mergeMap with switchMap in setStartOfNextDayDiffOnChange
effect to better communicate intent (only latest emission matters).
Add comment clarifying archived tasks are intentionally excluded
from dueDay migration.

* test(sync): add LWW tests for dueWithTime → TODAY_TAG sync

Cover the dueWithTime path in syncTodayTagTaskIds that was added
but had no test coverage. Tests verify TODAY_TAG membership updates
when dueWithTime changes via LWW sync.
2026-02-21 12:47:19 +01:00

9.3 KiB

Integrations

Super Productivity offers two main kinds of integrations: Issue Providers (for bringing in tasks from external project management or issue-tracking systems) and Sync Providers (for backing up and synchronizing your data across devices). Both are optional. Understanding what each type does, which providers exist, and how they fit into your workflow helps you decide whether and how to use them.

For step-by-step setup and daily use of issue integrations, see 2.07-Manage-Task-Integrations. For a detailed comparison of issue provider capabilities, see 3.07-Issue-Integration-Comparison; for sync providers, see 3.08-Sync-Integration-Comparison. For where your data is stored, how sync and backups work, and technical details, see 3.06-User-Data and 4.23-Managing-Your-Data.

Two Categories of Integrations

Issue Providers

Issue providers connect the app to external systems (Jira, GitHub, GitLab, and others) so you can:

  • Search for issues (bugs, stories, tickets) in those systems.
  • Add them as tasks in Super Productivity with one click.
  • Keep task titles, status, and other details in sync with the external system.
  • Optionally send time logs or status updates back (when the provider supports it).

Each issue provider has its own configuration (URLs, API tokens, filters). You can enable multiple providers and assign them to different projects. Tasks created from issues carry issue integration attributes (issue ID, provider, link to the external item); see 4.09-Task-Attributes.

Sync Providers

Sync providers handle data synchronization between devices (or between the app and a backup location). They do not import issues; they sync your existing Super Productivity data (tasks, projects, time tracking, settings, and so on). Supported options include:

  • WebDAV — Works with Nextcloud, ownCloud, and other WebDAV-compatible servers.
  • Dropbox — Uses OAuth so you can store your sync file in Dropbox.
  • SuperSync — A dedicated sync server that can optionally use end-to-end encryption. SuperSync is very new and is still in beta.
  • Local file sync — Desktop only; syncs to a local or network folder.

Sync is local-first and operation-based: your device holds the primary copy, and changes are sent as operations to the remote side. For a comparison of sync providers (platform, auth, encryption), see 3.08-Sync-Integration-Comparison. For conflict handling and backup behavior, see 4.23-Managing-Your-Data and 3.06-User-Data.

Available Issue Providers

The app supports 11 issue-style integrations (the exact list may vary by version): Jira, GitHub, GitLab, Gitea, OpenProject, CalDAV, Calendar (iCal), Redmine, Trello, Linear, and ClickUp. Each has a display name and icon in the Issue Panel. Configuration is per-provider and often per-project (e.g. which project new issues are added to).

Capabilities vary by provider. Some support full two-way sync (e.g. status transitions and worklog submission); others are mainly for importing and refreshing issues. For a comparison of what each issue provider supports—issue import, status transitions, worklogs, comments, subtasks, attachments, filtering, auto-import, story points, due dates—see 3.07-Issue-Integration-Comparison. For a comparison of sync providers (WebDAV, Dropbox, SuperSync, local file), see 3.08-Sync-Integration-Comparison. In short: Jira and OpenProject offer the widest set (worklogs, status workflows, story points); GitHub and GitLab offer issue import and comments; CalDAV and Calendar (iCal) focus on calendar/todo and events; ClickUp supports subtasks alongside Jira.

iCal Vs CalDAV

Calendar (iCal) and CalDAV are both calendar-related but use different protocols and data:

Calendar (iCal) — Uses a subscription URL to fetch an iCal feed (e.g. .ics). The app parses VEVENT components only (events with start/end time). Events appear in the Schedule/Planner; the event description becomes the task note.

  • No login is required: you only paste the calendar URL (e.g. a “subscription” or “export” link).
  • The app does not sync completion or changes back to the server; if you change the event in the app, the external calendar is not updated.
  • In Nextcloud, use the “Copy subscription link” (or equivalent) so the URL is in the form expected for iCal (e.g. https://<NC-URL>/remote.php/dav/public-calendars/<CALENDAR-ID>?export). Do not use the “Copy private link” here—that format is for CalDAV.

CalDAV — Connects to a CalDAV server (e.g. Nextcloud calendars) with username and password.

  • The app requests VTODO components only (tasks/todos). It does not use VEVENTs.
  • You get task import and completion status can sync back to the server.
  • In Nextcloud, use the “Copy private link” (or the CalDAV URL for your user/calendar), e.g. https://<NC-URL>/remote.php/dav/calendars/<USER>/<CALENDAR_NAME>/. Do not use the subscription/export link here—that is for the iCal integration.

For more detail see 3.07-Issue-Integration-Comparison.

How You Use Integrations in Practice

Setup

  1. Open the Issue Panel (right side on desktop, bottom on mobile) and use the "+" tab to see available issue providers.
  2. Add and configure a provider: enter URLs, API tokens, and any filters (e.g. JQL, assignee) in the form for that provider.
  3. Optionally set a default project so new issues are added to the right project, and reorder provider tabs by drag-and-drop if you use several.

Sync is configured separately (e.g. in settings) by choosing a sync provider and connecting your account or path.

Daily Workflow

  1. Search and add — In the Issue Panel, search within a provider and add issues as tasks with one click.
  2. Polling — The app can poll in two ways:
    • Poll for changes — Update already-imported tasks when the external system changes.
    • Auto-add to backlog — Periodically import new issues that match your filters into a project backlog.
  3. Task sync — When an issue changes in the external system, the app can update the linked task and notify you.
  4. Sending data back — For providers that support it (e.g. Jira, OpenProject), completing a task or logging time can submit worklogs or status updates to the external system.

Handy Options

  • Pinned searches — Save frequently used search queries in the Issue Panel for quick access.
  • Default project — Attach a provider to a project so new issues land in that project by default.
  • Subtasks — Providers like Jira can import subtasks and keep the hierarchy in the app; see 4.11-Subtasks.

Impact on Users Who Do Not Use Integrations

Integrations are optional and designed to have minimal impact if you do not use them:

  1. Issue Panel — The panel is only shown if you open it or add a provider. You can do everything with the main add-task bar and never see issue integrations.
  2. Task creation — You can create and use "plain" tasks (no issue link) without any provider. The core add-task flow does not depend on integrations.
  3. UI — The Issue Panel can be toggled off so it does not clutter the interface.
  4. Performance — When a provider is disabled, no polling or API calls run for it, so there is no background cost for providers you do not use.

If you only use sync (e.g. WebDAV or Dropbox) and no issue providers, you get backup and cross-device sync without any issue-import features.

Platform and Privacy Notes

  • Web vs desktop — Some integrations (e.g. Jira, calendar, WebDAV) can be limited in the browser by CORS. The app may recommend the desktop version or the Chrome extension for full functionality. This does not affect users who do not use integrations.
  • Privacy — Integrations talk directly to your chosen services (Jira, GitHub, your WebDAV server, etc.). The app does not send your data to Super Productivity servers; configuration and synced data stay under your control and in the storage you choose.

Summary

  • Issue providers import and sync tasks from external issue/project systems (Jira, GitHub, GitLab, etc.); sync providers sync your app data across devices (WebDAV, Dropbox, SuperSync, local file).
  • Both are optional; the app works fully without any integration.
  • Setup is via the Issue Panel (for issue providers) and sync settings (for sync providers). Daily use: search → add as task → optional polling and two-way updates where supported.
  • Users who do not use integrations see no meaningful overhead; the Issue Panel and polling only run when configured.