Repository navigation
Releases
Zilla-RS 0.2.6
Zilla-RS 0.2.6 — the connection state finally shows on the toolbar, and the quick-access shortcut stops being a rumour.
What's changed
- The buttons tell the truth now. The page asked the connection portrait for
connected/live; the workstation answers withconnections/max_connections— and itsactivefield says whether the transfer is in active mode, not whether a wire is open. So "Se connecter" stayed clickable with a wire open, and "Déconnecter" stayed clickable with none. The check now reads whichever of the three fields the message actually carries (/sites,/status, the WebSocket welcome), so the greying holds wherever the state came from. - The page no longer wakes up ignorant. The
hellowelcome message carries the whole status, but the connections inside it were dropped — a reload with a live pool looked like "offline". It is ingested now, and the buttons are right before you click anything. - A pastille on the top bar, lit while a wire is open, naming the host it is holding. Greyed-out means exactly what it says: no colour, no response — "Rappeler" only keeps the floor when there is a site to call back.
- The shortcut is visible. The favourites bar stays put and, when empty, offers a "Raccourcis" button that opens the site manager; the site sheet gained a "☆ Make it a shortcut" button; the star in the tree got big enough to click; and the shortcut button takes the colour of the connection state, like the rest of the bar.
- A live harness.
tools/harnais-vivant.jsdrives the same throwaway DOM against a real workstation started bytests/pont.rs(#[ignore]— the rest of the suite stays as quick as before). It found both faults above; the silent harness now plays both shapes of the status portrait so neither comes back.
Verified by
node tools/harnais-vivant.js (five checks against a live server + demo FTP: idle, favourites, connected, disconnected, waking up on an already-open wire) and node tools/verif-ui.js (eight checks, silence is success). 54 Rust tests green, 1 ignored bridge, zilla selftest 16/16 on the shipped binary.
Zilla-RS 0.2.5
Zilla-RS 0.2.5 — the transfer queue finally lets go, and the sites you keep come to the top bar.
What's changed
- A finished row leaves the queue. The engine wrote
"Done","Down","Normal"on the wire while the page comparest.state === "done": with no meeting point, a completed download never left the list and its state read "en attente" forever — the arrow ignored uploads for the same reason. Rows are normalised on the way into the list, and the wire now speaks lowercase (JobState,Direction,Priority), with the old capitalised forms still accepted when readingtransferqueue.json.tests/etats.rspins the contract. - Favourites hang off the top bar. A site flagged as favourite — the star in the manager's tree, or the "favourite" box on its sheet — becomes a button in the toolbar: one click connects, the next gets you out, and the dot on the button says whether a wire is open.
Sitegained afavoritefield; sheets saved before it still load. - The connection state reads off the buttons. "Se connecter" greys out while a connection holds the place, "Déconnecter" greys out when none does. Clicking a name in the site tree opens its sheet again.
- 🧹 empties the queue, not just the tally. Finished rows leave on their own, so the broom now takes the whole list — running transfers included. The engine hands its slots back at the next chunk and reports how many rows it dropped.
Verified by
node tools/verif-ui.js — eight checks, silence is success: what the queue reads off the wire (both cases, both arrows), a finished row gone, the tally and the folded rows, the connect/disconnect buttons greyed the right way round, the favourites bar. 54 Rust tests green, zilla selftest 16/16 on the shipped binary. The visual result — the bar with ten favourites on it, the star in the tree — still wants a real browser.
Zilla-RS 0.2.4
Zilla-RS 0.2.4 — an interface release. The transfer queue moves out from between the two file panes and settles in the bottom strip it already belonged to.
What's changed
- The middle pane is gone.
main#panesis nowlocal · remote, gutter and all: the two file panes take the whole width (flex: 1 1 auto) instead of sharing it with a 260 px queue that duplicated what the bottom tabs already show. - The queue lives under the "Transferts" tab. Full-width rows — name + site, state, progress bar, transferred/total — a header line, the ⏸ 🧹 ⤢ buttons on the tab strip, and a count on the tab itself. The journal steps aside while that tab is open and comes straight back on the next click.
- One way in. The toolbar queue button and Ctrl+Alt+T now open that view (showing the bottom strip if it was hidden) instead of a dialog; the detailed window stays under ⤢. "Show transfer pane" (renamed "Show the transfers tab") now governs the tab and falls back to the "Tous" tab when turned off.
- A finished row still leaves the list. The tally stays on the strip, one click brings the folded rows back, and the detailed window still shows every one of them.
Verified by
tools/verif-ui.js — a throwaway DOM so that web/app.js can be driven without a browser: it replays five gestures and asserts the view swaps, the row renders with its bar, and a finished row is gone (node tools/verif-ui.js, quiet is success). The Rust suite is untouched at 48 tests green, and zilla selftest is 16/16 on the shipped binary. The visual result — column alignment inside the tab, roughly six rows in the default 196 px strip, the local/remote split once the middle pane is out of the way — still wants a real browser.
Zilla-RS 0.2.3
Zilla-RS 0.2.3 — a bug-fix release. The folder panes and the transfer queue now move when the transfers do.
What's fixed
- Folders refresh when a transfer finishes.
complete()used to write the final state into the queue and say nothing: the page learned about it at its next 3 s poll, and the pane that had just received (or lost) a file stayed on its stale listing. A finished line — and a failed one — now publishes its pane (localorremote, depending on direction) and the queue; the page then groups the signals of a folder download behind the first one instead of re-listing once per file. - A finished line leaves the waiting list. Done rows fold out of the queue pane. The tally stays on the strip with a "N terminé(s) masqué(s)" link, and the detailed queue window (⤢) still lists every row.
- The directories of a site are honored.
App::connect()used to log "Répertoire distant de départ" and then never use it — the remote pane always landed on/— while the site'sLocal directorywas only stored and read by nobody.ConnInfonow carriesserver_dir(the attach path the server announces, or the directory the site asks for once verified),/api/connectadds the site'slocal_dir, and the page installs both panes there at connect. An unreachable directory falls back to the root with a warning in the log instead of a silence.
Verified by
tests/panneaux.rs — the remote directory of a site (absolute with a trailing slash, bare /, relative, and one that is not there), the HTTP contract of /api/connect exactly as the page reads it, and the wake-up of the local/remote pane at the end of a download and of an upload, caught on the event bus. Against the code before this fix the server_dir assertions do not even compile. Whole suite: 48 tests green, and zilla selftest 16/16 on the shipped binary.
Zilla-RS 0.2.2
Zilla-RS 0.2.2 — a bug-fix release. The queue and the folder panes breathe again after a broken transfer.
What's fixed
- A broken upload no longer poisons the connection. When a
STORwas cut short — the peer drops the data channel mid-write, or you put the line in the bin — the client never read the reply the server sends after it closes the channel. That reply then sat in the control stream and got read as the answer to the next command: every folder listing after that failed on a nonsense protocol error (protocole inattendu : PASV : Reply { code: 226, ... }) and fell back to active mode, which timed out. It looked exactly like "no more refresh", and only restarting the service cured it. The transfer channel is now always closed and its reply read, whatever ended the cycle — success, error or cancellation. - An interrupted transfer is held accountable. A data channel closed without its reply marks the connection as dirty, so the pool replaces it instead of lending it out for browsing.
- A listing can no longer sleep forever. The
LISTdata channel was read without any inactivity bound, while it held the connection mutex: one silent listing froze every other operation on that connection. It is bounded now, likeMLSDalready was. - Dead connections give their slot back. Connections that had already given up the ghost kept their place in the pool, the vector grew with every incident, and the slot stayed filled twice over; the reaper takes them out first now.
- A stalled line is cut, not waited on. The data channel has an inactivity bound (
net.data_timeout, following the 20 s response delay by default) and the queue's watchdog abandons anActiveline that has stopped pushing bytes, so the following lines and the listings get their breathing space back.
Verified by
tests/tuyau_casse.rs — a sabotaging mini-FTP server (one that drops the data channel mid-write, one that stops taking bytes at all), driving a real upload and asking the panes to refresh afterwards. One of those scenes still fails when the fix is taken away. The whole suite is 45 tests, green.
Zilla-RS 0.2.1
Zilla-RS 0.2.1 — a bug-fix release. Nothing new goes in, the tree navigation in the panes comes back.
What's fixed
- You can enter a folder by double-clicking it again. The listing endpoint was sending the entry kind as
"Dir"while the interface testede.kind === "dir"— so every folder looked like a file, and a double-click went off to transfer or view instead of walking into the directory.EntryKindnow serializes in lowercase (dir,file,symlink,other), with aliases for the old spelling so settings and caches written by earlier versions still load. - Folders read as folders again: folder icon, "Directory" in the Type column, empty size, folders first sorting, and a status bar that counts them as folders instead of files.
- The double-click can no longer miss. Rows were being rebuilt on every plain click, on every websocket
hello, and on the 12-second status poll — the second click of a double-click could land on a row that had already been replaced by the time the event fired. Selection now repaints in place,applySettings()re-renders only when something visible actually moved, and rows are resolved by name instead of by row number, with a hit-test fallback. - Symlinks are links: the client compared against
"link"where the server sends"symlink". - Show hidden files (local) reloads the local pane the moment it is saved, instead of waiting for you to navigate.
New in the test suite
tests/kinds.rs pins the wire format (kinds in lowercase, old spelling still readable) so this class of bug cannot come back unnoticed. The manual round-trip — boot the UI, double-click a folder, drill down, come back up, press Enter on a selection — is exercised against a real server in a browser sandbox as well.
Building from source
cargo build --release
target/release/zilla serve
The asset below is a prebuilt x86_64-linux binary (zilla-rs 0.2.1, built with Rust 1.85+): extract and run ./zilla serve.
Zilla-RS 0.2.0
Zilla-RS 0.2.0 — a multi-pane FTP/FTPS/SFTP/FTP-over-TLS client, an autonomous FileZilla that lives in your browser.
What's new
- Folder comparison. Pick a local folder and a remote folder and get every difference the way FileZilla does: missing here, missing over there, different size or date — with byte totals, filters and a selection you can push in one shot. Backed by a new
GET /api/compare. - Sync that keeps the tree. Enqueueing now takes a common base, so the relative tree is re-created on the other side instead of everything landing flat in one folder.
- Timestamps travel both ways.
MFMTsets the remote date after a transfer (use_mfmtis now on by default), and the bundled demo server understands it. A new test checks the round-trip in each direction. - Faster FTP reply parsing. The text after a reply code no longer loses its first character when the separator is absent.
- Dates go through chrono instead of the hand-rolled civil-day arithmetic used by MDTM/MFMT and
LISTtimestamps.
Behaviour to know about
zilla demois gone, and flags are read from the whole command line —zilla -p 9000just works, no subcommand needed.- It now listens on
0.0.0.0:8734by default, and the session-token guard has been removed. The UI is reachable by anyone on your local network, with no password, and it can read and write the files your user can. Keep-b 127.0.0.1if you want it local-only.
Building from source
cargo build --release
target/release/zilla serve
The asset below is a prebuilt x86_64-linux binary (zilla-rs 0.2.0, built with Rust 1.85+): extract and run ./zilla serve.