Sign inSign up

junkerderprovinz/krusader

By junkerderprovinz

•Updated about 14 hours ago

Krusader twin-pane file manager for Unraid, in your browser via Selkies, dark mode.

Image
0

10K+

junkerderprovinz/krusader repository overview

Krusader

Build  Lint  Docker Pulls  Image Size  Arch  Selkies  Languages  Unraid  License: AGPL-3.0


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.


Buy me a coffee   PayPal   Donate with crypto


⁠Table of Contents

  1. Overview⁠
  2. Screenshots⁠
  3. Quick Start⁠
  4. Configuration⁠
  5. Languages⁠
  6. Right-Click Actions⁠
  7. Customisation & Persistence⁠
  8. Building Locally⁠
  9. Updating⁠
  10. Troubleshooting⁠
  11. Architecture⁠
  12. Contributing / License⁠
  13. License⁠
  14. How AI is used here⁠
  15. Support this project⁠

⁠1. Overview

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:

  • Selkies instead of noVNC: H.264 video for a smooth 60fps web desktop, real bidirectional browser clipboard, native file upload and download, high-DPI ready
  • Dark Mode pre-applied to Krusader, Kate and the whole KDE stack; switch to light with one variable
  • Row-aware panel icons: Krusader is built from source with our icon-tint patch, the file-list icons follow each row's effective text colour (normal, current and marked rows, including custom Konfigurator colours), so icons stay legible on any row highlight
  • Kate wired up as Krusader's external editor, also Dark Mode, with spell-check
  • krename: KDE's batch-rename dialog bundled; rename hundreds of files at once using regex, counters, case transforms and metadata patterns
  • Kompare: a side-by-side diff viewer bundled, so File → Compare by Content… opens two selected files in a real diff instead of the "cannot find any of the supported diff-frontends" error
  • Quit and come back: closing Krusader in the browser starts a fresh Krusader instead of leaving a black screen; no container restart needed
  • Full archive support: RAR, 7z, ZIP, TAR, GZ, BZ2, XZ, LHA, ARJ, ACE, RPM, CPIO; right-click "Extract RAR here" works out of the box
  • 33 UI languages picked from a dropdown in the Unraid template
  • The desktop follows your browser window: no screen size to set, and memory only grows with the window you actually use (see Screen size and memory use⁠)
  • Update-safe configs: first-run-only seeding, your customisations in /config survive every docker pull
  • Multi-arch: amd64 and arm64
This imagebinhexjlesageich777
Web stackSelkiesnoVNCnoVNCnoVNC
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 + arm64amd64✅amd64
BaseLinuxServerbinhex/Archjlesage/Alpineich777/Debian

⁠2. Screenshots

Krusader twin-pane main view with Dark Mode theme
Twin-pane file manager: Dark Mode, F-key shortcuts, in-browser via Selkies.


Krusader configurator: Colors
Configurator → Colors: full control over panel foreground / background / selection.


⁠3. Quick Start

⁠Step 1: Install the template

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
⁠Step 2: Add the container

In the Unraid Web UI: Docker tab → Add Container → in the Template dropdown, pick Krusader under User templates. All fields are pre-filled.

⁠Step 3: Adjust paths and start

The defaults work out of the box, but you may want to tweak:

  • Storage (/storage): defaults to /mnt, which exposes all shares and disks. Restrict to e.g. /mnt/user if you want.
  • UI Language: dropdown, default de.
  • Theme: dark or light.
  • WebUI Password: leave empty for LAN-only, set anything for exposure beyond the LAN.

Hit Apply. The first start takes 30 to 60 seconds while the container seeds its config and Selkies generates a self-signed certificate.

⁠Step 4: Open the WebUI

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.

Plain Docker (no Unraid)
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.


⁠4. Configuration

VariableDefaultDescription
PUID99User ID, Unraid's nobody
PGID100Group ID, Unraid's users
TZEtc/UTCTimezone, e.g. Europe/Vienna
KRUSADER_LANGdeUI language, see Languages⁠
KRUSADER_THEMEdarkdark (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
TITLEKrusaderBrowser tab / PWA title (see also SELKIES_UI_TITLE)
UMASK000File-creation mask. Keeps new files writable for other containers on the same shares
PortPurposeVolumePurpose
3001Selkies HTTPS (self-signed), default WebUI, needed for clipboard/configPersistent KDE / Krusader / Kate configs
3000Selkies HTTP (reverse-proxy only; direct access needs HTTPS)/storageFiles to manage, default host /mnt
⁠Screen size and memory use

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 /files browser both use the base image's FILE_MANAGER_PATH, which defaults to /config/Desktop, so a file dragged into the browser lands there, not in /storage. It is inside the persisted /config volume, and Krusader can navigate to it like any other folder. Point FILE_MANAGER_PATH somewhere under /storage if you would rather upload straight into your data, but choose with care: without PASSWORD set, /files serves that directory to anyone who can reach the WebUI, and /storage defaults to all of /mnt.


⁠5. Languages

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.

RegionLanguages
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 中文
Fallbacksystem, 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.


⁠6. Right-Click Actions

Krusader's UserActions are pre-loaded with extras:

ActionCommand
Extract RAR hereunrar x -o+ into the current directory
Extract RAR to subfolderSame, but into a folder named after the archive
Open with KateOpens the selected file(s) in Kate
Open Konsole hereNew 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.


⁠7. Customisation & Persistence

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⁠.


⁠8. Building Locally

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

⁠9. Updating

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.


⁠10. Troubleshooting

WebUI is black / desktop never appears
  • Make sure --shm-size is at least 512mb (Unraid template sets 1gb)
  • Check the container log for Selkies startup errors
  • Make sure you opened 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 appears
  • Wait 30 to 60 seconds on first start; KDE caches need to be built once
I closed Krusader and got a black screen

Fixed 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.

A window slipped behind another / I can't get it back
  • Press Alt+Tab to cycle windows (Alt+Shift+Tab goes backwards), or middle-click the empty desktop background for a list of every open window (minimised ones included) and pick one. Krusader also stays maximised so it does not slip behind on its own.
  • Krusader's "Show and close to tray" option is disabled in this container on purpose: the minimal openbox desktop has no system tray, so a tray-hidden window could not be recovered. A normal minimise stays reachable via Alt+Tab or the desktop menu.
WebUI is unreachable
  • Check the host port isn't already taken: netstat -tlnp | grep 3000
  • Disable the host firewall briefly to rule it out
  • Verify the container is listening: docker exec krusader ss -tlnp
  • Confirm the network is bridge (or host), not a custom br0 whose IP isn't reachable from your client
Right-click "Extract RAR here" does nothing
  • Open a Konsole inside the container: which unrar should print /usr/bin/unrar. If empty, file an issue.
Language change doesn't take effect
  • Restart the container; language is applied at start, not live
  • Check the env value matches a code from the Languages⁠ table
  • The script writes /etc/profile.d/zz-krusader-lang.sh and updates kdeglobals[Translations]
Files outside /storage not visible
  • That's by design. Map another path: -v /mnt/disks/somepool:/storage/somepool
"Permission denied" on /storage/...
  • Check PUID / PGID. On Unraid, 99:100 (nobody:users) match share permissions.
WebUI password not accepted
  • Open in a private window once; your browser may have cached old credentials.
Container fails to start with "mkdir /etc/localtime: file exists"

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.

Pasted UPPERCASE text arrives lowercase (Firefox)

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.

Bottom status bar hides persistently now

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.


⁠11. Architecture

┌─────────────────────────────────────────────────────────────────┐
│  ghcr.io/linuxserver/baseimage-selkies:dev                      │
│  ┌───────────────────────────────────────────────────────────┐  │
│  │  s6-overlay v3 init                                       │  │
│  │   ↓                                                       │  │
│  │  s6-rc.d/init-krusader/run                                │  │
│  │   ↓ seeds /config from /defaults 

Tag summary

Content type

Image

Digest

sha256:6932bd80a…

Size

1.3 GB

Last updated

6 days ago

docker pull junkerderprovinz/krusader