Personal configuration for a declarative and reproducible development environment. Built with Nix, managed via home-manager (optional), and deployed using chezmoi.
This setup assumes you have chezmoi installed.
Optionally should also install home-manager.
[!REMARK]
Instead of using home-manager to manage all my dotfiles, I use chezmoi as my primary tool. I use home-manager to declaratively manage user-specific packages and environment logic. This is an optional part of the setup; the core dotfiles can function independently, especially as I still have machines without nix.
This clones the repo into ~/.local/share/chezmoi
chezmoi init https://github.com/papanito/dotfiles.gitConfigure home-manager
Home Manager is a Nix-based tool that allows you to manage your user-specific configuration and packages declaratively, similar to how NixOS manages an entire system.
I configure chezmoi to run home-manager switch whenever I run chezmoi apply
[hooks.apply.post]
command = "home-manager"
args = [
"switch",
"--flake",
"/home/papanito/.config/home-manager"
]My environment uses the following basic tools:
- Shell: zsh as my primary shell using
- zinit to manage plugins for sub-second startup times using Turbo (asynchronous) loading.
- atuin an SQLite-powered shell history
- direnv to automatically load environment variables and Nix shells when entering a directory.
- oh-my-posh as my prompt for a consistent, informative, and aesthetic prompt across any shell.
- Aliases & Functions to work faster on the shell
- Editor: Neovim configured with the LazyVim distro for a modular, high-performance IDE experience.
- Workspace: Zellij — A modern terminal workspace and multiplexer with built-in layouts.
Here are some tools worth mentioning - check home.nix for more tools
| Tool | Description |
|---|---|
| bitwarden | Password manager to manage not only password but also use it as ssh-key agent |
| bws | Bitwarden secret manager in combination with direnv to inject environment variables. |
| zoxide | A smarter cd command that learns your habits. |
| fzf | General-purpose command-line fuzzy finder. |
| ripgrep (rg) | Blazing fast recursive line-oriented search. |
| bat | A cat clone with syntax highlighting and git integration. |
| eza | A modern, maintained replacement for ls. |
| watchman | Watches files and records, or triggers actions, when they change. |
| pueue | Pueue is a command-line task management tool for sequential and parallel execution of long-running tasks. |
I use direnv to load environment variables using bitwarden or bws. this file contains 2 Functions
bw_env- use bitwarden which will require to login/unlock the vaultbws_env- use bws which only contains the environment variables and not all personal passwords (hence my preferred solution)
So I can use the following in .envrc files to automatically inject secrets automatically
bws_env -p personal RESTIC_PASSWORD
bws_env -p private B2_ACCOUNT_KEY B2_ACCOUNT_IDWhere I have Nix installed, I manage some desktop settings with home-manager:
I manage background processes via systemd user services, which run in the user context (systemctl --user). This allows for automated management of daemons without requiring root privileges.
- paperless-sync: Regurarily pulls documents from [paperless-server][paperless-nxg]
- watchman: Starts watchman socket
- pueue: Starts pueue daemon