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 |
discobot-fedora |
Mac laptop running Fedora Linux | Fedora | AArch64 |
mcu-arch |
Desktop workstation running Arch Linux | Arch | x86_64 |
mcu-win |
Desktop workstation running Windows | Windows | x86_64 |
m4rv1n-arch |
Tablet running Arch Linux | Arch | 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
│ ├── discobot-fedora/ # Fedora laptop profile
│ │ ├── profile.json
│ │ └── packages/
│ │ ├── dnf.txt # DNF packages
│ │ ├── flatpak.txt # Flatpak applications
│ │ └── Brewfile # Homebrew packages
│ ├── 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
│ └── m4rv1n-arch/ # Arch tablet profile
├── scripts/ # Shared installation scripts
│ ├── prepare.sh # Pre-installation setup
│ ├── 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
│ ├── icons/ # Application icons
│ └── gtk/ # GTK themes
├── bin/ # Utility scripts and binaries
├── lib/ # Utility libraries for the installer
├── helpers/ # OS-specific helper scripts
├── install/ # Legacy installation scripts
├── system/ # System configuration files
└── install.sh # Main installer script
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", "icons"],
"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, wallpapers, icons
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 setup and preparation
- 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.
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/monitors.conf - 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
