A small, fast, keyboard-friendly file manager for Linux, written in Rust. Flat Material look, instant previews, vim keys.
Every release has x86_64 Linux builds. They need no Rust or Nix, only the graphics libraries listed under Cargo below (the .deb and .rpm pull them in for you).
# Debian, Ubuntu
sudo apt install ./ski_*_amd64.deb
# Fedora, openSUSE
sudo dnf install ./ski-*.x86_64.rpm
# Any other distribution (Arch included): unpack into /usr
sudo tar -xzf ski-*-x86_64-linux.tar.gz -C /Each package installs the desktop entry, the icon, and the portal and D-Bus files, so Ski shows up in your launcher and can be made the system file dialog. SHA256SUMS lists the checksums.
curl -fsSL https://raw.githubusercontent.com/ilyamiro/Ski/master/docker/ski-docker -o ski-docker
chmod +x ski-docker
./ski-docker [folder]The script detects Wayland or X11 and mounts your home folder so you see your real files. Use SKI_ENGINE=podman for Podman. In the container, "Open with…" can't launch your host apps, so for everyday use install Ski natively.
To build the image yourself:
docker build -t ski .
SKI_IMAGE=ski ./docker/ski-dockerNeeds Rust 1.85 or newer.
cargo install --git https://github.com/ilyamiro/SkiSki loads its graphics libraries at run time. If it fails to start, install them:
# Debian, Ubuntu
sudo apt install libwayland-client0 libxkbcommon0 libxkbcommon-x11-0 libx11-6 libxcursor1 libxi6 libxrandr2 libgl1 libegl1 xdg-utils
# Fedora
sudo dnf install libwayland-client libxkbcommon libxkbcommon-x11 libX11 libXcursor libXi libXrandr mesa-libGL mesa-libEGL xdg-utils
# Arch
sudo pacman -S wayland libxkbcommon libxkbcommon-x11 libx11 libxcursor libxi libxrandr libglvnd xdg-utilsgit clone https://github.com/ilyamiro/Ski && cd Ski
nix-shell --run 'cargo run --release'To install it on NixOS, import the package in configuration.nix. It ships its own desktop entry and icon:
environment.systemPackages = [ (pkgs.callPackage /path/to/Ski { }) ];nix/module.nix installs Ski and makes it the default file manager and the system's open / save dialog:
{
imports = [ /path/to/Ski/nix/module.nix ];
programs.ski.enable = true;
# programs.ski.defaultFileManager = false; # keep your current file manager
# programs.ski.filePicker = false; # keep your current file dialog
}It sets inode/directory to Ski, adds Ski as an xdg-desktop-portal backend for org.freedesktop.impl.portal.FileChooser, and sets GTK_USE_PORTAL=1. Log out and in after nixos-rebuild switch. Programs that use the portal then show Ski for "Open" and "Save as". Firefox also needs widget.use-xdg-desktop-portal.file-picker = 1 (programs.firefox.preferences on NixOS); Chromium needs --enable-features=UseXdgDesktopPortal unless it picks it up itself. Programs with a dialog of their own don't use the portal and keep it.
If you also use home-manager's xdg.portal, it takes over: it writes ~/.config/xdg-desktop-portal/portals.conf, which beats the system one, and points NIX_XDG_DESKTOP_PORTAL_DIR at the per-user profile, which doesn't contain ski.portal. Then the dialogs stay GTK's. Add Ski there as well:
xdg.portal = {
enable = true;
extraPortals = [ pkgs.xdg-desktop-portal-gtk osConfig.programs.ski.package ]; # osConfig: the NixOS config, needs `osConfig` in the module arguments
config.common = {
default = "*";
"org.freedesktop.impl.portal.FileChooser" = "ski";
};
};The dialog attaches itself to the window that asked for it (Wayland, xdg-foreign), so compositors float it and center it on that window, as they do for GTK dialogs. When the program gives no window, the dialog is a fixed-size window, which most compositors float and center too. It opens at the size you last left it at (760×520 the first time). The dialog only browses and chooses: no moving, renaming or deleting (making a folder is allowed when saving or picking a folder). Saving asks before replacing each existing file, typing a folder name in the file name field goes into that folder, and */* MIME filters use the system's shared-mime-info database. It starts in the folder the program last chose something in, and ends cleanly when the program withdraws the request. Its app id is ski-chooser; if yours tiles it, add a rule, e.g. sway: for_window [app_id="ski-chooser"] floating enable, move position center.
install -Dm644 assets/ski.desktop ~/.local/share/applications/ski.desktop
install -Dm644 assets/logo.svg ~/.local/share/icons/hicolor/scalable/apps/ski.svg
xdg-mime default ski.desktop inode/directory # optional: open folders with SkiSki can answer org.freedesktop.FileManager1 (browsers' "Show in folder") and be the portal FileChooser. Install the files in assets/ (ski.portal into share/xdg-desktop-portal/portals/, the two .service files into share/dbus-1/services/ with @out@ replaced by your prefix), then add this to ~/.config/xdg-desktop-portal/portals.conf. (ski.portal also lists the desktops it may serve in UseIn=, but when several installed portals offer a file dialog the one named here wins, so this line is what makes Ski the choice.)
[preferred]
org.freedesktop.impl.portal.FileChooser=skiski --portal is the service itself; D-Bus starts it when needed. Each dialog is ski --chooser --mode open|folder|save|save-files in a window of its own, which prints the chosen file:// URIs and exits with 0 (or 1 if cancelled).
ski # open the current folder
ski ~/Downloads # open a specific folder| To | Do this |
|---|---|
| Move around | Click, or use j k or the arrow keys and Enter. Backspace or h goes up. |
| Go to a path | Ctrl+L, type the path, Enter |
| Search | /, then type a name. Esc leaves the results. |
| Pin a folder or file to the sidebar | Select it and press Ctrl+D (with nothing selected: the open folder). Drag pinned rows to reorder. |
| Move or copy by dragging | Drag items onto a folder, sidebar place, breadcrumb or tab. Hold Ctrl to copy. |
| Open a folder in a tab | Middle-click it, or Ctrl+T for a new tab. Settings → General → Open Ski in → Restore last tabs brings back the tabs of the last session. |
| Eject a drive | Hover it in the sidebar and click the eject button |
| Switch list and grid | Ctrl+1 and Ctrl+2 |
| Go back and forward on a touchpad | Swipe sideways with two fingers over the files (off by default: Settings → Behavior → Touchpad) |
| Settings | Ctrl+, |
| See all shortcuts | ? |
Right-click anything for a menu that shows the shortcut of each action.
| Keys | Action |
|---|---|
j / k, arrows |
Move selection |
Enter / l |
Open |
Backspace / h / Alt+↑ |
Parent folder |
Alt+← / Alt+→ |
Back / forward (also the mouse buttons) |
Home / g, End / Shift+G |
First / last item |
Alt+Home |
Home folder |
Shift+arrows, Shift/Ctrl+click |
Select several |
Ctrl+A |
Select all |
Ctrl+C / Ctrl+X / Ctrl+V |
Copy / cut / paste |
F2 |
Rename (with several files selected: by template, or find and replace) |
Delete / Shift+Delete |
Move to trash / delete permanently |
Ctrl+Shift+N / Ctrl+Alt+N |
New folder / new file |
y |
Copy path |
Alt+Enter |
Properties |
Ctrl+H |
Show or hide hidden files |
F5 |
Refresh |
Ctrl+N |
New window |
Ctrl+T / Ctrl+W |
New tab / close tab (closes the window on the last tab) |
Ctrl+Shift+T |
Reopen the last closed tab |
Ctrl+Tab / Ctrl+Shift+Tab, Ctrl+PageDown / Ctrl+PageUp |
Next / previous tab |
Ctrl+Z |
Undo the last file operation |
Ctrl+Shift+Z / Ctrl+Y |
Redo |
Ctrl+Shift+D |
Duplicate |
Ctrl+Shift+M |
Create link |
Alt+T |
Add a tag to the selection (Tags plugin) |
F4 |
Open the folder in a terminal |
Ctrl+S |
Select items matching a pattern such as *.png |
Ctrl+Shift+I / Ctrl+Shift+A |
Invert selection / deselect all |
Ctrl+J |
Show running file operations |
Menu / Shift+F10 |
Open the context menu for the selection |
Esc |
Close a dialog, clear the search, then deselect |
Ctrl+Q |
Quit |
All of these can be changed in Settings, under Keybindings.
Settings, the context menu, the operations list and every dialog work without a mouse. A ring shows where the focus is.
| Keys | Action |
|---|---|
Tab / Shift+Tab |
Next / previous control (stays inside the open dialog or menu) |
| Arrows | Move to the control in that direction. In a menu, Home / End jump to the first / last entry. |
Left / Right on a choice such as Sort by |
Pick the previous / next option |
Enter / Space |
Activate the focused control |
Up / Down in Settings' category list |
Switch category; Right or Tab goes into its settings, Left comes back |
Ctrl+PageUp / Ctrl+PageDown |
Previous / next Settings category from anywhere |
Esc |
Close the menu or dialog |
Ctrl+, opens Settings: language, theme and accent color, interface size, font, default view and sorting, list columns, grid size, startup folder, single-click open, vim keys, terminal command, templates folder, and default apps.
The default theme follows your Serpantinum colors if you use them. Midnight, Nord, Gruvbox, Light, Catppuccin (Mocha and Latte), Dracula, Tokyo Night, Rosé Pine, One Dark, Everforest and Solarized (dark and light) are built in.
Open as administrator is in the main menu and in the folder context menus. It asks for your password through polkit (pkexec) and opens a second Ski, running as root, on that folder, so you can browse and edit system files. It reads your settings but never writes them. You can give it a shortcut under Settings → Keybindings.
Settings are stored in ~/.config/ski/settings.json, and the trash in ~/.local/share/Trash.
Ski bundles a few optional features as plugins. Switch them on or off in Settings → Plugins.
-
Git marks changed (
M), staged (A,S,R), deleted (D), conflicted (!) and untracked (?) files, marks folders that contain changes, and shows the branch and the number of changes in the corner. In a repository the context menu gets a Git group: Stage, Unstage, Show diff (staged and unstaged changes against the last commit, in a window) and Discard changes (asks first; the changes cannot be brought back and are not part of Undo). -
Checksums adds MD5, SHA-1, SHA-256 and SHA-512 to Properties and says whether one of them matches a hash on the clipboard or the checksum file next to the download (
name.sha256,name.sha1,name.md5,SHA256SUMS,sha256sums.txt,MD5SUMSand similar, in the GNU or BSD format). On a checksum file, "Verify files listed" checks every file it names as a file operation (progress, pause, cancel) and reports how many are OK, failed or missing. Names that point outside the folder are refused. -
Tags puts coloured labels on files. Right-click → Tags (or
Alt+T) adds a tag; the colours show as dots on the icon, and Settings → Plugins lets you pick them. The names are stored in the extended attributeuser.xdg.tags, the one Dolphin reads, so both managers show them; the colours are Ski's own (~/.config/ski/tags.json). Copies and cross-disk moves keep the tags; archives do not. The sidebar lists the tags Ski has seen, andtag:workin the search finds them (Ski remembers paths it tagged or saw tagged; "Find tags in this folder" rebuilds that list after other programs moved files). File systems without extended attributes (FAT, exFAT, some network shares) can't store tags, and links can't carry them. -
Duplicate finder looks for files with identical contents. Right-click a folder (or the empty space of the open folder) → Find duplicate files… The search runs as a file operation (progress, pause, cancel) and skips empty files, links and hard links of the same file. It compares sizes first, then the start and end of the files, and reads whole only what still looks alike (SHA-256). Nothing is selected for you: tick copies by hand or let a rule pick (keep the newest, the oldest, the shortest path, or the copy inside a folder). One copy of every group always stays; a copy that changed since the search is left alone; the rest go to the trash as one undo step.
-
Compare folders shows how two folders differ. Select two folders → Compare, or right-click empty space → Compare with the other tab (when exactly two tabs are open) or Compare folders… (two path fields). Each item is listed as only on the left or right, newer on one side, different with equal times, or identical (hidden until you switch it on); a folder that exists on one side only is one row. Items count as equal when size and modification time match (two seconds apart is still equal, for FAT); "Compare contents" reads files of equal size instead. Tick rows and copy them to the other side (name clashes ask, progress and Undo work as for any copy), move one side's copy to the trash, or open it. It never deletes by itself, so it is a compare-and-copy tool, not a mirror.
-
Quick Look previews the selected file when you press Space: text and code with line numbers, pictures and documents (not folders) and the contents of archives (a folder tree with sizes, the unpacked size, the compression ratio and a lock on encrypted entries; nothing is extracted).
.zipis read from its index; tar archives are streamed and listing stops after 2,000 entries or 10 seconds;.tar.xz,.tar.bz2,.tar.zst,.7z,.rar,.iso,.deband.rpmneed the tools from the Archives table below. Up and Down browse, Space or Esc closes. -
Custom actions adds your own commands to the context menu. Put a
.jsonfile or an executable script in~/.config/ski/actions/; changes are picked up while Ski runs, and Settings → Plugins lists the files that failed to load:{ "name": "Convert to WebP", "command": "for f in \"$@\"; do cwebp \"$f\" -o \"${f%.*}.webp\"; done", "extensions": ["jpg", "png"] }The command runs in the open folder with the selected files as arguments, and
SKI_SELECTED_FILESandSKI_CURRENT_DIRare set. Filters:extensions,dirs_only,files_only,single.
Folder sizes: the Size column shows how many items a folder holds. Right-click a folder → Calculate size (Settings → Files & View → Details → Folder sizes: Off, On demand, Always) measures it; sizes appear in the column, in the status line for a selection and in sorting. Two folders are measured at a time, hard-linked files count once, links are not followed and other mounted disks are skipped. A folder Ski could not fully read shows ≥. Sizes are remembered for the session and dropped when Ski changes something inside, or on refresh (F5); changes made by other programs show after a refresh. "Size on disk" counts allocated blocks instead of file lengths.
File operations: copies, and moves to another disk, that write to the same disk run one after the other, since several at once slow each other down on a spinning disk (Settings → General → File operations → Run copies to the same disk one at a time). A queued job shows "Waiting for the disk" in the operations list (Ctrl+J), where you can cancel it, start it now, or move it up or down. Moves within one file system and deletes are never queued. A paused job keeps its place; use Start now to run another one beside it.
Typing in a folder jumps to the file whose name starts with what you typed (Settings → Behavior → Type to jump); / or Ctrl+F still searches.
.zip and .tar.gz work out of the box. Other formats use system tools and only appear when those are installed:
| Format | Needs |
|---|---|
.tar.xz |
tar, xz |
.tar.bz2 |
tar, bzip2 |
.tar.zst |
tar, zstd |
.7z, and extracting .rar, .iso, .deb, .rpm |
7z |
On Debian or Ubuntu: sudo apt install xz-utils bzip2 zstd p7zip-full.
- No window, or errors about Wayland or libxkbcommon: install the libraries listed under Cargo above. On Nix, start Ski from
nix-shell. - Blank window in a VM: try
LIBGL_ALWAYS_SOFTWARE=1 ski. - Want X11 on a Wayland session:
env -u WAYLAND_DISPLAY ski. - Interface too small or large: Settings → Appearance → Size.
- Missing
.7zor.tar.xzwhen compressing: install the tools listed under Archives.
Found a bug? Open an issue with your distribution and whether you use Wayland or X11.
MIT. The bundled fonts keep their own licenses: Adwaita Sans (SIL OFL) and Symbols Nerd Font Mono (MIT).




