How to Self-Host Super Productivity with Docker
Docker Compose Configuration
Super Productivity’s Docker image serves the web app as a static frontend. Data is stored in the browser by default (IndexedDB), with optional WebDAV sync for persistence across devices.
Basic Setup (Browser Storage)
services:
super-productivity:
image: super-productivity/super-productivity:v17.4.1
restart: unless-stopped
ports:
- "8080:80"
Start with:
docker compose up -d
That’s it — open http://your-server-ip:8080 and start using it. All data stays in your browser’s local storage.
With WebDAV Backend (Recommended for Teams)
For persistent, multi-device sync, pair Super Productivity with a WebDAV server:
services:
super-productivity:
image: super-productivity/super-productivity:v17.4.1
restart: unless-stopped
ports:
- "8080:80"
environment:
# Pre-configure WebDAV sync for all users
SP_SYNC_PROVIDER: WebDAV
SP_WEBDAV_URL: "http://webdav:80"
SP_WEBDAV_USER: "user"
SP_WEBDAV_PASSWORD: "your-webdav-password"
depends_on:
- webdav
webdav:
image: bytemark/webdav:2.4
restart: unless-stopped
environment:
AUTH_TYPE: Basic
USERNAME: user
PASSWORD: your-webdav-password
volumes:
- webdav-data:/var/lib/dav
volumes:
webdav-data:
This gives you server-side persistence — data syncs across browsers and devices through WebDAV.
What Is Super Productivity?
Super Productivity is an open-source task management and time tracking app that runs entirely in the browser. It combines a todo list with timeboxing, Pomodoro timer, break reminders, and integrations with Jira, GitHub, GitLab, Gitea, OpenProject, Linear, ClickUp, and Azure DevOps.
Unlike server-side tools like Vikunja or Planka, Super Productivity is a client-side application. The Docker container just serves the web UI — there’s no backend database, no user accounts, no API server. Data lives in your browser’s IndexedDB unless you configure WebDAV or Dropbox sync.
| Specification | Details |
|---|---|
| License | MIT |
| Language | TypeScript (Angular) |
| Storage | Browser IndexedDB (default), WebDAV, Dropbox |
| Latest Version | v17.2.4 |
| Docker Image | super-productivity/super-productivity:v17.4.1 |
| Default Port | 80 (Nginx serving static files) |
| RAM | ~50 MB (static file server only) |
| Platforms | Web, Windows, macOS, Linux, Android |
Prerequisites
- A Linux server with Docker and Docker Compose (guide)
- 256 MB of free RAM (the Docker container is just Nginx)
- 200 MB of disk space
- A domain name (optional, for remote access)
| Requirement | Minimum | Recommended |
|---|---|---|
| CPU | 1 core | 1 core |
| RAM | 256 MB | 512 MB |
| Disk | 200 MB | 1 GB (with WebDAV) |
| Network | Local access | Reverse proxy + HTTPS |
Initial Setup
- Open
http://your-server-ip:8080 - Super Productivity loads in your browser — no account creation needed
- Start adding tasks, setting time estimates, and organizing by project
- Configure sync (Settings → Sync) if you want data persistence beyond browser storage
Configuring Sync
Go to Settings → Sync and choose your backend:
- WebDAV: Enter your WebDAV URL, username, and password. Sync happens automatically.
- Dropbox: Authenticate with your Dropbox account. Data syncs to a file in your Dropbox.
- Local file: Export/import JSON backups manually.
For self-hosted setups, WebDAV is the recommended sync method.
Configuration
Jira Integration
Connect to your Jira instance (cloud or self-hosted):
- Go to Settings → Issue Providers → Jira
- Enter your Jira URL, email, and API token
- Select the project(s) to import issues from
- Issues appear as tasks with time tracking linked to Jira work logs
GitHub/GitLab Integration
- Go to Settings → Issue Providers → GitHub (or GitLab)
- Enter a personal access token
- Select repositories
- Issues import as tasks with labels preserved
Other Integrations
Super Productivity also connects to Gitea, OpenProject, Linear, ClickUp, and Azure DevOps. Each requires an API token or OAuth setup in Settings → Issue Providers.
Advanced Configuration
Pomodoro Timer
Configure under Settings → Pomodoro:
- Work interval: 25 minutes (default)
- Short break: 5 minutes
- Long break: 15 minutes
- Long break interval: every 4 sessions
Timeboxing
Each task can have a time estimate. Super Productivity tracks actual time spent and shows the difference. Use the built-in timer to track work sessions automatically.
Keyboard Shortcuts
| Shortcut | Action |
|---|---|
D | Add new task |
S | Start/stop timer |
Space | Mark task done |
B | Start break |
Backspace | Delete task |
Reverse Proxy
Since Super Productivity is a static web app served by Nginx, reverse proxy setup is straightforward. For Caddy:
tasks.example.com {
reverse_proxy super-productivity:80
}
See Reverse Proxy Setup for detailed configuration.
Backup
Without WebDAV
Data lives in your browser. Export manually:
- Go to Settings → Import/Export
- Click Export to download a JSON file
- Store the JSON file in your backup system
With WebDAV
Back up the WebDAV data volume:
docker compose exec webdav ls /var/lib/dav
# Back up the volume
docker run --rm -v super-productivity_webdav-data:/data -v $(pwd):/backup alpine \
tar czf /backup/webdav-backup-$(date +%Y%m%d).tar.gz /data
See Backup Strategy for automated approaches.
Troubleshooting
Data disappears after clearing browser cache
Symptom: All tasks are gone after clearing browser data. Fix: This is expected behavior when using browser-only storage. Set up WebDAV sync to avoid data loss. If you haven’t configured sync, there’s no way to recover lost data.
WebDAV sync fails with CORS errors
Symptom: Sync reports CORS errors in the browser console. Fix: Your reverse proxy needs to pass CORS headers. Add these to your Nginx config:
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
add_header Access-Control-Allow-Headers "Authorization, Content-Type";
Jira integration shows “Unauthorized”
Symptom: Jira connection fails with 401.
Fix: Jira Cloud requires an API token, not your password. Generate one at https://id.atlassian.com/manage-profile/security/api-tokens. For Jira Server/Data Center, use your regular password or a personal access token.
Resource Requirements
| Metric | Value |
|---|---|
| RAM (container) | ~30-50 MB (Nginx only) |
| CPU | Negligible (static file serving) |
| Disk (application) | ~150 MB |
| Disk (WebDAV data) | ~1-10 MB per user |
| Network | Low (client-side app, minimal server traffic) |
Super Productivity is the lightest self-hosted task management option — the Docker container is essentially just an Nginx server delivering static files. All computation happens in the browser.
Verdict
If you want a personal productivity tool with time tracking and issue tracker integration, Super Productivity is hard to beat. It’s free, private (data stays in your browser or your WebDAV server), and connects to Jira, GitHub, GitLab, and more. The catch is it’s not a team collaboration tool — there’s no shared project database, no user management, no real-time collaboration. For personal task management with excellent time tracking, it’s the right tool. For team project management, look at Vikunja, Planka, or Leantime instead.
FAQ
Is Super Productivity really self-hosted if data stays in the browser?
The web app runs on your server, so you control access. But without WebDAV sync, data is stored client-side in IndexedDB. For true server-side persistence, configure WebDAV sync — then all data lives on your infrastructure.
Can multiple people use the same Super Productivity instance?
Multiple people can access the same instance, but each person’s data is isolated in their own browser storage. There’s no shared database or multi-user collaboration. Each user syncs independently via WebDAV.
How does it compare to Vikunja for task management?
Vikunja is a server-side task manager with multi-user support, shared projects, and a REST API. Super Productivity is a personal productivity tool with time tracking and issue tracker integrations. Choose Vikunja for team collaboration, Super Productivity for personal productivity.
Does Super Productivity work offline?
Yes. Since it’s a client-side app, it works fully offline. Changes sync to WebDAV when connectivity returns. The Docker container just needs to serve the initial page load.
Related
Get self-hosting tips in your inbox
Get the Docker Compose configs, hardware picks, and setup shortcuts we don't put in articles. Weekly. No spam.
Comments