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 (s toggle, a select all).
  • Make u unzip every selected archive, not just the highlighted row.
  • Add quick actions (i quick zip all, o quick 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.