A cross-platform development environment setup tool that automates system configuration through a modular, idempotent Python CLI.
- Cross-Platform Support: Arch Linux, Debian/Ubuntu, and macOS
- Idempotent Operations: Safe to run multiple times without side effects
- Modular Architecture: Separate one-time setup tasks from reusable utilities
- Recursive Script Discovery: Automatically finds and organizes platform-specific scripts
- Comprehensive Error Handling: Clear error messages and graceful failure recovery
- Consistent Privilege Model: Uses sudo only when necessary, with credential caching
- Flexible Execution: Run full installation or individual modules/scripts
- Bash shell (for the
startwrapper) - curl (for mise installation)
- Platform-specific tools:
- Debian/Ubuntu:
apt
- Debian/Ubuntu:
All other dependencies (Python 3.10, uv, ruff, brew) are automatically managed by mise.
Use the start wrapper to automatically handle mise installation and tool setup:
git clone <repository-url>
cd dev
./start installThe start script will:
- Install mise if not already present
- Install Python 3.10, uv, and ruff via mise
- Create a Python virtual environment
- Install Python dependencies
- Run the platform-specific installation
If you prefer to manage mise yourself or already have it installed:
- Clone the repository:
git clone <repository-url>
cd dev- Install mise (if not already installed):
curl https://mise.run/install.sh | sh- Install tools and dependencies:
mise install- Run the setup:
./dev installRun the complete setup for your platform, including all modules:
./start install # Recommended: handles mise automatically
# OR
./dev install # If you've already set up miseThis command:
- Detects your operating system
- Runs the appropriate platform-specific installation script
- Executes all modules in the
quickstart/modules/directory
View all available modules and scripts organized by platform:
./start list
# OR
./dev listExample output:
Modules:
fish_env
fisher
Scripts:
[arch]
paru (arch/paru.sh)
shell (arch/shell.bash)
podman (arch/podman.bash)
greetd (arch/greetd.bash)
nvim (arch/nvim.bash)
waybar (arch/waybar.bash)
[deb]
vim (deb/vim.bash)
Execute one or more modules or scripts by name:
./start run <name> [<name2> ...]
# OR
./dev run <name> [<name2> ...]Examples:
# Run a single module
./start run fisher
# Run a platform-specific script (multiple ways)
./start run paru # By basename
./start run arch/paru # By relative path
./start run arch/paru.sh # With extension
# Run multiple items at once
./start run fisher paru shellThe project uses a two-tier system to organize setup tasks:
One-time setup tasks that should only run once. Modules use marker files to track completion state:
- Located in
quickstart/modules/ - Implement idempotency checks using marker files in
~/.config/dev-setup/modules/ - Example:
fisher.shinstalls the Fisher plugin manager for Fish shell
Reusable utilities organized by platform that can be run multiple times:
- Located in
quickstart/scripts/<platform>/ - Platform-specific:
arch/,deb/, etc. - Can be invoked by basename, relative path, or full path
- Example:
arch/paru.shinstalls the Paru AUR helper
Platform-specific installation entry points:
install.sh- Detects OS and delegates to platform scriptarch.sh- Arch Linux setupdeb.sh- Debian/Ubuntu setuposx.sh- macOS setupshared.sh- Common utilities
| Platform | Status | Package Manager |
|---|---|---|
| Arch Linux | ✅ Supported | pacman, paru (AUR) |
| Debian/Ubuntu | ✅ Supported | apt |
| macOS | ✅ Supported | Homebrew |
| Fedora/RHEL | ❌ Not yet supported | - |
| Windows | ❌ Not yet supported see docs/branches.md |
- |
.
├── dev # Main Python CLI tool
├── requirements.txt # Python dependencies (Click)
├── LICENSE # MIT License
├── quickstart/
│ ├── install.sh # OS detection and delegation
│ ├── arch.sh # Arch Linux installation
│ ├── deb.sh # Debian/Ubuntu installation
│ ├── osx.sh # macOS installation
│ ├── shared.sh # Shared utilities
│ ├── modules/ # One-time setup modules
│ │ ├── fisher.sh # Fisher plugin manager
│ │ └── fish_env.sh # Fish shell environment
│ ├── scripts/ # Reusable platform scripts
│ │ ├── arch/ # Arch Linux scripts
│ │ │ ├── paru.sh # AUR helper installation
│ │ │ ├── shell.bash # Shell configuration
│ │ │ ├── podman.bash # Container runtime
│ │ │ ├── greetd.bash # Display manager
│ │ │ ├── nvim.bash # Neovim setup
│ │ │ └── waybar.bash # Wayland bar
│ │ └── deb/ # Debian/Ubuntu scripts
│ │ └── vim.bash # Vim setup
│ └── apps/ # Application lists
│ ├── PersonalBrewfile # Personal macOS apps
│ └── workBrew # Work macOS apps
└── docs/
├── branches.md # Historical branch information
└── todo.md # Development tasks
- Create a new script in
quickstart/modules/:
touch quickstart/modules/my_module.sh
chmod +x quickstart/modules/my_module.sh- Implement idempotency using marker files:
#!/usr/bin/env bash
set -euo pipefail
STATE_DIR="$HOME/.config/dev-setup/modules"
MARKER_FILE="$STATE_DIR/my_module.done"
if [ -f "$MARKER_FILE" ]; then
echo "my_module already completed, skipping..."
exit 0
fi
# Your setup logic here
mkdir -p "$STATE_DIR"
touch "$MARKER_FILE"
echo "my_module completed successfully."- Create a script in the appropriate platform directory:
touch quickstart/scripts/arch/my_script.sh
chmod +x quickstart/scripts/arch/my_script.sh- The script will be automatically discovered and available via
./dev run
To add support for a new platform:
- Create a platform script in
quickstart/(e.g.,fedora.sh) - Add detection logic to
quickstart/install.sh - Create a platform-specific scripts directory:
quickstart/scripts/fedora/ - Add platform-specific installation logic
- Idempotent Modules: Modules now use marker files to prevent duplicate execution
- Recursive Script Discovery: Scripts are automatically discovered in subdirectories
- Flexible Script Invocation: Scripts can be called by basename, relative path, or full path
- Comprehensive Error Handling: Better error messages and graceful failure recovery
- Consistent Privilege Model: Standardized sudo usage with credential caching
- Environment Variable Support:
BASE_DIRis passed from Python CLI to shell scripts
This project is licensed under the MIT License. See the LICENSE file for details.
Contributions are welcome! Please ensure:
- Scripts follow the established privilege model (sudo only when necessary)
- Modules implement idempotency checks
- Error handling is comprehensive with clear messages
- Code follows existing patterns and conventions
For historical information about the repository's previous branch-based organization, see docs/branches.md.