Skip to content

SQuent/dotfiles

Repository files navigation

Dotfiles

Welcome to my Dotfiles repository! This collection contains all the configurations for my personal machines and servers.


What are Dotfiles?

Dotfiles are hidden configuration files (prefixed with a .) in Unix-like systems. They store settings for shells, editors, and various tools, allowing for easy customization and consistency across different environments.


Why Store Dotfiles in Git?

  • Effortless Deployment: Easily set up new environments.
  • Synchronization: Keep your settings synced across multiple devices.
  • Rollback: Revert changes with ease.
  • Backup: Ensure nothing is lost.

Dotbot: The Dotfile Manager

I use Dotbot to manage these dotfiles. It not only handles symlinks but also manages package installations and scripts. Symlinks allow you to maintain all your dotfiles in a central Git directory, linking them to the appropriate locations on disk.


Installation Modes

  • Linux: Full setup via apt bootstrap + Homebrew + common configuration.
  • macOS: Setup via Homebrew only — no apt, font handling via ~/Library/Fonts.

Getting Started

Installation

git clone https://github.com/SQuent/dotfiles.git && cd dotfiles && ./install

The script auto-detects the OS (Darwin or Linux) and runs the appropriate steps.

Testing in Docker (Linux)

git clone https://github.com/SQuent/dotfiles.git && cd dotfiles
docker build . -t dotfiles:linux -f Dockerfile --progress=plain
docker run -it dotfiles:linux

Dotbot in Action

Installation Script

The installation script is a wrapper around Dotbot with the following features:

  • Auto-detects the OS (uname -s) — no flags required.
  • Logs actions to install.log.
  • Checks and installs prerequisites before running Dotbot.
  • Syncs and updates Dotbot plugins via git submodules.
  • Splits configuration across three files: common.conf.yaml, linux.conf.yaml, mac.conf.yaml.

Dotbot Steps

Linux (3 passes):

  1. Bootstrap: apt-get update/upgrade, install curl, python3, git, python3-dev.
  2. Pass 1 — linux.conf.yaml (--only apt): install APT packages.
  3. Pass 2 — common.conf.yaml: clean, create folders, symlinks, Homebrew install + packages, asdf plugins.
  4. Pass 3 — linux.conf.yaml (--except apt): Linux-specific brew (trash-cli), sudoers, default shell, font cache.

macOS (2 passes):

  1. Check Xcode Command Line Tools, set Homebrew PATH.
  2. Pass 1 — common.conf.yaml: clean, create folders, symlinks, Homebrew install + packages, asdf plugins.
  3. Pass 2 — mac.conf.yaml: macOS-specific brew (trash), ~/Library/Fonts symlink.

Features

XDG Directories

Manage the location of configuration files using the XDG Base Directory Specification for a clutter-free home directory. These are declared in config/.profile.


Shell: Zsh Configuration

Zsh, or the Z Shell, is a powerful and highly customizable Unix shell that extends the Bourne shell (sh).

config/zsh
├── .zshrc
├── aliases.zsh           # Personal Aliases
├── functions.zsh         # Personal Functions
├── history.zsh           # History Management 
├── import-plugins.zsh    # Plugins to install
└── setup-antigen.zsh     # Zsh plugin installer

Plugins

Shell History Management

Handled in config/zsh/history.zsh.
I bind the arrow keys to search through the history for commands that start with the current input.


Visualization Tools

  • Starship: For a minimal, fast, and customizable prompt. Config stored in config/starship.toml.

  • EZA: Enhanced ls command for better file listing. Color:

    export EXA_COLORS="ur=34:uw=35:ux=36:gr=34:gw=35:gx=36:tr=34:tw=35:tx=36"
  • Bat: A cat clone with syntax highlighting.

    if command_exists bat ; then
      alias cat="bat -pp"
    fi

Sensitive Data

Sensitive data like secrets, SSH keys, and kubeconfigs are not committed to the dotfiles repository. These are stored in Bitwarden SAAS and managed with bitwarden-cli and functions in config/zsh/functions.zsh.

First, you need to install the CLI, create client and secret id in Bitwarden, and configure ~/.bw as follows:

export BW_CLIENTSECRET=
export BW_CLIENTID=
export BW_PSSWD=
export BW_SECRET_NOTE_ID=
export BW_SSH_FOLDER_ID=

Secret Management

Secrets are stored in a Bitwarden note (referenced by BW_SECRET_NOTE_ID). Functions to manage these secrets include:

  • load_secret: Load secrets from Bitwarden and source them.
  • clean_secret: Remove files with secrets.

SSH Keys Management

SSH key files and ssh config file are stored in a Bitwarden folder and managed using the load_ssh_keys function to populate the ~/.ssh folder.

Kubeconfig Management


Multi-Git Management

Manage multiple Git profiles (github, gitlab, personnal instance of gitlab) with direnv.
Loading environment variables in directories with specific organization repositories:

git
├── github
│   ├── helm-kuma-ingress-watcher
│   └── kuma-ingress-watcher
├── gitlab
│   ├── dotfiles
├── nas
│   └── qlabv1
└── work
    └── Infrastructure

And for each directory i have GIT VARS loaded from other environment VARS when i go to the dir:

export GIT_SSH_COMMAND="ssh -i ~/.ssh/gitlab_id_rsa -F /dev/null"
export GIT_AUTHOR_NAME=$USER_GIT_GITLAB
export GIT_AUTHOR_EMAIL=$EMAIL_GIT_GITLAB
export GIT_COMMITTER_NAME=$USER_GIT_GITLAB
export GIT_COMMITTER_EMAIL=$EMAIL_GIT_GITLAB

Version Management with ASDF

ASDF manages multiple language runtime versions per project.

Automatic Version Management

  • Auto-Discovery: Detects .tool-versions files in project directories
  • Auto-Installation: Installs missing versions when entering a directory
  • Global Defaults: Uses global .tool-versions for consistent defaults across projects

When you cd into a project with a .tool-versions file, ASDF automatically installs and activates the specified versions.

ASDF is used specifically for development tools and languages where version compatibility matters for projects (Python, Node.js, Terraform, etc.). System utilities and CLI tools (eza, bat, starship) remain managed by Homebrew.


Quick save file

Dropbox Management

Sometimes, you need to quick save some files in an external storage. I use Dropbox.

First, ensure that you have the Dropbox CLI tool installed and configure your Dropbox access token as follows:

export DROPBOX_PERSONAL_TOKEN=

Dropbox integration functions include:

  • load_dbx: Creates a configuration directory and sets up Dropbox CLI authentication using the DROPBOX_PERSONAL_TOKEN.

  • dbxpush: Uploads a local file or directory to /tmp directory in Dropbox. Usage example:

    dbxpush <local-file-or-directory>
  • dbxget: Downloads a file from /tmp directory in Dropbox to the local machine. Usage example:

    dbxget <remote-file>
  • dbxclean: Cleans up temporary files in Dropbox. ( including config dir with token, but not the environment var with the token)

These functions are included in config/zsh/functions.zsh, which ensures efficient management of Dropbox operations within your setup.


Multi-windows Terminal with Tmux

Tmux is a terminal multiplexer that allows you to manage multiple terminal sessions within a single window.

My Tmux configuration, stored in config/.tmux.conf, includes:

  • Mouse Support: Allows window resizing with the mouse and enables a context menu with a right-click on a window.
  • Custom Prefix Key:
    • The default prefix key (C-b) is changed to Ctrl + Space for easier access.
    • Ctrl + Space + v for vertical splits.
    • Ctrl + Space + h for horizontal splits.
    • Ctrl + Space + arrow keys (→, ←, ↑, ↓) to switch between windows.
  • Custom Screensaver: The lock screen is configured to display a cbonsai animation after 180 seconds of inactivity. This can be switched to cmatrix or asciiquarium for alternative screensavers.

Garbage Management with Trash

To avoid accidentally deleting files permanently, I replace rm with a trash tool:

  • Linux: trash-cli — follows the freedesktop.org trash spec.
  • macOS: trash — moves files to the macOS Trash.

Aliases are set for trash management in both cases.


Editors

Neovim

Neovim is an extensible and modular text editor based on Vim. I use a pre-built version of NvChad, a framework for Neovim that provides a ready-to-use configuration with numerous plugins and enhancements.


Visual Studio Code

Visual Studio Code is a code editor developed by Microsoft.

Dotfiles for VsCode are:

  • settings.json
  • Profile

Installed Packages

APT Packages (Linux only)

Package Name Description Linux
build-essential Essential tools for building software (GCC, g++, make…) ✔️
curl Command line tool for transferring data with URL syntax ✔️
lsb-release Linux Standard Base distribution information ✔️
ca-certificates Common CA certificates for SSL validation ✔️
procps System utilities: ps, top, vmstat, kill… ✔️
file Determine file type from content ✔️
zsh Z Shell ✔️

Brew Packages

Package Name Description Linux macOS
gnupg GNU Privacy Guard ✔️ ✔️
fontconfig Library for configuring and customizing font access ✔️ ✔️
wget Network downloader ✔️ ✔️
watch Execute a program periodically, showing output fullscreen ✔️ ✔️
yq YAML processor (like jq for YAML) ✔️ ✔️
jq Command-line JSON processor ✔️ ✔️
btop Better than htop ✔️ ✔️
direnv Load/unload environment variables based on $PWD ✔️ ✔️
bitwarden-cli Bitwarden command-line interface ✔️ ✔️
scc For counting the lines of code, blank lines, comment lines, and physical lines of source code in many programming languages. ✔️ ✔️
duf Get info on mounted disks (better df) ✔️ ✔️
sd RegEx find and replace (better sed) ✔️ ✔️
asdf Extendable version manager with support for Ruby, Node.js, Elixir, Erlang & more ✔️ ✔️
tmux Terminal multiplexer ✔️ ✔️
fd Simple, fast and user-friendly alternative to 'find' ✔️ ✔️
starship Minimal, blazing-fast, and infinitely customizable prompt for any shell ✔️ ✔️
eza Listing files with info (better ls) ✔️ ✔️
bat Output highlighting (better cat) ✔️ ✔️
neovim Hyperextensible Vim-based text editor ✔️ ✔️
thefuck App which corrects your previous console command. ✔️ ✔️
fastfetch Show system data and distro info (replaces neofetch) ✔️ ✔️
tree Display directories as trees ✔️ ✔️
libyaml YAML Parser ✔️ ✔️
docker Platform to build, run, and share containerized applications ✔️ ✔️
docker-compose Define and run multi-container applications with Docker ✔️ ✔️
kubernetes-cli Kubernetes command-line interface ✔️ ✔️
podman Tool for managing OCI containers and pods ✔️ ✔️
kubectx Switch faster between clusters and namespaces in kubectl ✔️ ✔️
kustomize Kubernetes native configuration management ✔️ ✔️
kdash Kubernetes dashboard app ✔️ ✔️
lazydocker Full Docker management app ✔️ ✔️
helm-docs Autogenerate doc for Helm charts ✔️ ✔️
krew plugin manager for kubectl command-line tool. ✔️ ✔️
derailed/k9s/k9s Kubernetes CLI to manage your clusters in style! ✔️ ✔️
ctop Container metrics and monitoring ✔️ ✔️
docker-completion Bash, Zsh and Fish completion for Docker ✔️ ✔️
gitlab-ci-local Build all pipeline or specific job locally ✔️ ✔️
k3sup Bootstrap Kubernetes with k3s over SSH < 1 min ✔️ ✔️
argocd-autopilot Bootstrap ArgoCD Autopilot ✔️ ✔️
pwgen Password generator ✔️ ✔️
fdupes Duplicate file finder ✔️ ✔️
gping Interactive ping tool, with graph ✔️ ✔️
httpie HTTP / API testing client ✔️ ✔️
entr Run command when files change (for testing when you change code directly launch program) ✔️ ✔️
ttygif Make gif from terminal ✔️ ✔️
tldr Simplified and community-driven man pages ✔️ ✔️
librsvg To use rsvg-convert docker-compose.svg > docker-compose.png ✔️ ✔️
asciiquarium Fish tank animation in your terminal ✔️ ✔️
cmatrix Console Matrix ✔️ ✔️
figlet Banner-like program prints strings as ASCII art ✔️ ✔️
cbonsai terminal bonzai in ASCII ✔️ ✔️
trash-cli CLI for the freedesktop.org trashcan (Linux) ✔️
trash CLI to move files to the macOS Trash (replaces Linux trash-cli) ✔️

ASDF Packages

Package Name Description Linux macOS
python Python programming language ✔️ ✔️
nodejs JavaScript runtime built on Chrome's V8 JavaScript engine ✔️ ✔️
golang Go programming language ✔️ ✔️
terraform Infrastructure as code software tool ✔️ ✔️
opentofu Open source version of Terraform ✔️ ✔️
terragrunt Thin wrapper for Terraform that provides extra tools for working with multiple Terraform modules ✔️ ✔️
kubectl Kubernetes command-line tool ✔️ ✔️
helm The Kubernetes package manager ✔️ ✔️
minikube Run Kubernetes locally ✔️ ✔️
awscli Official Amazon AWS command-line interface ✔️ ✔️
packer Tool for creating identical machine images for multiple platforms ✔️ ✔️
poetry Python dependency management and packaging made easy ✔️ ✔️
pre-commit Allow script to run on every commit ✔️ ✔️
tflint Terraform Linter ✔️ ✔️
act Build and test GitHub pipelines on local stack ✔️ ✔️
glab CLI for GitLab ✔️ ✔️
gomplate A template renderer that can be used to generate README ✔️ ✔️
bitwarden-secrets-manager Secrets Manager command-line interface ✔️ ✔️

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors