Bootstrap Tool for iOS Projects
Instantly add CI/CD, quality tools, helper scripts, and automation to any Xcode project with a single command.
- 🚀 One-command setup - Bootstrap existing Xcode projects in seconds
- 🔄 Multi-CI support - Auto-detects and configures GitHub Actions, GitLab CI, or Bitbucket Pipelines
- 🛠 Automation scripts - Build, test, lint, format, preflight, and simulator management
- 📱 Smart simulator detection - Auto-configures iOS simulators based on deployment target
- 🎯 Quality tools - SwiftLint and SwiftFormat with sensible defaults
- 🪝 Git hooks - Pre-commit checks to maintain code quality
- 📊 Project templates - Includes XcodeGen project.yml and STATUS.md
- 🔧 Customizable - Override defaults with
.xcboot.ymlconfiguration
cd YourExistingProject
curl -fsSL https://raw.githubusercontent.com/nickhart/xcboot/main/bootstrap.sh | bash# Force upgrade to latest version
curl -fsSL https://raw.githubusercontent.com/nickhart/xcboot/main/bootstrap.sh | bash -s -- --force
# Create with MVVM directory structure
curl -fsSL https://raw.githubusercontent.com/nickhart/xcboot/main/bootstrap.sh | bash -s -- --structure
# Skip STATUS.md generation
curl -fsSL https://raw.githubusercontent.com/nickhart/xcboot/main/bootstrap.sh | bash -s -- --no-status- init-project-yml.sh - Generate project.yml from existing .xcodeproj (for XcodeGen adoption)
- build.sh - Build your project with xcodebuild or xcodegen
- test.sh - Run unit and UI tests with coverage
- lint.sh - Run SwiftLint on your codebase
- format.sh - Format code with SwiftFormat
- preflight.sh - Run all checks before pushing (lint + format + build + test)
- simulator.sh - Manage iOS simulators (create, delete, list)
- pre-commit.sh - Git pre-commit hook script
- Brewfile - Development dependencies (xcodegen, swiftlint, swiftformat, yq, xcbeautify)
- .gitignore - XcodeGen-optimized (ignores
*.xcodeprojand*.xcworkspace) - .swift-version - Swift version for consistency across team and CI
- .swiftlint.yml - SwiftLint configuration with sensible rules
- .swiftformat - SwiftFormat configuration
- .xcboot/config.yml - xcboot configuration (simulator settings, project metadata)
Auto-detects git provider and installs appropriate CI config:
- GitHub Actions (
.github/workflows/ci.yml) - Full support with build, test, lint, format - GitLab CI (
.gitlab-ci.yml) - Basic support calling preflight script - Bitbucket Pipelines (
bitbucket-pipelines.yml) - Basic support calling preflight script
- STATUS.md - Project status template (enabled by default, disable with
--no-status) - project.yml - XcodeGen project template (for new projects)
- pre-commit - Runs preflight checks before allowing commits
After bootstrapping, use the installed scripts:
# Generate project.yml for XcodeGen (one-time setup)
./scripts/init-project-yml.sh
# Set up simulators
./scripts/simulator.sh
# Run preflight checks (recommended before pushing)
./scripts/preflight.sh
# Build your project
./scripts/build.sh
# Run tests
./scripts/test.sh
# Lint code
./scripts/lint.sh
# Format code
./scripts/format.sh --fixInstalled automatically with detected values. Example:
version: "1.0"
project:
name: MyApp
bundle_id_root: com.mycompany
deployment_target: 18.0
swift_version: 6.2
ci:
provider: github
enabled: true
simulators:
tests:
name: xcboot-test-sim
device: iPhone 16 Pro
os: 18-0
arch: arm64Create .xcboot.yml in your project root to override defaults:
# Override simulator for tests
simulators:
tests:
device: iPhone 15 Pro
os: 17-5
# Disable CI checks
ci:
enabled: falseNote: .xcboot.yml should be in .gitignore for local developer preferences.
xcboot/
├── bootstrap.sh # Main installer (downloads from GitHub)
├── VERSION # Current version (0.1.0)
├── Brewfile # Development dependencies
├── CHANGELOG.md # Release history
├── CONTRIBUTING.md # Contribution guidelines
├── CLAUDE.md # Claude Code assistance guide
├── scripts/ # xcboot development scripts
│ ├── lint.sh # Lint xcboot shell scripts
│ ├── format.sh # Format xcboot shell scripts
│ ├── validate.sh # Validate YAML templates
│ └── test.sh # Test xcboot functionality
├── templates/
│ └── default/ # Default template
│ ├── scripts/ # User project scripts (distributed)
│ ├── configs/ # Configuration files (distributed)
│ ├── ci/ # CI configurations (distributed)
│ │ ├── github/
│ │ ├── gitlab/
│ │ └── bitbucket/
│ ├── .xcboot/ # xcboot config template
│ ├── project.yml # XcodeGen project template
│ └── STATUS.md # Status documentation template
└── .github/
└── workflows/
└── ci.yml # CI for xcboot itself
-
Detection Phase
- Detects Xcode project name from
.xcodeprojorproject.yml - Detects git provider from
git remote get-url origin - Detects deployment target from project.pbxproj
- Detects Swift version from
swift --version - Detects optimal simulator based on deployment target
- Detects Xcode project name from
-
Installation Phase
- Downloads template files from GitHub
- Replaces template variables (
{{PROJECT_NAME}},{{DEPLOYMENT_TARGET}}, etc.) - Installs scripts, configs, and CI based on detected provider
- Sets executable permissions on scripts
- Installs git pre-commit hook
- Creates
.xcboot/config.ymlwith detected values
-
Customization Phase
- User can create
.xcboot.ymlto override defaults - Scripts read user overrides first, fall back to system config
- User can create
brew bundle # Installs shellcheck, shfmt, yq, jq, gh# Lint shell scripts
./scripts/lint.sh
# Format shell scripts
./scripts/format.sh --fix
# Validate YAML templates
./scripts/validate.sh
# Run test suite
./scripts/test.sh# Test in existing Xcode project
cd /path/to/test/project
/path/to/xcboot/bootstrap.sh
# Test with force flag
/path/to/xcboot/bootstrap.sh --forcexcboot supports three CI providers with auto-detection:
| Provider | Support Level | Features |
|---|---|---|
| GitHub Actions | ✅ Full | Build, test, lint, format, coverage |
| GitLab CI | Calls ./scripts/preflight.sh |
|
| Bitbucket Pipelines | Calls ./scripts/preflight.sh |
To improve GitLab or Bitbucket support, edit:
templates/default/ci/gitlab/.gitlab-ci.ymltemplates/default/ci/bitbucket/bitbucket-pipelines.yml
xcboot uses a template system for extensibility. The default template is currently available.
Future templates might include:
swiftui- SwiftUI-specific project setupclean- Clean Architecture project structurespm- Swift Package Manager project
- Create
templates/yourtemplate/directory - Add scripts, configs, and CI configurations
- Use template variables:
{{PROJECT_NAME}},{{DEPLOYMENT_TARGET}}, etc. - Test with
./bootstrap.sh --template yourtemplate
- macOS with Xcode installed
- Git repository (for git provider detection)
- Existing Xcode project (
.xcodeproj) orproject.ymlfor xcodegen
- xcodegen - For project.yml support
- yq - For YAML configuration parsing
- swiftlint - For linting (installed by CI or manually)
- swiftformat - For formatting (installed by CI or manually)
To upgrade an existing xcboot installation:
curl -fsSL https://raw.githubusercontent.com/nickhart/xcboot/main/bootstrap.sh | bash -s -- --forceThis will overwrite all xcboot-managed files with the latest versions.
Note: Your .xcboot.yml user overrides will not be modified.
Make sure you're in a directory with a .xcodeproj file or a project.yml file for xcodegen.
Use --force flag to overwrite existing files during upgrades.
Run chmod +x scripts/*.sh to make scripts executable.
Run ./scripts/simulator.sh to create and configure simulators.
See CONTRIBUTING.md for development setup and guidelines.
MIT License - see LICENSE file for details.
Created by Nick Hart
Inspired by fastlane, oh-my-zsh, and other bootstrap tools.
xcboot - Bootstrap your Xcode projects with confidence! 🚀