Atuin v18.3.0 - Experimental daemon, syncing env vars, and a new release workflow

Atuin supercharges your productivity by enabling you to rapidly retrieve any command you’ve ran, at any time, from anywhere. It stores your shell history in a database, recording additional command context and syncing it (e2e encrypted) across devices. Get started here

Announcing a new release of Atuin! v18.3 is out now. Thank you to everyone who contributed in this release. A full changelog is included below, but I'll pull out some key points


For a long time, we avoided using a daemon to sync with Atuin. This was intended to keep things as simple as possible, reduce operational requirements, and limit what can go wrong.

The default behaviour is still to sync in a forked background process after a command completes, but with v18.3.0 we have introduced an experimental background daemon.

This solves several issues for us

  1. Sync can occur without user input. SSH into a machine and it already has all the latest shell history and dotfiles, regardless of how actively you use it. This is currently on a schedule, but could be realtime in the future.
  2. Work around open SQLite issues with ZFS. Taking database writes out of the shell lifecycle means we don't introduce any latency when filesystem writes take longer than expected
  3. Perform maintenance tasks in the background. Now that we have a persistent process, it's easier to schedule database maintenance tasks

Please note that this is still experimental. We do not provide any means of daemonizing this (no systemd unit, homebrew service, etc) intentionally, and will do so when it's ready for wide use. If you'd like to try it out, add the following to your Atuin config file

enabled = true
If you're compiling Atuin yourself, it will now require a protoc compiler installed

Read more here!

Env var sync

We introduced basic dotfile sync in Atuin v18.1, and have extended it for 18.3. As well as syncing shell aliases, we now sync (global) env vars too! If you're interested in syncing env for workspaces please get in touch

Use as follows

# Set FOO to be bar on all synced machines
atuin dotfiles var set FOO bar

# Set BAR to be baz on all synced machines, but don't export it
atuin dotfiles var set -n BAR baz

# List all vars
atuin dotfiles var list

# Delete a var
atuin dotfiles var delete FOO

Release workflow changes

We now use cargo-dist for our releases! This comes from the team at Generally building releases and managing an install script has been a bit frustrating, but cargo-dist makes it really easy. We now build for aarch64-musl, as well as gnu libc. However we no longer build debs. This may change in the future, but for now we'd rather focus on building for as many platforms as possible and not for specific package managers.

This change also introduces a new install script. We'll be rolling this out progressively, but it has the following benefits

  1. Rather than using whichever package manager the user might have for install, consistently install our binary to a single location. This makes support easier for users who are less familiar with the command line.
  2. Users who would rather use a package manager can continue to do so, and our docs will continue to reference this. The choice is now explicit.
  3. Include atuin-update, a command for managing Atuin installs. Running atuin-update will update the user to the latest stable release, but it can also upgrade to prereleases or downgrade in the case of a bug.

Bug Fixes

  • (bash) Fix a workaround for bash-5.2 keybindings (#2060)
  • (ci) Release workflow (#1978)
  • (client) Better error reporting on login/registration (#2076)
  • (config) Add quotes for strategy value in comment (#1993)
  • (daemon) Do not try to sync if logged out (#2037)
  • (deps) Replace parse_duration with humantime (#2074)
  • (dotfiles) Alias import with init output (#1970)
  • (dotfiles) Fish alias import (#1972)
  • (dotfiles) More fish alias import (#1974)
  • (dotfiles) Unquote aliases before quoting (#1976)
  • (dotfiles) Allow clearing aliases, disable import (#1995)
  • (stats) Generation for commands starting with a pipe (#2058)
  • (ui) Handle being logged out gracefully (#2052)
  • (ui) Fix mistake in last pr (#2053)
  • Support not-mac for default shell (#1960)
  • Adapt help to enter_accept config (#2001)
  • Add protobuf compiler to docker image (#2009)
  • Add incremental rebuild to daemon loop (#2010)
  • Alias enable/enabled in settings (#2021)
  • Bogus error message wording (#1283)
  • Save sync time in daemon (#2029)
  • Redact password in database URI when logging (#2032)
  • Save sync time in daemon (#2051)
  • Replace serde_yaml::to_string with serde_json::to_string_yaml (#2087)


  • Fix "From source" cd command (#1973)


  • (daemon) Add support for daemon on windows (#2014)
  • (doctor) Detect active preexec framework (#1955)
  • (doctor) Report sqlite version (#2075)
  • (dotfiles) Support syncing shell/env vars (#1977)
  • (gui) Work on home page, sort state (#1956)
  • (history) Create atuin-history, add stats to it (#1990)
  • (install) Add Tuxedo OS (#2018)
  • (server) Add me endpoint (#1954)
  • (ui) Scroll history infinitely (#1999)
  • (ui) Add history explore (#2022)
  • (ui) Use correct username on welcome screen (#2050)
  • (ui) Add login/register dialog (#2056)
  • (ui/dotfiles) Add vars (#1989)
  • Allow ignoring failed commands (#1957)
  • Show preview auto (#1804)
  • Add background daemon (#2006)
  • Support importing from replxx history files (#2024)
  • Support systemd socket activation for daemon (#2039)

Miscellaneous Tasks

  • (ci) Don't run "Update Nix Deps" CI on forks (#2070)
  • (codespell) Ignore CODE_OF_CONDUCT (#2044)
  • (install) Log cargo and rustc version (#2068)
  • (release) V18.3.0-prerelease.1 (#2090)
  • Move crates into crates/ dir (#1958)
  • Fix atuin crate readme (#1959)
  • Add some more logging to handlers (#1971)
  • Add some more debug logs (#1979)
  • Clarify default config file (#2026)
  • Handle rate limited responses (#2057)
  • Add Systemd config for self-hosted server (#1879)
  • Switch to cargo dist for releases (#2085)


  • (nushell) Use version.(major|minor|patch) if available (#1963)
  • Only open the database for commands if strictly required (#2043)


  • Preview_auto to use enum and different option (#1991)
If you'd like to support Atuin, please consider sponsoring on GitHub