Atuin: 29,794 GitHub Stars
Atuin thay thế lịch sử shell bằng SQLite, ghi ngữ cảnh lệnh (mã thoát, thư mục, thờ gian), đồng bộ hóa lịch sử qua nhiều máy với mã hóa E2E. Hỗ trợ Bash, Zsh, Fish, Nushell. Bao gồm cài đặt, tự host, cấu hình và so sánh Atuin vs mcfly vs fzf vs Hstr.
- MIT
- Cập nhật 2026-05-19
apiVersion: v1 kind: Service metadata: name: atuin-service spec: selector: app: atuin ports: - port: 8888 targetPort: 8888
## Benchmarks / Real-World Use Cases
### Performance Characteristics
Atuin's Rust implementation and SQLite backend provide consistent performance across large history datasets. These numbers were measured on an AMD Ryzen 5 5600X with NVMe storage and 32GB RAM:
| Metric | Value | Notes |
|--------|-------|-------|
| History query (100K entries) | ~15ms | fuzzy search, cold cache |
| History query (500K entries) | ~45ms | fuzzy search, warm cache |
| History query (1M entries) | ~85ms | fuzzy search, warm cache |
| Sync initial upload (50K cmds) | ~30s | depends on bandwidth |
| Incremental sync | ~1-3s | typical daily delta |
| Binary size | ~12MB | single static binary |
| Memory footprint | ~15MB | resident while idle |
| SQLite DB size | ~150MB per 100K commands | with full metadata |
| Shell startup overhead | ~5-10ms | one-time per shell session |
### Production Use Cases
1. **Multi-Device Development**: A developer with a work laptop, personal desktop, and cloud VM keeps all shell history in sync. Running `docker compose up` on one machine is searchable from another.
2. **Team Knowledge Preservation**: A DevOps team self-hosts Atuin to maintain a searchable audit trail of infrastructure commands across rotating on-call engineers.
3. **Remote Environment Recovery**: Developers using ephemeral cloud workstations (Gitpod, Coder) sync history so workspace teardown does not erase command context.
### Stats Command Output
```b
a
s
h
$ atuin stats
[▮▮▮▮▮▮▮▮▮▮] 9,607 fg
[▮▮▮▮▮▮▮▮▮ ] 9,458 vim
[▮▮▮ ] 3,144 ag
[▮▮▮ ] 3,095 git status
[▮▮ ] 2,248 git diff
[▮ ] 1,787 curl
[▮ ] 1,571 jq
[▮ ] 1,357 rg
[▮ ] 1,348 cd
[▮ ] 1,322 git log
Total commands: 62,849
Unique commands: 26,908
Migrating from Other History Tools #
If you are switching from mcfly, Hstr, or plain shell history, the migration path is straightforward:
a
s
h
# Step 1: Install Atuin (your existing history stays untouched)
curl --proto '=https' --tlsv1.2 -LsSf https://setup.atuin.sh | sh
# Step 2: Import existing history into Atuin's database
atuin import auto
# Step 3: Initialize shell integration
eval "$(atuin init zsh)" # or bash/fish
# Step 4: Verify — both systems coexist during transition
atuin stats
history | wc -l # native history still works
# Step 5: After a week of testing, disable native history in rc file:
# echo 'unset HISTFILE' >> ~/.zshrc
Atuin does not delete or interfere with your existing ~/.bash_history or ~/.zsh_history file. The original history remains intact as a fallback.
Advanced Usage / Production Hardening #
History Privacy Filters #
Prevent sensitive commands from entering the database:
o
m
l
# ~/.config/atuin/config.toml
[settings]
history_filter = [
# AWS credentials
"^aws configure",
"^export AWS_SECRET_ACCESS_KEY",
# Generic secrets
"^export.*SECRET",
"^export.*PASSWORD",
"^export.*TOKEN",
"^echo.*password",
# SSH keys
"^ssh-add",
"^ssh-keygen",
# Database connection strings
"^psql.*://.*:",
"^mysql.*-p",
]
Backing Up Your History #
a
s
h
# SQLite backup (safe, no lock issues)
sqlite3 ~/.local/share/atuin/history.db ".backup '/backup/atuin-$(date +%Y%m%d).db'"
# Or copy with WAL checkpoint
cp ~/.local/share/atuin/history.db ~/backups/atuin-backup.db
# Automated daily backup via cron
0 2 * * * sqlite3 ~/.local/share/atuin/history.db ".backup '/backups/atuin/atuin-$(date +\%Y\%m\%d).db'" && find /backups/atuin -mtime +30 -delete
Monitoring Sync Health #
a
s
h
# Check last sync time
atuin sync --force # force a sync and show status
# View sync info
atuin info
# Atuin v18.16.1
# Sync interval: 5m
# Sync address: https://api.atuin.sh
# Last sync: 2026-05-20T08:15:32Z
# History count: 47,231
# Check for issues
atuin doctor
Theming the TUI #
o
m
l
# ~/.config/atuin/config.toml
[theme]
# Use terminal's default colors
use_default_colors = true
# Or specify explicit colors
base = "#1e1e2e"
layer1 = "#313244"
text = "#cdd6f4"
accent = "#89b4fa"
Multi-Machine Key Migration #
When setting up a new machine, transfer your encryption key securely:
a
s
h
# On old machine — copy key to clipboard (or secure transfer)
cat ~/.local/share/atuin/key
# On new machine — after install and login
mkdir -p ~/.local/share/atuin
echo "YOUR_KEY_HERE" > ~/.local/share/atuin/key
chmod 600 ~/.local/share/atuin/key
# Verify sync works
atuin sync
atuin stats
Comparison with Alternatives #
| Feature | Atuin | mcfly | fzf + history | Hstr |
|---|---|---|---|---|
| Database | SQLite | SQLite | Plain text file | Plain text file |
| Cross-machine sync | Yes (E2EE) | No | No | No |
| Search UI | Built-in TUI | Built-in TUI | fzf integration | Built-in TUI |
| Context logging | cwd, exit, duration, host | cwd, exit | None | None |
| Statistics | atuin stats |
No | No | No |
| Shell support | bash, zsh, fish, nu, xonsh | bash, zsh, fish | Any shell | bash, zsh |
| Encryption | PASETO V4 | None | None | None |
| Self-hosted server | Yes (Docker/K8s) | N/A | N/A | N/A |
| AI integration | Yes (optional) | No | No | No |
| History import | bash, zsh, fish, nu | bash, zsh, fish | N/A | bash, zsh |
| GitHub Stars | 29,794 | 6,800 | 67,000 (fzf) | 3,900 |
| Binary size | ~12MB | ~4MB | ~4MB (fzf only) | ~2MB |
When to Choose Each Tool #
- Atuin: You want encrypted sync across machines, rich context metadata, and a full-featured search UI. Best for developers working on 2+ machines who value history analytics.
- mcfly: You want a lightweight, fully local tool with intelligent contextual ranking. Best for single-machine users who want zero network dependencies.
- fzf + history: You already use fzf for files and want a minimal history solution. Best for users who want one tool for everything fuzzy.
- Hstr: You want a simple, lightweight history TUI without database overhead. Best for minimalists on bash/zsh.
Limitations / Honest Assessment #
Atuin is not the right tool for every scenario:
-
No Executor Tracking: Atuin records the command but not whether it was typed manually, executed by a script, or generated by an AI coding assistant. All sources look identical in the database.
-
Local Database is Unencrypted: The SQLite database at
~/.local/share/atuin/is stored in plaintext for performance. History sync is encrypted, but local storage is not. Use filesystem encryption (LUKS, FileVault) for protection. -
Bash Integration Can Be Fragile: Bash’s
preexechooks rely on DEBUG traps that can conflict with other tools (pyenv, nodenv, certain PROMPT_COMMAND setups). Zsh and Fish integrations are more reliable. -
Sync Requires Account: Even self-hosted sync requires user registration. There is no anonymous or “just sync to S3” mode.
-
Up-Arrow Binding Surprises New Users: Atuin replaces the up-arrow key by default, which can confuse users who just want to cycle recent commands. Set
filter_mode_shell_up_key = "session"or disable the binding entirely. -
PowerShell Support is Tier 2: While functional, PowerShell integration receives less testing and may lag behind Unix shell features.
Frequently Asked Questions #
How do I disable the up-arrow binding? #
Add filter_mode_shell_up_key = "global" or show_preview = false in your config. To completely disable Atuin on up-arrow, add export ATUIN_NOBIND=1 before the init line and manually bind only Ctrl+R:
a
s
h
# ~/.bashrc
export ATUIN_NOBIND=1
eval "$(atuin init bash)"
bind '"\C-r": "\C-aatuin search\C-j"'
Can I use Atuin without any sync? #
Yes. Atuin works fully as a local tool. Simply skip registration and ignore all sync commands. Your history stores in local SQLite and all search features work offline.
How is my data encrypted? #
All sync data is encrypted client-side with PASETO V4 (XChaCha20-Poly1305 + Blake2b) before leaving your machine. The sync server (whether self-hosted or atuin.sh) only sees encrypted blobs — it cannot decrypt or read your commands. Your local SQLite database is not encrypted for search performance.
What happens if I lose my encryption key? #
Your encryption key is required to decrypt synced history. If lost, you cannot recover previously synced data. The key is displayed during initial setup with atuin key — back it up in a password manager. Local history remains accessible regardless.
Can two users share a history database? #
Not directly. Atuin’s sync model is designed for one user across multiple devices. For team shared history, each user maintains their own database and sync account. Self-hosted servers support multiple independent accounts.
Does Atuin slow down my shell? #
No measurable impact. The Rust binary adds ~5-10ms to shell startup (one-time), and command capture happens asynchronously via shell hooks. The SQLite WAL mode ensures writes do not block the shell prompt.
How do I delete a command from history? #
a
s
h
# Delete by search pattern
atuin search --delete "sensitive-command"
# Or use the TUI — find the command, then press Alt+Delete
Conclusion #
Atuin turns shell history from a flat text file into a structured, searchable, and portable database. With 29,794 GitHub stars, end-to-end encrypted sync, and support for every major shell, it is a practical upgrade for any developer who lives in the terminal.
Next steps:
- Run
curl --proto '=https' --tlsv1.2 -LsSf https://setup.atuin.sh | shto install - Import existing history with
atuin import auto - Register for sync or configure a self-hosted server
- Join the Telegram developer community for tips and troubleshooting
Recommended Hosting & Infrastructure #
Before you deploy any of the tools above into production, you’ll need solid infrastructure. Two options dibi8 actually uses and recommends:
- DigitalOcean — $200 free credit for 60 days across 14+ global regions. The default option for indie devs running open-source AI tools.
- HTStack — Hong Kong VPS with low-latency access from mainland China. This is the same IDC that hosts dibi8.com — battle-tested in production.
Affiliate links — they don’t cost you extra and they help keep dibi8.com running.
Sources & Further Reading #
- Atuin GitHub Repository
- Atuin Official Documentation
- Atuin Self-Hosting Guide
- Atuin Configuration Reference
- PASETO V4 Specification
- Ellie Huxtable — Atuin Creator Blog
- mcfly GitHub Repository
- fzf GitHub Repository
- Hstr GitHub Repository
💬 Bình luận & Thảo luận