Using it
Files
synfiles is SynapseOS's file manager, and what a folder opens in. It is one C
binary plus a quickshell window, in the same shape as
synpkg: the binary does the work and prints records, the window
only renders them. Nothing in the QML knows how to stat a file, and everything
the window can do has a command-line half.
| Front-end | Command |
|---|---|
| The window | Files in the start menu, double-clicking a folder, or synfiles gui [dir] |
| The terminal | synfiles tui [dir] — arrow keys, no desktop needed. See In a terminal |
| Command line | synfiles list, synfiles find, synfiles trash, … |
It has no dependency but libc. File types come from shared-mime-info's data
files, mounting is delegated to udisks2, and the icon theme is resolved by the
front-end that already has it loaded.
It replaced Dolphin as the default in August 2026. Dolphin is still installed and still works — it simply is not what a folder opens in. See Getting Dolphin back.
The window
- Tabs (
Ctrl+T), each with its own history — Back and Forward are per tab, because a shared history sends Back somewhere this tab has never been. - Split view (
F3): two panes side by side, each with its own tabs, selection and search. An accent line marks the active one. Drag between them. - Three view modes — Icons, Compact and Details — picked from the View
button. The default is
auto, which follows the icon size: a details list for small icons, a grid for large ones. - Thumbnails, from the shared freedesktop cache. Anything Dolphin, GTK or a video player has already thumbnailed appears here for free, video and PDF included, because it is the same cache keyed the same way.
- Folder tree, toggleable, expanded one level at a time.
- Address bar: breadcrumbs, or
Ctrl+Lto type a path. - Sidebar — pinned places, Recent, Trash, and your disks with fill meters.
F9puts it away (Dolphin's key, and Nautilus'), and that is remembered. - Drag and drop — between panes, between windows, onto the desktop, and out to any other application. A drop from another application copies rather than moves: moving would delete another program's data on a guess.
Copying, moving and deleting
Everything long says how long is left, in the unit that decides it. That is not decoration: emptying the trash of a folder off a USB stick is two or three minutes of work — an unlink there measures around 12 ms — and a GUI silent that long cannot be told from a hang.
Recursive deletes report as they go rather than as one record at the end, and copies show a rate and an estimate.
Copying used to be 147× slower than
cp. Anfsyncper file: 2000 small files took 12.25 s againstcp -r's 0.08 s on an SSD, and on a USB stick, where an fsync is tens of milliseconds, that was the whole of "copying seems slow". It is 0.08 s now. The fsync was there for a reason — a cross-filesystem move deletes the original — so the durability barrier stayed where it belongs and left the copy path alone.
A mounted disc image appears under Removable Devices — right-click an
.iso and choose Mount Image, or mount one any other way. It is named by
its volume label, or by its file name when it has none. Eject unmounts it
and releases the loop device behind it; if the image is open in a pane, the
pane goes to your home folder first. A hybrid image (one that also boots from a
USB stick) lists the filesystem inside it, not the container.
A USB stick with no partition table — a filesystem written straight to the device — appears under Removable Devices. One was mounted, browsable and invisible in the sidebar because the scan expected every filesystem to sit on a partition.
Keyboard
| Key | Action |
|---|---|
Enter |
Open |
Alt+Enter |
Properties |
F2 |
Rename, in place, in whichever view you are in |
F3 |
Split view on/off |
Delete |
Move to trash |
Backspace |
Up one folder |
Ctrl+F |
Search this folder and everything below it |
Ctrl+L |
Edit the path |
Ctrl+C / Ctrl+X / Ctrl+V |
Copy / cut / paste |
Ctrl+Z |
Undo the last thing that changed files |
Ctrl+A |
Select all |
Ctrl+N |
New folder |
Ctrl+T / Ctrl+W |
New tab / close tab — closing the last tab folds the split, or closes the window if there is no split |
Escape |
Close a dialog, end a search, or clear the selection |
In a terminal
synfiles tui [dir] is the same file manager with a terminal for a front-end.
It is the one to reach for over SSH, on a TTY, or on a machine whose desktop
will not start — and it needs nothing installed that the window does not.
synfiles tui # here
synfiles tui ~/Downloads # somewhere else
| Key | Action |
|---|---|
↑ ↓ |
Move the highlighted row |
→ or Enter |
Open — a folder is entered, a file goes to xdg-open |
← or Backspace |
Up one folder, landing on the folder you just left |
PgUp PgDn, Home End |
Move a page, or to the ends |
i |
Properties for this row |
z |
Size of this row, walked (see Sizes) |
m / y |
Move / copy it somewhere, typed at a prompt |
t |
Trash it |
e |
The right-click menu — Open With and the service menus |
/ |
Filter what is on screen; empty clears it |
c |
Type a path to go to |
a s r |
Hidden files, sort, reverse |
h |
Home |
g |
Open the window on the folder you are in |
q or Esc |
Quit |
y is copy rather than c, which is already "cd" — two operations that ask the
same question ("to:") should not be a shift away from each other.
It reimplements nothing. The listing is the scan synfiles list prints,
properties are synfiles info, sizes are synfiles du, moving and copying are
synfiles move and synfiles copy. So a move made here is in the same journal
as a move made in the window, and Ctrl+Z — synfiles undo — reverses it. A
browser that walked directories itself would be a second set of answers about
symlinks, broken links and sort order, and the two would drift on the first bug
fixed in one of them.
A path you type is relative to what you are browsing, not to the shell's
working directory: typing alpha while looking at a folder that plainly
contains an alpha goes there. ~ works. Only a leading / is absolute.
t reaches the trash, never synfiles delete — the permanent one is gated
behind --yes and no key here reaches it, exactly as in the window.
What it does to your terminal
It turns off echo and line-buffering so that arrow keys arrive without Enter,
and nothing else:
- No mouse reporting. That is the one that does real harm: a full-screen TUI killed mid-flight never sends the sequence that turns it off, and the shell underneath then reads every pointer movement as typed input.
- No alternate screen. What you browsed stays in the scrollback.
Ctrl+Cstill interrupts, rather than being swallowed as a keystroke.
The settings are put back on exit, on Ctrl+C, and on SIGTERM, SIGHUP and
SIGQUIT. The worst a kill -9 can leave behind is a terminal with echo off,
which reset fixes.
Piping to it
If stdin is not a terminal, it runs a line protocol instead — the same browser driven a line at a time, which is what makes it scriptable and testable:
printf '1\nq\n' | synfiles tui # open row 1, quit
There, a bare row number opens, and the actions take the row as an argument:
i 2, z 2, t 2, m 3 ~/dest, y 3 ~/dest, c ~/Pictures, / report,
n/p for pages.
The trash, and undo
These two are the whole safety design, and they are worth knowing before you need them.
Delete means the trash — the XDG trash, the same one Dolphin and Nautilus use, so what one of them put there is what you see here, and restoring puts a file back where it came from rather than in your home directory. A file on another disk goes to that disk's trash, because trashing is always a rename and never a copy.
synfiles trash notes.txt # what Delete does
synfiles trash list
synfiles trash restore notes.txt
synfiles trash empty --yes
The permanent one is synfiles delete --yes, it is gated behind that flag, and
no key or click in the window reaches it.
Anything that changed files can be undone — Ctrl+Z, or the chip in the
toolbar, which says what it would reverse ("↶ Move of 2 items"). A recovery
control that does not say what it undoes goes unpressed.
synfiles undo list # what would be reversed
synfiles undo
Three rules it follows:
- A batch is one thing. Moving six files undoes as one operation.
- Undoing a copy trashes the copies rather than unlinking them. The copy may have been edited since, and undo must never be a shorter road to losing work than delete is.
- It verifies, then refuses. If something else now occupies the old place,
undo stops rather than overwriting a file created after the operation being
undone.
delete --yesis deliberately not journalled at all: an undo entry that cannot undo would look like a safety net and not be one.
Hovering over something
Rest the pointer on a file or a folder, in the list or in the icon view, and a panel says what it is:
| Line | What it says |
|---|---|
| The name | In full — the icon view elides it to the cell, and this is usually why you hovered |
| Type | Its real name: Tar archive (gzip-compressed), not application/x-compressed-tar |
| Modified | When it last changed |
| Size | For a file, its size. For a folder, what it costs on disk — measured, not reported |
| Contents | Folders only: what the tree holds, and in how many files |
| Links to | Where a symlink points |
stat reports the size of the directory entry for a folder — a few hundred
bytes for a tree holding an ISO — so the panel runs the same walk Properties
does and shows the answer as it climbs. It starts when the panel appears rather
than when the pointer arrives, so crossing a grid of folders costs nothing, and
it stops when the panel goes. A finished measurement is remembered until the
listing is next re-read; after a copy, a delete or F5 it is measured again,
because a remembered one would be wrong.
The disk figure leads because it is the one that costs you something: a tree of small files takes a block each and occupies far more room than it contains.
The type's name is shared-mime-info's own, read from the same database every other file manager on the machine reads, so a file is called the same thing here as it is anywhere else. It travels on the listing row, so hovering costs nothing — no lookup happens when the pointer arrives.
The panel waits half a second before it appears. Crossing a grid of icons to reach something else brushes a dozen of them on the way, and a panel on each would be a strobe. Scrolling or clicking takes it down.
Properties
Alt+Enter, or Properties… in the right-click menu. The panel is a view
over synfiles info, so the dialog and the command show the same records by
construction. It has four tabs:
| Tab | What it shows |
|---|---|
| General | Icon, name and type; location, size and size on disk; created, modified and accessed; resolution for images and video. Then Disk — a fill meter, free, used and capacity, where the disk is mounted, its filesystem and device, and for a mounted disc image the image file behind it |
| Permissions | Owner, group, and a read/write/execute grid for owner, group and others. Ticking a box changes the file |
| Checksums | MD5, SHA-1, SHA-256 and SHA-512, each calculated when you press Calculate |
| Details | Every record synfiles info printed, unformatted |
For a folder, the size is a walk of the tree: what it costs on disk, with what it contains beside it. Several selected items get the General tab only — how many, how much, and the disk they are on.
synfiles info photo.jpg
synfiles chmod 755 build.sh
Disk space is counted the same way as the sidebar's meters, so both show
the same percentage for the same drive. Free is what an ordinary user can still
write — the same figure df gives as Avail — and the reserve only root may
use counts as used.
Permissions apply immediately. A symbolic link has no permissions of its
own — the boxes show its target's and are greyed; change them on the target.
Boxes are greyed too on a file you do not own, and the panel says who does.
synfiles chmod takes an octal mode only and never follows a link.
Checksums use coreutils (md5sum, sha256sum and the rest), one at a
time, and nothing is read until you ask. Paste a checksum from a download
page into the box and the matching algorithm is calculated for you, followed by
whether the file matches. A whole line out of a SHA256SUMS file works; case
does not matter.
Resolution is read from the file's magic bytes, never its extension, so a
photo saved as .txt still reports its size and a text file named .png is not
parsed into a plausible-looking lie. PNG, JPEG, GIF, BMP, WebP, TIFF, ICO, AVIF,
HEIF, MP4 and MOV are read in-tree with no extra package. Matroska, WebM and AVI
carry their size somewhere no small parser should go, so those are handed to
ffprobe — install ffmpeg and the row appears; without it, those files
simply have no resolution row rather than a guessed one.
Selecting several files answers a different question instead: how many, and how much.
Only
infoever reads a file's content. A listing never does — opening four thousand files to draw four thousand rows is what makes a file manager hang on a network share.
Sizes
A folder's size is its contents, not the few hundred bytes of the directory
entry that stat reports — which is the right answer to what stat was asked
and the wrong answer to what anybody opening properties is asking.
synfiles du ~/Videos
It is a separate command from info, and deliberately: walking a large tree
takes seconds, and folding it into info would freeze the properties panel on
exactly the folders anyone would ask about. The panel draws first and the total
arrives after, streaming as it counts, so there is a running number rather than
"calculating…" and then a jump.
Two totals, because they disagree and answer different questions: bytes
(apparent size — what has to fit when you copy it) and disk (blocks — a tree
of tiny files takes more, a sparse file less). Hard links are counted once: a
4 GB file linked in twice is not 8 GB, and a package cache is full of them.
Symlinks are never followed, which would double-count and hang on a cycle. Both
totals agree with du -sb and du -s exactly, and the tests assert that against
coreutils rather than against a remembered constant.
Closing the properties panel stops the walk. One left running lands its records in whatever folder is asked about next.
The right-click menu
Open With comes from the desktop-entry index, and the Extract / Crop / Mount
ISO / Run with Wine / Set as Wallpaper entries are synui's own KIO service
menus, read straight out of $XDG_DATA_DIRS/kio/servicemenus. That is where
Dolphin reads them too, so a helper written once appears in both file managers.
The window never builds a command line: it names an action, and the binary does
the Exec= parsing and the %F/%f/%U substitution. Nothing goes to a shell.
A mixed-type selection offers no service menus at all, because an action that applies to one kind of file and not another has no honest answer for the group.
Places, volumes and archives
Pinned places are Dolphin's own file — ~/.local/share/user-places.xbel.
Your existing sidebar is there the first time you open the window, and running
both file managers does not fork your bookmarks into two diverging lists. Pin
and unpin splice a single entry and take a one-time .pre-synfiles backup
before first touching the file.
Volumes come from lsblk, /proc/self/mounts and systemd .mount units,
which is more work than it sounds like it should be: an automounted disk shows
no mount point in lsblk until something touches it, and a file manager that
believes lsblk alone will call a working drive "not mounted" and offer to
mount it a second time. Unmounted volumes are shown dimmed with a mount button;
mounting and unmounting go through udisksctl, which owns the polkit rules that
let a desktop user do it without root.
The list keeps up on its own — plug a stick in, put a disc in a drive, or
mount something from another program or a terminal, and the sidebar changes
without a refresh. That takes three mechanisms, and none of them covers the
other two. A device arriving, and a disc going into a drive, are kernel
uevents, read from a netlink socket joined to udev's own multicast group, which
needs no privileges; the kernel notices the disc at all only because it polls
removable media a few times a minute. Mounting and unmounting emit no uevent
whatsoever — nothing about the device changed, only what is being done with
it — so the mount table is watched instead, with a poll() for POLLPRI on
/proc/self/mountinfo, the one thing that file answers. And a network share is
neither: gvfs hangs every share off a single FUSE mount, so mounting a second
one does not touch the mount table either, and each share appears as a
directory under /run/user/<uid>/gvfs — which is inotify's question. A burst
is coalesced, because one stick is five or six uevents with a mount behind
them and re-reading the list once per event would put six process spawns behind
one plug. synfiles volumes --watch is the same stream on the command line.
Archives: select, right-click, Compress — tar.gz, tar.xz, tar.zst,
zip or 7z. Every input must share one parent, and the tool runs with that
parent as its working directory, or the archive stores absolute paths and
unpacking it scatters files across the disk. Compressing is journalled, so
Ctrl+Z puts a mistaken archive in the trash. Extraction is the service menu
that was already there.
Search
Ctrl+F searches the current folder and everything below it. The filter box
does double duty and says which mode it is in — filtering is instant, searching
walks the tree.
synfiles find . --name=iso # no glob characters means "contains"
synfiles find ~/src --name='*.c' --content=TODO
- Never descends a symlink. A link to its own ancestor is a loop and one
pointing at
/turns a search of a project folder into a search of the whole machine. Links are reported, not followed. - Bounded — 1000 results and 16 levels by default, both adjustable.
--nameand--contentare ANDed;--contentskips binary files and caps each one at 8 MB.- Every hit carries the folder it was found in. "config.json" appears eleven times in a source tree, and which one it is is the only useful thing about it.
Settings
Remembered in ~/.config/synfiles/settings, written by the binary rather than
by the window:
synfiles config list
synfiles config set view details
synfiles config set icon_size 48
synfiles config reset
| Key | Values | Default |
|---|---|---|
view |
auto, icons, compact, details |
auto |
icon_size |
16–128 | 20 |
previews |
on/off | on |
tree |
on/off | off |
hidden |
on/off | off |
sort |
name, size, mtime, type |
name |
reverse |
on/off | off |
split |
on/off | off |
text_scale |
75–175 (percent) | 100 |
Numbers clamp; an unknown key or an invalid value is refused rather than
stored, because a settings file that accepts anything accumulates typos that
never read back. sort, reverse and hidden are per tab, so what is saved is
the default a new tab starts from.
For scripts: --rec
Every command takes --rec and prints tab-separated records — the same ones the
window parses.
synfiles --rec list ~/Downloads
synfiles --rec info photo.jpg
Every field carrying a name or a path is percent-encoded, and this is not
decoration. A filename is any sequence of bytes except / and NUL: tabs,
newlines, quotes and invalid UTF-8 are all legal, and a file called
notes<TAB>receipts does not make a broken row in a naive TSV — it makes a
plausible row naming a different file, which is then handed back to something
that renames or deletes it.
The encoded form is the identity. Decode it for display only, and never hand the decoded string back to anything that touches the disk.
Exit status is 0 for success, 1 for failure and 100 for "nothing to list",
so a script can tell an empty folder from a broken command without parsing
output.
Getting Dolphin back
One command, and it wins because it lands in your own config rather than in the distribution's:
xdg-mime default org.kde.dolphin.desktop inode/directory
The reverse is xdg-mime default synfiles.desktop inode/directory, or delete
the line from ~/.config/mimeapps.list to fall back to the system default,
which is synfiles.
If Dolphin is not installed any more: synpkg install dolphin.
See also
- The Desktop — the bar, widgets, desktop icons, themes
- Commands — the whole command-line surface
- Software —
synpkg, the package manager built the same way - Troubleshooting — when a folder opens in the wrong thing