{"slug": "stinkpot-sqlite-backed-shell-history", "title": "stinkpot: sqlite-backed shell history", "summary": "Developer oppiliappan released stinkpot, a 400-line Go shell-history searcher backed by SQLite that provides session-agnostic history management and a reverse-search TUI for bash, as a minimal alternative to atuin. The tool imports existing bash history, stores it in ~/.local/share/stinkpot, and is triggered by Ctrl+R at the shell.", "body_md": "\n\n```\nstinkpot\n--------\n                             _\n                         _  / \\  _\n                        (_\\/\\_/\\/_)\n                          /\\/ \\/\\\n                          \\/\\_/\\/\n                           \\/_\\/\n                           \"   \"\n\nstinkpot is an sqlite backed shell-history searcher for\nbash.\n\nstinkpot is a much tinier atuin (https://atuin.sh). i have\nbeen using atuin for a while, but i don't use most of its\nfeatures: the sync server, atuin AI, dotfiles manager,\nscript manager or the KV store. while sync is interesting,\nmy machines have very different setups and i tend to run\nvery different commands on them.\n\nmy only usecase for atuin was the session agnostic history\nmanagement, and the searcher TUI. stinkpot provides these\nwhile being about 400 lines of go.\n\nstinkpot is a tiny turtle species apparently, hence the\nname.\n\ndevelop\n-------\n\nto build:\n\n    go build -o stinkpot .\n\nusage\n-----\n\nif you use home-manager for nixos, stinkpot has a\nhome-manager module:\n\n    home-manager.users.<name> = {\n      imports = [\n        ./home.nix\n        inputs.stinkpot.homeManagerModules.default\n      ];\n    };\n\nif not, just call eval the init script in your .bashrc:\n\n    eval \"$(stinkpot init)\"\n\nstart by importing your existing bash history into stinkpot:\n\n    stinkpot import\n\nand then hit ctrl+r at your shell to trigger reverse search:\n\n    > search history...\n     1s vim flake.nix\n     3m redis-server\n     3m jj l\n    35m jj show m\n    36m jj git fetch\n    39m cd\n    40m vim readme.txt\n      788 matches · ↑/↓ move · enter accept · esc cancel\n\nhit tab/enter to accept the selection, hit enter again to\nexecute. the history database is stored in\n~/.local/share/stinkpot. if upgrades break the DB, just\ndelete it and run the import command.\n```\n\nsqlite-backed shell history\n\nGo\n82.5%\n\nNix\n17.5%\n\nSigned-off-by: oppiliappan <me@oppi.li>\n\nspeeds up reverse search, the sqlite plan now uses covering index\n\ninstead of temp b-tree for order-by\n\nSigned-off-by: oppiliappan <me@oppi.li>\n\nreadme.txt", "url": "https://wpnews.pro/news/stinkpot-sqlite-backed-shell-history", "canonical_source": "https://tangled.org/oppi.li/stinkpot", "published_at": "2026-07-25 09:10:12+00:00", "updated_at": "2026-07-25 09:23:57.889558+00:00", "lang": "en", "topics": ["developer-tools"], "entities": ["oppiliappan", "stinkpot", "atuin", "SQLite", "Go", "bash"], "alternates": {"html": "https://wpnews.pro/news/stinkpot-sqlite-backed-shell-history", "markdown": "https://wpnews.pro/news/stinkpot-sqlite-backed-shell-history.md", "text": "https://wpnews.pro/news/stinkpot-sqlite-backed-shell-history.txt", "jsonld": "https://wpnews.pro/news/stinkpot-sqlite-backed-shell-history.jsonld"}}