- local file synchronization via functional TUI
- tiling window friendly, fully scalable layout
- minimal and easy but flexible configuration
- plain and effective filter syntax without glob/regex
- strives for low complexity of app and codebase
- runs in all terminals on Linux, macOS and Windows
- native executables built with GraalVM Native Image
Usage: euaie [-AIQrSV] [-C=<MiB>] [-P=<KiB>] [-s=<policy>] [-t=<ms>] [-e[=<s:c:
e>...]]... [-i[=<s:c:e>...]]... [@<filename>...] <rootL> <rootR>
simple file synchronization
[@<filename>...] one or more argument files containing options
<rootL>
<rootR>
-e, --exclude[=<s:c:e>...] filter syntax: '<starts>:<contains>:<ends>'
-i, --include[=<s:c:e>...] filter syntax: '<starts>:<contains>:<ends>'
-r, --retain keep old files in <root>/.euaie/ (false)
-s, --symlinks=<policy> set policy for symbolic links (PRESERVE)
policies: FOLLOW, IGNORE, PRESERVE
-t, --tolerance=<ms> set tolerated time difference (-1)
negative values: detect automatically
-A, --automatic run automatically ignoring unclear items
-C, --copy-threshold=<MiB> set threshold for interruptable copy (512)
-I, --insensitive use case insensitive filters (false)
-P, --paranoid=<KiB> compare file head/tail when moving (0)
-Q, --quit exit when both sides are equal (false)
-S, --stateless ignore previous state (false)
-V, --version print version and exit
dotfiles:
euaie ~ ~/sync -r -i .config/ .local/share/ -e .config/too/big .local/share/Trash/
pictures and videos:
euaie ~/Pictures/DCIM /run/media/user/sdcard/DCIM --retain --quit
remote sync via rclone mount (alternative to rclone bisync):
euaie ~/mount/rclone/sftp1 ~/mount/rclone/pcloud --tolerance 2000
all options can be provided by arguments and argument files:
euaie @path/to/arguments.txt -Q
arguments.txt:
# comments start with #
#roots first
/home/user
/home/user/Cloud/Sync
--retain
--insensitive
--symlinks=IGNORE
#include in one line
--include=.config/
-i=.ssh/::.pub
#or multiple lines
--include
.local/bin/
.local/share/
Music/
--exclude=Music/::.flac
-e
.config/too/big
.config/not/this/path
.local/share/Trash/
::.tmp
each filter is a string-triple, all three parts have to match a path or can be empty:
<starts>:<contains>:<ends><starts>::or just<starts>:<contains>:or:<contains>::<ends>
examples:
.config/::.tomlmatches all .toml files anywhere in root/.config/:.git/:or::.git/matches all .git directories in any location:2026:.flacmatches all .flac files with '2026' in their pathspath/to/::/filematches root/path/to/some/file but not root/path/to/file.old
cross-platform jar:
./gradlew shadowJar
native executable with Gradle:
./gradlew nativeCompile
native executable with Podman/Docker:
podman run --rm --volume .:/app ghcr.io/graalvm/native-image-community:25 -jar euaie.jar
| euaie | FreeFileSync | Unison | |
|---|---|---|---|
| language | Kotlin | C++ | OCaml |
| version | 0.26.5 | 14.9 | 2.53.8 |
| LOC (cloc) | 1228 | 49238 | 40463 |
| LOC UI ratio | 59% | 47% | 26% |
copyright 2026 239 - licensed under the Apache License 2.0

