| 1 | # Roadmap |
| 2 | |
| 3 | Feature parity checklist against GitHub. Snapshot taken 2026-09-26 from the |
| 4 | API routes, DB schema, web pages and auth plugins. |
| 5 | |
| 6 | ## Done |
| 7 | |
| 8 | ### Git hosting |
| 9 | - [x] Create repositories (public/private), fork |
| 10 | - [x] Push/clone over HTTP (Basic auth) |
| 11 | - [x] Push/clone over SSH, SSH key management |
| 12 | - [x] WAL-on-S3 storage with materialized local cache |
| 13 | - [x] GPG commit signature verification, Verified badges, GPG key management |
| 14 | |
| 15 | ### Code browsing |
| 16 | - [x] Tree, blob, raw files, README rendering |
| 17 | - [x] Branch list, commit history, single commit diff and patch |
| 18 | - [x] Languages, contributors, stargazers, forks |
| 19 | - [x] Code search (Zoekt, indexed on push), repository search |
| 20 | |
| 21 | ### Issues |
| 22 | - [x] Create, edit, close, reopen |
| 23 | - [x] Comments, labels, assignees, timeline |
| 24 | - [x] `#123 |
| 25 | |
| 26 | ### Pull requests |
| 27 | - [x] Compare branches, create, view commits/files/patch |
| 28 | - [x] Merge: merge commit, squash, rebase |
| 29 | - [x] Closing issues from pull requests |
| 30 | |
| 31 | ### Users and accounts |
| 32 | - [x] Profile, contribution graph, avatar |
| 33 | - [x] Stars, dashboard |
| 34 | - [x] Multiple emails with verification, password reset, sessions, API keys |
| 35 | - [x] Organizations: create/invite/accept UI (Better Auth plugin only) |
| 36 | |
| 37 | ### Other |
| 38 | - [x] OG images, docs site, Grafana/metrics, themes |
| 39 | |
| 40 | ## Not done |
| 41 | |
| 42 | ### Tier 1: obvious gaps |
| 43 | 1. [x] ** |
| 44 | and a Settings tab: rename, description, visibility, default branch, |
| 45 | delete. Delete purges the log, cache and search shards before it answers |
| 46 | ([0020](0020-deletion-is-a-tombstone-then-a-purge.md |
| 47 | redirects from old slugs after a rename. |
| 48 | 2. [x] ** |
| 49 | namespace, org profile ([0022](0022-owners-share-one-namespace.md |
| 50 | Teams, fork into an organization, transfer, org contributions. Base |
| 51 | permission and member policies, outside collaborators, leaving, public |
| 52 | membership, profile details and pins, team pages and maintainers, |
| 53 | `@org/team` mentions, org defaults, guided deletion, transfers with |
| 54 | acceptance and redirects, `org:` search, dashboard switcher |
| 55 | ([0023](0023-organization-access-is-a-base-permission.md |
| 56 | 3. [x] ** |
| 57 | read/triage/write/maintain/admin ([0021](0021-access-is-a-role-ladder.md |
| 58 | Invitations lapse after 7 days; the dashboard lists owned and shared |
| 59 | repositories. |
| 60 | 4. [x] ** |
| 61 | with Markdown notes, drafts and prereleases, a computed latest release in |
| 62 | the sidebar; creating a release creates its tag |
| 63 | ([0024](0024-tags-live-in-git-releases-in-rows.md |
| 64 | per-account storage quota, off unless configured |
| 65 | ([0025](0025-storage-is-billed-to-the-owning-account.md |
| 66 | deleting tags from the UI, source archives (#18), per-account quota |
| 67 | overrides, upload progress. |
| 68 | 5. [x] ** |
| 69 | comments batched in a pending review or posted singly, checked against the |
| 70 | diff's hunks; threaded replies; editing and deleting comments and summaries; |
| 71 | dismissing a verdict; `#123` references from reviews; each reviewer's |
| 72 | standing verdict beside the merge button; draft pull requests that cannot |
| 73 | merge until marked ready, and back again; comments on a range of lines; |
| 74 | suggested changes applied as a commit to the head branch |
| 75 | ([0026](0026-a-review-is-pinned-to-the-head-it-read.md |
| 76 | applying several suggestions in one commit. |
| 77 | 6. [x] ** |
| 78 | the merge button, with the squash message editable before it lands; |
| 79 | conflicting paths listed on the request |
| 80 | ([0027](0027-squash-and-rebase-carry-the-head-along.md |
| 81 | 7. [x] ** |
| 82 | creating a branch from any other and deleting any but the default one or |
| 83 | one an open pull request uses |
| 84 | ([0028](0028-branch-writes-are-ref-only-pushes.md |
| 85 | deferred (see below). |
| 86 | 8. [x] ** |
| 87 | on mentions, team mentions, assignment, comments, reviews and state |
| 88 | changes; subscribing to threads and watching or ignoring repositories. |
| 89 | Events go through an outbox that webhooks will consume too |
| 90 | ([0029](0029-events-go-through-an-outbox.md |
| 91 | by an edit, per-user email preferences. |
| 92 | |
| 93 | ### Tier 2: platform |
| 94 | 9. [x] ** |
| 95 | redelivery. Already advertised on the landing page. Consume the outbox |
| 96 | ([0029](0029-events-go-through-an-outbox.md |
| 97 | published yet. Sent by `apps/delivery` |
| 98 | ([0031](0031-outbound-delivery-is-its-own-service.md |
| 99 | 10. [ ] **CI / Actions.** Runner, job logs, commit status checks. Start with a |
| 100 | commit status API (`POST /statuses/:sha`) so external CI can report; a |
| 101 | runner is a much larger project. |
| 102 | 11. [ ] **2FA / passkeys.** |
| 103 | exists, but the API's Better Auth has no `twoFactor` plugin. No OAuth |
| 104 | login (GitHub/Google). |
| 105 | 12. [ ] **Push errors over sideband.** Failures render as JSON, so the git CLI |
| 106 | shows an unhelpful error (see [0011](0011-deferred.md |
| 107 | 13. [x] ** |
| 108 | `receive-pack` accepts anonymous pushes, but `GitBasicAuthMiddleware` now |
| 109 | rejects read-only actors. Verify and update the doc. |
| 110 | |
| 111 | ### Organizations, later |
| 112 | - [ ] **Audit log.** Member added or removed, role changed, repository |
| 113 | transferred, settings changed; filterable by actor and action. |
| 114 | - [ ] **Custom organization roles.** Better Auth's dynamic access control is |
| 115 | on, but only the built-in roles grant repository access. |
| 116 | - [ ] **Blocking users** at organization level. |
| 117 | - [x] ** |
| 118 | - [ ] **Security policy:** required two-factor for members (needs #11), SSO / |
| 119 | SAML, verified domains. |
| 120 | |
| 121 | ### Branches, later |
| 122 | - [ ] **Branch protection.** Deferred from #7: required reviews (needs #5), |
| 123 | required status checks (needs #10), no force push, no deletion. |
| 124 | |
| 125 | ### Tier 3: nice to have |
| 126 | 14. [ ] Milestones, issue templates, reactions, lock conversation |
| 127 | 15. [ ] Follow users, activity feed, explore/trending |
| 128 | 16. [ ] Web file editor, file upload, blame, per-file history |
| 129 | 17. [ ] Gists, wiki, projects/kanban |
| 130 | 18. [ ] Repository mirroring, archive download (zip/tar). Import from GitHub |
| 131 | is done: code, releases, issues and pull requests, run by `apps/importer` |
| 132 | ([0032](0032-github-imports-run-outside-the-api.md |
| 133 | 19. [ ] WAL checkpoints/compaction (push currently reads full log, O(history)) |
| 134 | 20. [ ] Rate limiting, audit log, admin panel |
| 135 | |
| 136 | ## Order |
| 137 | |
| 138 | Every open issue, in the order to take it. The tiers above say what is missing; this says what comes next. Items in the same step can run side by side. |
| 139 | |
| 140 | ### 1. GitHub compatibility (#57) |
| 141 | Tools built for GitHub working against Ghost unchanged. Milestones 1 (auth, repositories, issues over GraphQL), 2 (REST v3 for issues, comments and labels, #112) and 3 (pull requests, #114) are done. |
| 142 | |
| 143 | 1. #115 Releases: `gh release`. |
| 144 | 2. #108 Organization OAuth app access policies. The one security gap in the OAuth work: a member's token reaches the organization's private repositories. |
| 145 | 3. #109 Ghost Apps, then #106 OpenID Connect, then #107 dynamic client registration. |
| 146 | |
| 147 | Alongside, small and independent: #116 search across repositories, #117 `updateRepository` and `gh repo edit`, #119 type |
| 148 | |
| 149 | ### 2. Platform and security |
| 150 | 5. #63 Two-factor authentication and passkeys (roadmap 11), and #121 verifying commits signed with SSH keys. |
| 151 | 6. #61 Commit status API (roadmap 10). Fills `statusCheckRollup` and `gh pr checks` from #114. |
| 152 | 7. #62 Branch protection rules. Needs #61 for required checks. |
| 153 | 8. #120 Report push failures over sideband (roadmap 12). |
| 154 | 9. #67 Rate limiting across the API and git transports. |
| 155 | 10. #68 WAL checkpoints and compaction. Push reads the whole log, so cost grows with history. |
| 156 | 11. #64 Site admin panel and sign-up controls, then #69 audit log. |
| 157 | 12. #65 Sign in with OIDC providers, then #79 organization security policy (needs #63 and #65). |
| 158 | |
| 159 | ### 3. Issues and pull requests (tier 3, roadmap 14) |
| 160 | 13. #82 Lock conversations (#111 is a duplicate with the GitHub compatibility part). |
| 161 | 14. #72 Milestones. |
| 162 | 15. #74 Reactions. |
| 163 | 16. #73 Issue and pull request templates. |
| 164 | 17. #81 Notify people mentioned by an edit, #80 per-user notification email preferences. |
| 165 | 18. #89 Apply several suggestions in one commit. |
| 166 | |
| 167 | Each of 13 to 15 also fills a field the compatibility layer answers empty today (`locked`, `milestone`, |
| 168 | |
| 169 | ### 4. Code browsing and editing (roadmap 16, 18) |
| 170 | 19. #71 Blame and per-file history. |
| 171 | 20. #70 Edit, create and upload files in the browser. |
| 172 | 21. #66 Download source archives. |
| 173 | 22. #88 Delete tags from the UI. |
| 174 | 23. #56 Git submodules. |
| 175 | |
| 176 | ### 5. Organizations, later |
| 177 | 24. #77 Custom organization roles. |
| 178 | 25. #78 Block users at the organization level. |
| 179 | |
| 180 | ### 6. Larger projects |
| 181 | 26. #87 CI runner and organization secrets. Builds on #61. |
| 182 | 27. #75 Repository mirroring. |
| 183 | 28. #83 Follow users and an activity feed, then #84 explore and trending. |
| 184 | 29. #85 Gists, #76 wiki, #86 project boards. |