Skip to content
85 linesCodeBlameRaw
1---
2title: Milestones
3description: Gather issues and pull requests under a goal and a due date, and see how much of it is done.
4---
5
6A milestone gathers issues and pull requests under one goal, such as a
7release, with an optional due date. Its page shows everything in it and how
8far along it is: the share of its issues and pull requests that are
9closed. A merged pull request counts as closed.
10
11## Make a milestone
12
13You need the Triage [role](/guides/access-and-roles/) or higher.
14
151. Open the project's **Issues**, then **Milestones**.
162. Choose **New milestone**.
173. Give it a title, unique in the repository, and if you like a due date
18 and a description. The description is Markdown.
194. Choose **Create milestone**.
20
21Milestones are numbered from 1 in each repository, apart from issues and
22pull requests. The number is in its address:
23`g1t.sh/<owner>/<repo>/milestones/3`.
24
25## Put an issue or a pull request in one
26
271. Open the issue or pull request.
282. In the sidebar, choose the settings icon beside **Milestone**.
293. Pick a milestone, or **Clear milestone** to take it out.
30
31An item is in at most one milestone. Moving it is noted in the
32conversation, and is an `issue.milestoned` or `issue.demilestoned` event
33(`pull.milestoned` and `pull.demilestoned` on a pull request). With the
34Triage role you can also choose a milestone on **New issue**.
35
36## Follow its progress
37
38**Milestones** lists open milestones soonest due first, then those without
39a due date; **Closed** lists the rest, most recently closed first. Each
40shows its due date, how many of its items are open and closed, and a bar
41of how much is done. One whose due date has passed says how late it is.
42
43A milestone's page lists its open and closed issues and pull requests,
44newest first. On **Issues** or **Pull requests**, choose **Milestone** to
45filter the list by one; the address keeps it as `?milestone=3`.
46
47## Change, close or delete one
48
49With the Write role or higher, on **Milestones** or a milestone's page (putting an issue in one needs only Triage):
50
51| To | Do this |
52| --- | --- |
53| Change its title, due date or description | **Edit**, on its page. |
54| Close it, once it is done | **Close**. **Reopen** opens it again. |
55| Delete it | **Delete**. What was in it stays as it is, in no milestone. This cannot be undone. |
56
57## From the API
58
59| To | REST | MCP |
60| --- | --- | --- |
61| List milestones | `GET /repos/{owner}/{name}/milestones`, `state` to filter | `repository` `list_milestones` |
62| Get one with its items | `GET /repos/{owner}/{name}/milestones/{milestone}` | `repository` `get_milestone` |
63| Make one | `POST /repos/{owner}/{name}/milestones` | `repository` `create_milestone` |
64| Change one | `PATCH /repos/{owner}/{name}/milestones/{milestone}` | `repository` `update_milestone` |
65| Delete one | `DELETE /repos/{owner}/{name}/milestones/{milestone}` | `repository` `delete_milestone` |
66
67A milestone has `number`, `title`, `description`, `due_on` (`YYYY-MM-DD`),
68`state` (`open` or `closed`), `open_items` and `closed_items`. Send
69`"due_on": ""` to clear a due date, and `"state": "closed"` to close it.
70
71```sh
72curl -X POST https://api.g1t.sh/repos/acme/web/milestones \
73 -H "Authorization: Bearer $G1T_TOKEN" \
74 -H "Content-Type: application/json" \
75 -d '{"title": "Launch", "due_on": "2026-10-14"}'
76```
77
78`milestone`, a milestone's number, puts an item in it on `create_issue`,
79`update_issue` and `update_pull_request`; `null` or `0` takes it out.
80Issues and pull requests carry `milestone` as `{"number", "title"}`, and
81`milestone` filters `list_issues` and `list_pull_requests`. Managing
82milestones needs a token with `issues:write`.
83
84[Dependency updates](/guides/dependency-updates/) put their pull requests
85in the milestone their entry's `milestone` names.