
swpui (Rust, MIT/Apache-2.0, v0.9.0, 51★) — a case-aware search-and-replace TUI with per-file preview and zero runtime deps.
sed -i 's/foo/bar/g' **/*.rs works until it doesn't. You rename a function across a codebase and three hours later you find FooHandler, fooHandler, and FOO_HANDLER still littering the diff. sed doesn't know about case variants. Your IDE's find-and-replace does — but that assumes you want to open an IDE.# Cargo (any platform with Rust toolchain)
cargo install swpui
# cargo-binstall (skips compile, downloads pre-built binary)
cargo binstall swpui
# Nix
nix profile install nixpkgs#swpui
# Arch Linux (AUR)
yay -S swpui-binswp. Run it in any directory and it opens a split-pane TUI: a search box, a replace box, a scrollable file list with match counts per file, and a preview panel showing the diff in context. 1hash → sha256 replacement across 14 files. 1snake_case, camelCase, PascalCase, UPPER_SNAKE, kebab-case, or Flat — and applies the replacement in the same case. Rename worker to executor and you get executor, Executor, EXECUTOR, and executor_pool without writing six separate sed commands. 2j/k move through files, Enter applies all matches in the current file, Space skips the file, f applies the entire file at once, s skips. This per-file review flow is the practical difference from a one-shot sed -i or rg --replace: you can stop mid-operation, inspect a tricky file, and decide not to touch it — without canceling the whole batch.$0–$9 reference captured groups in the replacement pattern, the same syntax as most editors. 1 The tool respects .gitignore, .ignore, and a .swpignore file if you need to exclude generated files per project.FileHash to ContentDigest across a mid-size codebase. The type appears in doc comments, struct names, function names, and variable names — all different cases.cd my-project
swp
# In the TUI:
# Search: FileHash (case-aware mode: on)
# Replace: ContentDigest.gitignore), shows you 14 files with 80 total matches, and opens a preview for each. You navigate through the list, confirm the source files, skip the auto-generated Cargo.lock entry, and press Enter on each file. The whole operation takes about two minutes and you saw every change before it landed.serpl — the nearest equivalent — stopped being maintained and required ripgrep and ast-grep as runtime dependencies. "The main feature I wanted to have is immediate feedback for the search query, which is also why I didn't stick with tools like fastmod and repgrep," Bersier wrote on Hacker News. 3| Tool | Interactive preview | Case-aware replace | No runtime deps | Notes |
|---|---|---|---|---|
| swpui | ✓ per-file | ✓ 6 case variants | ✓ | v0.9.0, MIT/Apache-2.0 |
sed -i | ✗ | ✗ | ✓ | scriptable, composable, no visual feedback |
fastmod (Facebook) | ✗ | ✗ | ✓ | interactive confirm but no preview panel |
repgrep | partial | ✗ | ✓ | ripgrep-powered, no live diff preview |
serpl | ✓ | ✓ | ✗ | requires ripgrep + ast-grep; maintenance stalled |
| Field | Value |
|---|---|
| Repo | github.com/beeb/swpui |
| Version | v0.9.0 (released 2026-06-13) |
| Language | Rust (99.2%) |
| License | MIT OR Apache-2.0 |
| Stars | 51 ★ (+11 in 24h) |
| Commits | 122 |
| Binary name | swp |
| Install (Rust toolchain) | cargo install swpui |
| Install (no compile) | cargo binstall swpui |
| Platforms | Linux, macOS, Windows (pre-built binaries on Releases) |
| MSRV | Rust 1.94.1 |
sed + a manual review pass anyway. swpui collapses those two steps.cargo binstall swpui gets you a binary in under 30 seconds, no compile time. Run it once on a non-critical rename and see if the preview workflow fits.hash in a string literal is different from hash as a type name.github.com
news.ycombinator.com
crates.io
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.