Developer Onboarding Document Skill

Write a developer onboarding document for a service, codebase, or team.

Developer Onboarding Document Skill — The Skill Playground: pick the Executive Update skill, fill in a few notes, hit run, and watch a structured executive… (from the mohitagw15856/pm-claude-skills README)

From the mohitagw15856/pm-claude-skills README — shows the whole collection, not only this skill. · view on GitHub

How to use it

Claude Code
  1. Run the line below. It pulls the whole folder into ~/.claude/skills/developer-onboarding-doc, including the files SKILL.md points to.
  2. Describe your job in plain words. Claude Code follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit mohitagw15856/pm-claude-skills/skills/developer-onboarding-doc#main ~/.claude/skills/developer-onboarding-doc

For 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)
  1. On this page open ⋯ → Download .md.
  2. Save it as SKILL.md in a folder, zip the folder, then Customize → Skills → + → Create skill → Upload a skill.
  3. Pick the file and Save. Claude shows the name and description and runs a security scan.
  4. Check the skill is switched on.
  5. Start a new chat and describe your job in plain words. The AI follows the skill from there.
ChatGPT or another app
  1. ChatGPT: make a Project and paste it into Instructions.
  2. 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.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Source of Developer Onboarding Document Skill

Show the full text341 lines
namedescription
developer-onboarding-docWrite 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-Id header"]
  • [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.example and 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]

  1. Merge to main → automatic deploy to staging
  2. Smoke tests run on staging
  3. Manual approval → deploy to production
  4. 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:

  1. Acknowledge the alert
  2. Check [dashboard link] for the first clue
  3. Common alert runbooks: [link to oncall-runbook or runbook-writer output]
  4. 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"
  1. Check that Docker / dependencies are running: [command]
  2. Check .env is populated — missing values cause silent failures
  3. Check logs: [log command]
  4. 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"
  1. Check [dashboard] for the error spike
  2. Check recent deploys in #deployments
  3. If it's an active incident, page on-call via [PagerDuty / Slack command]

Further Reading


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---
2name: developer-onboarding-doc
3description: "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 
8Produce a complete developer onboarding document for a service or team — covering everything a new engineer needs to be productive within their first week.
9 
10A 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 
14Ask 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```bash
104# 1. Clone the repo
105git clone [repo URL]
106cd [repo-name]
107 
108# 2. Copy and configure environment variables
109cp .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
125curl 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```bash
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```bash
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```bash
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 
2301. Merge to `main` → automatic deploy to staging
2312. Smoke tests run on staging
2323. Manual approval → deploy to production
2334. 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:**
2641. Acknowledge the alert
2652. Check [dashboard link] for the first clue
2663. Common alert runbooks: [link to oncall-runbook or runbook-writer output]
2674. 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 
2921. Check that Docker / dependencies are running: `[command]`
2932. Check `.env` is populated — missing values cause silent failures
2943. Check logs: `[log command]`
2954. 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 
3091. Check [dashboard] for the error spike
3102. Check recent deploys in `#deployments`
3113. 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)](./docs/decisions/) — why the codebase is the way it is
318- [API documentation](./docs/api/) or [link to external docs]
319- [Incident runbooks](./docs/runbooks/)
320- [CI/CD pipeline documentation](./docs/cicd/)
321- [Team working agreements](./docs/team/)
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

Alternatives

Also in TestingSee all 533 in Development →