- Create a branch from the default branch.
- Make focused changes (prefer smaller PRs).
- Ensure lint/build pass for impacted workspaces.
- Commit using the required commit format (below).
- Open a PR with a clear description and validation notes.
Every commit must start with a valid change type:
feat— new functionalityfix— bug fixdocs— documentation onlychore— maintenance, tooling, housekeepingrefactor— code change that neither fixes a bug nor adds a featureperf— performance improvementbuild— build system / dependenciesci— CI configuration/scriptsrevert— revert a prior commit
We use Conventional-Commit-inspired scopes to clarify where changes land.
- If your change is scoped to one app, the scope must be that app/workspace.
- Example:
feat(docs): update page layout
- Example:
- If your change intentionally spans multiple apps/packages, you must use an empty scope (no parentheses).
- Example:
chore: align eslint rules across apps
- Example:
Every commit must include a Linear issue reference in the commit body.
Example:
fix(admin): prevent crash on empty results
Linear: DR-482
Notes
- The Linear reference must be in the body, not just the title.
- If a commit truly has no issue, create one first.
<type>(<scope>): <subject>
<body>
type: required (see list above)scope: required for single-app changes; must be empty for cross-boundary changessubject: short, imperative, no trailing periodbody: must include Linear reference (required)
Single app change (scoped):
feat(docs): update getting started
Linear: DC-53423
Single app bug fix (scoped):
fix(docs): ensure UTMs are persisted
Linear: DC-233
Cross-boundary change (empty scope):
chore: update shared lint rules and apply fixes
Linear: DC-1288
Use the same version for a given dependency across all apps and packages (e.g. the same react, typescript, or next range everywhere). When adding or upgrading a dependency used in multiple workspaces, update every package.json that lists it so versions stay aligned.
- Prefer changes that only touch the necessary app/package.
- If you need shared updates, ensure they’re intentional and explained in the PR.
Run checks for affected workspaces where possible:
pnpm run lintpnpm run build
PR titles should follow the same convention as commits:
feat(app): …fix(app): …chore: …(for cross-boundary)
- What changed and why
- How it was tested (commands + notes)
- Screenshots for UI changes (when applicable)
- Follow-ups / known limitations
- Prefer clarity over cleverness.
- Avoid drive-by refactors inside feature/bugfix PRs.
- Follow existing patterns within each app.