Atuin v18.13 – better search, a PTY proxy, and AI for your shell

A new release is out! v18.13 is probably the biggest set of changes we have released in a good while, read on to find out more.

Much faster and better search with the daemon

The daemon has existed for a long time, and has been marked as "experimental" for its entire existence. It was originally shipped as a workaround for poor ZFS/SQLite interactions, or for systems with particularly high IO latency.

The daemon now maintains a hot, in-memory search index. This is powered by a modified version of nucleo. Nucleo implements the same algorithm as fzf, bringing better performance and accuracy.

We've also added configurable multipliers for frequency, recency, and frecency scoring.

Enable this by running atuin setup, or by adding the following to your config file:

search_mode = "daemon-fuzzy"

[daemon]
enabled = true
autostart = true

With autostart = true, Atuin will manage the daemon lifecycle for you. It will ensure it's up to date, healthy, and running when required. If you'd rather manage that yourself, you can leave autostart setting disabled.

The daemon also allows you to sync records without interacting with the shell - remote machines stay up to date, and have the latest data from the second you log in.

Atuin AI

0:00
/0:12

With this release, we are introducing atuin ai. Atuin AI provides an effective english-to-bash helper within your shell. Press ? on an empty prompt, describe what you want, then press enter to execute or tab to edit. If you wish to adjust the suggested command, or ask questions about it, you can press f to follow up.

This is another opt-in feature, either by running atuin setup, or by setting this in your config:

[ai]
enabled = true

We're building this out with accuracy, safety, and data privacy in mind.

Accuracy

We use the latest frontier models, which already do a good job of generating commands using well-known binaries and CLIs. On top of that, we integrate a dataset powered by man pages and command outputs to ensure you get the correct command first.

Safety

If the generated command is suspected to be dangerous (wiping data, restarting deployments, etc), then Atuin will flag it as dangerous and require you to press enter twice in order to execute it.

This is achieved by a mix of static checks and LLM-powered guardrails. We're also working to integrate it with a command dataset.

Data privacy

By default, Atuin AI knows nothing about your machine, other than the operating system and shell. This is the bare minimum required to generate a decent shell command.

It will soon be able to ask you for access to more data - such as the current directory path, contents, git status, etc - but you must give permission first. This will happen in a similar way to existing agents, and be configurable to an even finer degree in your config file.

Extra powers with a pty proxy

If you've used Atuin before, you've probably noticed a tradeoff with our rendering. Either fullscreen alt-screen mode that takes over your terminal, or inline mode that clears your previous output. Neither is great.

With 18.13, we are shipping atuin hex. With Hex, we can have our cake AND eat it too. The Atuin popup renders over the top of your previous output, but when it's closed we can restore the output successfully.

Hex is a super lightweight pty proxy. It behaves like a very minimal tmux, and enables us to integrate with the terminal in ways that we cannot do with shell hooks alone. How it works warrants an entirely separate post!

💡
Unlike tmux, hex does not affect scrollback, does not break terminal features, and literally just proxies bytes and maintains a shadow vt100. It is designed to be as minimally intrusive and minimally resource intensive as possible.
0:00
/0:07

no clearing, no fullscreen!

You can enable hex one-off by running atuin hex, or make it permanent by putting the following in your shell config:

eval "$(atuin hex init)"

Future

Hex doesn't just stop here. In future releases, we can use it for

  1. Support searching and syncing command outputs, in addition to the commands
  2. Supporting shells that do not allow for shell hooks
  3. Supporting anything readline-esque

If using Hex breaks your setup, it is a bug. Please report it.

New authentication

We're rolling out new authentication for our hosted sync service, running as part of Atuin Hub. You can now log in with Google or GitHub, and recover your account via email. Your existing sync service credentials will continue to work. We couldn't support this before without building a bunch of infrastructure into the intentionally minimal atuin-server binary.

The Hub isn't open source yet. We plan to open it up once the codebase stabilises (it's also got a bunch of runbooks stuff mixed in), but it's changing too fast right now for that to be useful to anyone. We'll share more when we're closer!

If you self-host, nothing changes. Your server works exactly as it did before, and atuin-server is well supported.

Changelog

Bug Fixes

  • Nushell 0.111 + future 0.112 support (#3249, #3266)
  • (deps) Add use-dev-tty to crossterm in atuin-ai (#3185)
  • (docs) Update Postgres volume path in Docker as required by pg18 (#3174)
  • Systemd Exec for separate server binary (#3176)
  • Multiline commands with fish (#3179)
  • Silent DB failures e.g. when disk is full (#3183)
  • Forward $PATH to tmux popup in zsh (#3198)
  • Dramatically decrease daemon memory usage (#3211)
  • Regen cargo dist
  • Clear script database before rebuild to prevent unique constraint violation (#3232)
  • Ctrl-c not exiting ai (#3256)

Features

  • (docs) Add Shell Integration and Interoperability docs (#3163)
  • switch-context (#3149)
  • Add Hub authentication for future sync + extra features (#3010)
  • Add Atuin AI inline CLI MVP (#3178)
  • Add autostart and pid management to daemon (#3180)
  • Generate commands or ask questions with atuin ai (#3199)
  • Add history author/intent metadata and v1 record version (#3205)
  • In-memory search index with atuin daemon (#3201)
  • Update script for smoother setup (#3230)
  • Initial draft of atuin-shell (#3206)
  • Allow setting multipliers for frequency, recency, and frecency scores (#3235)
  • Allow running atuin search -i as subcommand (#3208)
  • Use pty proxy for rendering tui popups without clearing the terminal (#3234)
  • Allow authenticating with Atuin Hub (#3237)
  • Initialize Atuin AI with atuin init (#3255)
  • Add atuin setup (#3257)
  • Call atuin setup from install script (#3265)
  • Allow headless account ops against Hub server (#3280)
  • Add custom filtering and scoring mechanisms

Documentation

  • Update config.md to remove NuShell support note (#3190)
  • Document search.filters (#3195)
  • Clean up doc references for sqlite-based self-hosting (#3216)
  • Document daemon-fuzzy search mode (#3254)

Miscellaneous Tasks

  • (ci) Migrate to depot runners (#3279)
  • (ci) Use depot to build docker images too (#3281)
  • (release) Building windows aarch64 was overly optimistic
  • (release) Update dist, remove custom runners
  • Use workspace versions (#3210)
  • Move atuin ai subcommand into core binary (#3212)
  • Update to Rust 1.94 (#3247)
  • Strip symbols in dist profile to reduce binary size
  • Upgrade thiserror 1.x to 2.x to deduplicate dependency
  • Upgrade axum 0.7 to 0.8 to deduplicate with tonic's axum
  • Update permissions in Docker workflow (#3283)
  • Change CHANGELOG format to be easier to parse
  • Symlink changelog so dist can pick it up
  • Vendor nucleo-ext + fork, so we can depend on our changes properly (#3284)