Create Onboard Config
Scan the current repository and generate a .onboard YAML config file that captures all the dependencies (and optionally apps) needed to develop on this project.
When This Skill Applies
- User says
/create-onboardor asks to generate an onboard config - User wants to capture a project's dev environment as an
.onboardfile - User wants to make it easy for others to set up this codebase
How It Works
Phase 1: Scan the Codebase
Search for these signals in the current working directory to detect the stack:
Package/dependency files (search for all of these):
| File | Signals |
|---|---|
package.json |
Node.js, npm; check for yarn.lock/pnpm-lock.yaml/bun.lockb to detect package manager |
requirements.txt / pyproject.toml / setup.py / Pipfile / poetry.lock |
Python |
Cargo.toml |
Rust |
go.mod |
Go |
Gemfile |
Ruby |
composer.json |
PHP |
build.gradle / pom.xml |
Java/Kotlin |
Package.swift |
Swift |
mix.exs |
Elixir |
pubspec.yaml |
Flutter/Dart |
Infrastructure & tools (search for all of these):
| File/Pattern | Signals |
|---|---|
Dockerfile / docker-compose.yml / docker-compose.yaml |
Docker |
.github/ directory |
GitHub CLI useful |
.terraform/ / *.tf |
Terraform |
serverless.yml |
Serverless Framework |
.env.example / .env.sample |
Check variable names only for service references (DATABASE_URL → PostgreSQL, REDIS_URL → Redis). NEVER read .env — it contains secrets. Only read .env.example or .env.sample. |
Database signals (grep dependency manifests like package.json, requirements.txt, Gemfile — never .env):
- PostgreSQL: references to
pg,psycopg,postgresin dependency names - MySQL: references to
mysql,mysql2in dependency names - Redis: references to
redis,ioredisin dependency names - MongoDB: references to
mongodb,mongoosein dependency names - SQLite: references to
sqlite,better-sqlite3in dependency names
Phase 2: Build the Dependency Tree
Every .onboard file should include these foundational dependencies (they're always needed on macOS):
# Always include these first:
- xcode-cli # Foundation for all dev tools
- homebrew # Package manager (depends on xcode-cli)
- git # Version control (depends on homebrew)
Then add project-specific dependencies based on what was detected. Common mappings:
| Detected | Dependency ID | Name | Check | Install | Icon |
|---|---|---|---|---|---|
| Node.js | node |
Node.js | which node |
brew install node |
icon_img: nodejs.svg, icon_bg: "#333" |
| Python | python |
Python 3 | which python3 |
brew install python |
icon_img: python.svg, icon_bg: "#306998" |
| Rust | rust |
Rust | which rustc |
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh |
icon: "🦀", icon_bg: "#CE422B" |
| Go | go |
Go | which go |
brew install go |
icon: "🔵", icon_bg: "#00ADD8" |
| Ruby | ruby |
Ruby | which ruby |
brew install ruby |
icon: "💎", icon_bg: "#CC342D" |
| PHP | php |
PHP | which php |
brew install php |
icon: "🐘", icon_bg: "#777BB4" |
| Java | java |
Java | which java |
brew install openjdk |
icon: "☕", icon_bg: "#ED8B00" |
| Elixir | elixir |
Elixir | which elixir |
brew install elixir |
icon: "💧", icon_bg: "#6E4A7E" |
| Dart/Flutter | flutter |
Flutter | which flutter |
brew install --cask flutter |
icon: "🦋", icon_bg: "#02569B" |
| Bun | bun |
Bun | which bun |
brew install oven-sh/bun/bun |
icon_img: bun.svg, icon_bg: "#fbf0df" |
| Yarn | yarn |
Yarn | which yarn |
brew install yarn |
icon: "📦", icon_bg: "#2C8EBB" |
| pnpm | pnpm |
pnpm | which pnpm |
brew install pnpm |
icon: "📦", icon_bg: "#F69220" |
| pipx | pipx |
pipx | which pipx |
brew install pipx && pipx ensurepath |
icon: "📦", icon_bg: "#3775A9" |
| GitHub CLI | gh |
GitHub CLI | which gh |
brew install gh |
icon_img: github.png, icon_bg: "#24292e" |
| Terraform | terraform |
Terraform | which terraform |
brew install terraform |
icon: "🏗", icon_bg: "#7B42BC" |
| Serverless | serverless |
Serverless Framework | which serverless |
brew install serverless |
icon: "⚡", icon_bg: "#FD5750" |
All project-specific dependencies should have depends_on: homebrew (except Rust which installs via rustup).
Phase 3: Interactive Review
Do not proceed to generation yet. Before presenting, scan the user's machine for installed apps:
# List GUI apps in /Applications
ls /Applications/ 2>/dev/null | grep '\.app$' | sed 's/\.app$//' | sort
# List Homebrew cask apps (gives us exact cask names for install commands)
brew list --cask 2>/dev/null
From the installed apps, identify developer-relevant tools using this reference table:
| App Name (in /Applications) | Cask Name | Category |
|---|---|---|
| Cursor | cursor | Editor |
| Visual Studio Code | visual-studio-code | Editor |
| Zed | zed | Editor |
| iTerm | iterm2 | Terminal |
| Warp | warp | Terminal |
| Docker | docker | Infrastructure |
| Postman | postman | API |
| Insomnia | insomnia | API |
| Alfred 5 | alfred | Productivity |
| Raycast | raycast | Productivity |
| Rectangle | rectangle | Productivity |
| Caffeine | caffeine | Productivity |
| Figma | figma | Design |
| Sketch | sketch | Design |
| Slack | slack | Communication |
| Discord | discord | Communication |
| 1Password 7 | 1password | Security |
| Field Theory | fieldtheory | Productivity |
| Codex | Codex | AI |
| TablePlus | tableplus | Database |
| Postico 2 | postico | Database |
| Proxyman | proxyman | Networking |
| Charles | charles | Networking |
For apps found in /Applications/ that are NOT in this table and NOT in the brew list --cask output, use brew search --cask <name> to find the correct cask name. Only recommend apps where you can confidently generate a brew install --cask command. Do not guess cask names. Skip system default apps (Safari, Calendar, Mail, etc.) and non-developer apps.
Now present everything in one message:
Here's what I detected in this codebase:
Dependencies to include:
- Xcode CLI Tools (foundation)
- Homebrew (package manager)
- Git (version control)
- Node.js (detected: package.json)
- Python 3 (detected: requirements.txt)
- [etc.]
I also found these developer apps on your machine:
Editors: Cursor, VS Code Terminals: iTerm Productivity: Alfred, Rectangle Other: Docker, Slack
Are there any dependencies or apps you'd like to add, remove, or change?
This is the only pause point. One question, one wait. The user can:
- Confirm as-is ("looks good")
- Modify dependencies (add/remove)
- Pick apps to include (e.g., "add Cursor and iTerm")
- Decline apps entirely (just don't mention them)
- Add apps NOT on their machine — warn them: "[App Name] doesn't appear to be installed on your machine. Are you sure?" If confirmed, use
brew search --cask <name>to verify the cask exists.
Rules:
- List every dependency with the detection reason in parentheses
- Group dependencies: foundational first, then project-specific
- Categorize discovered apps by type
- If the user adds a dependency not in the mapping table, ask them for the check and install commands
- If the user removes a dependency that others depend on, warn about the dependency chain
- Once confirmed, proceed to Phase 4
Building app entries:
For each app the user selects, construct:
id: lowercase, no spaces (e.g.,cursor,vscode,iterm)name: Display name as it appears in /Applicationsicon: Use emoji. Useicon_imgonly for well-known tools with SVG/PNG assets in the Onboard appicon_bg: Pick a color matching the app's branddesc: One sentence describing what the app doescheck:ls /Applications/App\ Name.app(escape spaces with backslash)install:brew install --cask <cask-name>depends_on:homebrew
Phase 4: Generate and Write
Construct the YAML:
schema_version: 1
name: "Config Name"
description: "Short description of what this setup is for"
dependencies:
# ... foundational deps first, then project-specific
If the user selected apps in Phase 3, add the apps section:
apps:
# ... selected apps
If the user declined apps or selected none, omit the apps: key entirely from the YAML. Do not write an empty apps: [].
Naming rules:
- If the user provided a name argument, use it
- Otherwise, derive from the repo/directory name
- The
namefield should be human-friendly (e.g., "My Project" not "my-project") - The
descriptionshould mention the key technologies (e.g., "Node.js + React development environment")
File naming:
- Save as
<project-name>.onboardin the project root directory - Use kebab-case for the filename (e.g.,
my-project.onboard)
After generating:
- Write the file to the project root
- Show a summary of what was included
- Display the generated YAML
- Always show the full absolute path to the generated file so the user can find it
- Tell them: "Open this with the Onboard app, or share it with your team."
Good Practices
- Use the mapping table for install commands — don't copy install commands from repo files. The table ensures consistent, correct output. If a dependency isn't in the table, use the pattern
brew install <well-known-package-name>or ask the user. - Skip
.envfiles — read.env.exampleor.env.sampleinstead (same structural info, no secrets). Only look at variable names, not values. - Don't include secrets or credentials in the generated file.
Important Rules
- Always include xcode-cli → homebrew → git as the foundation chain
- Respect
depends_onchains — everything installed via brew depends on homebrew - Use
icon_imgfor well-known tools where SVG/PNG assets likely exist in the Onboard app (node, python, git, homebrew, github). Use emojiiconfor everything else. - Keep descriptions short — one sentence, focused on what it does for THIS project
- Quote install commands in single quotes when they contain special shell characters (dollar signs, exclamation marks, subshells)
- --minimal flag: Only include the foundational deps + the primary language runtime. Skip app discovery entirely.
- Don't over-include: Only add dependencies that are actually needed for THIS project. A Python project doesn't need Node.js unless there's evidence of it.
- Check commands must be reliable:
which <binary>for CLI tools,ls /Applications/Name.appfor apps - Apps are interactive and optional: Always ask the user. Only recommend apps actually installed on their machine. Never silently bundle apps the user doesn't use.
- Don't guess cask names: If you can't confidently map an app to a Homebrew cask, skip it or ask the user.