* fix: address review findings from daily changes
- Add setPermissionCheckHandler alongside setPermissionRequestHandler
for defense-in-depth in Electron (permission queries now also denied)
- Fix tagIds merge ordering in issue service: provider adapter tags are
now merged with default tags instead of being silently overwritten
- Execute deleteTask action last in automations to prevent subsequent
actions from failing on a deleted task
- Add unit tests for getTaskDefaults logic (TODAY_TAG filtering,
defaultNote, tagIds merging, deduplication, context tags)
- Add test for deleteTask execution ordering in ActionExecutor
https://claude.ai/code/session_01UhoR5g7RQgm4E6bZCvU9PS
* refactor: revert YAGNI changes from review fixes
- Revert tagIds merge in issue.service.ts: no provider currently sets
tagIds in getAddTaskData, so merging solves a hypothetical problem
- Revert deleteTask sort in action-executor: the automations feature is
new and nobody has hit this edge case yet
- Remove tests for reverted behavior, keep tests for existing features
(TODAY_TAG filtering, defaultNote, note override prevention)
https://claude.ai/code/session_01UhoR5g7RQgm4E6bZCvU9PS
---------
Co-authored-by: Claude <noreply@anthropic.com>
Enable webSecurity (same-origin policy) since CORS is already handled at
the session level via onBeforeSendHeaders and onHeadersReceived. Add
setPermissionRequestHandler to deny unnecessary permissions (webcam,
microphone, geolocation). Improve certificate-error logging with warn
level and URL context.
Bundle preload.ts into a single file so all local imports (e.g.
ipc-events.const) are inlined at build time. This allows removing
sandbox: false since the bundled preload only requires the built-in
electron module, which is allowed in sandboxed preloads.
The preload script uses require() for local modules which is not
supported in Electron's sandboxed preload environment (default since
Electron 20). This only affects Electron's preload API restrictions,
not Chromium's OS-level process sandbox which remains active.
Add OAuth support for plugins with PKCE, token persistence in local-only
IndexedDB, and Electron/web redirect handling. Extend two-way sync with
dueDay, dueWithTime, and timeEstimate field mappings including mutually
exclusive field clearing. Support remote issue deletion on task delete
and remote deletion detection during polling.
Add Google Calendar plugin (disabled from bundled builds pending legal
review) as a development reference for the plugin OAuth and two-way
sync APIs.
Additional fixes:
- Restore accidentally deleted focus-mode translation keys
- Remove full Task[] from deleteTasks action to prevent op-log bloat
- Add dueDay/deadlineDay format validation guards (#6908)
- Fix Android reminder alarm cancel intent matching
- Validate dueDay format to prevent false overdue from corrupted data
- Fix PKCE test expectation after utility consolidation
- Make overlay window resizable with persisted bounds via simpleStore
- Add new OverlayIndicatorConfig section (isEnabled, isAlwaysShow, opacity)
- Move setting from misc.isOverlayIndicatorEnabled to overlayIndicator
with migration in reducer
- Add responsive CSS with scale variable (full/tiny modes)
- Add always-show mode that keeps overlay visible when main window is open
- Add opacity slider (10-100%) applied as CSS variable
- Consolidate overlay init into single updateOverlayEnabled path
- Remove dead code: updateOverlayTheme, setIgnoreMouseEvents, unused
shortcut param
Guard the SET_PROGRESS_BAR tray icon update with an _isRunning check so
that late IPC events (e.g. trailing throttle emissions from focus mode)
cannot override the correct stopped icon after a task is unset.
Closes#3410
Previously the 1px border only appeared with the custom title bar
enabled. Now it shows for all Electron windows and is hidden during
fullscreen via IPC-driven body class toggling.
* fix: add proxy env support for jira integration #6324
* refactor(providers): address code review feedback from proxy support for jira provider
* refactor(providers): removed manually setting electron session proxy as settings are automatically picked
---------
Co-authored-by: Thomas Tisch <thomas.tisch@hobex.at>
Suppress noisy "EXITING due to failed single instance lock" message when
a second instance is launched via xdg-open for protocol URL handling.
Register superproductivity:// as a MIME type handler in the .desktop file
so Linux users no longer need manual xdg-settings configuration.
Remove duplicate requestSingleInstanceLock() call in start-app.ts.
Closes#173
Previously the tray icon only changed from "stopped" to "running" when
SET_PROGRESS_BAR fired on the first addTimeSpent tick, which could take
up to 60 seconds depending on the tracking interval. Now the
CURRENT_TASK_UPDATED handler sets the running icon immediately.
Extracts getRunningIconPath() helper to share icon selection logic
between SET_PROGRESS_BAR and CURRENT_TASK_UPDATED handlers.
Closes#6566
- Gate blur() to Windows only (not supported on Wayland, limited on macOS)
- Add setTimeout delay in ready-to-show to match showOrFocus pattern
- Add webContents.focus() in ready-to-show for renderer-level focus
- Add isDestroyed() guards in setTimeout callbacks
- Only restore focus on resume/unlock if window was visible before
suspend/lock to avoid surfacing hidden/minimized windows
On Windows, BrowserWindow.show() can silently fail to acquire keyboard
focus after a system reboot (electron#20464). This leaves the window in
a "phantom focus" state where clicks work but typing does not.
- Add blur()+focus() cycle after show() in ready-to-show handler
- Add webContents.focus() in showOrFocus() delayed callback
- Add showOrFocus() call in resume/unlock-screen power monitor handlers
Fixes#6663
Windows ties tray icon GUIDs to the executable path when unsigned.
Portable and NSIS builds have different exe paths, so sharing a single
GUID caused silent tray creation failure in whichever distribution
registered second. Each distribution type now gets its own stable GUID.
Portable keeps the original GUID to avoid disrupting existing users.
NSIS and Store get new GUIDs for a clean start.
Also adds a try/catch fallback that retries without GUID if creation
fails (e.g., stale GUID registrations).
Closes#6647
In older app versions simpleSettings was stored as a directory. Reading
it as a file threw EISDIR which was caught/logged but saveSimpleStore()
would subsequently fail with an uncaught EISDIR when writing to the
same path.
- Catch EISDIR in loadSimpleStoreAll and rename legacy dir to .bak
- Catch EISDIR in saveSimpleStore, remove dir and retry write
- Replace module-level DATA_PATH with lazy getDataPath() to fix
stale path when --user-data-dir or Snap overrides userData
- Remove debug console.log that leaked settings to stdout
- Replace console.error with electron-log for consistency
Closes#4791
Remove dead methods (getCurrentSyncData, wouldConflict), dead types
(SyncVersionConflictError, MigrationInProgressError, MigrationLockContent),
dead IPC handler (fileSyncGetRevAndClientUpdate), and a dead mutation.
Deduplicate retry logic in _uploadWithRetry by reusing _buildMergedSyncData.
Make Electron file writes atomic via write-to-temp-then-rename.
Clear _processedOpIds and persist state in _deleteAllData() to prevent
stale localStorage from surviving app restart after a delete-all operation.
Preserve original Error objects in electron/local-file-sync.ts catch
blocks instead of wrapping with `new Error(e as string)`, which loses
structured fields like `code` and the original stack trace.
Backups now use YYYY-MM-DD_HHmmss.json naming instead of YYYY-MM-DD.json,
allowing multiple backups per day instead of overwriting. A cleanup routine
keeps the 14 most recent backups plus the last backup of each day for 7 days.
requestSingleInstanceLock() creates a Unix domain socket blocked by the
macOS App Store sandbox, causing the app to silently fail to start (#6275).
macOS natively prevents multiple app launches, so the lock is unnecessary.
* docs(clipboard): Added the plan to guide AI implementation.
* feat(clipboard): Changed requirement to reflect the fact that some functions can't be done in browsers.
* feat(clipboard): Added Ctrl-v pasting functionality from clipboard.
- Storing image in IndexedDB in browser, and storing image in userdata path in Electron.
- Added image resizing in markdown.
* docs(clipboard): Removed requirement file since it's implemented.
* feat(clipboard): Added clipboard images management in settings.
* feat(tests): Enhance focus mode and inline markdown tests with mock store and actions
* feat(clipboard): Add electron-only annotation to findImageFile function
* feat(clipboard): Prevent memory leaks by revoking cached blob URLs on image deletion
* feat(clipboard): Improve paste handling by tracking current placeholder and cleaning up old progress
* Merge branch 'master' into feat/clipboard-files
* feat(marked-options): Refactor renderer methods and add hooks for image sizing syntax
* feat(clipboard): Added feature that pasted image will be added to task attachment.
* revert: Revert the change of lock file from last merge.
* revert: Removed unwanted changes.
* refactor(clipboard): Cleaned up code that seems not necessary.
* feat(clipboard): Handle storage quota exceeded error and update messages
* feat(clipboard): Implement validated IPC handlers for clipboard image operations
* feat(clipboard): Add error handling for clipboard image URL resolution
* feat(clipboard): Refactor file operations to use async fs promises
* feat(clipboard): Integrate ClipboardPasteHandlerService for improved paste handling
* feat(clipboard): Rename resolveUrl to resolveIndexedDbUrl for clarity and update references
* feat(clipboard): Add defaultPath option to showOpenDialog for improved user experience
* feat(clipboard): Implement getDefaultClipboardImagesPath utility for consistent image path retrieval
* feat(clipboard): Refactor MIME type handling to use centralized mapping for improved maintainability
* feat(clipboard): Add computed property to toggle markdown parsing based on formatting settings
* revert: Removed unwanted changes.
* revert: Removed unwanted chagnes.
* revert: Removed unwanted chagnes.
* fix(clipboard-images-cfg): remove debug log from selectImagePath method
* refactor(paste-handler): update currentPlaceholder to use getter/setter methods
* fix(docs): correct formatting and improve clarity in multiple wiki pages
* fix: update dialog handling in initLocalFileSyncAdapter for type safety
* revert: Revert space change.
* fix(inline-markdown): ensure model is set to an empty string instead of undefined
* fix(tests): update clipboard images section locator to use collapsible title
- Fix isLoading staying true after search results arrive in issue panel
- Use getPayloadKey() for correct entity key derivation in conflict resolution
- Update archive-wins comments/logs to reflect all op types, not just updates
- Add archive-wins unit tests for local/remote archive vs UPDATE/DELETE
- Tighten WebDAV archive E2E assertion to deterministic archive-wins check
- Add @deprecated JSDoc to legacy pfapi meta-model-ctrl.js
- Refactor wasMaximizedBeforeHide from exported let to getter/setter
* fix(window): restore maximized window state from startup/minimized/tray
Changes:
Call `win.restore()` before `win.show()` to ensure the window returns to its previous state when restored from startup/minimized/tray.
Fixes#5466
* fix(window): add manual tracking of maximized window state before hide
Changes:
add wasMaximizedBeforeHide flag to manually track and handle maximized window state reliably across all platforms
* fix(window): add manual tracking of maximized window state before hide
Changes:
add wasMaximizedBeforeHide flag to manually track and handle maximized window state reliably across all platforms
If I understand the codebase correctly, this will do exactly as the title states, if not, please educate me :). Also is there a way to turn of idle checking when it is also turned of in the settings?
- Replace deprecated `selector:` properties with proper Electron `role:` in macOS menu
- Add standard macOS menu items (hide, hideOthers, unhide)
- Ensure before-close handlers always call setDone() to prevent app hanging
- Change sync error dialog from confirm() to alert() since result was ignored
The tray icon was jumping between showing task time and focus session time
when focus mode was active with a task being tracked. This occurred because
the tray display logic didn't know which focus mode was active.
Changes:
- Send focus mode type (Countdown/Pomodoro/Flowtime) from frontend to Electron
- Update IPC handler to receive and pass focus mode type to tray message creation
- Implement three-mode priority logic in createIndicatorMessage():
1. Countdown/Pomodoro modes: Show focus session countdown timer
2. Flowtime mode: Show task estimate or title (no timer)
3. No focus mode: Show normal task time (existing behavior)
- Update TypeScript type definitions for updateCurrentTask()
- Update unit tests to mock the new mode() signal
This ensures the tray displays the correct timer without jumping based on
the active focus mode, matching the behavior of the overlay indicator.
Fixes jumping tray indicator during focus mode + tracking
Fixes#6042 where app wouldn't launch from taskbar when minimize to tray
was enabled. The second-instance handler now uses showOrFocus() which
properly handles both hidden and minimized windows, matching the behavior
of the tray icon click handler.
Electron validates the GUID argument even when undefined is passed,
causing "Invalid GUID format" error on Linux/macOS. Only pass the
GUID argument on Windows where it's needed.
Add a static GUID to the Electron Tray constructor on Windows to persist
tray icon position and visibility preferences across app updates. This
prevents the tray icon from being hidden in the overflow menu after
Microsoft Store updates change the executable path.
Closes#5973
* master:
refactor(dialog): remove unused OnDestroy implementation from DialogAddNoteComponent
fix(calendar): poll all calendar tasks and prevent auto-move of existing tasks
docs: add info about how to translate stuff #5893
refactor(calendar): replace deprecated toPromise with firstValueFrom
build: update links to match our new organization
add QuestArc to community plugins list
feat(calendar): implement polling for calendar task updates and enhance data retrieval logic
fix(heatmap): use app theme class instead of prefers-color-scheme
fix(focus-mode): start break from banner when manual break start enabled
feat(i18n): connect Finnish and Swedish translation files
refactor(focus-mode): split sessionComplete$ and breakComplete$ into single-responsibility effects
Fixing Plugin API doc on persistence
# Conflicts:
# src/app/features/issue/store/poll-issue-updates.effects.ts
# src/app/t.const.ts
Improve error text extraction utilities to never return "[object Object]"
when displaying error messages to users. The fix adds more robust fallback
mechanisms including:
- Check for message, name, statusText properties before calling toString()
- Detect "[object Object]" result and fallback to JSON.stringify()
- Provide meaningful fallback messages when all extraction methods fail
Fixes#5790
* master:
fix(test): use dynamic date in year boundary test to avoid today collision
fix(electron): reduce idle detection log verbosity
fix(plugins): ensure setCounter creates valid SimpleCounter records
feat(android): add quick add widget
perf(android): prewarm WebView during idle time to speed up startup
fix(ical): prevent race condition in lazy loader
Merge branch 'master' into master
# Conflicts:
# src/app/features/android/store/android.effects.ts
# src/app/features/schedule/ical/get-relevant-events-from-ical.spec.ts
Resolve conflict in webdav-sync-expansion.spec.ts:
- Use simplified sync verification without reload (sync updates NgRx directly)
- Test: B marks task done -> sync -> verify A sees task as done
Add isFlatpak() detection to Electron API and show environment-specific
error messages when file permission errors occur during sync:
- Flatpak users see Flatseal and ~/.var/app/ guidance
- Snap users see 'snap connect' and ~/snap/... guidance
- Other users see generic permission error
Addresses #4078
E2E test improvements:
- Increase timeouts for sync button and add task bar visibility checks
- Add retry logic for sync button wait in setupSuperSync
- Handle dialog close race conditions in save button click
- Fix simple counter test to work with collapsible sections and inline forms
Build fixes:
- Add es2022 lib/target and baseUrl to electron tsconfig
- Include window-ea.d.ts for proper type resolution
- Add @ts-ignore for import.meta.url in reminder service for Electron build
* master:
fix(electron): use includes() instead of in operator for hostname check
fix(docker): use Debian-based nginx for ARM64 QEMU compatibility
16.6.1
build: add resolved URL and integrity for ical.js version 2.1.0
fix(ui): align time tracking button overlay (#5720)
fix(calendar): handle Office 365 updateTimezones crash (#5722)
fix(repeat): use fallback for undefined startDate (#5724)
build(welcome): update wording for issue claiming instructions
fix(docker): drop arm/v7 platform to fix QEMU build failure