Reference
Capability matrix
Which operations each forge supports.
The table lists every capability for every provider. The GitHub column assumes app auth with an installation. With a token, installations is ❌. The Tangled column assumes that notificationsUrl is set.
See Capabilities for the meaning of each value. The provider pages have one table per forge.
| Capability | GitHub | GitLab | Bitbucket | Forgejo | Gitea | Gitee | Azure DevOps | Cursor Origin | pushin.eu | Tangled |
|---|---|---|---|---|---|---|---|---|---|---|
experimental | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ❌ |
sources.poll | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
sources.webhook | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ |
sources.subscribe | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
repos.get | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
users.get | ✅ | ✅ | ❌ | ✅ | ✅ | experimental | ❌ | ❌ | ❌ | ❌ |
repos.list | ✅ | ✅ | experimental | ✅ | ✅ | experimental | experimental | experimental | experimental | experimental |
repos.labels | ✅ | ✅ | ❌ | ✅ | ✅ | experimental | ❌ | ❌ | ✅ | ❌ |
repos.createLabel | experimental | experimental | ❌ | experimental | experimental | experimental | ❌ | ❌ | ❌ | ❌ |
repos.milestones | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
repos.collaborators | ✅ | ✅ | ❌ | ✅ | ✅ | experimental | ❌ | ❌ | experimental | ❌ |
repos.permissionFor | ✅ | ✅ | ❌ | experimental | experimental | ❌ | ❌ | ❌ | ❌ | ❌ |
repos.addCollaborator | experimental | experimental | ❌ | experimental | experimental | ❌ | ❌ | ❌ | ❌ | ❌ |
repos.assignableUsers | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
repos.reviewerCandidates | emulated | emulated | ❌ | experimental | experimental | ❌ | ❌ | ❌ | ❌ | ❌ |
threads.get | issue, PR, discussion, commit (experimental) | issue, PR, commit (experimental) | issue (experimental), PR, commit (experimental) | issue, PR, commit (experimental) | issue, PR, commit (experimental) | issue (experimental), PR | issue (experimental), PR | PR | issue, PR (experimental) | issue, PR |
threads.list | issue, PR, discussion | issue, PR | issue (experimental), PR | issue, PR | issue, PR | issue (experimental), PR | issue, PR | PR | issue, PR (experimental) | issue (experimental), PR |
threads.getMany | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
comments.list | issue, PR, discussion, commit (experimental) | issue, PR, commit (experimental) | issue (experimental), PR, commit (experimental) | issue, PR | issue, PR | issue (experimental), PR | issue (experimental), PR | PR | issue, PR (experimental) | issue, PR |
comments.edit | issue (experimental), PR, discussion (experimental), commit (experimental) | issue (experimental), PR (experimental) | issue (experimental), PR (experimental), commit (experimental) | issue (experimental), PR (experimental) | issue (experimental), PR (experimental) | issue (experimental), PR (experimental) | issue (experimental), PR (experimental) | PR (experimental) | ❌ | issue (experimental), PR (experimental) |
comments.delete | issue (experimental), PR, discussion (experimental), commit (experimental) | issue (experimental), PR (experimental) | issue (experimental), PR (experimental), commit (experimental) | issue (experimental), PR (experimental) | issue (experimental), PR (experimental) | issue (experimental), PR (experimental) | issue (experimental), PR (experimental) | PR (experimental) | ❌ | issue (experimental), PR (experimental) |
reactions.list | issue, PR, discussion | issue, PR | ❌ | issue, PR | issue, PR | ❌ | ❌ | ❌ | ❌ | ❌ |
notifications.list | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | experimental | experimental |
notifications.markRead | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | experimental |
notifications.markDone | ✅ | ✅ | ❌ | emulated | emulated | ❌ | ❌ | ❌ | ❌ | ❌ |
notifications.unsubscribe | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
notifications.markAllRead | ✅ | ❌ | ❌ | ✅ | ✅ | experimental | ❌ | ❌ | ❌ | experimental |
notifications.markAllDone | ❌ | experimental | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
notifications.unreadCount | ❌ | ✅ | ❌ | ✅ | ✅ | experimental | ❌ | ❌ | ❌ | experimental |
writes.comment | issue (experimental), PR, discussion, commit (experimental) | issue (experimental), PR, commit (experimental) | issue (experimental), PR, commit (experimental) | issue (experimental), PR | issue (experimental), PR | issue (experimental), PR | issue (experimental), PR | PR | ❌ | issue (experimental), PR |
writes.upsertComment | issue (emulated), PR (emulated), discussion (emulated), commit (emulated) | issue (emulated), PR (emulated) | issue (emulated), PR (emulated), commit (emulated) | issue (emulated), PR (emulated) | issue (emulated), PR (emulated) | issue (emulated), PR (emulated) | issue (emulated), PR (emulated) | PR (emulated) | ❌ | issue (emulated), PR (emulated) |
writes.close | issue, PR, discussion | issue (experimental), PR | issue (experimental), PR | issue (experimental), PR | issue (experimental), PR | issue, PR | issue, PR | PR | ❌ | issue (experimental), PR |
writes.reopen | issue (experimental), PR, discussion | issue (experimental), PR | issue (experimental) | issue (experimental), PR | issue (experimental), PR | issue (experimental), PR | issue (experimental), PR | PR | ❌ | issue (experimental), PR |
writes.create | issue, PR (experimental) | issue (experimental), PR (experimental) | issue (experimental), PR (experimental) | issue (experimental), PR (experimental) | issue (experimental), PR (experimental) | issue (experimental), PR (experimental) | issue (experimental), PR (experimental) | PR (experimental) | ❌ | issue (experimental) |
writes.update | issue (experimental), PR, discussion (experimental) | issue (experimental), PR (experimental) | issue (experimental), PR (experimental) | issue (experimental), PR (experimental) | issue (experimental), PR (experimental) | issue (experimental), PR (experimental) | issue (experimental), PR (experimental) | PR (experimental) | ❌ | issue (experimental), PR (experimental) |
writes.setLabels | issue (experimental), PR | issue (experimental), PR (experimental) | ❌ | issue (experimental), PR (experimental) | issue (experimental), PR (experimental) | issue (experimental), PR (experimental) | issue (experimental), PR (experimental) | PR (experimental) | ❌ | ❌ |
writes.addLabels | issue (experimental), PR | issue (experimental), PR (experimental) | ❌ | issue (experimental), PR (experimental) | issue (experimental), PR (experimental) | issue (experimental), PR (experimental) | ❌ | ❌ | ❌ | ❌ |
writes.removeLabels | issue (experimental), PR | issue (experimental), PR (experimental) | ❌ | issue (experimental), PR (experimental) | issue (experimental), PR (experimental) | issue (experimental), PR (experimental) | ❌ | ❌ | ❌ | ❌ |
writes.setMilestone | issue (experimental), PR (experimental) | issue (experimental), PR (experimental) | ❌ | issue (experimental), PR (experimental) | issue (experimental), PR (experimental) | ❌ | ❌ | ❌ | ❌ | ❌ |
writes.react | issue (experimental), PR, discussion (experimental) | issue (experimental), PR (experimental) | ❌ | issue (experimental), PR (experimental) | issue (experimental), PR (experimental) | ❌ | ❌ | ❌ | ❌ | ❌ |
writes.setAssignees | issue (experimental), PR | issue (experimental), PR (experimental) | issue (experimental) | issue (experimental), PR (experimental) | issue (experimental), PR (experimental) | issue (experimental) | issue (experimental) | ❌ | ❌ | ❌ |
writes.requestReview | PR | PR (experimental) | PR (experimental) | PR (experimental) | PR (experimental) | PR (experimental) | PR (experimental) | PR (experimental) | ❌ | ❌ |
writes.merge | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
writes.approveAndMerge | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
writes.transfer | experimental | experimental | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
writes.markDuplicate | experimental | emulated | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
subscriptions.get | issue, PR, discussion | issue, PR | issue (experimental) | issue, PR | issue, PR | ❌ | ❌ | ❌ | ❌ | issue (experimental), PR (experimental) |
subscriptions.set | issue, PR, discussion | issue, PR | issue (experimental) | issue, PR | issue, PR | ❌ | ❌ | ❌ | ❌ | issue (experimental), PR (experimental) |
installations | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
checks.thread | PR | PR | PR | PR | PR | PR | PR | PR | ❌ | ❌ |
checks.list | ✅ | ✅ | ✅ | ✅ | ✅ | experimental | experimental | experimental | ❌ | ❌ |
checks.report | ✅ | experimental | experimental | experimental | experimental | ❌ | experimental | ❌ | ❌ | ❌ |
checks.rerun | ✅ | experimental | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
ci.runs | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
ci.run | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
ci.jobs | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
ci.log | ✅ | experimental | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
contents.file | ✅ | ✅ | ✅ | ✅ | ✅ | experimental | experimental | experimental | ❌ | ❌ |
contents.tree | ✅ | ✅ | ✅ | ✅ | ✅ | experimental | experimental | experimental | ❌ | ❌ |
contents.branches | ✅ | ✅ | ✅ | ✅ | ✅ | experimental | experimental | experimental | ❌ | ❌ |
contents.tags | ✅ | ✅ | ✅ | ✅ | ✅ | experimental | experimental | experimental | ❌ | ❌ |
contents.resolveRef | ✅ | ✅ | ✅ | ✅ | ✅ | experimental | experimental | experimental | ❌ | ❌ |
contents.commits | ✅ | ✅ | ✅ | ✅ | ✅ | experimental | experimental | experimental | ❌ | ❌ |
contents.commit | ✅ | ✅ | ✅ | ✅ | ✅ | experimental | experimental | experimental | ❌ | ❌ |
contents.compare | ✅ | ✅ | ✅ | ✅ | ✅ | experimental | experimental | experimental | ❌ | ❌ |
contents.threadFiles | ✅ | ✅ | ✅ | ✅ | ✅ | experimental | ❌ | experimental | ❌ | ❌ |
contents.threadCommits | ✅ | ✅ | ✅ | ✅ | ✅ | experimental | experimental | experimental | ❌ | ❌ |
reviews.list | ✅ | emulated | emulated | ✅ | ✅ | ❌ | emulated | ✅ | ❌ | ❌ |
reviews.create | ✅ | emulated | emulated | experimental | experimental | emulated | emulated | experimental | ❌ | ❌ |
reviews.submit | ✅ | ❌ | ❌ | experimental | experimental | ❌ | ❌ | ❌ | ❌ | ❌ |
reviews.approve | ✅ | ✅ | emulated | experimental | experimental | emulated | emulated | experimental | ❌ | ❌ |
reviews.resolveThread | ✅ | experimental | ❌ | ❌ | ❌ | ❌ | experimental | experimental | ❌ | ❌ |
releases.list | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
releases.get | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
releases.latest | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
releases.getByTag | ✅ | ✅ | ❌ | ✅ | ✅ | experimental | ❌ | ❌ | ❌ | ❌ |
releases.downloadAsset | ✅ | ❌ | ❌ | experimental | experimental | ❌ | ❌ | ❌ | ❌ | ❌ |
webhooks.list | ✅ | experimental | experimental | experimental | experimental | experimental | ❌ | ❌ | ❌ | ❌ |
webhooks.create | ✅ | experimental | experimental | experimental | experimental | experimental | ❌ | ❌ | ❌ | ❌ |
webhooks.update | ✅ | experimental | experimental | experimental | experimental | experimental | ❌ | ❌ | ❌ | ❌ |
webhooks.delete | ✅ | experimental | experimental | experimental | experimental | experimental | ❌ | ❌ | ❌ | ❌ |
webhooks.rotateSecret | experimental | experimental | experimental | experimental | experimental | experimental | ❌ | ❌ | ❌ | ❌ |
webhooks.deliveries | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
webhooks.redeliver | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
search.threads | ✅ | ✅ | experimental | ✅ | ✅ | experimental | experimental | ❌ | ❌ | ❌ |
search.repos | ✅ | ✅ | experimental | ✅ | ✅ | experimental | ❌ | ❌ | ❌ | ❌ |
search.commits | ✅ | experimental | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
securityAlerts | dependency (experimental), code scanning (experimental), secret (experimental) | dependency (experimental), code scanning (experimental), secret (experimental) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
eventKinds | native | heuristic | native | native | native | native | native | native | native | native |
auth | token, app, anonymous | token, anonymous | token, basic, anonymous | token, anonymous | token, anonymous | token, anonymous | token, basic, anonymous | token, app | token, anonymous | anonymous, app_password, oauth |
limits | body 65536, comment 65536, label 50 | body 1048576, comment 1000000, label 255 | unknown | unknown | unknown | unknown | unknown | unknown | unknown | unknown |