dots is a fast, cross-platform dotfiles manager with an interactive TUI, written in Rust. It installs your tools, wires up symlinks GNU Stow–style, applies premade app configs, and keeps everything healthy — on macOS (Homebrew) and Linux (apt/dnf) alike.
This repository is the
dotstool itself. Your actual dotfiles/configs live in a separate repo (e.g.dotfiles-CUK);dotsmanages the symlinks between them and your$HOME.
- Interactive TUI — run
dotsfor a dashboard covering symlink health, installed tools, shell plugins, app configs, and updates. - Cross-platform installs — one dependency list, resolved per platform via Homebrew,
apt, ordnf. - Symlink management — declare your own links (
dots link add), then create/repair them idempotently. Adopts existing files with automatic backups. - Premade configs — bundled starter configs for Ghostty, Neovim, and opencode, applied on demand (existing files are backed up).
- Portable profiles — export your setup to
personal.jsonand re-import it on another machine, locally or straight from GitHub. - Self-updating — built-in update checker and one-command upgrade.
- Single static binary — no runtime dependencies (pure-Rust TLS, no OpenSSL/keychain), optimized for size.
curl -fsSL https://raw.githubusercontent.com/CtrlUserKnown/dots/main/install.sh | shThe installer clones the repo to ~/.dots, downloads a prebuilt binary for your OS/arch (or builds from source with cargo if no release matches), puts dots on your PATH, and initializes config.
install.sh [--branch <name>] [--version <tag>] [--dir <path>]
Prefer to build it yourself? See BUILD_MACOS.md, or from a clone:
cargo build --release # binary at target/release/dotsTo remove it: uninstall.sh.
Run dots with no arguments to open the TUI. The dashboard's panes — Symlinks, Tools, Plugins, Configs, Update — drill into full-screen views for health checks, aliases, profile, theme, and settings.
Everything is also scriptable via subcommands:
| Command | What it does |
|---|---|
dots health [--fix] |
Check and repair all declared symlinks, tools, and plugins |
dots update |
Check for and apply updates |
dots install <name> |
Install a single dependency |
dots install --all |
Install all missing required dependencies |
dots install --optional |
Install all missing optional dependencies |
dots aliases list | add <name> <value> | remove <name> |
Manage shell aliases |
dots premade list | apply <app> |
List/apply bundled app configs (ghostty, neovim, opencode) |
dots link add <source> <target> |
Adopt a file/dir and symlink it (recorded in links.toml) |
dots link list | apply | remove <target> |
Inspect, create/repair, or remove declared links |
dots profile generate [path] |
Export your setup to personal.json |
dots profile import <path> |
Import a personal.json from a local file |
dots profile import-git <user/repo/path.json> |
Import a personal.json from GitHub |
dots init [--quiet] |
Initialize config (idempotent; run automatically by the installer) |
dots --version |
Print the version |
The dependency list is defined in crates/dots/src/packages.rs in three tiers, each mapped to its brew / dnf / apt package name:
| Category | When installed | Examples |
|---|---|---|
| Required | dots install --all |
git, eza, bat, fd, fzf, fastfetch, zoxide |
| Optional | dots install --optional |
neovim, herdr, btop, lazygit, yazi, carapace |
| Dev | dots install <name> |
go, lua, cmake, gcc, ripgrep, gh, docker, ffmpeg, … |
-
~/.dots/— the tool's home (repo checkout +bin/dots). -
~/.dots/settings.toml— tool settings, under a[dots]table:Key Default Meaning update_checktrueCheck for updates periodically update_frequency1440Minutes between update checks greetingtrueShow the greeting banner developer_modefalseEnable developer features theme(empty) Selected theme -
~/.personal/— your personal, machine-local layer:aliases.zsh(sourced after the built-in aliases),apps/, and an optionalconfig.tomlthat overridessettings.toml.
A Cargo workspace with two crates:
crates/dots/— thedotsbinary: CLI, TUI screens, installer, symlink/link engine, config, and bundled premadeassets/.crates/tui-core/— shared TUI chrome (header/footer/description bars, color theme, flash model) used by thedotsscreens.
cargo test --all # unit + integration tests
cargo clippy --all -- -D warnings # lints
cargo fmt --all -- --check # formatting
bash tests/integration/test_setup.sh # shell integration test (matches CI)An isolated container test environment lives in test-env/ (see test-env/manage.sh); the manual QA checklist is in docs/manual-test-checklist.md. CI runs on Linux and macOS via .github/workflows/ci.yml.
See LICENSE.