A modern, machine-specific dotfiles management system using JSON-based profile configurations.
This dotfiles system is organized around profiles that represent specific computer/OS combinations. Each profile contains its own package lists, configuration files, and setup scripts tailored to that specific environment.
| Profile | Description | OS | Architecture |
|---|---|---|---|
discobot-darwin |
Mac laptop running macOS | macOS | ARM64 |
h4l9000-arch |
ROG G16 laptop running Arch Linux | Arch | x86_64 |
k3v1n-arch |
Minisforum V3 running Arch Linux | Arch | x86_64 |
mcu-arch |
Desktop workstation running Arch Linux | Arch | x86_64 |
mcu-win |
Desktop workstation running Windows | Windows | x86_64 |
zero-deb |
Debian home server | Debian | x86_64 |
./install.sh --auto# List available profiles
./install.sh --list
# Install specific profile
./install.sh discobot-darwin
# Dry run to see what would be installed
./install.sh mcu-arch --dry-run# Install packages only
./install.sh discobot-darwin --packages-only
# Link configurations only
./install.sh discobot-darwin --configs-only
# Run scripts only
./install.sh discobot-darwin --scripts-onlydotfiles/
├── profiles/ # Profile configurations
│ ├── discobot-darwin/ # macOS laptop profile
│ │ ├── profile.json # Profile configuration
│ │ └── packages/ # Package files
│ │ └── Brewfile # Homebrew packages
│ ├── h4l9000-arch/ # ROG laptop Arch profile
│ │ ├── profile.json
│ │ └── packages/
│ │ ├── pacman.txt # Pacman packages
│ │ ├── aur.txt # AUR packages
│ │ ├── flatpak.txt # Flatpak applications
│ │ └── npm.txt # Global npm packages
│ ├── k3v1n-arch/ # Minisforum V3 Arch profile
│ │ ├── profile.json
│ │ └── packages/
│ │ ├── pacman.txt
│ │ ├── aur.txt
│ │ ├── flatpak.txt
│ │ └── npm.txt
│ ├── mcu-arch/ # Arch desktop profile
│ │ ├── profile.json
│ │ └── packages/
│ │ ├── pacman.txt # Pacman packages
│ │ └── aur.txt # AUR packages
│ ├── mcu-win/ # Windows desktop profile
│ │ ├── profile.json
│ │ └── packages/
│ │ ├── winget.txt # Winget packages
│ │ └── scoop.txt # Scoop packages
│ └── zero-deb/ # Debian home server profile
│ ├── profile.json
│ └── packages/
│ ├── apt.txt # APT packages
│ ├── Brewfile # Homebrew packages
│ └── npm.txt # Global npm packages
├── scripts/ # Shared installation scripts
│ ├── prepare.sh # Pre-installation orchestrator
│ ├── macos_defaults.sh # macOS system defaults
│ ├── workspace.sh # Workspace setup
│ ├── permissions.sh # File permissions
│ ├── services.sh # System services
│ ├── finalize.sh # Post-installation cleanup
│ ├── minisforum-finalize.sh # Mini PC specific setup
│ └── python_venv.sh # Python virtual environment
├── config/ # Configuration files organized by application
│ ├── zsh/ # ZSH configuration
│ ├── hypr/ # Hyprland window manager
│ ├── waybar/ # Status bar for Wayland
│ ├── ghostty/ # Terminal emulator
│ ├── yabai/ # macOS window manager
│ ├── sketchybar/ # macOS status bar
│ ├── skhd/ # macOS hotkey daemon
│ ├── lazygit/ # Git TUI
│ ├── yazi/ # File manager
│ ├── btop/ # System monitor
│ ├── bat/ # Cat alternative
│ ├── borders/ # Window borders (macOS)
│ ├── dunst/ # Notification daemon
│ ├── wofi/ # Application launcher
│ ├── sway/ # Wayland compositor
│ ├── swaylock/ # Screen locker
│ ├── gtk-3.0/ # GTK 3 theming
│ ├── gtk-4.0/ # GTK 4 theming
│ ├── atuin/ # Shell history
│ ├── posting/ # HTTP client
│ ├── vscode/ # VS Code themes
│ └── virt-manager/ # Virtual machine manager
├── dotfiles/ # Dotfiles to be linked to home directory
├── themes/ # Themes and visual assets
│ ├── fonts/ # Font files
│ └── wallpapers/ # Desktop wallpapers
├── bin/ # Utility scripts and binaries
├── lib/ # Utility libraries for the installer
│ ├── bootstrap.sh # Minimal installer prerequisites
│ ├── runtime.sh # Homebrew, fnm, node, pnpm setup
│ └── repos/ # OS-specific repository setup
├── system/ # System configuration files
├── install.sh # Bootstrap wrapper
└── profile-install.sh # Main profile installer
Each profile is defined by a profile.json file with the following structure:
{
"name": "profile-name",
"description": "Profile description",
"hostname": "expected-hostname",
"os": "darwin|arch|fedora|windows",
"arch": "arm64|x86_64|aarch64",
"package_managers": {
"homebrew": {
"enabled": true,
"file": "Brewfile"
},
"pacman": {
"enabled": true,
"file": "pacman.txt"
},
"yay": {
"enabled": true,
"file": "aur.txt"
},
"dnf": {
"enabled": true,
"file": "dnf.txt"
},
"flatpak": {
"enabled": true,
"file": "flatpak.txt"
}
},
"configs": ["zsh", "git", "hypr", "waybar"],
"dotfiles": [".zshrc", ".gitconfig", ".editorconfig"],
"themes": ["fonts", "wallpapers"],
"scripts": {
"pre_install": ["prepare.sh"],
"post_install": ["macos_defaults.sh", "finalize.sh"]
},
"environment": {
"BROWSER": "firefox",
"TERMINAL": "ghostty"
},
"features": {
"gaming": true,
"virtualization": false
}
}The system supports multiple package managers per profile:
- macOS: Homebrew (
Brewfile) - Arch Linux: pacman (
pacman.txt) + AUR via yay (aur.txt) - Fedora: DNF (
dnf.txt) + Flatpak (flatpak.txt) + Homebrew (Brewfile) - Windows: Winget (
winget.txt) + Scoop (scoop.txt)
Configurations are organized in three categories:
- Dotfiles: Files linked to
~/.*(e.g.,.zshrc,.gitconfig) - Configs: Directories linked to
~/.config/*(e.g.,hypr,waybar,ghostty) - Themes: Asset directories like fonts and wallpapers
Profile scripts are stored in the main scripts/ directory and can be shared across multiple profiles. Each profile references the scripts it needs in its profile.json configuration.
Available Scripts:
- prepare.sh - Pre-installation orchestrator for runtime and repository setup
- macos_defaults.sh - Configure macOS system defaults and preferences
- workspace.sh - Set up workspace directories and structure
- permissions.sh - Configure file and directory permissions
- services.sh - Enable and configure system services
- finalize.sh - Post-installation cleanup and finalization
- minisforum-finalize.sh - Mini PC specific setup and configuration
- python_venv.sh - Python virtual environment setup
Scripts run at different stages:
- Pre-install: Run before package installation (e.g., repository setup)
- Post-install: Run after configuration linking (e.g., system defaults)
Scripts support both Bash (.sh) and PowerShell (.ps1) formats and are automatically detected by file extension.
install.sh installs only the minimal tools needed to run the profile installer, then hands off to profile-install.sh. Profile pre_install scripts use scripts/prepare.sh, which delegates runtime setup to lib/runtime.sh and OS repository setup to lib/repos/.
Usage: ./install.sh [profile] [options]
Options:
-h, --help Show help
-l, --list List available profiles
-a, --auto Auto-detect profile based on hostname
-d, --dry-run Show what would be installed without installing
-p, --packages-only Install packages only
-c, --configs-only Link configurations only
-s, --scripts-only Run scripts only
-f, --force Force installation without prompts
-v, --verbose Verbose output- Create a new directory under
profiles/with your profile name - Create a
profile.jsonconfiguration file - Add package files under
packages/ - Add any custom scripts under
scripts/ - Test with
--dry-runbefore running
jqfor JSON parsinggitfor repository managementtreefor directory structure display- Platform-specific package managers (brew, pacman, dnf, etc.)
# Auto-detect and install current machine's profile
./install.sh --auto --force
# Install desktop workstation profile with dry-run first
./install.sh mcu-arch --dry-run
./install.sh mcu-arch
# Update only configurations for laptop
./install.sh discobot-darwin --configs-only
# Install packages for Windows profile
./install.sh mcu-win --packages-onlyManual steps to complete after a successful install. These require user interaction and can't be automated.
- Tailscale — Run
sudo tailscale upand authenticate in browser - VS Code — Open VS Code, sign in with GitHub, enable Settings Sync
- Google Chrome — Open Chrome, sign in with Google account, enable sync
- ZSH — Log out and back in for shell change to take effect
- Hyprland — Verify monitor config in
~/.config/hypr/lua/hosts/$HOSTNAME.lua - Flatpak apps — Open each app once to initialize config dirs, then re-run
flatfix
- VirtualBox — Install extension pack if needed
- Samba — Set samba password:
sudo smbpasswd -a $USER - QEMU/libvirt — Verify with
virsh list --all - Supabase — Review generated secrets in
~/labs/vm/docker/supabase/app/.env, updateSUPABASE_PUBLIC_URLif not using localhost - Supabase Dashboard — Access at
http://localhost:8000, login withDASHBOARD_USERNAME/DASHBOARD_PASSWORDfrom.env - Plex — Get a claim token from https://www.plex.tv/claim/ (valid 4 minutes), set
PLEX_CLAIMin~/labs/vm/docker/plex/.env, then restart:cd ~/labs/vm/docker/plex && docker compose --env-file .env up -d - Plex Libraries — Access at
http://localhost:32400/web, add libraries: Movies →/data/media/movies, TV Shows →/data/media/tv-shows - Home Assistant — Access at
http://localhost:8123, create your admin account on first visit