Build what's next on GitHub, the place for anyone from anywhere to build anything.
Join us October 28-29 in San Francisco or online for GitHub Universe, our flagship developer event uniting people, agents, and the world's code.
Level up your use of GitHub Projects on the command line and in GitHub Actions with the new project CLI command.

Effective planning and tracking is essential for developer teams of all shapes and sizes. Last year, we announced the general availability of GitHub Projects, connecting your planning directly to the work your teams are doing in GitHub. Today, we’re making GitHub Projects faster and more powerful. The project command for the gh CLI is now generally available!
In this blog, we’ll take a look at how to get started with the new command, share some examples you can try on the command line and in GitHub Actions, and list the steps to upgrade from the archived gh-projects extension. Let’s take a look at how you can conveniently manage and collaborate on GitHub Projects from the command line.
Let’s start by familiarizing ourselves with the key components of GitHub Projects. A project is made up of three components—the Project, Project field(s), and Project item(s).
A Project belongs to an owner (which can be either a user or an organization), and is identified by a project number. As an example, the GitHub public roadmap project is number 4247 in the github organization. We’ll use this project in some of our examples later on.

Project fields belong to a Project and have a type such as Status, Assignee, or Number, while field values are set on an item. See understanding fields for more details.
Project items are one of type draft issue, issue, or pull request. An item of type draft issue belongs to a single Project, while items of type issue and pull request can be added to multiple projects.
These three components make up the subcommands of gh project, for example:
create, copy, list, and view.field-create, field-list , and field-delete.item-add, item-edit, item-archive, and item-list.For the full list of project commands, check out the manual.
In order to get started with the new command, you’ll need to ensure you have the right permissions. The project command requires the project auth scope, which isn’t part of the default scopes of the gh auth token.
In your terminal, you can check your current scopes with this command:
If you don’t see project in the list of token scopes, you can add it by following the interactive prompts from this command:
$ gh auth refresh -s project
$ gh auth refresh -s project
In GitHub Actions, you must choose one of the options from the documentation to make a token with the project scope available.
project commandsNow that you have the permissions you need, let’s look at some examples of running project commands using my user and the GitHub public roadmap project, which you can adapt to your team’s use cases.
List the projects owned by the current user (note that no --owner flag is set):
$ gh project list NUMBER TITLE STATE ID 1 my first project open PVT_kwxxx 2 @mntlty's second project open PVT_kwxxx
$ gh project list
NUMBER TITLE STATE ID
1 my first project open PVT_kwxxx
2 @mntlty's second project open PVT_kwxxx
Create a project owned by mntlty:
$ gh project create --owner mntlty --title 'my project'
$ gh project create --owner mntlty --title 'my project'
View the GitHub public roadmap project:
$ gh project view --owner github 4247 Title GitHub public roadmap ## Description -- ## Visibility Public ## URL <https://github.com/orgs/github/projects/4247> ## Item count 208 ## Readme -- ## Field Name (Field Type) Title (ProjectV2Field) Assignees (ProjectV2Field) Status (ProjectV2SingleSelectField) Labels (ProjectV2Field) Repository (ProjectV2Field) Milestone (ProjectV2Field) Linked pull requests (ProjectV2Field) Reviewers (ProjectV2Field) Tracks (ProjectV2Field) Tracked by (ProjectV2Field)
$ gh project view --owner github 4247
Title
GitHub public roadmap
## Description
--
## Visibility
Public
## URL
<https://github.com/orgs/github/projects/4247>
## Item count
208
## Readme
--
## Field Name (Field Type)
Title (ProjectV2Field)
Assignees (ProjectV2Field)
Status (ProjectV2SingleSelectField)
Labels (ProjectV2Field)
Repository (ProjectV2Field)
Milestone (ProjectV2Field)
Linked pull requests (ProjectV2Field)
Reviewers (ProjectV2Field)
Tracks (ProjectV2Field)
Tracked by (ProjectV2Field)
List the items in the GitHub public roadmap project:
$ gh project item-list --owner github 4247 TYPE TITLE NUMBER REPOSITORY ID Issue Kotlin security analysis support in CodeQL code scanning (public beta) 207 github/roadmap PVTI_lADNJr_NE13OAALQgw Issue Swift security analysis support in CodeQL code scanning (beta) 206 github/roadmap PVTI_lADNJr_NE13OAALQhA Issue Fine-grained PATs (v2 PATs) - [Public Beta] 184 github/roadmap PVTI_lADNJr_NE13OAALQmw
$ gh project item-list --owner github 4247
TYPE TITLE NUMBER REPOSITORY ID
Issue Kotlin security analysis support in CodeQL code scanning
(public beta) 207 github/roadmap
PVTI_lADNJr_NE13OAALQgw
Issue Swift security analysis support in CodeQL code scanning
(beta) 206 github/roadmap
PVTI_lADNJr_NE13OAALQhA
Issue Fine-grained PATs (v2 PATs) - [Public Beta]
184 github/roadmap PVTI_lADNJr_NE13OAALQmw
Copy the GitHub public roadmap project structure to a new project owned by mntlty:
$ gh project copy 4247 --source-owner github --target-owner mntlty --title 'my roadmap' https://github.com/users/mntlty/projects/1
$ gh project copy 4247 --source-owner github --target-owner mntlty --title 'my roadmap'
https://github.com/users/mntlty/projects/1
Note that if you are using a TTY and do not pass a --owner flag or the project number argument to a command which requires those values, an interactive prompt will be shown from which you can select those values.
Now, let’s look at how to format the command output in JSON, which displays more information for use in scripting, automation, and piping into other commands. Every project subcommand supports outputting to JSON format by setting the --format=json flag:
$ gh project view --owner github 4247 --format=json
{"number":4247,"url":"<https://github.com/orgs/github/projects/4247","shortDescription":"", "public":true,"closed":false,"title":"GitHub> public roadmap","id":"PVT_kwDNJr_NE10","readme":"","items":{"totalCount":208},"fields":{"totalCount":10},"owner":{"type":"Organization","login":"github"}}%
$ gh project view --owner github 4247 --format=json
{"number":4247,"url":"<https://github.com/orgs/github/projects/4247","shortDescription":"", "public":true,"closed":false,"title":"GitHub> public roadmap","id":"PVT_kwDNJr_NE10","readme":"","items":{"totalCount":208},"fields":{"totalCount":10},"owner":{"type":"Organization","login":"github"}}%
Combining JSON formatted output with a tool such as jq enables you to unlock even more capabilities. For example, you can create a list of the URLs from all of the Issues on the GitHub public roadmap project that have status “Future”:
$ gh project item-list --owner github 4247 --format=json | jq '.items[] | select(.status=="Future" and .content.type == "Issue") | .content.url' "<https://github.com/github/roadmap/issues/188>" "<https://github.com/github/roadmap/issues/187>" "<https://github.com/github/roadmap/issues/166>"
$ gh project item-list --owner github 4247 --format=json | jq '.items[] |
select(.status=="Future" and .content.type == "Issue") | .content.url'
"<https://github.com/github/roadmap/issues/188>"
"<https://github.com/github/roadmap/issues/187>"
"<https://github.com/github/roadmap/issues/166>"
You can also level up your team’s usage of GitHub Projects with project commands in your GitHub Actions workflows to enhance automation, generate on demand reports, and react to events such as when a project item is modified. For example, you can create a workflow which is triggered by a workflow_dispatch event and will close all projects that are owned by mntlty and which have no items:
on:
workflow_dispatch:
jobs:
close_empty:
runs-on: ubuntu-latest
env:
GH_TOKEN: $
steps:
- run: |
gh project list --owner mntlty --format=json \
| jq '.projects[] | select(.items.totalCount == 0) | .number' \
| xargs -n1 gh project close --owner mntlty
on:
workflow_dispatch:
jobs:
close_empty:
runs-on: ubuntu-latest
env:
GH_TOKEN: $
steps:
- run: |
gh project list --owner mntlty --format=json \
| jq '.projects[] | select(.items.totalCount == 0) | .number' \
| xargs -n1 gh project close --owner mntlty
The latest version of gh is automatically available in the GitHub Actions environment. For more information on using GitHub Actions, see https://docs.github.com/en/actions.
gh-projects extensionNow that the project command is officially part of the CLI, the gh-projects extension repository has been archived. If you’re currently using the extension, you don’t need to change anything. You can continue installing and using the gh-projects extension; however, it won’t receive any future enhancements. Fortunately, it’s very simple to make the transition from the gh-project extension to the project command:
gh.--user and --org with --owner in project commands. owner is the login of the project owner, which is either a user or an organization.gh projects with gh project.To avoid confusion, I also recommend removing the extension by running the following command:
$ gh ext remove gh-projects
$ gh ext remove gh-projects
Thank you to the community, @mislav, @samcoe, and @vilmibm for providing invaluable feedback and support on gh-projects!
project command todayIf you’re interested in learning more or giving us feedback, check out these links:
Upgrade to the latest version of the gh CLI to level up your usage of GitHub Projects!