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.

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.

SpecificationDetails
LicenseMIT
LanguageTypeScript (Angular)
StorageBrowser IndexedDB (default), WebDAV, Dropbox
Latest Versionv17.2.4
Docker Imagesuper-productivity/super-productivity:v17.4.1
Default Port80 (Nginx serving static files)
RAM~50 MB (static file server only)
PlatformsWeb, 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)
RequirementMinimumRecommended
CPU1 core1 core
RAM256 MB512 MB
Disk200 MB1 GB (with WebDAV)
NetworkLocal accessReverse proxy + HTTPS

Initial Setup

  1. Open http://your-server-ip:8080
  2. Super Productivity loads in your browser — no account creation needed
  3. Start adding tasks, setting time estimates, and organizing by project
  4. 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):

  1. Go to Settings → Issue Providers → Jira
  2. Enter your Jira URL, email, and API token
  3. Select the project(s) to import issues from
  4. Issues appear as tasks with time tracking linked to Jira work logs

GitHub/GitLab Integration

  1. Go to Settings → Issue Providers → GitHub (or GitLab)
  2. Enter a personal access token
  3. Select repositories
  4. 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

ShortcutAction
DAdd new task
SStart/stop timer
SpaceMark task done
BStart break
BackspaceDelete 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:

  1. Go to Settings → Import/Export
  2. Click Export to download a JSON file
  3. 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

MetricValue
RAM (container)~30-50 MB (Nginx only)
CPUNegligible (static file serving)
Disk (application)~150 MB
Disk (WebDAV data)~1-10 MB per user
NetworkLow (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.

Comments