# Web App Vs Desktop

This reference enumerates functional differences and limitations of the web app compared with the desktop (Electron) app. Most limitations stem from browser security (CORS, CSP, sandboxing) rather than intentional feature removal.

## Features Unavailable or Restricted in the Web App

### Plugin System

Plugins that require Node.js execution (elevated permissions) are disabled in the web version. When such a plugin is loaded, the app shows a disabled placeholder with an error stating the plugin requires the desktop version.

### Calendar Integration

Calendar providers can be disabled for the web app via an `isDisabledForWebApp` flag to avoid CORS failures. When this flag is set and the app runs in a browser, calendar event requests return empty results instead of performing the HTTP request. The UI shows a prominent warning that calendar integration will likely not work in the browser and recommends downloading the desktop version.

### Local File System

- **Automatic backups to file system:** Available only in Electron (desktop) and Android; not in the web browser.
- **Local file sync:** The web app cannot sync to local or network folders; that sync provider is not available in the browser.

### Time Tracking

In the web version, time tracking only works while the app is open. Idle time tracking in the browser requires the Super Productivity Chrome Extension to be installed.

## Browser-Related Limitations

### CORS (Cross-Origin Resource Sharing)

WebDAV sync and calendar integration are likely to fail in the browser due to CORS. The app detects CORS-related failures and can show localized messages suggesting the user check server configuration. The desktop app can bypass CORS for these requests; the web app cannot.

### WebCrypto API

The web app depends on modern browser support for:

- **Dropbox PKCE authentication:** Requires `window.crypto.getRandomValues` and `window.crypto.subtle.digest`.
- **Secure context:** WebCrypto (e.g. `crypto.subtle`) is only available in secure contexts (HTTPS). The app shows alerts when WebCrypto is unavailable or when run over non-HTTPS.

### Multi-Tab Instance Prevention

The web version uses BroadcastChannel to prevent multiple tabs from running the app at once. If another tab already has the app open, the new tab shows a blocker message asking the user to close one of the tabs.

## Storage, Memory, and Performance

### Browser Storage Persistence

The web app requests persistent storage from the browser. If the request is denied, the user sees a warning that data may be lost. Denial is surfaced via a snack notification.

### Storage Quota Monitoring

The app uses the Storage API to estimate usage and quota. When available space falls to 333 MiB or less, the user is alerted that disk space is low and the app may be affected.

### IndexedDB Quota Exceeded

When IndexedDB quota is exceeded, the app triggers emergency compaction with reduced retention (24 hours instead of 7 days) and uses a circuit breaker to avoid infinite retry loops.

### Service Worker

The web app registers a Service Worker for offline caching (PWA). This is disabled for Electron and Android. Background behavior is limited to what the browser's Service Worker API allows.

## File Size and Upload Limits (Sync)

These limits are enforced by the sync server; they affect web users who sync:

- **Operation payloads:** 20 MB maximum.
- **Compressed operations:** 10 MB maximum.
- **Snapshots:** 30 MB compressed, 100 MB decompressed.
- **WebDAV:** 10 MB maximum for XML responses; 100 MB maximum for file content.

## Offline and Background Processing

### Background Throttling

The desktop app disables background throttling for its window. The web app is subject to the browser's background tab throttling, which can affect timer accuracy and background task execution when the tab is in the background.

### Offline Support

The web app uses a Service Worker (production builds) to cache assets for limited offline use. Full offline behavior is more limited than on desktop and Android. The app shows an offline banner when the network is unavailable.

## Plugin and Integration Limitations (Web)

### Plugin API in Iframes

When plugins use iframe-based UIs, the following API methods are not available for security reasons:

- `registerHeaderButton()`
- `registerMenuEntry()`
- `registerSidePanelButton()`
- `registerShortcut()`
- `registerHook()`
- `execNodeScript()`

### Content Security Policy (Iframe Plugins)

Iframe plugins are subject to strict CSP:

- External scripts and stylesheets are blocked.
- Only same-origin resources are allowed.
- Scripts must be inlined within the plugin HTML file.

### Chrome Extension for Integrations

Jira integration and idle time tracking in the web version require the Super Productivity Chrome Extension to be installed.

## Native Features Not Available in the Web App

The web version does not have:

- Native file system access (open/save dialogs, automatic backups to disk).
- OS-level notifications (it uses the Web Notifications API instead).
- Window management (minimize to tray, global show/hide, custom title bar).
- System tray integration.
- Global keyboard shortcuts (only in-page shortcuts; desktop can register system-wide shortcuts).

Certain UI elements tied to these features are hidden in the web build via platform-specific CSS or logic.

## Documented Error Conditions (Web)

- **CORS errors:** WebDAV (and similar) sync may report CORS failures with localized messages suggesting server configuration checks.
- **WebCrypto unavailable:** Dropbox OAuth and other crypto-dependent features show alerts when WebCrypto is missing or not in a secure context.
- **Storage persistence denied:** A snack notification warns when the browser denies the persistent storage request.
- **Quota exceeded:** The app handles multiple quota-exceeded variants (e.g. Firefox `NS_ERROR_DOM_QUOTA_REACHED`, Safari code 22) and triggers emergency compaction.

## Notes

- The project README describes the web version as "a bit limited" and recommends the desktop version for full functionality, especially for calendar, file system access, and plugin support.
- The Android app offers a "Connectivity-Free Mode" for fully offline use; the web app does not provide an equivalent.
- Some integration features in the browser depend on the Chrome extension to work around security limits.

For installation and download options, see [[2.01-Downloads and Install]]. For sync backends and limitations, see [[2.09-Configure-Sync-Backend]].
