Krusader twin-pane file manager for Unraid, in your browser via Selkies, dark mode.
10K+
A modern, plug-and-play Docker image for Krusader on Unraid. Twin-pane file management in your browser, powered by Selkies, with Dark Mode, Kate as external editor, full archive support and 33 UI languages, all configurable from the Unraid template, no SSH or config-file editing required.
A one-knight job: I build it, keep it running, work through the issues and add what people ask for, until nothing is missing. It is free, with no accounts, no telemetry, no ads and no paid tier. No asterisk anywhere. Nothing readable ever leaves your own walls. Forged on evenings and weekends, with heart and stubbornness.
If it has earned a place on your server or computer, toss a coin to your knight: it helps cover the costs and keeps the project alive. It also makes this knight's heart beat a little faster. Three ways below, whichever suits you.
This image packages Krusader, KDE's twin-pane file manager, into a self-contained Docker container that runs in any modern web browser. It is built on top of linuxserver/baseimage-selkies, so it benefits from LSIO's actively-maintained Selkies desktop-streaming stack (H.264 video to the browser) and weekly security updates, while everything Krusader-specific (theme, archive tools, right-click actions, language packs, default configs) is layered on top in this repo.
What's included beyond bare Krusader:
/config survive every docker pull| This image | binhex | jlesage | ich777 | |
|---|---|---|---|---|
| Web stack | Selkies | noVNC | noVNC | noVNC |
| HW-accelerated rendering | ✅ | ❌ | ❌ | ❌ |
| Browser clipboard | ✅ | ⚠️ | ⚠️ | ⚠️ |
| File upload via WebUI | ✅ | ❌ | ❌ | ❌ |
| Dark Mode default | ✅ | ❌ | ❌ | ❌ |
| Kate as editor | ✅ | ❌ | ❌ | ❌ |
| Batch rename (krename) | ✅ | ❌ | ❌ | ❌ |
| RAR right-click | ✅ | ❌ | ❌ | ❌ |
| Language dropdown | ✅ (33) | ❌ | ❌ | ❌ |
| Multi-arch | ✅ amd64 + arm64 | amd64 | ✅ | amd64 |
| Base | LinuxServer | binhex/Arch | jlesage/Alpine | ich777/Debian |
Twin-pane file manager: Dark Mode, F-key shortcuts, in-browser via Selkies.
Configurator → Colors: full control over panel foreground / background / selection.
On Unraid: Apps → search for Krusader → click Install. The Community Applications
template is published from the
unraid-apps feed
(one feed for all of junkerderprovinz's apps).
To load it by hand, pull it into Unraid's user-template folder via the console / SSH:
mkdir -p /boot/config/plugins/dockerMan/templates-user && \
curl -fsSL -o /boot/config/plugins/dockerMan/templates-user/my-Krusader.xml \
https://raw.githubusercontent.com/junkerderprovinz/unraid-apps/main/krusader/krusader.xml
In the Unraid Web UI: Docker tab → Add Container → in the Template dropdown, pick Krusader under User templates. All fields are pre-filled.
The defaults work out of the box, but you may want to tweak:
/storage): defaults to /mnt, which exposes all shares and disks. Restrict to e.g. /mnt/user if you want.de.dark or light.Hit Apply. The first start takes 30 to 60 seconds while the container seeds its config and Selkies generates a self-signed certificate.
https://<unraid-ip>:3001/ (HTTPS, self-signed, accept the certificate once). Use HTTPS: the Selkies web client requires a secure context, so direct browser access must go through the HTTPS port. Port 3000 (HTTP) is not a usable direct fallback; opening http://<unraid-ip>:3000/ shows a "requires a secure connection (HTTPS)" error and won't load. It exists for a reverse proxy that terminates TLS in front of the container (the proxy serves HTTPS to the browser and forwards HTTP to 3000).
Once Community Applications has accepted this image it will also be installable via Apps → search
Krusader.
docker run -d \
--name krusader \
--restart unless-stopped \
--shm-size=1gb \
-p 3000:3000 -p 3001:3001 \
-e PUID=99 -e PGID=100 \
-e TZ=Europe/Vienna \
-e KRUSADER_LANG=de \
-e KRUSADER_THEME=dark \
-v /mnt/user/appdata/krusader:/config \
-v /mnt:/storage \
junkerderprovinz/krusader:latest
--shm-size=1gb is required for smooth KDE rendering. The Unraid template sets it for you.
| Variable | Default | Description |
|---|---|---|
PUID | 99 | User ID, Unraid's nobody |
PGID | 100 | Group ID, Unraid's users |
TZ | Etc/UTC | Timezone, e.g. Europe/Vienna |
KRUSADER_LANG | de | UI language, see Languages |
KRUSADER_THEME | dark | dark (Dark Mode) or light (Breeze) |
CUSTOM_USER | (empty) | WebUI login username; leave empty with PASSWORD for no login |
PASSWORD | (empty) | WebUI password, set this if exposed beyond LAN |
TITLE | Krusader | Browser tab / PWA title (see also SELKIES_UI_TITLE) |
UMASK | 000 | File-creation mask. Keeps new files writable for other containers on the same shares |
| Port | Purpose | Volume | Purpose | |
|---|---|---|---|---|
3001 | Selkies HTTPS (self-signed), default WebUI, needed for clipboard | /config | Persistent KDE / Krusader / Kate configs | |
3000 | Selkies HTTP (reverse-proxy only; direct access needs HTTPS) | /storage | Files to manage, default host /mnt |
The desktop follows your browser window: Selkies resizes the screen to the size the browser reports, so there is no screen size to set and memory only grows with the window you actually use. A 1600x1000 window on a laptop set to 200 % counts as 1600x1000. With HiDPI switched on in the Selkies sidebar the same window counts in physical pixels, 3200x2000.
Display scaling follows the browser without any setting. Every browser is streamed at the size it reports, with the desktop at 96 DPI, so Krusader looks the same on a 100 % desktop and on a laptop set to 200 %. On the laptop the picture is a little softer, because the browser stretches it. The HiDPI switch in the Selkies sidebar is remembered per browser and wins over this default. With it on, a high-resolution display gets its physical pixels and Krusader is drawn at half size, so if Krusader looks tiny on a laptop, switch HiDPI off there.
Web file transfers: the Selkies sidebar's upload/download panel and the WebUI's
/filesbrowser both use the base image'sFILE_MANAGER_PATH, which defaults to/config/Desktop, so a file dragged into the browser lands there, not in/storage. It is inside the persisted/configvolume, and Krusader can navigate to it like any other folder. PointFILE_MANAGER_PATHsomewhere under/storageif you would rather upload straight into your data, but choose with care: withoutPASSWORDset,/filesserves that directory to anyone who can reach the WebUI, and/storagedefaults to all of/mnt.
The Unraid template ships a dropdown with 33 UI languages (German default, plus system fallback). Each language has its language-pack-<code> and language-pack-kde-<code> baked in, switching is instant after a restart.
| Region | Languages |
|---|---|
| Western Europe | 🇩🇪 de Deutsch · 🇬🇧 en English · 🇫🇷 fr Français · 🇪🇸 es Español · 🇮🇹 it Italiano · 🇵🇹 pt Português · 🇳🇱 nl Nederlands · 🇪🇸 ca Català · 🇪🇸 eu Euskara · 🇮🇪 ga Gaeilge |
| Northern Europe | 🇩🇰 da Dansk · 🇸🇪 sv Svenska · 🇳🇴 nb Norsk Bokmål · 🇫🇮 fi Suomi · 🇮🇸 is Íslenska |
| Central / Eastern Europe | 🇵🇱 pl Polski · 🇨🇿 cs Čeština · 🇸🇰 sk Slovenčina · 🇭🇺 hu Magyar · 🇷🇴 ro Română · 🇸🇮 sl Slovenščina · 🇭🇷 hr Hrvatski · 🇷🇸 sr Српски · 🇧🇬 bg Български · 🇺🇦 uk Українська · 🇷🇺 ru Русский · 🇬🇷 el Ελληνικά |
| Middle East | 🇹🇷 tr Türkçe · 🇮🇱 he עברית · 🇸🇦 ar العربية |
| Asia / CJK | 🇯🇵 ja 日本語 · 🇰🇷 ko 한국어 · 🇨🇳 zh 中文 |
| Fallback | system, use the container's default locale |
Default: de (Deutsch). Set via KRUSADER_LANG or the Unraid dropdown.
How it works: Unraid renders any
<Default>a|b|c</Default>value with at least one|as a native<select>dropdown. The cont-init hook re-applies the language on every start.
Krusader's UserActions are pre-loaded with extras:
| Action | Command |
|---|---|
| Extract RAR here | unrar x -o+ into the current directory |
| Extract RAR to subfolder | Same, but into a folder named after the archive |
| Open with Kate | Opens the selected file(s) in Kate |
| Open Konsole here | New Konsole tab in the current directory |
For generic archive extraction (7z, ZIP, TAR, …) use Ark's built-in right-click menu; it is already installed and avoids a duplicate "Extract" entry in the context menu.
Edit them via Krusader → Settings → Configure UserActions, or directly at /config/.local/share/krusader/useractions.xml.
On the first start only, the container seeds defaults from /defaults/ into /config/:
/config/
├── .config/
│ ├── kdeglobals # KDE color scheme + Dark Mode
│ ├── krusaderrc # Editor=kate, theme, panel layout
│ └── katerc # Kate Dark Mode
└── .local/share/krusader/
└── useractions.xml # right-click actions
A marker file /config/.krusader-firstrun.done is written so subsequent container starts never overwrite your customisations. To re-seed defaults, delete the marker and restart.
The two env-driven knobs (KRUSADER_LANG, KRUSADER_THEME) are re-applied on every start via a cont-init.d hook, so you can flip them freely.
The base image also supports /config/custom-cont-init.d/ for your own init scripts, see the LinuxServer docs.
git clone https://github.com/junkerderprovinz/krusader.git
cd krusader
# amd64 only (your local arch)
docker build -t krusader:dev .
# Multi-arch (amd64 + arm64) – needs buildx
docker buildx build --platform linux/amd64,linux/arm64 -t krusader:dev --load .
# Test run — http://localhost:3000 is fine here: browsers treat localhost as a
# secure context, so the HTTP port works for local testing but not over the LAN
docker run --rm -it \
-p 3000:3000 \
-v "$PWD/.dev-config:/config" \
-v "$PWD:/storage" \
krusader:dev
docker pull junkerderprovinz/krusader:latest
docker stop krusader && docker rm krusader
# re-create with the same template / docker run args
On Unraid: Docker tab → click the container → Force Update. Your /config is untouched.
The image is rebuilt weekly via GitHub Actions for upstream Selkies, Ubuntu and KDE patches.
--shm-size is at least 512mb (Unraid template sets 1gb)https://<ip>:3001/ (self-signed) and not http://<ip>:3000/; over plain HTTP the Selkies client aborts with "requires a secure connection (HTTPS)" and the desktop never appearsFixed in v2.5.0. Quitting Krusader (File → Quit, Ctrl+Q, the window X) now
starts a fresh Krusader, so refreshing the browser tab brings the file manager
back instead of an empty desktop. On older versions the desktop kept running
without any window and only a container restart helped.
If Krusader cannot stay up (five failed starts in a row, or twenty instant exits of any kind) the session stops trying instead of looping. That means something is genuinely broken (config, X, a missing library), so restart the container and check the log.
netstat -tlnp | grep 3000docker exec krusader ss -tlnpbridge (or host), not a custom br0 whose IP isn't reachable from your clientwhich unrar should print /usr/bin/unrar. If empty, file an issue./etc/profile.d/zz-krusader-lang.sh and updates kdeglobals[Translations]-v /mnt/disks/somepool:/storage/somepoolPUID / PGID. On Unraid, 99:100 (nobody:users) match share permissions.You have a /etc/localtime:/etc/localtime:ro bind-mount configured (e.g. from an old template version). The LSIO base image manages /etc/localtime internally as a symlink; a bind-mount on top causes the conflict.
Fix: Remove the /etc/localtime path mapping from your container settings and use the TZ environment variable instead (e.g. TZ=Europe/Vienna). The TZ variable is the correct and supported way to set the timezone in LSIO-based containers.
Known Firefox-specific issue, see issue #27 and
TROUBLESHOOTING.md Bug #5
for the full root-cause chain. Firefox restricts silent clipboard reads more
than Chromium, so it falls back to a Selkies retype path with a real bug,
already fixed upstream, just not yet on the Selkies branch this image
builds from. Workaround: in Firefox, open about:config,
search for dom.events.testing.asyncClipboard, and set it to true. This
gives Firefox the same silent clipboard-sync behaviour Chromium already has,
which sidesteps the retype path (and its case bug) entirely. No container
change or restart needed; it takes effect on the next paste. Chromium-based
browsers (Brave, Edge, Chrome) are not affected.
Fixed as of the Selkies release (Krusader 2.9.0). Uncheck View → Show Statusbar once and it stays hidden across restarts; Krusader 2.9.0 auto-saves the statusbar state about a second after toggling and also saves settings on docker stop, so no clean exit is needed. (On the old KasmVNC image, Krusader 2.8.1 could not persist this.) The per-panel (upper) free-space / device status bar is a different widget and is unaffected.
┌─────────────────────────────────────────────────────────────────┐
│ ghcr.io/linuxserver/baseimage-selkies:dev │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ s6-overlay v3 init │ │
│ │ ↓ │ │
│ │ s6-rc.d/init-krusader/run │ │
│ │ ↓ seeds /config from /defaults
Content type
Image
Digest
sha256:6932bd80a…
Size
1.3 GB
Last updated
6 days ago
docker pull junkerderprovinz/krusader