Writing pull request titles and descriptions for the tldraw repository. Use when creating a new PR, updating an existing PR's title or body, or when the /pr command needs PR content guidance.
Standards for PR titles and descriptions in tldraw/tldraw.
Use semantic PR titles (Conventional Commits format):
<type>(<scope>): <description>
feat - New featurefix - Bug fixdocs - Documentation onlyrefactor - Code change that neither fixes a bug nor adds a featureperf - Performance improvementtest - Adding or fixing testschore - Maintenance tasksA noun describing the affected area: fix(editor):, feat(sync):, docs(examples):
feat(editor): add snap threshold configuration optionfix(arrows): correct binding behavior with rotated shapesdocs: update sync documentationrefactor(store): simplify migration systemUse this template:
<description paragraph>
### Change type
- [x] `bugfix` | `improvement` | `feature` | `api` | `other`
### Test plan
1. Step to test...
2. Another step...
- [ ] Unit tests
- [ ] End to end tests
### Release notes
- Brief description of changes for users
Start with: "In order to X, this PR does Y."
[x]When a PR introduces a new system, several new types/APIs, or otherwise has enough surface area that a reviewer would benefit from a glossary, include extra explanatory sections above the standard ### Change type / ### Test plan / ### Release notes block. Skip these for small or focused PRs — they're for features and large refactors.
Pull from this menu, in roughly this order, using only what fits:
Term | Type | Meaning columns. Use this when readers need a shared vocabulary to follow the rest of the description.Method | Description and Prop | Type | Description tables for new public surface.apps/examples/src/examples/, with a one-line description each, so reviewers know where to look for runnable demos.Reference: tldraw/tldraw#8410 is a good worked example of all of these sections together.
These sections come before ### Change type. The standard ### Change type / ### Test plan / ### Release notes / ### API changes / ### Code changes blocks still appear at the bottom in the usual order.
Include when changes affect api-report.md:
### API changes
- Added `Editor.newMethod()` for X
- Breaking! Removed `Editor.oldMethod()`
- Changed `Editor.method()` to accept optional `options` parameter
Create a table that includes net LOC changes for each of the following sections. The sum of all rows must match the total PR diff. Omit rows with no changes.
packages/) source, excluding tests and API reports*.test.*, e2e/)api-report.api.md, snapshots)apps/docs/, apps/examples/)apps/dotcom/, apps/mcp-app/, apps/vscode/, etc.), excluding e2e teststemplates/)eslint.config.*, yarn.lock, etc.)### Code changes
| Section | LOC change |
| --------------- | ---------- |
| Core code | +10 / -2 |
| Tests | +5 / -0 |
| Automated files | +0 / -1 |
| Documentation | +2 / -0 |
| Apps | +3 / -1 |
| Templates | +0 / -0 |
| Config/tooling | +1 / -0 |
Search for and link relevant issues that this PR addresses.
The PR author often writes a personal note at the very top of the description, prefaced with a "person" emoji such as 🅯 or 👨 (or similar). This block is human-written and readers trust it as such.
--- horizontal rule. Preserve everything from the person emoji through (and including) that --- exactly.---, the human note is just the leading paragraph led by the person emoji.--- if present).