Skip to content

Browser vs Desktop

The same codebase runs in both. What differs is how it reaches the outside world: files, processes, and GPUs.

Browser Desktop
Install None — app.sleap.ai ~100–220 MB depending on platform, installer
Open / save .slp File System Access API Native file dialogs, writes in place
Drag-and-drop ✅ ✅
Labeling, tracks, view, analyze ✅ ✅
Video playback (WebCodecs) ✅ ✅
Transcode legacy codecs ❌ convert externally ✅ native ffmpeg sidecar, cached
Local training / inference ❌ ✅ via Environment
Remote training / inference ✅ ✅
Crash-recovery drafts ✅ OPFS ✅ app data directory
Reveal file in file manager ❌ ✅
Open Preferences Directory / Clear Video Transcode Cache ❌ ✅
Local scrub proxies for network videos ❌ ✅
NWB export ❌ ✅
ONNX / TensorRT model export ❌ ✅
Model-output overlays ❌ ✅
DeepLabCut import Chromium browsers only (Chrome, Edge) — needs the folder picker ✅
In-app updates Reload the page ✅ per channel
Offline ❌ needs a connection to load the page ✅

Which should I use?

Browser if you are labeling, reviewing predictions, or checking someone else's project — there is nothing to install and nothing to keep up to date. It is also the right choice on a machine you don't administer, and it can still train and predict through a remote worker.

Desktop if you want native file handling on large projects, a local GPU, or legacy-codec videos handled for you.

Projects are the same .slp files either way, so moving between them costs nothing.

Saving differences worth knowing

In the browser, opening a file through the picker gives the page a writable handle and Save writes back to that same file. Opening by drag-and-drop yields no handle, so Save falls back to a Save-As prompt. On the desktop, Save always writes to the project's path.

See Saving & Recovery.

Under the hood

The desktop app is Tauri v2 — it uses the operating system's own WebView rather than bundling a browser engine. It does bundle its own ffmpeg/ffprobe for converting legacy-codec videos. Platform-specific behavior is isolated behind a small abstraction layer, so features arrive in both runtimes at once unless they fundamentally cannot.