The problem
Running git stash list gives you cryptic stash@{N} IDs and terse messages; recovering the right stash means running git stash show -p stash@{N} for each candidate until you find what you need.
If you've hit this, you know the drill — git stash list, squint at the messages, run git stash show -p stash@{2}, repeat.
As a solution, I created stashpick
Interactive arrow-key git stash browser — preview diffs and apply, pop, or drop stashes without memorizing stash IDs
Zero dependencies. Run immediately:
npx stashpick
Output:
$ npx stashpick
stashpick 3 stashes a=apply p=pop d=drop q=quit
ref date message │ diff preview
──────────────────────────────────────────────────────────────────────────────
▶ stash@{0} 2026-05-27 WIP on main: login │ diff --git a/src/auth.js b/src/auth.js
stash@{1} 2026-05-24 feat: refactor api │ @@ -12,6 +18 @@
stash@{2} 2026-05-20 quick css tweak │ + async login(email, password) {
│ + const res = await fetch("/api/auth"
──────────────────────────────────────────────────────────────────────────────
1/3 stash@{0} WIP on main: login form
How it works
Pure Node.js: shells out to git stash list and git stash show -p via child_process, caches diff output per stash, and renders a two-pane terminal UI using raw ANSI escape codes and readline raw mode — zero npm dependencies.
Why I built it
Found repeated complaints on r/git and HN about losing stash contents — developers stash work, forget what is in each one, and end up cherry-picking blindly or abandoning stashes entirely. Existing solutions like lazygit are full git UIs requiring separate installation; no zero-dependency npx tool fills the gap of a focused, single-purpose stash browser.
Try it
npx stashpick --help
Part of µ micro — one new developer tool, shipped every day. All tools are zero-dependency Node.js.
Top comments (0)