Skip to content

Releases: cristocola/fast-folder

v3.19.1

Choose a tag to compare

@github-actions github-actions released this 15 Oct 18:14
34455bc

fastf 3.19.1: the AUR build's own tests no longer fail at random

Building fast-folder from source runs fastf's test suite (check() in the
AUR package). Three of those tests could fail on a busy machine for reasons
that had nothing to do with fastf. When one did, paru fast-folder stopped
with A failure occurred in check(), and running it again usually worked.

Each of those tests started a program, a fake shell or a lock, while other
tests were starting programs of their own. For a moment, a program another
test was starting could still hold the file this test needed. The tests now
work in a way that does not depend on that timing. On this machine they
failed about once in every thirteen runs before the fix and passed 90 runs
in a row after it.

fastf itself is unchanged from 3.19.0. Its release notes cover $, your
shell in the project folder.

What's Changed

  • fastf 3.19.1: three unit tests no longer race the processes other tests start by @cristocola in #135

Full Changelog: v3.19.0...v3.19.1

v3.19.0

Choose a tag to compare

@github-actions github-actions released this 15 Oct 17:35
b35686a

fastf 3.19.0: your shell in the project folder, right where the app is

X starts the agent in the project's folder in the app's own terminal. $
now does the same for your shell. Press it on a project and the app steps
aside, your shell ($SHELL) starts in that project's folder, and exit
brings the app back where you left it.

  • No setup. Nothing goes into your .bashrc. fastf starts a shell in
    the folder, the way it starts the agent; it never moves the shell you
    started fastf from.
  • Works over ssh. t opens a new terminal window and needs a desktop
    for it; $ uses the terminal you are already in.
  • Your shell as you know it. It starts the way a terminal tab starts it,
    with your prompt, aliases and PATH. On Windows it is PowerShell.

t is now titled "Open a terminal window", so the pair reads like x and
X: a window of its own, or here.

Ctrl-C belongs to what you are running

Ctrl-C typed to an agent X started could reach fastf too. Once the agent
was done, the app quit with aborted., and a second Ctrl-C closed fastf
while the agent was still running. Now Ctrl-C goes only to the agent, or to
the command running in the $ shell. Closing the window still closes fastf.

fastf term on the command line still opens a new window. A command cannot
move the shell it was typed into; cd "$(fastf path ID0047)" does that.

How it works: docs/app.md

What's Changed

  • packaging: bump both AUR packages to 3.18.1-1 by @cristocola in #132
  • fastf 3.19.0: $ opens your shell in the project folder, in the app's terminal by @cristocola in #133

Full Changelog: v3.18.1...v3.19.0

v3.18.1

Choose a tag to compare

@github-actions github-actions released this 15 Oct 15:09
61aa063

fastf 3.18.1: your agent starts from the app menu

Opened from the app menu, fastf could not start an agent installed in
~/.local/bin, which is where Claude Code's own installer puts claude.
X, x and fastf agent all stopped at sh: line 1: claude: command not found. The same thing happened to a template's commands, the editor and a
terminal installed there. From a terminal everything worked, which is what
made it look random.

Why

A desktop session's PATH is the one it started with, before any shell
read ~/.bashrc. The folders your rc file adds were missing from every
program fastf started.

What fastf does now

fastf asks your shell which PATH it builds, the way a terminal tab starts
it, and starts the program with that one:

  • Opened from the app menu or a terminal emulator, the agent, the editor
    and every post-create command get your shell's PATH.
  • Typed into a shell, fastf's PATH already is your shell's, so it asks
    only when it cannot find the program itself.

It asks once per run, and for five seconds at most. It never asks without a
display, over ssh, or with $SHELL unset. fastf's own environment never
changes, only the program's. While it asks, FASTF_ASKING_SHELL=1 is set,
so an rc that does slow work can skip it.

Quotes around the agent

An agent typed into Settings with quotes around the whole of it,
"claude --dangerously-skip-permissions", used to be stored with them, so
the shell would look for one program with that entire name. Now fastf
treats it as the command inside the quotes. That applies when you set it,
and when it reads a value an earlier fastf already stored. The editor
setting gets the same treatment.

Nothing else changed.

How a program is found: docs/cli.md

What's Changed

  • packaging: bump both AUR packages to 3.18.0-1 by @cristocola in #130
  • fastf 3.18.1: a program you name is found where your shell finds it by @cristocola in #131

Full Changelog: v3.18.0...v3.18.1

v3.18.0

Choose a tag to compare

@github-actions github-actions released this 13 Oct 15:39
3035e95

fastf 3.18.0: todo owners, the hat, fastf agent, the desk and fastf peek

Nothing about an existing project changes. Every PROJECT_INFO.md,
config.toml and template works untouched, and no command, flag or file format
was removed. A todo nobody dates or gives an owner is written as it always was.

This release is for one person keeping track of many projects at once, with
agents working inside them. A todo can now carry an owner: a name you write
for yourself to say who the todo is with, such as an agent or a client. From
that and the folders alone, fastf answers which todos are yours, which are
with an agent or a client, and which projects have gone quiet.

Todos carry their owner and their dates

A todo's line may end in @owner, added:<stamp> and done:<stamp>, each a
plain token a person or an agent can write by hand.

- [ ] colour grade @claude added:2026-10-12T14:02:11Z
- [x] shoot @sales added:2026-09-20T10:00:00Z done:2026-09-28T18:30:00Z
  • fastf todo add writes added:; todo done writes done: and --undo
    removes it; todo edit keeps the tokens; todo owner <id> <n> <name> (or
    --none) changes the owner; --owner and --mine on todo add set the
    owner as the todo is written. todo list shows the owner and the day.
  • In the pane the owner and the day sit at the row's right, and O on a
    todo
    sets its owner: an owner the list already names, the hat, nobody, or
    a name you type.
  • A template's starter todos may end in @owner, so a new project starts
    with those owners on those todos.
  • fastf journal --todos lists every ticked todo (and with --todos=all,
    every added todo) between the notes, each row saying which it is; the JSON
    rows gain kind.
  • Only the tokens at the end of the line count. A @word in the middle of
    the text stays text.
  • A line without these tokens is a todo without an owner and without dates,
    and nothing fills them in: fastf does not know when it was written.

The hat

fastf hat sales sets the hat to @sales. The hat is the owner name you
use for your own todos: the app's header shows it, the desk lists the todos
with that owner under yours, todo add --mine uses it, and FASTF_HAT sets it
for one shell without writing the config file. Nothing else reads it; the hat
never changes what a file says.

fastf agent

agent = "claude" in config.toml (or fastf config set agent claude) names
one shell line, the shape a post-create command has. fastf agent <query>
runs it with the project as its working folder and FASTF_PROJECT_PATH set,
in the terminal you are in, so you never cd. From a desktop launcher it opens
a terminal window running the agent. In the app, x opens a new window
per agent so the desk stays up, and X runs it in the same terminal: the
app steps aside until the agent exits and re-reads the pane when it comes
back. fastf keeps no list of running agents: what the agent wrote in the
folder is its status.

The desk

w in the app, and fastf desk on the command line: every project as
one line, grouped by the owner of its next open todo. The next open
todo is the first unticked todo in the file. The groups are yours (the
hat), @claude, @acme, no owner (the next todo has no @name) and
no open todos. Within a group the project nothing has written in for the
longest comes first. Each line says how long the project has been quiet,
active when a program is working in it right now (Linux, from the process
table), and ⚠ when the next todo has an owner, nothing has been
written in the folder for three days, and no program is working in it. No due
dates, no priorities, no lifecycle to set.

  • f shows one group alone, F or Esc every group again; s/S change the
    order within a group (quiet, recent, name, id); z puts the cursor on a
    project picked at random. The desk's pane is the library's pane and every
    project verb works on the row under the cursor. Esc steps back to the
    library; w too.
  • The records are read once each, a base at a time, and checked against the
    disk every ten seconds while the desk is on screen, so a todo an agent
    ticks moves its project to the right group without a keypress.
  • On the command line: fastf desk --mine, --owner claude, --no-owner,
    --no-open-todos, --quiet 7, --random, --order, --as <hat>,
    --json. On a terminal it opens the app on the tab; --plain prints the
    list.
  • A bare fastf opens on the desk when it was quit there; the session
    remembers the group, the order and when the desk was last open.

What is going on in a project, without opening its folder

  • fastf peek <query> prints one project's summary: the next open todo
    and its owner, the todo counts, which programs are working in the folder (Linux),
    the newest file under it, the repository's head (read from .git as files,
    no git started), the last note, and how long the project has been quiet.
  • The pane gains a glance section ahead of the variables: last moved
    (the newest file under the folder, from the size scan; a dot-folder such as
    .git is skipped), head, and working (the programs whose working
    folder is inside the project, checked once a second while the pane shows
    it; Linux).
  • L gains a journal page: every dated note and every todo added or
    ticked across every project, newest first, with a rule where the desk was
    last open, so what happened since you last looked is above the rule.

Smaller things

  • The header keeps all three tabs down to forty columns.
  • fastf show --json carries the todos' owner, added and done_at.
  • The settings screen has hat and agent rows beside editor.

Full key list: docs/app.md;
the desk: docs/cli.md.

What's Changed

  • packaging: bump both AUR packages to 3.17.1-1 by @cristocola in #124
  • ci: bump actions/upload-artifact from 7.0.1 to 7.0.2 by @dependabot[bot] in #126
  • ci: bump dtolnay/rust-toolchain from 02cb101ec7c40f2c49e1d9714d64511d8e1b74de to e2a55d2ffb04f378e9626c28d38b36d230d1e12f by @dependabot[bot] in #127
  • ci: bump actions/download-artifact from 8.0.1 to 8.0.2 by @dependabot[bot] in #128
  • fastf 3.18.0: todo owners, the hat, fastf agent, the desk and fastf peek by @cristocola in #129

Full Changelog: v3.17.1...v3.18.0

v3.17.1

Choose a tag to compare

@github-actions github-actions released this 07 Oct 16:37
99e4db0

fastf 3.17.1: Describe, from anywhere

A project's description could only be edited from its row in the detail
pane, so the command palette could not find it and the action menu did not
list it. Both do now.

Describe the project

Press d on a project, open its action menu, or press c and type
"describe": Describe the project puts the cursor on the description in
the pane and opens the line, the same edit Enter on that row opens. Change
it and press Enter, or empty it and press Enter to remove it.

Where the pane is switched off, the line opens in a small prompt instead,
with the current description already in it. A description belongs to one
project, so with projects marked the command is greyed out and says to clear
the marks first.

Nothing else changed.

Full key list: docs/app.md

What's Changed

  • packaging: bump both AUR packages to 3.17.0-1 by @cristocola in #122
  • fastf 3.17.1: Describe the project, from the list, the palette and the action menu by @cristocola in #123

Full Changelog: v3.17.0...v3.17.1

v3.17.0

Choose a tag to compare

@github-actions github-actions released this 07 Oct 11:00
08f0b93

fastf 3.17.0: what a project is, when it was last alive, and what happened lately

Nothing about an existing project changes. Every PROJECT_INFO.md,
config.toml and template works untouched, and no command, flag or file format
was removed. A project nobody describes writes the same bytes it always did.

The description

Every project can now carry one line saying what it is — for whom, what
for, where it stands — and every list shows it.

  • fastf desc ID0047 "Music video for Lullaby, Indie, due in May" sets it,
    fastf desc ID0047 prints it, --clear removes it.
  • fastf new --description="…" writes it at creation, and so does fastf register --description="…" for one folder. In the app, the wizard asks it
    as its last question, after the template's own; the register form asks it
    for one folder and not for a whole base.
  • In the pane it is the row under the name: Enter or F2 opens the line in
    place, emptied and Enter removes it. It wraps like a note; nothing is cut.
  • fastf recent --plain and fastf search --plain print it on a row of its
    own under the project, fastf show under the name, and the JSON carries it
    as description. Free-text search matches it, and description=*fiverr*
    addresses it by name.

It is one line and at most 200 characters, and a refusal names the rule, on
the command line and in the pane alike. It lives in the frontmatter as
description: and rides in the base's index like the tags, so a list never
opens a file for it; show, desc and the pane read the file, and a line
typed into the file by hand shows in the list once the project is opened or
the base reindexed.

A template that declares a variable called description keeps
--description for that variable, as it has always been, and says so: a
script written before this release goes on working.

Touched

Beside created, every project now says when it was last written:
touched, the newer of its PROJECT_INFO.md and its folder. It is in the
plain list, in fastf show, in the pane's facts and in the JSON, as the same
fixed-width stamp as created, so the two compare as text. It is never
stored: every write fastf makes moves it, and so does a file dropped into or
taken out of the folder's top level; an edit deeper in the folder does not,
which is why a note is still how work is said to have happened. fastf show --json also carries last_note, the newest dated note.

The journal

fastf journal is every project's notes as one timeline, newest first:
the day and time, the project's id, the note. --since is about the note's
own date, so a new note on an old project is in this month's journal;
--template, --tag and --base choose the projects; --grep keeps the
notes whose text contains a word, which is how a note written to be found
later — lesson: ask for the stems first — is found; -n sets how many, and
--json prints them for a script.

docs/projects.md now has a section on a project as memory: the three kinds
of note that outlive a project and where each is promoted to, and the two
edits that close a project.

What's Changed

  • packaging: bump both AUR packages to 3.16.0-1 by @cristocola in #116
  • A project's one-line description, and when it was last touched by @cristocola in #118
  • fastf journal: every project's notes as one timeline by @cristocola in #120
  • fastf 3.17.0: the version, and the release notes by @cristocola in #121

Full Changelog: v3.16.0...v3.17.0

v3.16.0

Choose a tag to compare

@github-actions github-actions released this 03 Oct 00:31
443e246

fastf 3.16.0: choose which bases the list shows

Nothing about an existing project changes. Every PROJECT_INFO.md,
config.toml and template works untouched, and no command, flag or file format
was removed.

The bases panel

b in the app now opens the bases panel: every base on one row, ticked when
it is active, with the default base marked.

  • Space ticks or unticks a base. Unticking one takes its projects out of
    the list at once, so an archive or a scratch drive can stay out of the daily
    list.
  • B, from the panel or the list, switches between every base and only the
    active ones. Every base is the default, so nothing changes until you untick
    one.
  • Enter opens the base's menu: every action on it, each with its key, and
    Add or remove bases, which opens the settings on the list of bases.
  • f shows one base alone, which is what b used to do. It works on an
    inactive base too, without making it active.

The choice is remembered in state.toml the moment it is made, and the next
run opens on it. It is the app's own view: discovery still reads every base,
and the ID counter, moves and every command see every base as before. The
default base always stays active.

Nothing is out of sight in silence. The header names the active bases and
counts the rest, the search bar says active bases, and a search the active
bases leave empty says how many matches the inactive ones hold. A project you
ask for by name, from the palette or just created in an inactive base, is shown
with its base alone.

Fixed

  • Esc now clears "show only this base", which it never did.
  • docs/config.md said config.toml keeps keys fastf does not recognise. It
    never did: they are read past and left out of the next write. The docs now
    say so.

What's Changed

  • packaging: bump both AUR packages to 3.15.0-1 by @cristocola in #113
  • The bases panel: mark bases active, show every base or the active ones by @cristocola in #114
  • fastf 3.16.0: the version, and the release notes by @cristocola in #115

Full Changelog: v3.15.0...v3.16.0

v3.15.0

Choose a tag to compare

@github-actions github-actions released this 28 Sep 21:53
7059fcd

fastf 3.15.0: a quality pass

Nothing about an existing project changes. Every PROJECT_INFO.md,
config.toml and template works untouched, and no command, flag or file format
was removed. --help, the man pages and the shell completions are byte for
byte those of 3.14.0.

This release is a careful read of the whole source by somebody who did not
write it. Most of it changes how the code reads and nothing you can see. What
you can see is below: defects that reading turned up, each fixed with a test
that failed first.

What looks different

Two screens and the reconcile report's wording changed. Everything else looks
as it did.

  • Making a template from a folder: the preview now shows its summary line
    (2 folders, 1 text file 1 bundled (24.0 KB)), which sat below the fold of
    the dialog before, even in a window with rows to spare.
  • The reconcile report, in the app and from fastf reconcile, counts in
    plain words: 1 move finished, 1 project was never finished, where it
    used to say 1 move(s) and 1 project(s) were.
  • What reconcile put right is listed as put right. Files a cloud mount had
    left behind, which reconcile moved into their place, used to be reported
    under what needs a look, with a ⚠ verdict and a count in the summary. They
    are now listed under repaired, and a reconcile whose only findings are
    repairs ends with ✓. The exit status is unchanged. If a script reads
    reconcile's output, check it against these words.
  • fastf register on a folder that already is a project used to print
    ✓ Project registered when nothing was written. It now says Already a project — nothing was written, and names --rename or --apply when they
    were asked for and not carried out. The exit code is unchanged.

Fixed in the app

  • A dialog acts on the projects it was opened about. Delete named its
    folders as it opened and read the marks again at Enter, so a library reload
    landing in between could send the delete to the row under the cursor: a
    folder the question never named. Unregister, move, copy, the tag pickers,
    the quick note and the todo prompts had the same shape. Each now keeps the
    folders it was opened about, and refuses when none of them is left.
  • A tag or a value made shorter in the pane no longer shows the end of the old
    one after it (client/Xcme for client/X) until it is saved.
  • A slow read of one project's details can no longer land in the dialog of a
    copy of it with the same ID.
  • The copy and counter prompts check what you typed before they close, so a
    refusal no longer loses the text.
  • The palette brings a project into view whatever filter hid it; a long folder
    is listed in order rather than an arbitrary 200 entries; the picker's
    columns line up under double-width names; one mark reads 1 mark cleared.

Fixed on the command line

  • template from-folder's preview and --dry-run come from the same scan the
    run makes, depth limit and refusals included.
  • register --rename's preview reads the counter the way the run does,
    register --recursive's preview names the ID the run writes, and options
    that rule each other out are refused before anything waits on the lock.
  • config show says where the editor came from and prints the limit actually
    in force.
  • A value written into config.toml by hand is read whatever its case:
    on_name_collision = "Error" now means error, where it used to fall back to
    suffix. A recent_limit of zero reads as the default, twenty, rather than
    one.
  • fastf apply mentions {id} only where the template uses it.
  • On Windows, paths are shown without the \\?\ prefix everywhere, including
    the path a create prints for a shell to cd into.

Fixed in moves and removals

  • What a move copied is written to disk, folder by folder, before the
    original is touched.
  • A base that stopped answering holds no other command up.
  • A mount that drops is no longer asked again a thousand times a second, which
    filled the log and rotated it away. On a dropped mount the log is now a few
    kilobytes where it was megabytes.
  • Removing a move's record waits for an upload once, about twenty seconds,
    where it could take four minutes.
  • Smaller ones: a case check that cannot be undone stops a copy before it
    starts, a removal whose claim could not be written stays under the lock, the
    search for a staging name always ends, and a removal's last pause is followed
    by one last try.
  • On Windows the cursor is restored after Ctrl-C by the console's own call.

How it was checked

Every scenario of the 3.14.0 test runs on real mounts (a local disk, sshfs, an
rclone mount of an S3 bucket, and mounts that stall and drop mid-move) was run
again on this release and on 3.14.0 side by side. Twenty-four scenarios, and
the two agree on every outcome, on what is left behind, and on content, modes
and file times. Moves take the same time.

What's Changed

  • packaging: bump both AUR packages to 3.14.0-1, and retire PLAN.md by @cristocola in #110
  • A quality pass: smaller files, comments that earn their place, and the defects that reading it found by @cristocola in #111
  • fastf 3.15.0: a quality pass by @cristocola in #112

Full Changelog: v3.14.0...v3.15.0

v3.14.0

Choose a tag to compare

@github-actions github-actions released this 27 Sep 00:48
de8c03d

fastf 3.14.0: moves that finish clean on fragile mounts

Nothing about an existing project changes. Every PROJECT_INFO.md,
config.toml and template works untouched, and no command, flag or file format
was removed. Anything an older fastf left unfinished is picked up by this one:
the app finishes it by itself, or fastf reconcile does.

This release comes out of moving projects across an sshfs mount of a laptop and
an rclone mount of a Cloudflare R2 bucket. A move that met a dropped
connection, a dev server still writing, or an upload rclone had not finished
could leave half of the old copy behind, lose the record that said so, and end
with "look inside, and delete it yourself". None of that should happen now.

Only what fastf cannot fix stops a move

A move stops for a missing permission, a full or read-only drive, a name the
drive will not take, or a program holding a file in the project, and it says
which file and which program before anything is copied:
python3 (pid 4242) has session.txt open for writing; close it, or quit python3, then move again. On Windows, where a folder cannot be moved while
anything in it is open, it names the program there too, and a console sitting
in the project's folder.

Everything else is waited out:

  • An input/output error or a brief lock is asked again with a growing pause.
  • A mount that drops is waited for until the same mount is back. A move whose
    mount stays gone before it has published its copy pauses, keeping what
    it copied; moving the project again, or a reconcile, copies only the rest.
  • A stall is said, never a freeze: no answer from /mnt/laptop for 12 s.
  • A program merely running in the folder, like a dev server or your shell, does
    not stop the move. What it changes during the move is copied too, and the
    result tells you to restart it from the new place.

The old copy leaves entry by entry

Once the moved copy is complete, the original leaves the library in one step,
and what is left of it is removed only where the moved copy provably holds the
same. Something missing from the moved copy is put back into it first;
something that changed in the original during the move replaces the moved
copy's version; only a file changed in both places is kept and asked about.
On an rclone mount the old copy is emptied where it stands instead of renamed,
since a rename there is a copy and a delete of every object and moves uploads
still in flight. The record of the move is never cleared while anything it
owns is left, and on a cloud mount it stays ten minutes more, in case the
mount puts something back.

fastf finishes its own leftovers

The app runs its own reconcile when there is something it can finish, and the
header only asks for you when a decision is really yours: ⚠ 1 needs you !.
! lists everything unfinished with its reason and the choices that settle it
(keep the moved version, take the old one, put an old copy back, discard it).
From a terminal: fastf reconcile --list and fastf reconcile --resolve <path> <action>.

A base that stops answering holds up nothing

Every base is asked at once, with one short deadline. In the app each base's
projects are listed as soon as that base answers, a silent one is named
unresponsive in the header, and q quits at once. A project copied onto an
rclone base from elsewhere is listed without fastf reindex.

Faster, and truer to the original

Walks, copies and removals ask the filesystem about several entries at once.
Moving a web project off R2 went from 5 minutes 14 to 24 seconds, and deleting
one there from almost 6 minutes, with 181 files left behind, to 28 seconds with
nothing left. A move now keeps file and folder times and permission bits, +x
included, as mv does.

Compatibility

A move this version records on an rclone mount is written so that an older
fastf refuses to finish it rather than finish it the wrong way. If you run
fastf on two systems sharing a cloud base, update both.

What's Changed

  • packaging: bump both AUR packages to 3.13.0-1, and retire PLAN.md by @cristocola in #107
  • fastf 3.14.0: moves that finish clean on fragile mounts by @cristocola in #108
  • The Windows folder-holder test holds the folder itself by @cristocola in #109

Full Changelog: v3.13.0...v3.14.0

v3.13.0

Choose a tag to compare

@github-actions github-actions released this 25 Sep 17:41
883444e

fastf 3.13.0: a move you can watch, leave, and come back to

Nothing about an existing project changes. Every PROJECT_INFO.md,
config.toml and template works untouched, and no command, flag or file format
was removed. A move, copy or delete that an older fastf left waiting is finished
by the first fastf reconcile you run with this version.

This release comes out of moving a 1,473-file project off a Google Drive folder
mounted with rclone. The copy took minutes; then the app sat at "finalizing"
with its bar full for ten more while it removed the original, one Drive request
per file, saying nothing. Killed, it left the removal for Reconcile, which did
it again behind a spinner. Nothing was wrong, and nothing said so.

Every step is named and counted

A move now says what it is doing and how far it has got, the whole way:
scanning, checking the original's base, copying (files and bytes), verifying,
publishing PROJECT_INFO.md, setting the original aside, checking the old
copy, removing it — removing the old copy 312 of 1473 entries — and clearing
the record. In the app each step is a row: ticked with its count when done, the
current one with its bar and the entry it is at. On the command line each
finished step leaves a line, so the terminal keeps the whole run. A copy to a
folder and a reconcile report the same way; a reconcile names which item of how
many it is on, and can now be stopped between items or in the middle of a
removal.

A move is a process of its own

A move, a copy to a folder, a delete and a reconcile each run as a job: a
copy of fastf detached from the terminal and the app that started it, which
only follow it. Closing the terminal, quitting the app or killing either
leaves the job to finish.
Any fastf started meanwhile sees it: the app's
header shows what is running and its step, and fastf jobs lists it. In the
app, Esc hides the progress dialog and the job goes on; Ctrl-C cancels it until
the move publishes its copy, after which it is too late and the dialog says so.

  • fastf jobs lists jobs, fastf jobs watch follows one, fastf jobs cancel
    stops one.
  • move, copy-to, delete and reconcile take --detach: start and return.
  • A job that ended while no fastf was open is reported by the next app.
  • A job killed outright shows as stopped, and fastf reconcile finishes it.

The slow part no longer holds everything else

A move holds the library only until the original is set aside. Removing the old
copy — the part that takes minutes on a cloud mount — happens after, so a tag,
a note or another move goes through meanwhile. While a job does hold the
library, the app dims the verbs that would only wait for it and says why, and a
command that waits names the job it waits for.

Messages and the log

What fastf said and what it did are now kept, from every session:

  • Messages — the status lines and outcomes you were shown: fastf messages.
  • The log — every step of every move, copy and reconcile with its count,
    every warning, one timestamped line each: fastf log, fastf log --follow.
    config set log-level debug adds a line for every file a move touches.

L in the app opens both, with a jobs page between them; Enter on a job opens
its own log.

Tested against real mounts

The release build moved a 1,473-file project off a Cloudflare R2 bucket mounted
with rclone, with the command line killed mid-removal: the job finished, and
rclone lsf found nothing left in the bucket. It moved it back up, all 1,473
files arriving, and moved a project off the Google Drive mount, again with
nothing left on Drive. On Windows a move started over ssh finished after the
ssh session ended, and a cancel from a second session stopped another.

What's Changed

  • packaging: bump both AUR packages to 3.12.1-1 by @cristocola in #105
  • Moves as background jobs, with progress, messages and logs: 3.13.0 by @cristocola in #106

Full Changelog: v3.12.1...v3.13.0