I've been using Atuin for at least a year and a half, and I think it's definitely the tool I'd been looking for the most in my entire dev career. It has made me much more confident with my hazy memory. Before it I'd struggle consistently to remember most of my recent commands.
bck-i was always a bit obtuse to me and I honestly never grokked it until I had Atuin wired into my workflow (hard) and ran into bck-i instead when SSH'd.
Anytime a peer views my screenshare, they ask "what's the funny thing that makes you so fast". I then proceed to share, first and foremost, Atuin.
Thanks Atuin team! Would love to contribute someday with more time.
Thanks for your work! Atuin is definitely one of those "How did nobody figure this out before now?" sort of ideas, executed really well. Two thumbs up.
I'm really intrigued by the upcoming Runbooks - they seem like they could be an absolute game changer. Any updates/teases on that front?
One of the things I really struggle to retain about the shell is the various expansions.
Unfortunately history shows the expanded form of what's happened, so I can't go reference that I used the third word of history item 773 as an argument, I only see the resolved argument.
Alas I haven't found any hooks in zsh that show promise here. I'd really love the pure history.
One technique I've used in the past is making a quick command in vim, that takes the selection or current line, and sends it to a given terminal. And perhaps starts a new line too. Basically using vim to author commands, to build the history log. Also I get to use vim, yay.
I second this wholeheartedly. Atuin is a joy to use and makes it so easier to find past commands. Thanks a lot atuin, and thanks to the colleague who recommended it!
For zsh users who like this idea and don't want to have to worry about anything leaving the device (not to insinuate that Atuin is doing anything below board, I don't think they are) I built my own version of this for myself called raven:
Raven has no sync component, stores your history in a sqlite, and never tries to move data off the device. It has a similar / large overlap in features with Atuin.
Sharing here in case anyone else could benefit from it, it only supports zsh for the moment since that's what I use.
I am happy Atuin user now, but I was initially worried that it would sync my data unless I explicitly disabled that feature. The fact that it's opt-in becomes clear once you read the docs and understand how it works, but it might be worth emphasizing that on the landing page. Currently it says:
Shell history sync
Sync your shell history to all of your machines, wherever they are
this is my only quip with atuin, despite my endorsement in a sibling comment.
this should absolutely be opted-out BY DEFAULT. not defaulted to opt-in.
if you have someone outright cloning your entire project just to skip this opted-in privacy gap feature, it's a good indicator it's an issue to be mindful of!
If any of you is having problems with Atuin acting weirds or slow, and has a ZFS filesystem, there's a known problem with sqlite and ZFS [0]. There are a couple of workarounds [1] that are, either using `atuin daemon`, or creating an ext4 volume for the atuin storage.
I see it also supports fish. That's been my shell for many years, it just works really well and, as far as I can tell (couldn't find a demo on their website), it doesn't add much to fish beyond syncing?
Has anyone used fish + autuin? What are your thoughts? I'm curious to know if it is worth the extra tool, maybe I should just try it :)
I use fish + atuin. I leave the "Up" arrow set to use fish's default history search (see https://docs.atuin.sh/faq/#how-do-i-remove-the-default-up-ar...), which keeps the UI minimal when just going back one or two commands, then use atuin via Ctrl+R when I need to find a command from earlier in my history. At that point Atuin provides a nicer UI for searching the history.
I've been using fish + atuin for well over a year now. I personally love it. I'm not sure if zsh or bash with atuin offers some additional features that fish doesn't, but the shell syncing and fuzzy search is enough of a value that it made it completely worth setting up for me.
fish doesn't use SQLite, but its own plaintext format. They've been trying to migrate to other formats.[1] Currently fish stores timestamps and directories in its history.
I recently switched to Atuin from McFly, and while McFly has been a solid performer for me for years, I love Atuin. Worth pointing out for others who care about such things as it's not made clear on this landing page, you don't actually need to register - if you don't need the sync, you can just use it without registering and it's still amazing, and if you do need the sync but don't like the idea of your history being stored on someone else's server, you can self-host the sync server too.
I've used Atuin for a few months, but I ended up going back to zsh-histdb, which stores history in an SQLite database.
When I compared Atuin with zsh-histdb again, the performance difference was stark. Zsh-histdb is just instantaneous, whereas Atuin has noticeable lag.
Atuin's ranking algorithms are also quite deficient, and I've tried all of them. I did a quality comparison before going back to zsh-hidden and found a good example: If I autocomplete on "curl cat", the first match is something like "curl http://localhost/v1/chat" that I did earlier today. If I autocomplete on "curl chat", the first match is something like "curl http://localhost/_cat".
From what I can tell, the ranking doesn't seem to consider contiguous substring matches as having higher relevance than random letters in different order. Clearly "cat" should match "cat" higher than "chat", even if they both have "h" somewhere.
(If anyone from Atuin is reading here, I'd be happy to show a screen recording of the problem.)
The fact that Atuin cannot delete old history is also a problem, especially since it gets markedly slower the more history you have. I initially imported all my history (about 100MB?) and it was dog slow. But there was no way to prune older entries, so I had to wipe it clean and then import a subset. Even then, as I said, it's clearly slower than zsh-histdb.
Zsh-histdb has other issues, and hasn't been updated in years, but it works better for me. Atuin's syncing is nice, but it's something I can live without.
If I explicitly DON’T want sync between machines (my workflows are very machine specific), does atuin give me anything significant over my current fzf based C-r?
I don't use the sync feature, but I will say that "my workflows are very machine specific" is one of the reasons I use Atuin. When working in containers, I sometimes share an Atuin database volume between them, to save history relevant to those containers.
On MacOS the main reason I reach for Atuin is that I have never been able to get ZSH to store history properly. Atuin saves history to SQLite, which so far has been much more reliable. It also enables some nice features like being able to search commands run from the same directory.
> does atuin give me anything significant over my current fzf based C-r
I'm interested in this as well. I currently use fzf and I'm happy with what I've got (except for me syncing would probably be a nice feature to have).
Also: I gave atuin a quick try and found the TUI to be worse than fzf. Why do I need a fullscreen ctrl-r interface? I found that distracting. But maybe that is configurable. I didn't look much further.
bck-i was always a bit obtuse to me and I honestly never grokked it until I had Atuin wired into my workflow (hard) and ran into bck-i instead when SSH'd.
Anytime a peer views my screenshare, they ask "what's the funny thing that makes you so fast". I then proceed to share, first and foremost, Atuin.
Thanks Atuin team! Would love to contribute someday with more time.
I'm really intrigued by the upcoming Runbooks - they seem like they could be an absolute game changer. Any updates/teases on that front?
Unfortunately history shows the expanded form of what's happened, so I can't go reference that I used the third word of history item 773 as an argument, I only see the resolved argument.
Alas I haven't found any hooks in zsh that show promise here. I'd really love the pure history.
One technique I've used in the past is making a quick command in vim, that takes the selection or current line, and sends it to a given terminal. And perhaps starts a new line too. Basically using vim to author commands, to build the history log. Also I get to use vim, yay.
https://github.com/tylersaunders/raven
Raven has no sync component, stores your history in a sqlite, and never tries to move data off the device. It has a similar / large overlap in features with Atuin.
Sharing here in case anyone else could benefit from it, it only supports zsh for the moment since that's what I use.
Atuin is great though!
if that's not enough, you can disable all network features via a feature flag at compile time
if you don't care for sync, there are a bunch of other projects doing this (and supporting several shells), eg:
- mcfly: https://github.com/cantino/mcfly
- resh: https://github.com/curusarn/resh
Are there network features other than sync?
if you have someone outright cloning your entire project just to skip this opted-in privacy gap feature, it's a good indicator it's an issue to be mindful of!
https://docs.atuin.sh/self-hosting/server-setup/
--
Has anyone used fish + autuin? What are your thoughts? I'm curious to know if it is worth the extra tool, maybe I should just try it :)
Otherwise consistency is nice if you use a few setups
[1] https://github.com/fish-shell/fish-shell/issues/3341
When I compared Atuin with zsh-histdb again, the performance difference was stark. Zsh-histdb is just instantaneous, whereas Atuin has noticeable lag.
Atuin's ranking algorithms are also quite deficient, and I've tried all of them. I did a quality comparison before going back to zsh-hidden and found a good example: If I autocomplete on "curl cat", the first match is something like "curl http://localhost/v1/chat" that I did earlier today. If I autocomplete on "curl chat", the first match is something like "curl http://localhost/_cat".
From what I can tell, the ranking doesn't seem to consider contiguous substring matches as having higher relevance than random letters in different order. Clearly "cat" should match "cat" higher than "chat", even if they both have "h" somewhere.
(If anyone from Atuin is reading here, I'd be happy to show a screen recording of the problem.)
The fact that Atuin cannot delete old history is also a problem, especially since it gets markedly slower the more history you have. I initially imported all my history (about 100MB?) and it was dog slow. But there was no way to prune older entries, so I had to wipe it clean and then import a subset. Even then, as I said, it's clearly slower than zsh-histdb.
Zsh-histdb has other issues, and hasn't been updated in years, but it works better for me. Atuin's syncing is nice, but it's something I can live without.
Also has functions for filtering command search by directory
Being backed by SQLite tends to mean your history is more durable + is properly saved across shells too
I don't use the sync feature, but I will say that "my workflows are very machine specific" is one of the reasons I use Atuin. When working in containers, I sometimes share an Atuin database volume between them, to save history relevant to those containers.
On MacOS the main reason I reach for Atuin is that I have never been able to get ZSH to store history properly. Atuin saves history to SQLite, which so far has been much more reliable. It also enables some nice features like being able to search commands run from the same directory.
I'm interested in this as well. I currently use fzf and I'm happy with what I've got (except for me syncing would probably be a nice feature to have).
Also: I gave atuin a quick try and found the TUI to be worse than fzf. Why do I need a fullscreen ctrl-r interface? I found that distracting. But maybe that is configurable. I didn't look much further.
And also the default is now to use 40 lines, not the alt screen (has its own drawbacks)
You can set “inline_height”
https://docs.atuin.sh/guide/basic-usage/#inline-window