* fix(persistence): increase IndexedDB retry window for session-restart locks On Linux desktop environments (especially Flatpak with autostart), logging out and back in can leave stale LevelDB locks for 5-15+ seconds. The previous retry window (~3.5s) was too short to outlast this, causing "Database Error - Cannot Load Data" on every logout/login cycle. Increase IDB_OPEN_RETRIES from 3 to 5 and IDB_OPEN_RETRY_BASE_DELAY_MS from 500ms to 1000ms, giving a total retry window of ~31 seconds. Fixes #7191 * fix: update stale retry timing comments to match new constants * fix(persistence): gate long IDB retry window on lock-related errors _ensureInit() is awaited by every op-log read/write, and the hydrator auto-reloads on IndexedDB open errors. Applying the ~31s retry window to every error class could create a reload -> wait -> reload loop that feels like a hang. Classify the error on first failure and fall back to a short retry budget (IDB_OPEN_RETRIES_NON_LOCK=2, ~3s window) for errors that don't look lock-related. InvalidStateError and messages containing "backing store" still get the full window used for stale LevelDB locks on Linux desktop session restart. See #7191. The spec is hardened to assert concrete constant floors rather than recomputing the backoff formula (which only proved the formula matched itself). Also adds unit tests for the classification helper. * fix(persistence): address review feedback on IDB retry split - Correct stale "auto-reload" rationale in op-log-errors.const, operation-log.const, operation-log-store.service, and archive-store.service: the hydrator shows a blocking alert dialog on IndexedDBOpenError, it does not auto-reload. The fail-fast argument now reflects the real reason — every op-log read/write awaits _ensureInit(), so a 31s wait on a non-lock error blocks the subsystem for 31s before the alert dialog surfaces. - isLockRelatedIdbOpenError now checks `err instanceof DOMException || err instanceof Error` before reading .name/.message, mirroring the pattern in the sibling isConnectionClosingError. In some Electron / older runtimes DOMException does not satisfy instanceof Error. - Added behavioral tests for _openDbWithRetry that spy on a new _openDbOnce testing seam: generic errors take exactly 1 + IDB_OPEN_RETRIES_NON_LOCK attempts, InvalidStateError takes up to 1 + IDB_OPEN_RETRIES, and a lock-error followed by success resolves. - Bumped IDB_OPEN_RETRIES_NON_LOCK from 2 to 3 to match master's pre-PR retry count (1s + 2s + 4s = ~7s ceiling). Framing this as "keep master's existing retry count for non-lock errors, add long retry only for lock errors" is a lower-risk scope. Adjusted the const spec's upper-bound assertion accordingly. - Replaced the "retries 1-5" hardcoded schedule comment in operation-log-store.service and archive-store.service with a formula-based comment so the two retry budgets can't drift out of sync with reality. - Added two DOMException-shaped test cases to operation-log.const.spec.ts covering the new predicate branch. * docs(persistence): clean up rot-prone worked examples in retry docstrings |
||
|---|---|---|
| .devcontainer | ||
| .github | ||
| .husky | ||
| .signpath/policies/super-productivity | ||
| .vscode | ||
| android | ||
| build | ||
| docs | ||
| e2e | ||
| electron | ||
| eslint-local-rules | ||
| fastlane/metadata/android | ||
| ios | ||
| nginx | ||
| packages | ||
| scripts | ||
| snap/hooks | ||
| src | ||
| tools | ||
| .browserslistrc | ||
| .dockerignore | ||
| .editorconfig | ||
| .env.example | ||
| .gitattributes | ||
| .gitignore | ||
| .gitmodules | ||
| .gitpod.yml | ||
| .npmrc | ||
| .nvmrc | ||
| .prettierignore | ||
| .prettierrc.json | ||
| .stylelintrc.mjs | ||
| AGENTS.md | ||
| angular.json | ||
| ARCHITECTURE-DECISIONS.md | ||
| capacitor.config.ts | ||
| CLAUDE.md | ||
| CONTRIBUTING.md | ||
| docker-compose.e2e.fast.yaml | ||
| docker-compose.e2e.yaml | ||
| docker-compose.supersync.yaml | ||
| docker-compose.yaml | ||
| docker-entrypoint.sh | ||
| Dockerfile | ||
| Dockerfile.e2e.dev | ||
| Dockerfile.e2e.dev.fast | ||
| electron-builder.yaml | ||
| eslint.config.js | ||
| Gemfile | ||
| Gemfile.lock | ||
| LICENSE | ||
| ngsw-config.json | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| SECURITY.md | ||
| tsconfig.base.json | ||
| tsconfig.json | ||
| webdav.yaml | ||
An advanced todo list app with timeboxing & time tracking capabilities that supports importing tasks from your calendar, Jira, GitHub and others
🌐 Open Web App or 💻 Download
💻 Downloads & Install
For all current downloads, package links, and platform-specific notes:
check the wiki.
✔️ Features
- Keep organized and focused! Plan and categorize your tasks using sub-tasks, projects and tags and color code them as needed.
- Use timeboxing and track your time. Create time sheets and work summaries in a breeze to easily export them to your company's time tracking system.
- Helps you to establish healthy & productive habits:
- A break reminder reminds you when it's time to step away.
- The anti-procrastination feature helps you gain perspective when you really need to.
- Need some extra focus? A Pomodoro timer is also always at hand.
- Collect personal metrics to see, which of your work routines need adjustments.
- Integrate with Jira, Trello, GitHub, GitLab, Gitea, OpenProject, Linear, ClickUp and Azure DevOps. Auto import tasks assigned to you, plan the details locally, automatically create work logs, and get notified immediately, when something changes.
- Basic CalDAV integration.
- Back up and synchronize your data across multiple devices with Dropbox and WebDAV support
- Attach context information to tasks and projects. Create notes, attach files or create project-level bookmarks for links, files, and even commands.
- Super Productivity respects your privacy and does NOT collect any data and there are no user accounts or registration. You decide where you store your data!
- It's free and open source and always will be.
And much more!
📖 Documentation
Full guides and reference material live in the wiki. Quick links: First steps, Reference index, How-To index.
❓ How to use it
If you need some help, this article on dev.to is the best place to start.
If you prefer, there is also a (long) YouTube video available.
There is another article on how I implement the 'eat the frog' prioritizing scheme in the app.
If you have further questions, please refer to the discussions page.
For a structured walkthrough (web app, install, next steps), see First steps (wiki).
Keyboard shortcuts and short-syntax for new tasks are maintained in the wiki: Keyboard shortcuts, Short syntax.
🌐 Web Version
Check out the web version even though it is a bit limited: Time tracking only works if the app is open and for idle time tracking to work, the chrome extension must be installed.
If you want the Jira integration and idle time tracking to work, you also have to download and install the Super Productivity Chrome Extension.
More detail: Web app vs desktop (wiki).
Community
The development of Super Productivity is driven by a wonderful community of users and contributors. Thank you all so much for your support!
👀 Check out our awesome curated list of community-created resources about Super Productivity
♥️ Contributing
If you want to get involved, please check out the CONTRIBUTING.md
There are several ways to help.
-
Spread the word: More users mean more people testing and contributing to the app which in turn means better stability and possibly more and better features. You can vote for Super Productivity on Slant, Product Hunt, Softpedia or on AlternativeTo, you can tweet about it, share it on LinkedIn, reddit or any of your favorite social media platforms. Every little bit helps!
-
Provide a Pull Request: Here is a list of the most popular community requests and here some info on how to run the development build (wiki). Please make sure that you're following the commit message format and to also include the issue number in your commit message, if you're fixing a particular issue (e.g.:
feat: add nice feature #31). -
Answer questions: You know the answer to another user's problem? Share your knowledge!
-
Provide your opinion: Some community suggestions are controversial. Your input might be helpful and if it is just an up- or down-vote.
-
Provide a more refined UI spec for existing feature requests
-
Make a feature or improvement request: Something can be done better? Something essential missing? Let us know!
-
Translations, Icons, etc.: You don't have to be a programmer to help. Many of the translations could use some love. Guide: Contribute translations (wiki).
-
Create custom plugins: Extend Super Productivity with your own features and integrations by developing custom plugins. Overview: Develop a plugin (wiki).
Special Thanks to our Sponsors!!!
Recently support for Super Productivity has been growing! A big thank you to all our sponsors, especially the ones below!
(If you are, intend to or have been a sponsor and want to be shown here, please let me know!)
Code Signing
Windows binaries are signed. Free code signing is provided by SignPath.io, certificate by SignPath Foundation.
Running the development server
See the wiki: Run the development server, Package the app, Build for Android.
Run as Docker Container
See the wiki: Run with Docker (wiki).
Custom themes (desktop only)
See the wiki: Theming (wiki), User data (wiki).
Custom WebDAV Syncing
See the wiki: User data (wiki), Managing your data (wiki).
Automatic Backups
See the wiki: User data (wiki), Restore data from backup (wiki).
User Data Folder
See the wiki: User data (wiki), Other (wiki).

