Building Rusty-Zipper with Anti-Gravity
On November 19, 2025, I started rusty-zipper-v1 with Anti-Gravity. The first attempt in Zig did not land, so I reset in Rust and immediately got better results.
The goal was practical: I grade programming assignments, students submit archives, and I needed a fast tool that can bulk unzip or zip from the working directory.
What shipped first
Phase 1 got a working CLI mode where --cli unzips every .zip in the current directory into matching folders. From there we added a Cursive TUI that could unzip one archive and zip one file/folder at a time.
#[derive(clap::Parser)]
struct Args {
#[arg(long)]
cli: bool,
#[arg(long, default_value = "unzip")]
mode: String,
}
What got hard
The long middle phases were about behavior, not demos:
- Add bulk zip support with format flags (
zip,gzip,tar,tar.gz,tgz) and default names. - Support multi-select in TUI (
stoggle,aselect all). - Make
uunzip every selected archive, not just the highlighted row. - Add quick actions (
iquick zip all,oquick unzip all). - Add complete in-app help (
h) and better CLI docs. - Investigate dependency upgrades and keep current crates where possible.
What we learned
The biggest lesson was how fast a utility grows once real users touch it. Every manual test surfaced edge cases: stale dialogs, missing status indicators, key binding behavior, and performance concerns under larger batches.
Even with those bumps, Anti-Gravity helped me keep momentum through late nights and credit limits. The app became genuinely useful, not just a code exercise.