Rsynko is a meaning-first manager for path transfers. A transfer joins two ends — a folder or a file, here or on another machine — and is rehearsed before it is performed. rsync performs it, and the manager never learns what rsync is: what it knows is the command, which it states before it runs it.
A submitted line names a path unless a source recognizes it as its own, so /home/dev/music, nas.local:/srv/data, and rsync://nas.local/data are all transfers.
Retrieval is the additional source composed onto that: media from Youtube and X is downloaded the same way a path is transferred, from the same list. Thanks to yt-dlp, from which the extraction algorithm for Youtube and X downloads is taken.
┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
│ rsynko 0.1.0 │
└──────────────────────────────────────────────────────────────────────────────────────────────────┘
┌ Transfers (3) ───────────────────────────────────────────────────────────────────────────────────┐
│▸ ● ██▏ 28% First fetched title Downloading 18.2 MiB / 63.0 MiB 2.0 MiB/s │
│ ● ████████ 100% Second fetched title Complete — │
│ ○ 0% A portable video title Ready — │
│ │
│ │
└──────────────────────────────────────────────────────────────────────────────────────────────────┘
┌ Actions ─────────────────────────────────────────────────────────────────────────────────────────┐
│[↑↓] Select [Enter] Details [a] Add [Space] Pause [Del] Remove [Ctrl+Q] Quit │
└──────────────────────────────────────────────────────────────────────────────────────────────────┘
Everything the manager states — the details page, the formats a source offers, what a transfer would change, the command it runs — is in rsynko-manager.
Important
Rsynko is an extendable specification. A source is added by stating what it means, and an interpreter by stating how it is carried out; neither edits the other, and neither has to be foreseen. That is the expression problem gone rather than managed — and once it is gone, compositions that were not imaginable before become ordinary. Retrieval composed onto transfers, without either knowing about the other, is the first one.
Interactive terminals open a collection/detail manager. Command-line arguments pre-populate its
collection; press a to add more and Space on each source to run it. Redirected output remains
line-oriented and acts on each supplied source immediately.
Ctrl+Q and Ctrl+C both quit, and both stop what is running before they do, so nothing is left behind either way. Ctrl+C has to be pressed twice, quickly, so hitting it by accident quits nothing. Escape navigates back and never quits.
rsynko
rsynko /home/dev/photos/2026
rsynko 'backup@nas.local:/volume1/photos /home/dev/photos'
rsynko 'fixture://single-video'
rsynko 'https://www.youtube.com/watch?v=jNQXAC9IVRw'
rsynko 'https://x.com/somebody/status/1234567890123456789'Note
Transferring a path needs rsync on the PATH, and a remote endpoint needs ssh the way
rsync itself does. Retrieving a web address needs nothing but the executable.
Take the built binary. Every push builds rsynko-x86_64-unknown-linux-gnu.tar.gz beside its
.sha256, and a tagged v* push attaches both to a release — the newest one is always at
releases/latest. Unpack it and put rsynko wherever the PATH reaches:
tar -xzf rsynko-x86_64-unknown-linux-gnu.tar.gz
install -Dm755 rsynko-x86_64-unknown-linux-gnu/rsynko ~/.local/bin/rsynkoBuild it. With a Rust toolchain, just install states the same executable on the PATH, built
with the release profile:
just install # cargo install --path crates/rsynko
cargo build --release # target/release/rsynko, to place by hand
cargo run -- /home/dev/photos # without installing anythingWhat something means, with no interpreter in it. These sit at the top level of the repository.
| Crate | States | |
|---|---|---|
rsynko-manager |
The collection, its pages, and its queue | |
rsynko-ui |
Keys, menus, and pages, with nothing drawing them | |
rsynko-session |
What is running, and one pass of attention | |
rsynko-rsync |
Path transfers and what one would change | |
rsynko-media |
Media: described, chosen, produced, named | |
rsynko-download |
Retrieval of one resource, published atomically | |
rsynko-yt |
Youtube as a special case of retrieval | |
rsynko-x |
What a public tweet carries, and how to ask |
What a library makes of a specification. Each lives under crates/ and is named for the choice it makes.
| Crate | Interprets it as | |
|---|---|---|
rsynko |
the executable, composing the rest | |
rsynko-memory |
in-memory values the laws run against | |
rsynko-process |
an operating-system process running rsync |
|
rsynko-reqwest |
Reqwest requests and published files | |
rsynko-ratatui |
a terminal screen, and keys read back |
- Better text editing in the input, output, and add-sources editors
- Scrolling in the collection and the report, so a long list is not cut to the pane
- A selectable folder filter per transfer, stated in
rsync's own filter-file language - Every file a tweet carries, rather than one of them —
Take::EverythingandTake::Imagesare stated inrsynko-xand nothing consumes them yet - Youtube's adaptive streams taken together: signature deciphering, proof-of-origin tokens, and a merge
- A collection remembered between runs
- Binaries beyond
x86_64-unknown-linux-gnu
Read DENOTATIONAL_DESIGN.md for semantic authority and
ARCHITECTURE.md for dependency and interpretation boundaries before adding
implementation machinery.
Packages are licensed under MIT. Publish them in this order, allowing the crates.io index to update between dependent packages:
rsynko-download,rsynko-session, andrsynko-xin any orderrsynko-mediarsynko-managerrsynko-rsyncandrsynko-uiin any orderrsynko-ytrsynko-memoryrsynko-process,rsynko-reqwest, andrsynko-ratatuiin any orderrsynko
Cargo cannot package a later step against crates.io until the preceding version is available there.
Each crate carries its own version, so a release states only the crates that changed:
just release-crate <crate> <level> for one, just release <level> for the whole workspace. Every
release tags <crate>-v<version>, and rsynko-v<version> is what builds and attaches the
executable.