Skip to content
ilyamiroPublic

About

A fast and convinient file manager

Resources

Stars

5 stars

Watchers

0 watching

Forks

Repository files navigation

Ski logo

Ski

A small, fast, keyboard-friendly file manager for Linux, written in Rust. Flat Material look, instant previews, vim keys.

Ski showing a Pictures folder as a grid of thumbnails

Install

Prebuilt packages

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.

Docker or Podman

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-docker

Cargo

Needs Rust 1.85 or newer.

cargo install --git https://github.com/ilyamiro/Ski

Ski 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-utils

Nix

git 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 { }) ];

NixOS: default file manager and system file dialog

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.

Application menu and default file manager

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 Ski

Other distributions: file dialog and file manager service

Ski 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=ski

ski --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).

Usage

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.

List view

Context menu

Keyboard shortcuts

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.

Menus and dialogs

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

Settings

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.

Appearance settings

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.

Themes

Settings are stored in ~/.config/ski/settings.json, and the trash in ~/.local/share/Trash.

Plugins

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, MD5SUMS and 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 attribute user.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, and tag:work in 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). .zip is 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, .deb and .rpm need 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 .json file 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_FILES and SKI_CURRENT_DIR are 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.

Archives

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

Troubleshooting

  • 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 .7z or .tar.xz when compressing: install the tools listed under Archives.

Found a bug? Open an issue with your distribution and whether you use Wayland or X11.

License

MIT. The bundled fonts keep their own licenses: Adwaita Sans (SIL OFL) and Symbols Nerd Font Mono (MIT).

About

A fast and convinient file manager

Resources

Stars

5 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages