The tool I use to provision new Debian systems on my network and keep their user configurations synchronized.
This is a personal project - read the contents before running these scripts on your machine.
Run the bootstrap script on the target machine:
wget -qO- https://raw.githubusercontent.com/1npo/encamp/main/install.sh | bashThis clones the repository to ~/.local/share/encamp and adds encamp and encamp-sync to ~/.local/bin as symlinks.
encamp <target> [module]
Targets define the machine type:
| Target | Description |
|---|---|
base |
Common baseline for all machines |
desktop |
Machines with a graphical desktop environment |
headless-workstation |
Machines serving as workstations without a GUI |
lan-services |
Machines providing network services to the LAN |
iot-node |
Machines that are embedded or small IoT devices |
Modules select what to install:
| Module | Description |
|---|---|
all |
Installs everything (default) |
packages |
Installs applications (via curl or a package manager) |
config-user |
Installs user configurations (via stow) |
config-system |
Installs system configuration (per hostname) |
services |
Enables systemd user and system services |
Set up a fresh desktop machine:
encamp base all
encamp desktop allInstall desktop-specific packages only:
encamp desktop packagesApply desktop-specific user configurations only:
encamp desktop config-userSynchronizes user configurations with the git remote.
encamp-sync <command> [message]
| Command | Description |
|---|---|
pull |
Pull latest changes from the remote and re-stow configurations |
push <message> |
Commit local configuration changes and push them to the remote |
encamp-sync pull
encamp-sync push "updated zsh config"See docs/ for reference materials to help you understand and maintain this project.
| Document | Description |
|---|---|
| Architecture | How encamp is structured and how its components work together |
| Configs | How user and system configurations are organized and managed |
| Adding a new machine | A checklist for onboarding a new host |
See docs/guides/ for instructions on how to perform some manual setups.
- Bitwarden with pass
- GPG agent, pass, and keyring
- GPG agent
- Niri with DankMaterialShell
- Neovim plugins
- SSH agent
- tmux plugins
The tasks listed below were performed by or with the aid of a LLM (Claude Sonnet 4.6, Claude Code):
- Writing the first draft of this README.md
- Writing the first drafts of the project documentation
- Troubleshooting errors
- Writing the test suite
- Writing
docs/developers.md - Suggesting and implementing various best practice changes:
- Reorganizing the project layout to reduce complexity and number of files needed
- Implementing the following code using the conventions and style used in other modules:
scripts/lib/install_services.shscripts/lib/install_configs.shscripts/sync.shinstall.sh- The following functions in
scripts/lib/install_app.sh:install_obsidianinstall_proton_bridge
- The method used in the header of all scripts to safely import the library scripts
- The
run_stepfunction inscripts/lib/utils.sh