# Changelog (/docs/changelog)

What changed in each release.

{/* generated by scripts/sync-changelog.ts, edit the changelog file instead */}

<Release date="2026-10-17">

## 2.6.0 [#v2-6-0]

### Added [#added]
- **New release notice.** Once a day the app checks GitHub for a newer
  release, cached in `latest-release.json` under the cache directory. When
  one exists the header shows `vX.Y.Z available` with the upgrade command,
  `gh extension upgrade gh-select` for extension installs or the releases
  page otherwise, and `gh select version` repeats it on stderr.
  `GH_SELECT_NO_UPDATE_CHECK=1` or `CI` turns the check off; local builds
  never check.
- **Archived repos, last push, license and size.** Forks get a labeled
  `fork` badge and archived repos an `archived` badge with a dimmed row. A
  Pushed column shows the time since the last push. The details show the
  archived state, last push, SPDX license and disk size. `is:archived` and
  `is:active` filter on it, in the lists and in GitHub search.
- **`ctrl+g`** cycles the border style and **`ctrl+o`** toggles Nerd Font
  icons for the current session.

### Changed [#changed]
- **New footer.** Key hints render as keycaps, and the author, source, last
  update and commit moved from the header to a credit line under them.
- **`gruvbox` is the default theme**, replacing `catppuccin`.
- **The `updated` sort orders by last push.**
- **Cache schema v3.** Existing caches are refetched once to pick up the new
  repo fields.
- **Faster repo list.** Your repos and stars load as parallel REST pages
  instead of one GraphQL page after another: 300 repos take about 1s instead
  of 6.6s, and 93 stars about 1s instead of 2.8s. Fork parents and languages,
  which the REST listing leaves out, come from one small GraphQL lookup.
- **Smoother scrolling.** Column widths are measured once per result set
  instead of once per visible row, which cut a keypress from about 18ms of
  rendering to 0.3ms with 300 repos.
- **Quicker start.** The GitHub token is read once instead of once per API
  client, saving about 100ms before the first frame.

</Release>

<Release date="2026-10-03">

## 2.5.0 [#v2-5-0]

### Added [#added-1]
- **GitHub search understands more input.** It takes `owner/repo`,
  `owner repo`, `owner-repo`, a bare owner or name, URLs with any scheme,
  `www.` or TLD, SSH remotes, `.git` suffixes and whole `git clone`
  commands. An exact repo is pinned on top, an owner's repos match by
  partial name, and a misspelled owner falls back to similar accounts.
  Pasting a URL into My repos or Starred switches to GitHub search.
- **API rate limits.** `gh select limits` (`-l`, `--limits`) and the `?`
  overlay show the search, core, graphql and code search budgets: usage,
  how far each window has run, time to reset, and how soon the current pace
  would run a bucket dry.
- **Clones are found anywhere under your home directory**, not only under
  the clone root. The scan runs in the background, skips dependency and
  cache folders, and is cached for the next start. Worktrees and submodules
  count, and when a repo is cloned twice the most recently used copy wins.
  `GH_SELECT_SCAN_DIRS` lists directories to search first.
- **Fork details.** Forks are tagged in the list, the details show the
  parent repo, and `is:fork` and `is:source` filter on it.
- **Every language** a repo uses is listed in the details, largest first.
- **Themes.** `everforest`, `graphite`, `kanagawa`, `rose-pine` and
  `solarized` join the built-in set. Custom themes load from
  `~/.config/gh-select/themes/NAME.json` and inherit unset colors through
  `extends`. `ctrl+t` cycles themes and saves the choice.
- **Credits in the `?` overlay**, with one-key links to the author's GitHub
  and website, the source, a new issue and the release notes.
- **`shift+tab`** switches scope backwards.

### Changed [#changed-1]
- **Command line.** `doctor`, `limits`, `refresh`, `version` and `help`
  each work as a word, a short flag and a long flag, and take `-h` for
  their own help page. Help is grouped into commands, options, environment
  and examples, and is colored unless `NO_COLOR` is set. Unknown commands
  and options exit with status 2 and suggest the closest match instead of
  opening the picker.
- **`--print-path` exits 130** when you quit without a pick, so
  `dir=$(gh select -p) && cd "$dir"` no longer runs `cd ""`.
- **Redesigned screen.** Panels are frameless by default (`--border
  rounded` brings the boxes back), scope tabs sit above the search, the
  list has aligned name, language and star columns, and a details block
  below it shows the repo's URL and local path. The header shows the
  version and build, and a hairline separates the key hints.
- **Nerd Font icons** mark private repos, forks, local clones and stars.
  `--icons none` or `GH_SELECT_ICONS=none` shows words instead.
- **The default theme is now `catppuccin`.** `--theme tokyonight` keeps the
  old look.
- **`ctrl+c` clears a search or filter box first** and quits on the second
  press.
- The details block drops your own username from repo names.
- The repo cache is refetched once after upgrading to pick up fork data.

### Fixed [#fixed]
- `space` types a space in the repo list search, so `lang:go alpha` works.
- Backspace goes back from the action menu, and from the branch picker once
  its filter is empty.

</Release>

<Release date="2026-09-30">

## 2.4.0 [#v2-4-0]

### Added [#added-2]
- **Starred repositories**: `tab` now cycles my repos → starred → GitHub
  search. Starred repos show from cache instantly and refresh once per
  session.
- **Sort and filter the list**: `ctrl+s` cycles recent / stars / name (plus
  updated for starred and search results), shown in the panel title. Filter
  tokens in the search box: `lang:go`, `is:private`, `is:public`, `is:local`,
  `is:mine`; in GitHub search they become GitHub's own qualifiers where one
  exists.
- **Branches and tags in the tree browser**: `b` lists both and reloads the
  tree at the one you pick. Preview, save, copy and partial clone all follow
  it.
- **File links in the tree browser**: `o` opens the file or folder on
  github.com, `Y` copies a permalink pinned to the current commit, `r` copies
  the raw download URL.
- **Save and copy from the tree browser**: `s` saves the marked files and
  folders (or the highlighted one) straight from the GitHub API, no git
  needed, into `--download-dir` / `GH_SELECT_DOWNLOAD_DIR` or the current
  directory. Existing files are kept and the new copy gets a `-1` suffix. `y`
  copies a file's contents to the clipboard, from the listing or the preview.
- **Releases**: a **Releases…** action lists a repository's last 100
  releases with their notes rendered alongside (`n` reads them full-screen,
  `o` opens the release page, `y` copies its link, `/` filters). `enter` opens
  a release's downloads, the uploaded assets plus the generated source archives,
  with the file for this OS and CPU preselected and tagged `◆ this machine`.
  `space` marks several, `a` marks all, `v` previews a text asset, `y` copies
  a download link, `enter` downloads, and `x` downloads and unpacks
  `.tar.gz` / `.tgz` / `.tar.bz2` / `.zip` archives (refusing entries that
  would escape the destination; links are skipped). Downloads are verified
  against the release's checksum files (GNU, BSD and per-file `.sha256`
  formats) and a mismatch discards the file. Files land in the current
  directory, or `--download-dir` / `GH_SELECT_DOWNLOAD_DIR`; existing files are
  never overwritten, a download only takes its real name once complete, and
  Ctrl+C removes the partial file. Works for private repositories.
- **Rendered markdown**: `.md` files opened in the tree browser are rendered as
  prose (headings, lists, links, highlighted code blocks) instead of shown as
  raw source, themed from the active palette. A **View README** action opens the
  repository's readme the same way, without hunting for it in the tree; GitHub
  resolves which file that is, so `docs/`, `.github/`, and odd casing all work.
- **Delete repositories, single or in bulk**: `ctrl+x` marks a repository in
  the list (marked rows get a `✗` and the panel title counts them) and `ctrl+d`
  opens a confirmation screen for every marked one; a single repository can
  also be deleted from its action menu. Deletion is permanent, so it is gated
  behind retyping a phrase (the repository's name for one, `DELETE <n>` for a
  batch) and is only offered for repositories you own. Local working copies
  are never touched, only pointed out. Requires the `delete_repo` scope:
  `gh auth refresh -s delete_repo`.
- **Clone directory**: `-d, --dir DIR` / `GH_SELECT_CLONE_DIR` sets a clone
  root so repositories land there instead of the current working directory.
  Cloning refuses to overwrite an existing working copy.
- **Local clone awareness**: repositories already cloned under the clone root
  are badged `local` in the list, show their path in the info panel, and their
  action menu leads with **Open in editor** (`$VISUAL`/`$EDITOR`) and **Pull**
  instead of a redundant clone. Detection scans one level deep plus
  `owner/repo` layouts and matches on the git remote, so renamed directories
  are still recognised.
- **`-p, --print-path`**: prints the selected repository's absolute path on
  stdout, cloning it first if needed, so a shell wrapper can `cd` into it:
  `ghcd() { local dir; dir=$(gh select --print-path) && cd "$dir"; }`.
  The TUI and git's progress move to stderr in this mode.
- **Open in editor** as an action for any repository (`Clone & open` when it
  isn't cloned yet).

### Changed [#changed-2]
- Files over 1 MB now load in the tree browser (preview, save and copy) via the
  git blob API instead of coming back empty.
- Repository rows line up in columns: name, `local` / `private` tags, a
  language with its GitHub color dot, and a right-aligned star count shortened
  to `★1.2k`. Repos you don't own are dimmed in "my repos".
- The details column is one card titled with the repository: description
  first, then access, language, stars, last update and local path.
- Footers drop whole hints on narrow terminals instead of cutting one off, and
  `?` on an empty search opens the full repo-list keymap. Footer key colors now
  follow the theme on every screen.
- Marking for deletion explains itself: `^x mark for deletion` / `unmark` in
  the footer, a confirmation line on each mark, a red `^d delete N repos` hint,
  and marked rows struck through.
- Action menu numbers are right-aligned so `10` stays in line, and its hints
  are short enough to fit beside the details column.
- Repository fetch now includes organization and collaborator repositories, not
  just owned ones (`affiliations` *and* `ownerAffiliations` set to
  `[OWNER, ORGANIZATION_MEMBER, COLLABORATOR]`; the latter defaults to
  `[OWNER, COLLABORATOR]` and would otherwise drop every org-owned repo).
  Results are de-duplicated, preserving recency order.
- The action menu is built per repository, so its number shortcuts vary with
  the entries on offer.
- **Rewritten in Go** as a precompiled `gh` extension (was a Bash script).
  Authentication, REST + GraphQL access via `go-gh`; TUI via Bubble Tea.
  `fzf` and `jq` are no longer required.

### Removed [#removed]
- The legacy Bash implementation (`legacy/gh-select.sh`) and its shell
  installer scripts (`scripts/install.sh`, `scripts/uninstall.sh`), superseded
  by the Go binary distributed via `gh extension install`.

### Added (Go rewrite) [#added-go-rewrite]
- **Codebase tree browser**: navigate a repository's full file tree and preview
  file contents without cloning (single recursive tree API call).
- **Partial / sparse clone**: multi-select folders and clone only those via
  `git clone --filter=blob:none --sparse` + cone-mode sparse-checkout.
- Type-to-filter (`/`) within the tree browser for large repositories.
- Stale-while-revalidate cache: the list renders instantly and refreshes in the
  background, with a loading spinner during fetches.
- `gh select doctor`: checks for git, gh, and authentication.

### Performance [#performance]
- Repository fetch drops the expensive `defaultBranchRef` GraphQL field
  (~3.5s/page → ~1.4s/page); tree/clone default to HEAD instead.

</Release>

<Release date="2025-07-05">

## 1.0.2 [#v1-0-2]

### Added [#added-3]
- Comprehensive uninstallation support
- Global installation support

### Fixed [#fixed-1]
- Extension name must start with gh- prefix
- Remove tag from extension.yml for proper installation

---

</Release>

<Release date="2025-07-03">

## 1.0.1 [#v1-0-1]

### Fixed [#fixed-2]
- Extension.yml configuration for proper installation

---

</Release>

<Release date="2025-07-01">

## 1.0.0 [#v1-0-0]

### Added [#added-4]
- Initial release
- Interactive repository selection with fuzzy search
- Clone repositories to any location
- Copy repository names or URLs to clipboard
- Open repositories in browser
- Beautiful fzf interface with live preview

</Release>
