Developer Onboarding Document Skill
Write a developer onboarding document for a service, codebase, or team.
How to use it
Claude Code
- Run the line below. It pulls the whole folder into
~/.claude/skills/developer-onboarding-doc, including the files SKILL.md points to. - Describe your job in plain words. Claude Code follows the skill from there.
npx degit mohitagw15856/pm-claude-skills/skills/developer-onboarding-doc#main ~/.claude/skills/developer-onboarding-docFor one project only, change the path to .claude/skills/developer-onboarding-doc. This skill also uses Node.js, routes.js, app.py, requirements.txt — copying SKILL.md alone won't be enough. See the folder on GitHub.
Claude (web or desktop app)
- On this page open ⋯ → Download .md.
- Save it as SKILL.md in a folder, zip the folder, then Customize → Skills → + → Create skill → Upload a skill.
- Pick the file and Save. Claude shows the name and description and runs a security scan.
- Check the skill is switched on.
- Start a new chat and describe your job in plain words. The AI follows the skill from there.
ChatGPT or another app
- ChatGPT: make a Project and paste it into Instructions.
- Neither? Paste it at the top of a new chat — it works for that chat.
Not working?
- Check which app you pasted it into — the steps above name the right one.
- Some skills need the paid tier of Claude or ChatGPT.
Paste into Claude, ChatGPT or Cursor.
Source of Developer Onboarding Document Skill
Show the full text341 lines
| name | description |
|---|---|
| developer-onboarding-doc | Write a developer onboarding document for a service, codebase, or team. Use when asked to write a developer guide, service README, onboarding doc for a new engineer, codebase orientation, or getting-started guide for a technical team. Produces a structured doc covering service overview, architecture, local setup, key patterns, testing, deployment, and who to ask for what. |
Developer Onboarding Document Skill
Produce a complete developer onboarding document for a service or team — covering everything a new engineer needs to be productive within their first week.
A good onboarding doc is not a wiki dump. It answers the questions a new engineer actually has on day one, in the order they'll have them.
Required Inputs
Ask for these if not already provided:
- Service name and what it does
- Team responsible for it
- Tech stack — language(s), framework(s), database(s), message queues, etc.
- Key external dependencies — upstream services, third-party APIs
- Deployment target — Kubernetes, ECS, Lambda, bare metal, etc.
- Local dev setup — how to run locally (Docker Compose, local DB, etc.)
- Testing approach — unit, integration, E2E; test commands
- Deployment process — summary of how code gets to production
- On-call setup — who's on-call, how alerts work
- Contacts — tech lead, platform team, related service owners
Output Format
Developer Onboarding: [Service Name]
Team: [Team name] | Tech lead: [Name] Last updated: [Date] | Updated by: [Name]
If something in this doc is wrong or out of date, fix it now — it will affect every engineer who onboards after you.
What This Service Does
[3–5 sentences. What problem does this service solve? Who calls it, and who does it call? What would break if this service went down?]
Service type: [API / Background worker / Event consumer / Data pipeline / etc.] Consumers: [List internal services or external clients that depend on this service] Dependencies: [List upstream services, databases, and third-party APIs this service calls]
Architecture diagram: [Link or embed — even a rough ASCII diagram helps]
[Caller A] ──→ [This Service] ──→ [Database]
│
└──→ [Downstream Service]
Codebase Orientation
Repository: [Link]
Main branch: [main / master]
Language: [e.g. Go 1.22 / Node.js 20 / Python 3.12]
Framework: [e.g. Express / FastAPI / Gin / Rails]
Key directories
[repo-root]/
├── [src/ or cmd/] # Application code
│ ├── [handlers/] # HTTP handlers / controllers
│ ├── [services/] # Business logic
│ ├── [repository/] # Database access layer
│ └── [models/] # Data models / types
├── [tests/] # Test files
├── [migrations/] # Database migrations
├── [scripts/] # Utility scripts
├── [.github/workflows/] # CI/CD pipeline definitions
└── [docs/] # Additional documentation
Where to start reading: [Point to 2–3 key files that give the best orientation — e.g. main.go, routes.js, app.py]
Things that might surprise you
- [Unusual pattern 1 — e.g. "We use event sourcing — state is derived from an event log, not stored directly"]
- [Unusual pattern 2 — e.g. "Auth is handled by the gateway — this service trusts the
X-User-Idheader"] - [Unusual pattern 3 — any non-obvious decisions or legacy choices]
Local Development Setup
Estimated setup time: [X minutes for a fresh machine]
Prerequisites
- [Tool 1] — version [X] — [install link]
- [Tool 2] — version [X] — [install link]
- Access to [repo / internal package registry] — request from [who]
- [Any secrets or credentials needed] — request from [who]
Step-by-step setup
# 1. Clone the repo
git clone [repo URL]
cd [repo-name]
# 2. Copy and configure environment variables
cp .env.example .env
# Edit .env — see "Environment Variables" section below
# 3. Start dependencies (database, cache, etc.)
[docker compose up -d / make deps / etc.]
# 4. Install dependencies
[npm install / go mod download / pip install -r requirements.txt]
# 5. Run database migrations
[migration command]
# 6. Start the service
[start command]
# 7. Verify it's working
curl http://localhost:[PORT]/health
# Expected: {"status":"ok"}
If this doesn't work: Check [Troubleshooting section below] or ask in #[channel].
Environment Variables
| Variable | Required | Description | Example |
|---|---|---|---|
DATABASE_URL |
Yes | Connection string for the primary DB | postgres://localhost:5432/[db] |
[VAR_2] |
Yes | [Description] | [Example] |
[VAR_3] |
No | [Description — default value] | [Example] |
Secrets for local dev: [Where to get them — e.g. "Run [command] to pull from Vault" or "Ask [person] in #[channel]"]
Useful local commands
[start command] # Start the service
[test command] # Run all tests
[lint command] # Run linter
[format command] # Format code
[migration command] # Run pending migrations
[seed command] # Seed local database
Testing
Testing philosophy: [e.g. "We test at the integration layer — unit tests for pure functions, integration tests for anything touching the DB or external services"]
Running tests
# All tests
[test command]
# Unit tests only
[unit test command]
# Integration tests (requires local deps running)
[integration test command]
# A specific test file or test case
[test command with filter]
Test coverage: [X]% (minimum required to pass CI: [Y]%) Coverage report: [Where to find it]
Writing tests
- Unit tests: [Where to put them — e.g. alongside source files as
*_test.go] - Integration tests: [Where to put them — e.g.
tests/integration/] - Test database: [How it works — e.g. "Each test gets a clean transaction that rolls back on teardown — see
tests/helpers/db.go"] - Mocking: [Policy — e.g. "We mock at the repository layer — don't mock the DB directly"]
Making Changes
Branching
[Branch naming convention — e.g. feature/[ticket-id]-short-description, fix/[ticket-id]-short-description]
Before opening a PR
- Tests pass locally
- Linter passes (
[lint command]) - New behaviour has test coverage
- Any new environment variables are added to
.env.exampleand documented - Database migrations are backward-compatible (old code can run against new schema)
Code review
- Reviewers: [Who to request review from — e.g. "Any engineer on [team]; lead review required for auth changes"]
- Expected review time: [X hours / 1 business day]
- PR template: [Link or auto-generated by GitHub]
Database migrations
# Create a new migration
[migration create command]
# Apply pending migrations
[migration up command]
# Roll back last migration
[migration down command]
Migration rules:
- All migrations must be backward-compatible — old code must run against the new schema
- Never rename or drop a column in a single migration — do it in two steps (add new, migrate data, drop old)
- Test your rollback before merging
Deployment
How code gets to production: [1–2 sentence summary — link to full CI/CD playbook if it exists]
- Merge to
main→ automatic deploy to staging - Smoke tests run on staging
- Manual approval → deploy to production
- Post-deploy monitoring for [X minutes]
Deployment docs: [Link to CI/CD playbook or pipeline docs]
Who can deploy: [Any engineer / Lead engineer / On-call engineer — specify]
Deployment channel: #[deployments channel]
Monitoring and Observability
Dashboard: [Datadog / Grafana / CloudWatch — link] Logs: [Log aggregation tool and link — e.g. "Logs are in Datadog under service:[name]"] Traces: [Tracing tool and link if applicable] Alerts: [Where alerts fire — e.g. PagerDuty / Slack #alerts-[service]]
Key metrics to know:
- Error rate: Should be <[X]% (alert at [Y]%)
- P99 latency: Should be <[X]ms
- [Business metric]: [e.g. "Queue depth should be <100 items"]
On-Call
On-call schedule: [PagerDuty / Opsgenie link]
Who's on-call now: [Link to current schedule or #oncall channel]
Escalation: [On-call → [team lead] → [EM] — after [X] minutes unacknowledged]
If you get paged:
- Acknowledge the alert
- Check [dashboard link] for the first clue
- Common alert runbooks: [link to oncall-runbook or runbook-writer output]
- If you can't resolve in [X minutes], escalate to [person/channel]
Key Contacts
| Role | Name | Best way to reach |
|---|---|---|
| Tech lead | [Name] | Slack: @[handle] |
| On-call rotation | [Team] | PagerDuty / #on-call |
| Platform / infra | [Team] | #platform Slack channel |
| Database / DBA | [Name or team] | #database Slack channel |
| [Upstream service] owner | [Name] | Slack: @[handle] |
Where to ask questions:
- General engineering:
#engineering - This service specifically:
#[service-name] - Urgent / production issues:
#incidents
Troubleshooting
"The service won't start locally"
- Check that Docker / dependencies are running:
[command] - Check
.envis populated — missing values cause silent failures - Check logs:
[log command] - Ask in
#[channel]
"Tests are failing locally but passing in CI"
- Check your local dependency versions match CI:
[version check command] - Try a clean install:
[clean install command] - Integration tests need local deps running —
[start deps command]
"I can't access [internal tool / system]"
- Request access through [process — e.g. Okta self-serve / ask your manager]
"Something looks wrong in production"
- Check [dashboard] for the error spike
- Check recent deploys in
#deployments - If it's an active incident, page on-call via [PagerDuty / Slack command]
Further Reading
- Architecture Decision Records (ADRs) — why the codebase is the way it is
- API documentation or [link to external docs]
- Incident runbooks
- CI/CD pipeline documentation
- Team working agreements
Quality Checks
- Local setup instructions work on a fresh machine — tested recently
- Environment variables table is complete and accurate
- "Things that might surprise you" captures the actual surprises (ask a recent joiner)
- On-call section has real links, not placeholders
- Contacts are current — team members with real Slack handles
- Troubleshooting covers the top 3 actual questions new joiners ask
Anti-Patterns
- Do not document the ideal setup — document the actual setup; real oddities and gotchas are what new engineers need most
- Do not leave placeholder contacts like "ask your manager" — name specific people for each domain or the doc becomes useless when the new joiner has an urgent question
- Do not write the onboarding doc without reviewing it with a recent joiner — the author is blind to what they take for granted
- Do not include every piece of architectural detail — an onboarding doc that covers everything teaches nothing; link to deeper docs instead
- Do not skip the "things that might surprise you" section — undocumented non-obvious patterns are the number one cause of wasted engineering time in the first week
| 1 | |
| 2 | name developer-onboarding-doc |
| 3 | description "Write a developer onboarding document for a service, codebase, or team. Use when asked to write a developer guide, service README, onboarding doc for a new engineer, codebase orientation, or getting-started guide for a technical team. Produces a structured doc covering service overview, architecture, local setup, key patterns, testing, deployment, and who to ask for what." |
| 4 | |
| 5 | |
| 6 | # Developer Onboarding Document Skill |
| 7 | |
| 8 | Produce a complete developer onboarding document for a service or team — covering everything a new engineer needs to be productive within their first week. |
| 9 | |
| 10 | A good onboarding doc is not a wiki dump. It answers the questions a new engineer actually has on day one, in the order they'll have them. |
| 11 | |
| 12 | ## Required Inputs |
| 13 | |
| 14 | Ask for these if not already provided: |
| 15 | **Service name** and what it does |
| 16 | **Team** responsible for it |
| 17 | **Tech stack** — language(s), framework(s), database(s), message queues, etc. |
| 18 | **Key external dependencies** — upstream services, third-party APIs |
| 19 | **Deployment target** — Kubernetes, ECS, Lambda, bare metal, etc. |
| 20 | **Local dev setup** — how to run locally (Docker Compose, local DB, etc.) |
| 21 | **Testing approach** — unit, integration, E2E; test commands |
| 22 | **Deployment process** — summary of how code gets to production |
| 23 | **On-call setup** — who's on-call, how alerts work |
| 24 | **Contacts** — tech lead, platform team, related service owners |
| 25 | |
| 26 | ## Output Format |
| 27 | |
| 28 | |
| 29 | |
| 30 | # Developer Onboarding: [Service Name] |
| 31 | |
| 32 | **Team:** [Team name] | **Tech lead:** [Name] |
| 33 | **Last updated:** [Date] | **Updated by:** [Name] |
| 34 | |
| 35 | > If something in this doc is wrong or out of date, fix it now — it will affect every engineer who onboards after you. |
| 36 | |
| 37 | |
| 38 | |
| 39 | ## What This Service Does |
| 40 | |
| 41 | [3–5 sentences. What problem does this service solve? Who calls it, and who does it call? What would break if this service went down?] |
| 42 | |
| 43 | **Service type:** [API / Background worker / Event consumer / Data pipeline / etc.] |
| 44 | **Consumers:** [List internal services or external clients that depend on this service] |
| 45 | **Dependencies:** [List upstream services, databases, and third-party APIs this service calls] |
| 46 | |
| 47 | **Architecture diagram:** [Link or embed — even a rough ASCII diagram helps] |
| 48 | |
| 49 | |
| 50 | [Caller A] ──→ [This Service] ──→ [Database] |
| 51 | │ |
| 52 | └──→ [Downstream Service] |
| 53 | |
| 54 | |
| 55 | |
| 56 | |
| 57 | ## Codebase Orientation |
| 58 | |
| 59 | **Repository:** [Link] |
| 60 | **Main branch:** `[main / master]` |
| 61 | **Language:** [e.g. Go 1.22 / Node.js 20 / Python 3.12] |
| 62 | **Framework:** [e.g. Express / FastAPI / Gin / Rails] |
| 63 | |
| 64 | ### Key directories |
| 65 | |
| 66 | |
| 67 | [repo-root]/ |
| 68 | ├── [src/ or cmd/] # Application code |
| 69 | │ ├── [handlers/] # HTTP handlers / controllers |
| 70 | │ ├── [services/] # Business logic |
| 71 | │ ├── [repository/] # Database access layer |
| 72 | │ └── [models/] # Data models / types |
| 73 | ├── [tests/] # Test files |
| 74 | ├── [migrations/] # Database migrations |
| 75 | ├── [scripts/] # Utility scripts |
| 76 | ├── [.github/workflows/] # CI/CD pipeline definitions |
| 77 | └── [docs/] # Additional documentation |
| 78 | |
| 79 | |
| 80 | **Where to start reading:** [Point to 2–3 key files that give the best orientation — e.g. `main.go`, `routes.js`, `app.py`] |
| 81 | |
| 82 | ### Things that might surprise you |
| 83 | |
| 84 | [Unusual pattern 1 — e.g. "We use event sourcing — state is derived from an event log, not stored directly"] |
| 85 | [Unusual pattern 2 — e.g. "Auth is handled by the gateway — this service trusts the `X-User-Id` header"] |
| 86 | [Unusual pattern 3 — any non-obvious decisions or legacy choices] |
| 87 | |
| 88 | |
| 89 | |
| 90 | ## Local Development Setup |
| 91 | |
| 92 | **Estimated setup time:** [X minutes for a fresh machine] |
| 93 | |
| 94 | ### Prerequisites |
| 95 | |
| 96 | [ ] [Tool 1] — version [X] — [install link] |
| 97 | [ ] [Tool 2] — version [X] — [install link] |
| 98 | [ ] Access to [repo / internal package registry] — request from [who] |
| 99 | [ ] [Any secrets or credentials needed] — request from [who] |
| 100 | |
| 101 | ### Step-by-step setup |
| 102 | |
| 103 | |
| 104 | # 1. Clone the repo |
| 105 | git clone [repo URL] |
| 106 | cd [repo-name] |
| 107 | |
| 108 | # 2. Copy and configure environment variables |
| 109 | cp .env.example .env |
| 110 | # Edit .env — see "Environment Variables" section below |
| 111 | |
| 112 | # 3. Start dependencies (database, cache, etc.) |
| 113 | [docker compose up -d / make deps / etc.] |
| 114 | |
| 115 | # 4. Install dependencies |
| 116 | [npm install / go mod download / pip install -r requirements.txt] |
| 117 | |
| 118 | # 5. Run database migrations |
| 119 | [migration command] |
| 120 | |
| 121 | # 6. Start the service |
| 122 | [start command] |
| 123 | |
| 124 | # 7. Verify it's working |
| 125 | curl http://localhost:[PORT]/health |
| 126 | # Expected: {"status":"ok"} |
| 127 | |
| 128 | |
| 129 | **If this doesn't work:** Check [Troubleshooting section below] or ask in `#[channel]`. |
| 130 | |
| 131 | ### Environment Variables |
| 132 | |
| 133 | | Variable | Required | Description | Example | |
| 134 | |---|---|---|---| |
| 135 | | `DATABASE_URL` | Yes | Connection string for the primary DB | `postgres://localhost:5432/[db]` | |
| 136 | | `[VAR_2]` | Yes | [Description] | [Example] | |
| 137 | | `[VAR_3]` | No | [Description — default value] | [Example] | |
| 138 | |
| 139 | **Secrets for local dev:** [Where to get them — e.g. "Run `[command]` to pull from Vault" or "Ask [person] in #[channel]"] |
| 140 | |
| 141 | ### Useful local commands |
| 142 | |
| 143 | |
| 144 | [start command] # Start the service |
| 145 | [test command] # Run all tests |
| 146 | [lint command] # Run linter |
| 147 | [format command] # Format code |
| 148 | [migration command] # Run pending migrations |
| 149 | [seed command] # Seed local database |
| 150 | |
| 151 | |
| 152 | |
| 153 | |
| 154 | ## Testing |
| 155 | |
| 156 | **Testing philosophy:** [e.g. "We test at the integration layer — unit tests for pure functions, integration tests for anything touching the DB or external services"] |
| 157 | |
| 158 | ### Running tests |
| 159 | |
| 160 | |
| 161 | # All tests |
| 162 | [test command] |
| 163 | |
| 164 | # Unit tests only |
| 165 | [unit test command] |
| 166 | |
| 167 | # Integration tests (requires local deps running) |
| 168 | [integration test command] |
| 169 | |
| 170 | # A specific test file or test case |
| 171 | [test command with filter] |
| 172 | |
| 173 | |
| 174 | **Test coverage:** [X]% (minimum required to pass CI: [Y]%) |
| 175 | **Coverage report:** [Where to find it] |
| 176 | |
| 177 | ### Writing tests |
| 178 | |
| 179 | **Unit tests:** [Where to put them — e.g. alongside source files as `*_test.go`] |
| 180 | **Integration tests:** [Where to put them — e.g. `tests/integration/`] |
| 181 | **Test database:** [How it works — e.g. "Each test gets a clean transaction that rolls back on teardown — see `tests/helpers/db.go`"] |
| 182 | **Mocking:** [Policy — e.g. "We mock at the repository layer — don't mock the DB directly"] |
| 183 | |
| 184 | |
| 185 | |
| 186 | ## Making Changes |
| 187 | |
| 188 | ### Branching |
| 189 | |
| 190 | [Branch naming convention — e.g. `feature/[ticket-id]-short-description`, `fix/[ticket-id]-short-description`] |
| 191 | |
| 192 | ### Before opening a PR |
| 193 | |
| 194 | [ ] Tests pass locally |
| 195 | [ ] Linter passes (`[lint command]`) |
| 196 | [ ] New behaviour has test coverage |
| 197 | [ ] Any new environment variables are added to `.env.example` and documented |
| 198 | [ ] Database migrations are backward-compatible (old code can run against new schema) |
| 199 | |
| 200 | ### Code review |
| 201 | |
| 202 | **Reviewers:** [Who to request review from — e.g. "Any engineer on [team]; lead review required for auth changes"] |
| 203 | **Expected review time:** [X hours / 1 business day] |
| 204 | **PR template:** [Link or auto-generated by GitHub] |
| 205 | |
| 206 | ### Database migrations |
| 207 | |
| 208 | |
| 209 | # Create a new migration |
| 210 | [migration create command] |
| 211 | |
| 212 | # Apply pending migrations |
| 213 | [migration up command] |
| 214 | |
| 215 | # Roll back last migration |
| 216 | [migration down command] |
| 217 | |
| 218 | |
| 219 | **Migration rules:** |
| 220 | All migrations must be backward-compatible — old code must run against the new schema |
| 221 | Never rename or drop a column in a single migration — do it in two steps (add new, migrate data, drop old) |
| 222 | Test your rollback before merging |
| 223 | |
| 224 | |
| 225 | |
| 226 | ## Deployment |
| 227 | |
| 228 | **How code gets to production:** [1–2 sentence summary — link to full CI/CD playbook if it exists] |
| 229 | |
| 230 | Merge to `main` → automatic deploy to staging |
| 231 | Smoke tests run on staging |
| 232 | Manual approval → deploy to production |
| 233 | Post-deploy monitoring for [X minutes] |
| 234 | |
| 235 | **Deployment docs:** [Link to CI/CD playbook or pipeline docs] |
| 236 | |
| 237 | **Who can deploy:** [Any engineer / Lead engineer / On-call engineer — specify] |
| 238 | |
| 239 | **Deployment channel:** `#[deployments channel]` |
| 240 | |
| 241 | |
| 242 | |
| 243 | ## Monitoring and Observability |
| 244 | |
| 245 | **Dashboard:** [Datadog / Grafana / CloudWatch — link] |
| 246 | **Logs:** [Log aggregation tool and link — e.g. "Logs are in Datadog under service:[name]"] |
| 247 | **Traces:** [Tracing tool and link if applicable] |
| 248 | **Alerts:** [Where alerts fire — e.g. PagerDuty / Slack #alerts-[service]] |
| 249 | |
| 250 | **Key metrics to know:** |
| 251 | **Error rate:** Should be <[X]% (alert at [Y]%) |
| 252 | **P99 latency:** Should be <[X]ms |
| 253 | **[Business metric]:** [e.g. "Queue depth should be <100 items"] |
| 254 | |
| 255 | |
| 256 | |
| 257 | ## On-Call |
| 258 | |
| 259 | **On-call schedule:** [PagerDuty / Opsgenie link] |
| 260 | **Who's on-call now:** [Link to current schedule or `#oncall` channel] |
| 261 | **Escalation:** [On-call → [team lead] → [EM] — after [X] minutes unacknowledged] |
| 262 | |
| 263 | **If you get paged:** |
| 264 | Acknowledge the alert |
| 265 | Check [dashboard link] for the first clue |
| 266 | Common alert runbooks: [link to oncall-runbook or runbook-writer output] |
| 267 | If you can't resolve in [X minutes], escalate to [person/channel] |
| 268 | |
| 269 | |
| 270 | |
| 271 | ## Key Contacts |
| 272 | |
| 273 | | Role | Name | Best way to reach | |
| 274 | |---|---|---| |
| 275 | | Tech lead | [Name] | Slack: @[handle] | |
| 276 | | On-call rotation | [Team] | PagerDuty / `#on-call` | |
| 277 | | Platform / infra | [Team] | `#platform` Slack channel | |
| 278 | | Database / DBA | [Name or team] | `#database` Slack channel | |
| 279 | | [Upstream service] owner | [Name] | Slack: @[handle] | |
| 280 | |
| 281 | **Where to ask questions:** |
| 282 | General engineering: `#engineering` |
| 283 | This service specifically: `#[service-name]` |
| 284 | Urgent / production issues: `#incidents` |
| 285 | |
| 286 | |
| 287 | |
| 288 | ## Troubleshooting |
| 289 | |
| 290 | ### "The service won't start locally" |
| 291 | |
| 292 | Check that Docker / dependencies are running: `[command]` |
| 293 | Check `.env` is populated — missing values cause silent failures |
| 294 | Check logs: `[log command]` |
| 295 | Ask in `#[channel]` |
| 296 | |
| 297 | ### "Tests are failing locally but passing in CI" |
| 298 | |
| 299 | Check your local dependency versions match CI: `[version check command]` |
| 300 | Try a clean install: `[clean install command]` |
| 301 | Integration tests need local deps running — `[start deps command]` |
| 302 | |
| 303 | ### "I can't access [internal tool / system]" |
| 304 | |
| 305 | Request access through [process — e.g. Okta self-serve / ask your manager] |
| 306 | |
| 307 | ### "Something looks wrong in production" |
| 308 | |
| 309 | Check [dashboard] for the error spike |
| 310 | Check recent deploys in `#deployments` |
| 311 | If it's an active incident, page on-call via [PagerDuty / Slack command] |
| 312 | |
| 313 | |
| 314 | |
| 315 | ## Further Reading |
| 316 | |
| 317 | [Architecture Decision Records (ADRs)] — why the codebase is the way it is |
| 318 | [API documentation] or [link to external docs] |
| 319 | [Incident runbooks] |
| 320 | [CI/CD pipeline documentation] |
| 321 | [Team working agreements] |
| 322 | |
| 323 | |
| 324 | |
| 325 | ## Quality Checks |
| 326 | |
| 327 | [ ] Local setup instructions work on a fresh machine — tested recently |
| 328 | [ ] Environment variables table is complete and accurate |
| 329 | [ ] "Things that might surprise you" captures the actual surprises (ask a recent joiner) |
| 330 | [ ] On-call section has real links, not placeholders |
| 331 | [ ] Contacts are current — team members with real Slack handles |
| 332 | [ ] Troubleshooting covers the top 3 actual questions new joiners ask |
| 333 | |
| 334 | ## Anti-Patterns |
| 335 | |
| 336 | [ ] Do not document the ideal setup — document the actual setup; real oddities and gotchas are what new engineers need most |
| 337 | [ ] Do not leave placeholder contacts like "ask your manager" — name specific people for each domain or the doc becomes useless when the new joiner has an urgent question |
| 338 | [ ] Do not write the onboarding doc without reviewing it with a recent joiner — the author is blind to what they take for granted |
| 339 | [ ] Do not include every piece of architectural detail — an onboarding doc that covers everything teaches nothing; link to deeper docs instead |
| 340 | [ ] Do not skip the "things that might surprise you" section — undocumented non-obvious patterns are the number one cause of wasted engineering time in the first week |
| 341 |
Discussion
Browse more free Claude skills or everything in Development.


