# Technical Documentation: dlvhdr/gh-dash

> ℹ️ **Provenance:** Multi-Tier Ingestion · [CodeWiki Reference](https://codewiki.google/github.com/dlvhdr/gh-dash)

### Overview (`README.md`)

<br />
<p align="center">
  <a  class="underline: none;" href="https://gh-dash.dev">
    <picture>
      <source media="(prefers-color-scheme: dark)" srcset="./docs/public/logo.png">
      <img alt="Text changing depending on mode. Light: 'So light!' Dark: 'So dark!'" width="600" src="./docs/public/logo-light.png">
    </picture>
  </a>
</p>

<p align="center">
    <a href="https://gh-dash.dev" target="_blank">→ https://gh-dash.dev ←</a>
</p>
<p align="center">
  A rich terminal UI for GitHub that doesn't break your flow.
  <br />
  <br />
  <a href="https://github.com/dlvhdr/gh-dash/releases"><img src="https://img.shields.io/github/release/dlvhdr/gh-dash.svg" alt="Latest Release"></a>
  <a href="https://discord.gg/SXNXp9NctV"><img src="https://img.shields.io/discord/1413193703476035755?label=discord" alt="Discord"/></a>
  <a href="https://github.com/sponsors/dlvhdr"><img src=https://img.shields.io/github/sponsors/dlvhdr?logo=githubsponsors&color=EA4AAA /></a>
  <a href="https://www.jetify.com/docs/devbox" alt="Built with Devbox"><img src="https://www.jetify.com/img/devbox/shield_moon.svg" /></a>
</p>

<br />

<img src="./docs/src/assets/overview.gif" />

## ❤️ Sponsoring

If you enjoy `DASH` and want to help, consider supporting the project with a
donation at the [sponsors page](https://github.com/sponsors/dlvhdr).

Thank you to all past and existing sponsors! 🙏🏽




## Sponsors

<h3 align="center">TUI Innovator</h3>

<p align="center">
<a href="https://github.com/denopink?utm_source=dlvhdr&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/12867159?s=160&u=61c67cd6aab705e030389253a7c326384a6c6a1b&v=4" alt="Owen Cabalceta" width="160"/></a>&nbsp;&nbsp;
</p>

<h3 align="center">TUI Visionary</h3>

<p align="center">
<a href="https://engineering.tryarchitect.com?utm_source=dlvhdr&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/179040529?s=128&v=4" alt="Architect" width="128"/></a>&nbsp;&nbsp;
<a href="http://steipete.me?utm_source=dlvhdr&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/58493?s=128&u=95a4fccef3d341039661c427695691a664e333ba&v=4" alt="Peter Steinberger" width="128"/></a>&nbsp;&nbsp;
</p>

<h3 align="center">TUI Power User</h3>

<p align="center">
<a href="https://alexandergarber.com?utm_source=dlvhdr&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/9858440?s=50&u=3f0f3072d5c4e7ee4c0cd72e5f8ad2edd01033be&v=4" alt="Alexander Garber" width="50"/></a>&nbsp;&nbsp;
<a href="https://bjg.io?utm_source=dlvhdr&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/1212?s=50&u=9af0530b0e65983da61672445f974432cc1ca8ea&v=4" alt="Brian Gianforcaro" width="50"/></a>&nbsp;&nbsp;
<a href="https://github.com/cdxn?utm_source=dlvhdr&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/2151520?s=50&u=eb74f479693b7f172506e678a169a34ead03796b&v=4" alt="cdxn" width="50"/></a>&nbsp;&nbsp;
<a href="https://github.com/kenosando?utm_source=dlvhdr&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/13559092?s=50&u=efb2ab2cd3c739182f76876e2e88a369ac71d65b&v=4" alt="Ken Sanders" width="50"/></a>&nbsp;&nbsp;
<a href="https://rollans.sh?utm_source=dlvhdr&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/4101096?s=50&u=8330a195570652f1bcd39e89bc5571ee41b15386&v=4" alt="Luke Rollans" width="50"/></a>&nbsp;&nbsp;
<a href="https://github.com/mchisolm0?utm_source=dlvhdr&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/39521893?s=50&u=2ab5b762d1573b0aecc776a30a93cc8ab04fdbad&v=4" alt="Matthew Chisolm" width="50"/></a>&nbsp;&nbsp;
<a href="https://nikolay.com?utm_source=dlvhdr&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/2882?s=50&u=b5278753f2aeee2a074f17c163df9179d3640b03&v=4" alt="Nikolay Kolev" width="50"/></a>&nbsp;&nbsp;
<a href="https://philippeserhal.com/?utm_source=dlvhdr&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/1377702?s=50&u=97edad0b41ef9cb95fd1825a62e244e6648c4681&v=4" alt="Philippe Serhal" width="50"/></a>&nbsp;&nbsp;
<a href="https://ames.sh?utm_source=dlvhdr&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/8071752?s=50&u=d66ecf5d4a8d8cdd3cc6bab4c5524a0bdd0d9b21&v=4" alt="Scott Ames" width="50"/></a>&nbsp;&nbsp;
<a href="https://github.com/sideshowbarker?utm_source=dlvhdr&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/194984?s=50&v=4" alt="sideshowbarker" width="50"/></a>&nbsp;&nbsp;
<a href="https://github.com/scjudd?utm_source=dlvhdr&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/167754?s=50&u=b094905c1930afc3b307f39776d5fc4250d02298&v=4" alt="Spencer Judd" width="50"/></a>&nbsp;&nbsp;
<a href="https://github.com/candril?utm_source=dlvhdr&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/404352?s=50&v=4" alt="Stefan Lüdin" width="50"/></a>&nbsp;&nbsp;
<a href="https://stevie.sh?utm_source=dlvhdr&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/6165538?s=50&u=2d9fc263793ca4050bc0a76c3e6c297fd72ce71c&v=4" alt="Stevie Huh" width="50"/></a>&nbsp;&nbsp;
<a href="http://dangel.im?utm_source=dlvhdr&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/350922?s=50&v=4" alt="Ulrich Dangel" width="50"/></a>&nbsp;&nbsp;
<a href="https://github.com/vosahloj?utm_source=dlvhdr&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/566194?s=50&u=0bca2b2bfa091749aa09df75d2d588de1fdb42b8&v=4" alt="vosahloj" width="50"/></a>&nbsp;&nbsp;
<a href="https://github.com/roninjin10?utm_source=dlvhdr&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/35039927?s=50&u=94370136033f1a4d900b4857c2ae13964bf51f96&v=4" alt="Will Cory" width="50"/></a>&nbsp;&nbsp;
</p>

<h3 align="center">TUI Backer</h3>

<p align="center">
<a href="https://jeffry.in?utm_source=dlvhdr&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/1074042?s=40&u=81cb6e662a6d3254850200c4498ed07e7d59061e&v=4" alt="Jeff Wainwright" width="40"/></a>&nbsp;&nbsp;
<a href="https://purajit.com?utm_source=dlvhdr&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/7026198?s=40&u=5b76b661dba1677a00ae40a83f19c42250b81f5a&v=4" alt="purajit" width="40"/></a>&nbsp;&nbsp;
</p>



## 🌟 Features

- User-defined, per-repo, PRs & issues sections
- Overridable vim-style keyboard hotkeys
- Custom actions to perform your specific workflow needs
- Everything you can do on GitHub - diff, comment, checkout, push, update etc.
- Control every setting with a YAML config file

If you like quickly navigating with your keyboard, seeing the PRs and issues you need and you <strong>love the terminal</strong> - <code>DASH</code> is for you! 🫵🏽

## 📃 Docs

`DASH` has an extensive docs site at [gh-dash.dev/getting-started](https://gh-dash.dev/getting-started).

## 👥 Discord

Have questions? Join our [Discord community](https://discord.gg/SXNXp9NctV)!

## 🙏 Contributing

See the contribution guide at [https://www.gh-dash.dev/contributing](https://www.gh-dash.dev/contributing/).

## 🛞 Under the hood

`DASH` uses:

- [bubbletea](https://github.com/charmbracelet/bubbletea) for the TUI
- [lipgloss](https://github.com/charmbracelet/lipgloss) for the styling
- [glamour](https://github.com/charmbracelet/glamour) for rendering markdown
- [vhs](https://github.com/charmbracelet/vhs) for generating the GIF
- [cobra](https://github.com/spf13/cobra) for the CLI
- [gh](https://github.com/cli/cli) for the GitHub functionality
- [delta](https://github.com/dandavison/delta) for viewing PR diffs

## Authors

Dolev Hadar ([@dlvhdr](https://github.com/dlvhdr)) and the [community](https://github.com/dlvhdr/gh-dash/graphs/contributors).

---

### Src Content Docs Configuration Index (`docs/src/content/docs/configuration/index.mdx`)

---
title: How to Configure
---

import { Aside, LinkCard, CardGrid } from "@astrojs/starlight/components";

`dash` has extensive configuration options.

- Modify the default config which is usually under `$HOME/.config/gh-dash/config.yml`.
- Use the [`--config`][01] flag to specify a different configuration file.
- Create a `.gh-dash.yml` file in a repo for project specific configuration.

<details>
  <summary>Give me more details!</summary>
  Using the following logic:
1. If `$GH_DASH_CONFIG` is a non-empty string, `dash` will use this file for
   its configuration.
2. If `$GH_DASH_CONFIG` isn't set and you're in a git repository, it will look for `.gh-dash.yml` or `.gh-dash.yaml`
   in the repository root.
3. If neither of the above applies, then:
  - If `$XDG_CONFIG_HOME` is a non-empty string, the default path is `$XDG_CONFIG_HOME/gh-dash/config.yml`.
  - If `$XDG_CONFIG_HOME` isn't set, then:
    - On Linux and macOS systems, the default path is `$HOME/.config/gh-dash/config.yml`.
    - On Windows systems, the default path is `%USERPROFILE%\.config\gh-dash\config.yml`.

</details>

---

<br />

<Aside type="tip">
  Just want a few examples for inspiration? Check out the
  [examples](./examples).
</Aside>

[01]: /getting-started/usage/#--config

## Options

The configuration for `dash` is schematized. The pages in this section list the configuration
options, their defaults, and how you can use them.

### Schema

Documentation and schema for the configuration of your GitHub dashboard.

<CardGrid>
  <LinkCard
    title="Schema"
    href="./schema"
    description="Configure your IDE to autocomplete when editing the config file"
  />
  <LinkCard
    title="Defaults"
    href="./defaults"
    description="Documentation for the default setting options for your GitHub dashboard."
  />
  <LinkCard
    title="Searching"
    href="./searching"
    description="How to search and filter issues and prs"
  />
  <LinkCard
    title="PR Section"
    href="./pr-section"
    description="Documentation for configuring the PR sections of your GitHub dashboard."
  />
  <LinkCard
    title="Issue Section"
    href="./issue-section"
    description="Documentation for configuring the issue's sections of your GitHub dashboard."
  />
  <LinkCard
    title="Keybindings"
    href="./keybindings"
    description="Documentation for defining commands for your GitHub dashboard."
  />
  <LinkCard
    title="Layout"
    href="./layout/options"
    description="Documentation for configuring your GitHub dashboard’s layout."
  />
  <LinkCard
    title="Theme"
    href="./theme"
    description="Documentation for configuring your GitHub dashboard’s theme."
  />
  <LinkCard
    title="Reusing Settings"
    href="./reusing.mdx"
    description="Define global settings that will always be applied"
  />
</CardGrid>

---

### Src Content Docs Contributing Index (`docs/src/content/docs/contributing/index.mdx`)

---
title: Contributing
---

Thank you for investing your time in contributing to our project!

In this guide you will get an overview of the contribution workflow from opening an issue, creating a PR, reviewing, and merging the PR.

## The Critical Rule

- The most important rule: you must understand your code. If you can't explain what your changes do and how they interact with the greater system, do not contribute to this project.
- The second most important rule: when you submit a PR you must be willing to address comments and maintain this code. Dot not submit drive-by PRs that solve your own issue without the willingness to iterate on it. Keep these in your own fork.
- The project has a strict no-AI policy.

## AI Usage

Please see the [AI Usage Policy](https://github.com/dlvhdr/gh-dash/blob/main/AI_POLICY.md). This is very important.

## Quick Guide

### I Have an Idea for a Feature

Like bug reports, first search through both issues and discussions and try to find if your feature has already been requested. Otherwise, open a discussion in the ["Feature Requests, Ideas"](https://github.com/dlvhdr/gh-dash/issues/new?template=feature_request.md) category.

### I've Implemented a Feature

- If there is an issue for the feature, open a pull request straight away.
- If there is no issue, open a discussion and link to your branch.
- If you want to live dangerously, open a pull request and hope for the best.

### I Have a Question Which Is Neither a Bug Report nor a Feature Request

Open a [Q&A discussion](https://github.com/dlvhdr/gh-dash/discussions/categories/q-a), or join our [Discord Server](https://discord.gg/SXNXp9NctV) and ask away in the #help forum channel.

## Working on the Code

### Installing Required Tooling

Our project uses [Devbox](https://github.com/jetpack-io/devbox) to manage its development environment.

Using Devbox will get your dev environment up and running easily and make sure we're all using the same tools with the same versions.

- Clone this repo

```sh
git clone git@github.com:dlvhdr/gh-dash.git && cd gh-dash
```

- Install `devbox`

```sh
curl -fsSL https://get.jetpack.io/devbox | bash
```

- Start the `devbox` shell and run the setup (will take a while on first time)

```sh
devbox shell
```

_This will create a shell where all required tools are installed._

- _(Optional)_ Set up `direnv` so `devbox shell` runs automatically
  - [direnv](https://www.jetify.com/devbox/docs/ide_configuration/direnv/) is a tool that allows setting unique environment variables per directory in your filesystem.
    - Install `direnv` with: `brew install direnv`
    - Add the following line at the end of the `~/.bashrc` file: `eval "$(direnv hook bash)"`
      - See [direnv's installation instructions](https://direnv.net/docs/hook.html) for other shells.
    - Enable `direnv` by running `direnv allow`
- _(Optional)_ Install the VSCode Extension
  - Follow [this guide](https://www.jetify.com/devbox/docs/ide_configuration/vscode/) to set up VSCode to automatically run `devbox shell`.

#### Troubleshooting

- delete the `.devbox` directory at the project's root

### Navigating the Codebase

To navigate our codebase with confidence, familiarize yourself with:

- [Bubbletea](https://github.com/charmbracelet/bubbletea) - the TUI framework we're using
- [The Elm architecture](https://guide.elm-lang.org/architecture/)
- [charmbracelet/glow](https://github.com/charmbracelet/glow) - for parsing and presenting Markdown

#### Code Structure

- `ui/` - this is the code that's responsible for rendering the different parts of the TUI
- `data/` - the code that fetches data from GitHub's GraphQL API
- `config/` - code to parse the user's `config.yml` file
- `utils/` - various utilities

### Debugging

- Write to the log by using Charm's `log` package
- Tail the log by running `task logs`
- Run `dash` in debug mode with `task debug` in another terminal window / pane

```go
import "charm.land/log/v2"

// more code...

log.Debug("some message", "someVariable", someVariable)
```

### Linting

CI runs this check, but for PRs from forks it may require maintainer approval before it starts. Running `task lint` locally saves a round-trip.

```sh
task lint
```

To auto-fix formatting issues (line length, imports, etc.):

```sh
task lint:fix
```

### Running the Docs Locally

- Run the docs site by running `task docs`

* Go to `localhost:4321` to view them

---

### Src Content Docs Donating Index (`docs/src/content/docs/donating/index.mdx`)

---
title: Donating ❤️
---

import { Aside } from "@astrojs/starlight/components";
import Sponsorship from "../../../components/Sponsorship.astro";

Donations are the primary way to support me in maintaining these projects.
If you enjoy my work and want to help, consider supporting me with a donation!

I'm also trying out a Sponsorware model where you can support me by joining the <a href="../insiders">Insiders</a> program to get early access features and apps.

## Goal

<div class="m-auto mt-12 flex flex-col gap-2 text-center md:w-full lg:w-1/2">
  <p>This is my current sponsorship goal</p>
  <Sponsorship server:defer />
</div>

Reaching this goal would help me spend more time on my projects and hopefully 🤞🏽
become a full time OSS maintainer one day.

_This is my dream_, to build projects sponsored by individuals with the sole focus on its users - no investors, no line go
up.

## How to Donate?

To become a sponsor go to:

<iframe
  src="https://github.com/sponsors/dlvhdr/card"
  title="Sponsor dlvhdr"
  height="120"
  width="100%"
  class="h-[200px] lg:h-[120px]"
></iframe>

Thank you very much! ❤️

---

### Src Content Docs Getting Started Index (`docs/src/content/docs/getting-started/index.mdx`)

---
title: Installation
---

Get started using `dash` to review and manage your GitHub work items.

## Recommended Steps

1. Install the `gh` CLI

   ```bash
   brew install gh # e.g. if on macOS
   ```

   Or, see the [installation instructions][01] for other platforms.

2. Install this extension:

   ```sh
   gh extension install dlvhdr/gh-dash
   ```

3. To get the icons to render properly, you should download and install a [Nerd font][02]. Then,
   select that font as your font for your terminal of choice.

   ```bash
    brew install --cask font-fira-code-nerd-font
   ```

---

<details>
<summary>How do I get these exact colors and font?</summary>
The screenshots in this documentation use [Ghostty][n01] with the
[tokyonight theme][n02] and the [Fira Code][n03] Nerd Font. For the full setup,
see [these dotfiles][n04].

[n01]: https://ghostty.org/
[n02]: https://github.com/folke/tokyonight.nvim
[n03]: https://github.com/ryanoasis/nerd-fonts/tree/master/patched-fonts/FiraCode
[n04]: https://github.com/dlvhdr/dotfiles

</details>

---

## Manual Steps

If you want to install this extension **manually**, follow these steps:

1. Clone the repo

   ```bash
   # git
   git clone https://github.com/dlvhdr/gh-dash

   # GitHub CLI
   gh repo clone dlvhdr/gh-dash
   ```

2. `cd` into it

   ```bash
   cd gh-dash
   ```

3. Install it locally

   ```bash
   gh extension install .
   ```

[01]: https://github.com/cli/cli#installation
[02]: https://www.nerdfonts.com/

---

### Src Content Docs Insiders Index (`docs/src/content/docs/insiders/index.mdx`)

---
title: Join Insiders
---

import { Icon } from "@astrojs/starlight/components";
import EnhanceCard from "../../../components/EnhanceCard.astro";
import FeatureCard from "../../../components/FeatureCard.astro";
import Sponsorship from "../../../components/Sponsorship.astro";

`DASH Insiders` is a program you can join by sponsoring me on GitHub and gets you early access to
new companion apps and features.

The first app I worked on, [ENHANCE](../enhance), was successfully funded and is now fully open
source.

Currently, there are no benefits other than supporting me in
maintaining my apps and adding new features to them.

In the future I'm intending to create more apps so I can do everything through
the terminal. If you're also passionate about that please do support me and
let's make that a reality!

<form action="#how-do-i-join" class="flex w-full justify-center pt-8">
  <button
    type="submit"
    class="flex items-center gap-2 bg-[var(--sl-color-accent)] px-4 py-2 font-bold text-black"
  >
    Support Me!
    <Icon class="mt-0" name="heart" size="20px" color="var(--color-pink-800)" />
  </button>
</form>

<div class="m-auto mt-12 flex flex-col gap-2 md:w-full lg:w-1/2">
  <p>This is my current sponsorship goal:</p>
  <Sponsorship server:defer />
</div>

## Future Plans

Supporting me will help me make these things a reality:

<div class="flex flex-col gap-2">
  <FeatureCard
    project="dash"
    feature="Support for More Git Forges"
    description="DASH currently only works against GitHub. This will add support
    for more git forges such as Gitlab, Bitbucket, Codeberg etc."
    future={true}
  />

  <FeatureCard
    project="dash"
    feature="Fully Editable PRs and Issues"
    description="Add support for fully editing a PR / Issue from DASH such as:
    editing the title, description, base branch, deleting a comment etc."
    future={true}
  />

  <FeatureCard
    project="dash"
    feature="Search Autocompletions"
    description="Add autocompletions for the search bar for things like the
    author, owner, repo, commenter, review requested etc."
    future={true}
  />

  <FeatureCard
    project="enhance"
    feature="View Repo-Level Workflow Runs"
    description="The ability to view checks at the repo level - against branches, tags or manually triggered. Currently it's only supported to view checks that are run against a PR."
    future={true}
  />
</div>

## Achieved Benefits

The community successfully funded the release of:

<EnhanceCard />

## How Do I Join?

Follow the Sponsor button below and complete a sponsorship of -<br />**$5 a month or more**.

_Note: you can cancel your sponsorship anytime._

I would really appreciate your support! ❤️

<iframe
  src="https://github.com/sponsors/dlvhdr/card"
  title="Sponsor dlvhdr"
  height="120"
  width="100%"
  class="h-[200px] lg:h-[120px]"
></iframe>

### FAQ

<details>
  <summary>What happens if I cancel my sponsorship?</summary>
  If you cancel your subscription, you're automatically removed as a
  collaborator and will miss out on all future updates of Insiders. However, you
  may use the latest version that's available to you as long as you like. Just
  remember that [GitHub deletes private
  forks](https://docs.github.com/en/github/setting-up-and-managing-your-github-user-account/removing-a-collaborator-from-a-personal-repository).
</details>

<details>
  <summary>What about sponsorships lower than 5$ a month?</summary>
  Sponsorships lower than $5 a month are also very much appreciated! They won't
  grant you access to Insiders, but they will be counted towards reaching
  sponsorship goals. Every sponsor helps me to implement new features and
  releasing them to the public.
</details>

## How Does this Help Me?

By sponsoring me on one of the eligible tiers you:

1. Get access to my private projects that you can download, use, view the code
   and open issues.
1. Help reach goals towards open sourcing these projects
1. Show support for my other fully open source projects

## Why Sponsorware

I'm a full-stack developer who loves the terminal and I want to invest more time
doing that in a sustainable way.

I have a full time job and this makes it hard to find time for open source.
In order to get some kind of funds to be able to work more on OSS I need an
alternative income. This is an attempt to make it happen.

If you want more details you can [read this](https://github.com/sponsorware/docs) to understand the sponsorware release strategy.

## Terms

- Each app will have a goal towards open sourcing it. Future major releases may
  require additional sponsorship goals.
- Please don't distribute the source code of Insiders. You may freely use it for public, private or commercial projects, privately fork or mirror it, but please don't make the source code public, as it would counteract the sponsorware strategy.
- If you cancel your subscription, you're automatically removed as a collaborator and will miss out on all future updates of Insiders. However, you may use the latest version that's available to you as long as you like. Just remember that [GitHub deletes private forks](https://docs.github.com/en/github/setting-up-and-managing-your-github-user-account/removing-a-collaborator-from-a-personal-repository).

---

### Src Content Docs Companions Enhance Getting Started (`docs/src/content/docs/companions/enhance/getting-started.mdx`)

---
title: Installation
---

import { Aside } from "@astrojs/starlight/components";

Get started using `ENHANCE` to manage your PRs GitHub Actions.

## Recommended Steps

1. Install the `gh` CLI

   ```bash
   brew install gh # e.g. if on macOS
   ```

   Or, see the [installation instructions][01] for other platforms.

2. Install this extension:

   ```sh
   # if you're *not* in the insiders program
   gh extension install dlvhdr/gh-enhance

   # if you are in the insiders program
   gh extension install dlvhdr-insiders/gh-enhance

   ```

3. To get the icons to render properly, you should download and install a [Nerd font][02]. Then,
   select that font as your font for your terminal of choice.

   ```bash
    brew install --cask font-fira-code-nerd-font
   ```

---

<details>
<summary>How do I get these exact colors and font?</summary>
The screenshots in this documentation use [Ghostty][n01] with the
[tokyonight theme][n02] and the [Fira Code][n03] Nerd Font. For the full setup,
see [these dotfiles][n04].

[n01]: https://ghostty.org/
[n02]: https://github.com/folke/tokyonight.nvim
[n03]: https://github.com/ryanoasis/nerd-fonts/tree/master/patched-fonts/FiraCode
[n04]: https://github.com/dlvhdr/dotfiles

</details>

---

## Manual Steps

If you want to install this extension **manually**, follow these steps:

1. Clone the repo

- If you're **not** in the insiders program:

  ```bash
  # Git
  git clone https://github.com/dlvhdr/gh-enhance

  # or with the GitHub CLI
  gh repo clone dlvhdr/gh-enhance
  ```

- If you are in the insiders program:

  ```bash
    # Git
    git clone https://github.com/dlvhdr-insiders/gh-enhance

    # or with the GitHub CLI
    gh repo clone dlvhdr-insiders/gh-enhance
  ```

2. `cd` into it

   ```bash
   cd gh-enhance
   ```

3. Install it locally

   ```bash
   gh extension install .
   ```

[01]: https://github.com/cli/cli#installation
[02]: https://www.nerdfonts.com/

---

### Src Content Docs Configuration Keybindings Index (`docs/src/content/docs/configuration/keybindings/index.mdx`)

---
title: Custom Keybindings
---

`dash` allows you to override existing keybindings as well as add custom ones.

Every valid entry for the configuration options must have a `key` and `command`.
When a user presses the key or key combination the dashboard shells out and executes the command.

To help you identify your custom commands, an additional `name` property can be supplied to describe it in the help menu.

There are 3 types of keybindings: `universal`, `prs` and `issues`.

## Key Values

The `key` value must match one of the [Ultraviolet key strings][ultraviolet-key-strings].
`dash` does not translate alternate key names or terminal labels before matching a keybinding.

For example, Page Down is emitted as `pgdown`, not `pgdn`:

```yaml
keybindings:
  universal:
    - key: pgup
      builtin: pageUp
    - key: pgdown
      builtin: pageDown
```

## Universal Keybindings

Define keybindings that will work in any view.

For example:

```yaml
keybindings:
  universal:
    - key: g
      name: lazygit
      command: >
        cd {{.RepoPath}} && lazygit
    - key: s
      builtin: search
```

### Built-in Commands

The following built-in universal commands can be overridden with custom keybinds:

| Command         | Description                                     |
| --------------- | ----------------------------------------------- |
| `up`            | row up                                          |
| `down`          | row down                                        |
| `firstLine`     | go to first row                                 |
| `lastLine`      | go to last row                                  |
| `togglePreview` | toggle the preview pane                         |
| `openGithub`    | open the selection in GitHub                    |
| `refresh`       | refresh the current section                     |
| `refreshAll`    | refresh all sections                            |
| `redraw`        | redraw the screen - in case of visual artifacts |
| `pageDown`      | go one page down in the preview pane            |
| `pageUp`        | go one page up in the preview pane              |
| `nextSection`   | go to next section                              |
| `prevSection`   | go to previous section                          |
| `search`        | focus the search bar                            |
| `copyurl`       | copy the URL of the selected row                |
| `copyNumber`    | copy the number of the selected row             |
| `help`          | toggle the help menu                            |
| `quit`          | quit gh-dash                                    |

See [global keys](../../getting-started/keybindings/global/) and [navigation keys](../../getting-started/keybindings/navigation/) for more details.

## PR Keybindings

Define any number of keybindings for the PRs view or override existing ones.

For example:

```yaml
keybindings:
  prs:
    - key: O
      builtin: checkout
    - key: m
      command: gh pr merge --admin --repo {{.RepoName}} {{.PrNumber}}
    - key: g
      name: lazygit add
      command: >
        cd {{.RepoPath}} && git add -A && lazygit
    - key: v
      name: approve
      command: >
        gh pr review --repo {{.RepoName}} --approve --body "$(gum input --prompt='Approval Comment: ')" {{.PrNumber}}
```

### Available Command Arguments

| Argument      | Description                                                                     |
| ------------- | ------------------------------------------------------------------------------- |
| `RepoName`    | The full name of the repo (e.g. `dlvhdr/gh-dash`)                               |
| `RepoPath`    | The path to the Repo, using the `config.yml` `repoPaths` key to get the mapping |
| `PrNumber`    | The PR number                                                                   |
| `HeadRefName` | The PR's head branch name                                                       |
| `BaseRefName` | The PR's base branch name                                                       |
| `Author`      | The username of the PR author                                                   |

### Built-in Commands

The following built-in PR commands can be overridden with custom keybinds:

| Command            | Description                                 |
| ------------------ | ------------------------------------------- |
| `prevSidebarTab`   | previous sidebar tab                        |
| `nextSidebarTab`   | next sidebar tab                            |
| `approve`          | approve the PR                              |
| `assign`           | assign users to the PR                      |
| `unassign`         | unassign users from the PR                  |
| `comment`          | add a comment to the PR                     |
| `diff`             | show the diff of the PR                     |
| `checkout`         | locally checkout the PR                     |
| `close`            | close the PR                                |
| `ready`            | mark the PR as ready                        |
| `reopen`           | reopen a closed PR                          |
| `merge`            | merge the PR                                |
| `update`           | update the PR to the latest base branch     |
| `watchChecks`      | watch the checks of the PR and get notified |
| `approveWorkflows` | approve the runs of the PR                  |
| `viewIssues`       | switch to the Issues view                   |
| `summaryViewMore`  | expand the truncated PR description         |

See [PR keys](../../getting-started/keybindings/selected-pr/) for more details.

## Issue Keybindings

Define any number of keybindings for the issues view or override existing ones.

For example:

```yaml
keybindings:
  issues:
    key: "P"
    command: >
      gh issue pin {{ .IssueNumber }} --repo {{ .RepoName }}
```

### Available Command Arguments

| Argument      | Description                                                                     |
| ------------- | ------------------------------------------------------------------------------- |
| `RepoName`    | The full name of the repo (e.g. `dlvhdr/gh-dash`)                               |
| `RepoPath`    | The path to the Repo, using the `config.yml` `repoPaths` key to get the mapping |
| `IssueNumber` | The issue number                                                                |
| `IssueTitle`  | The issue title                                                                 |
| `Author`      | The username of the issue author                                                |

### Built-in Commands

The following built-in issue commands can be overridden with custom keybinds:

| Command    | Description                          |
| ---------- | ------------------------------------ |
| `label`    | edit the issue's labels              |
| `assign`   | assign users to the issue            |
| `unassign` | remove assigned users from the issue |
| `comment`  | add a comment to the issue           |
| `checkout` | checkout a branch for the issue      |
| `close`    | close the issue                      |
| `reopen`   | reopen a closed issue                |
| `viewPrs`  | switch to the PRs view               |

See [issue keys](../../getting-started/keybindings/selected-issue/) for more details.

## Notification Keybindings

Define any number of keybindings for the notifications view or override existing ones.

For example:

```yaml
keybindings:
  notifications:
    - key: d
      builtin: markAsDone
    - key: D
      builtin: markAllAsDone
```

### Available Command Arguments

The command template receives different fields depending on whether the sidebar has been opened:

| State            | PR template fields                       |
| ---------------- | ---------------------------------------- |
| Sidebar not open | `RepoName`, `PrNumber`, `RepoPath`       |
| Sidebar open     | + `HeadRefName`, `BaseRefName`, `Author` |

| State            | Issue template fields                 |
| ---------------- | ------------------------------------- |
| Sidebar not open | `RepoName`, `IssueNumber`, `RepoPath` |
| Sidebar open     | + `Author`                            |

If a template references a sidebar-only field (e.g., `{{.HeadRefName}}`) before the sidebar is opened, the template engine’s `missingkey=error` option produces an error message. This is intentional — users should open the notification first to populate the full data.

### Built-in Commands

The following built-in notifications commands can be overridden with custom keybinds:

| Command          | Description                                        |
| ---------------- | -------------------------------------------------- |
| `view`           | view notification (fetches content, marks as read) |
| `markAsDone`     | mark as done (removes from inbox)                  |
| `markAllAsDone`  | mark all as done                                   |
| `markAsRead`     | mark as read                                       |
| `markAllAsRead`  | mark all as read                                   |
| `unsubscribe`    | unsubscribe from thread                            |
| `toggleBookmark` | toggle bookmark                                    |

See [notification keys](../../getting-started/keybindings/selected-notification/) for more details.

[ultraviolet-key-strings]: https://github.com/charmbracelet/ultraviolet/blob/main/key.go#L612

## Completions Keybindings

Define any number of keybindings for the Completions popup or override existing ones.

For example:

```yaml
keybindings:
  completions:
    - key: tab
      builtin: selectSuggestion
    - key: ctrl+j
      builtin: nextSuggestion
    - key: ctrl+k
      builtin: previousSuggestion
    - key: ctrl+t
      builtin: toggleSuggestions
    - key: ctrl+r
      builtin: refreshSuggestions
```

### Built-in Commands

The following built-in completion commands can be overridden with custom keybinds:

| Command              | Description                               |
| -------------------- | ----------------------------------------- |
| `nextSuggestion`     | next suggestion in the list               |
| `previousSuggestion` | previous suggestion in the list           |
| `selectSuggestion`   | accept the currently selected suggestion  |
| `toggleSuggestions`  | toggle if suggestions are shown or hidden |
| `refreshSuggestions` | fetch and refresh suggestion              |

See [Completions keys](../../getting-started/keybindings/completions/) for more details.

---

### Src Content Docs Getting Started Keybindings Index (`docs/src/content/docs/getting-started/keybindings/index.mdx`)

---
title: Overview
weight: 3
summary: >-
  Get started using key presses to interact with the dashboard.
---

import { LinkCard, CardGrid } from "@astrojs/starlight/components";

When you use `dash` to display a dashboard for your GitHub work items, you can interact with the
dashboard using key combinations.

This section lists the default keybindings for the dashboard's commands and what they do. Most of
the commands are universal across the dashboard's views. There are also commands that are specific
to the [PRs][01] and [Issues][02] views.

You can also define your own custom keybindings with the `keybindings` setting in your dashboard's
[configuration file][03].

<CardGrid>
  <LinkCard
    title="Global"
    href="./global"
    description="Lists the default keybindings for controlling the dashboard globally."
  />
  <LinkCard
    title="Selected Item"
    href="./selected-item"
    description="Lists the default keybindings for interacting with active items in the dashboard in any view."
  />
  <LinkCard
    title="Selected PR"
    href="./selected-pr"
    description="Lists the default keybindings for interacting with an actively selected item in the PRs view for the dashboard."
  />
  <LinkCard
    title="Selected Issue"
    href="./selected-issue"
    description="Lists the default keybindings for interacting with an actively selected item in the Issues view for the dashboard."
  />
  <LinkCard
    title="Preview Pane"
    href="./preview"
    description="Lists the default keybindings for interacting with the preview pane in the Dashboard."
  />
  <LinkCard
    title="Completions"
    href="./completions"
    description="Lists the default keybindings for interacting with the completions popup for input boxes."
  />
</CardGrid>

[01]: ./selected-pr
[02]: ./selected-issue
[03]: /configuration/

---

### README (`docs/README.mdx`)

# Docs Site

[](https://starlight.astro.build)

Live at [https://gh-dash.dev](https://gh-dash.dev).

## 🚀 Project Structure

In this project you'll see the following folders and files:

```
.
├── public/
├── src/
│   ├── assets/
│   ├── content/
│   │   └── docs/
│   └── content.config.ts
├── astro.config.mjs
├── package.json
└── tsconfig.json
```

Starlight looks for `.md` or `.mdx` files in the `src/content/docs/` directory. Each file is exposed as a route based on its file name.

Images can be added to `src/assets/` and embedded in Markdown with a relative link.

Static assets, like favicons, can be placed in the `public/` directory.

## 🧞 Commands

All commands are run from the root of the project, from a terminal:

| Command                | Action                                           |
| :--------------------- | :----------------------------------------------- |
| `pnpm install`         | Installs dependencies                            |
| `pnpm dev`             | Starts local dev server at `localhost:4321`      |
| `pnpm build`           | Build your production site to `./dist/`          |
| `pnpm preview`         | Preview your build locally, before deploying     |
| `pnpm astro ...`       | Run CLI commands like `astro add`, `astro check` |
| `pnpm astro -- --help` | Get help using the Astro CLI                     |

---

### Devbox.Json (`docs/devbox.json`)

{
  "$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.16.0/.schema/devbox.schema.json",
  "env": {
    "DEVBOX_COREPACK_ENABLED": "true"
  },
  "packages": {
    "nodejs": "22.14.0"
  },
  "shell": {
    "init_hook": ["echo \"Creating devbox shell for docs site...\""]
  }
}

---

### Package.Json (`docs/package.json`)

{
  "name": "docs",
  "type": "module",
  "version": "0.0.1",
  "scripts": {
    "dev": "astro dev",
    "start": "astro dev",
    "build": "astro build",
    "preview": "astro preview",
    "astro": "astro"
  },
  "dependencies": {
    "@astrojs/node": "^9.4.3",
    "@astrojs/starlight": "^0.35.2",
    "@astrojs/starlight-tailwind": "^4.0.1",
    "@tailwindcss/vite": "^4.1.12",
    "astro": "^5.6.1",
    "astro-broken-links-checker": "github:imazen/astro-broken-link-checker",
    "sharp": "^0.34.2",
    "tailwindcss": "^4.1.12"
  },
  "devDependencies": {
    "@typescript-eslint/parser": "^8.41.0",
    "eslint": "^9.34.0",
    "eslint-plugin-astro": "^1.3.1",
    "eslint-plugin-jsx-a11y": "^6.10.2",
    "prettier": "^3.6.2",
    "prettier-plugin-astro": "^0.14.1",
    "prettier-plugin-tailwindcss": "^0.6.14"
  },
  "packageManager": "pnpm@10.14.0"
}

---

### Tsconfig.Json (`docs/tsconfig.json`)

{
  "extends": "astro/tsconfigs/strict",
  "include": [".astro/types.d.ts", "**/*"],
  "exclude": ["dist"]
}

---

### Src Assets Custom Commands.Yml (`docs/src/assets/custom-commands.yml`)

prSections:
  - title: My Pull Requests
    filters: is:open author:@me owner:dlvhdr
  - title: Needs My Review
    filters: review-requested:@me owner:dlvhdr
issuesSections:
  - title: Ghostty
    filters: is:open ghostty-org/ghostty
  - title: Neovim
    filters: is:open neovim/neovim

defaults:
  preview:
    open: false
    width: 40
  prsLimit: 20
  issuesLimit: 20
  view: repo
keybindings:
  universal:
    - key: g
      name: lazygit
      command: >
        cd {{.RepoPath}} && lazygit
    - key: C
      name: code review
      command: >
        tmux new-window -c {{.RepoPath}} '
        nvim -c ":silent Octo pr edit {{.PrNumber}}"
        '
repoPaths:
  dlvhdr/*: ~/code/personal/*
pager:
  diff: diffnav
theme:
  colors:
    text:
      primary: "#E2E1ED"
      secondary: "#666CA6"
      inverted: "#242347"
      faint: "#b0b3bf"
      warning: "#F23D5C"
      success: "#3DF294"
    background:
      selected: "#1b1b33"
    border:
      primary: "#383B5B"
      secondary: "#39386B"
      faint: "#2B2B40"
smartFilteringAtLaunch: false

---

### Src Assets Demo.Yml (`docs/src/assets/demo.yml`)

prSections:
  - title: My Pull Requests
    filters: is:open author:@me owner:charmbracelet
  - title: Review Requested
    filters: review-requested:@me owner:charmbraclet
  - title: My Team
    filters: is:open owner:neovim author:gpanders author:tjdevries
  - title: Open Source
    filters: is:open repo:ghostty-org/ghostty repo:neovim/neovim
issuesSections:
  - title: Ghostty
    filters: is:open ghostty-org/ghostty
  - title: Neovim
    filters: is:open neovim/neovim
  - title: Bubbletea
    filters: repo:charmbracelet/bubbletea

defaults:
  preview:
    open: true
    width: 40
  prsLimit: 20
  issuesLimit: 20
  view: repo
keybindings:
  prs: []
repoPaths: {}
pager:
  diff: diffnav
theme:
  colors:
    text:
      primary: "#E2E1ED"
      secondary: "#666CA6"
      inverted: "#242347"
      faint: "#b0b3bf"
      warning: "#F23D5C"
      success: "#3DF294"
    background:
      selected: "#1b1b33"
    border:
      primary: "#383B5B"
      secondary: "#39386B"
      faint: "#2B2B40"
smartFilteringAtLaunch: false

---

### Src Assets Sections.Yml (`docs/src/assets/sections.yml`)

prSections:
  - title: My Pull Requests
    filters: is:open author:@me owner:dlvhdr
  - title: Needs My Review
    filters: review-requested:@me owner:dlvhdr
issuesSections:
  - title: Ghostty
    filters: is:open ghostty-org/ghostty
  - title: Neovim
    filters: is:open neovim/neovim

defaults:
  preview:
    open: false
    width: 40
  prsLimit: 20
  issuesLimit: 20
  view: repo
keybindings:
  prs: []
repoPaths: {}
pager:
  diff: diffnav
theme:
  colors:
    text:
      primary: "#E2E1ED"
      secondary: "#666CA6"
      inverted: "#242347"
      faint: "#b0b3bf"
      warning: "#F23D5C"
      success: "#3DF294"
    background:
      selected: "#1b1b33"
    border:
      primary: "#383B5B"
      secondary: "#39386B"
      faint: "#2B2B40"
smartFilteringAtLaunch: false

---

### Src Assets Theme Catpuccin.Yml (`docs/src/assets/theme-catpuccin.yml`)

prSections:
  - title: My Pull Requests
    filters: is:open author:@me owner:dlvhdr
  - title: Needs My Review
    filters: review-requested:@me owner:dlvhdr
issuesSections:
  - title: Ghostty
    filters: is:open ghostty-org/ghostty
  - title: Neovim
    filters: is:open neovim/neovim

defaults:
  preview:
    open: true
    width: 50
  prsLimit: 20
  issuesLimit: 20
  view: repo
keybindings:
  prs: []
repoPaths: {}
pager:
  diff: diffnav
theme:
  colors:
    text:
      primary: "#89b4fa"
      secondary: "#b4befe"
      inverted: "#181825"
      faint: "#7f849c"
      warning: "#f9e2af"
      success: "#a6e3a1"
    background:
      selected: "#313244"
    border:
      primary: "#9399b2"
      secondary: "#585b70"
      faint: "#313244"
smartFilteringAtLaunch: false

---

### Src Assets Theme Gruvbox.Yml (`docs/src/assets/theme-gruvbox.yml`)

prSections:
  - title: My Pull Requests
    filters: is:open author:@me owner:dlvhdr
  - title: Needs My Review
    filters: review-requested:@me owner:dlvhdr
issuesSections:
  - title: Ghostty
    filters: is:open ghostty-org/ghostty
  - title: Neovim
    filters: is:open neovim/neovim

defaults:
  preview:
    open: true
    width: 50
  prsLimit: 20
  issuesLimit: 20
  view: repo
keybindings:
  prs: []
repoPaths: {}
pager:
  diff: diffnav
theme:
  colors:
    text:
      primary: "#fe8019"
      secondary: "#d65d0e"
      inverted: "#3c3836"
      faint: "#d5c4a1"
      warning: "#fabd2f"
      success: "#98971a"
    background:
      selected: "#282828"
    border:
      primary: "#665c54"
      secondary: "#3c3836"
      faint: "#1d2021"
smartFilteringAtLaunch: false

---

### Src Assets Theme Tokyonight.Yml (`docs/src/assets/theme-tokyonight.yml`)

prSections:
  - title: My Pull Requests
    filters: is:open author:@me owner:dlvhdr
  - title: Needs My Review
    filters: review-requested:@me owner:dlvhdr
issuesSections:
  - title: Ghostty
    filters: is:open ghostty-org/ghostty
  - title: Neovim
    filters: is:open neovim/neovim

defaults:
  preview:
    open: true
    width: 50
  prsLimit: 20
  issuesLimit: 20
  view: repo
keybindings:
  prs: []
repoPaths: {}
pager:
  diff: diffnav
theme:
  colors:
    text:
      primary: "#E2E1ED"
      secondary: "#666CA6"
      inverted: "#242347"
      faint: "#b0b3bf"
      warning: "#F23D5C"
      success: "#3DF294"
    background:
      selected: "#1b1b33"
    border:
      primary: "#383B5B"
      secondary: "#39386B"
      faint: "#2B2B40"
smartFilteringAtLaunch: false

---

### Src Content Docs Configuration Defaults (`docs/src/content/docs/configuration/defaults.mdx`)

---
title: Defaults
---

## Default Options (`defaults`)

These settings define the default behavior for the dashboard. You can override many of these
settings on a per-section basis.

```yaml
defaults:
  issuesLimit: 20
  notificationsLimit: 20
  prApproveComment: LGTM
  preview:
    open: true
    width: 0.45
    height: 0.60
    position: auto
  prsLimit: 20
  refetchIntervalMinutes: 30
  view: prs
```

By default, the dashboard is configured to:

- Display the preview pane to the right at 45% width, or below at 40% height when the terminal is narrow.
- Only fetch 20 PRs, issues, and notifications at a time for each section.
- Display the PRs view when the dashboard loads.
- Refetch PRs and issues for each section every 30 minutes.
- Display dates using relative values.

For more details on the default layouts, see the documentation for [PR] and [issue] layout definitions.

[PR]: /configuration/layout/pr/
[issue]: /configuration/layout/issue/

### Layout Options (`layout`)

This setting defines the layout for the work item tables in the dashboard. You can override
these settings in any section you define in the [`prSections`] or [`issueSections`] settings.

They determine which columns are displayed and how.

[`prSections`]: /configuration/pr-section
[`issueSections`]: /configuration/issue-section

#### PR Section Layout

You can define how a PR section displays items in its table by setting options for the
available columns. You can define a column's width, whether it grows to fill available space,
and whether the column should be visible at all.

Note that if the length of a column's text exceeds the defined column [`width`], the view
truncates the column's text to two characters shorter than the column's width. For example, if
the width is `6`, `gh-dash` displays as `gh-d`.

Column headings have their color defined by the [`theme.colors.text.primary`] setting.

For more information, see [PR Section Layout](/configuration/layout/pr).

[`width`]: /configuration/layout/options
[`theme.colors.text.primary`]: /configuration/theme

#### Issue Section Layout (`issues`)

You can define how an issue section displays items in its table by setting options for the
available columns. You can define a column's width, whether it grows to fill available space,
and whether the column should be visible at all.

Note that if the length of a column's text exceeds the defined column [`width`], the view
truncates the column's text to two characters shorter than the column's width. For example, if
the width is `6`, `gh-dash` displays as `gh-d`.

Column headings have their color defined by the [`theme.colors.text.primary`] setting.

For more information, see [Issue Section Layout](/configuration/layout/issue).

[`width`]: layout.options.width
[`theme.colors.text.primary`]: theme.colors.text.primary

### PR Fetch Limit

| Type    | Minimum | Default |
| :------ | :-----: | :-----: |
| Integer |    1    |   20    |

This setting defines how many PRs the dashboard should fetch for each section when:

- The dashboard first loads.
- The [fetch interval] elapses.
- You navigate to the next PR in a table without another fetched PR to display.
- You use the [refresh current section] or [refresh all sections] commands.

[fetch interval]: #refetch-interval-in-minutes-refetchintervalminutes
[refresh current section]: /getting-started/keybindings/global/#r---refresh-current-section
[refresh all sections]: /getting-started/keybindings/global/#r---refresh-all-sections

### Issue Fetch Limit (`issuesLimit`)

| Type    | Minimum | Default |
| :------ | :-----: | :-----: |
| Integer |    1    |   20    |

This setting defines how many issues the dashboard should fetch for each section when:

- The dashboard first loads.
- The [fetch interval] elapses.
- You navigate to the next issue in a table without another fetched issue to display.
- You use the [refresh current section] or [refresh all sections] commands.

[fetch interval]: #refetch-interval-in-minutes-refetchintervalminutes
[refresh current section]: /getting-started/keybindings/global/#r---refresh-current-section
[refresh all sections]: /getting-started/keybindings/global/#r---refresh-all-sections

### Notifications Fetch Limit (`notificationsLimit`)

| Type    | Minimum | Default |
| :------ | :-----: | :-----: |
| Integer |    1    |   20    |

This setting defines how many notifications the dashboard should fetch when:

- The dashboard first loads.
- You navigate to the next notification in a table without another fetched notification to display.
- You use the [refresh current section] or [refresh all sections] commands.

[refresh current section]: /getting-started/keybindings/global/#r---refresh-current-section
[refresh all sections]: /getting-started/keybindings/global/#r---refresh-all-sections

### Preview Pane (`preview`)

These settings define how the preview pane displays in the dashboard. You can specify
whether the preview pane is open by default, its width (for right position), its height
(for bottom position), and its position relative to the main content.

#### Open on Load (`open`)

| Type    | Default |
| :------ | :-----: |
| Boolean |  true   |

Specifies whether the preview pane should be open by default for the selected work item
when the dashboard loads. You can always use the [toggle preview pane] command to
toggle the preview pane's visibility.

By default, the dashboard displays the preview pane.

[toggle preview pane]: /getting-started/keybindings/preview/#p---toggle-preview-pane

#### Preview Pane Width (`width`)

| Type    | Minimum | Default |
| :------ | :-----: | :-----: |
| Number  |    0    |  0.45   |

Specifies the width of the preview pane. You can set the size to the percentage of the terminal size by using fractions (e.g. 0.4 would be 40%).

By default, the preview pane is 45% wide.

#### Preview Pane Height (`height`)

| Type   | Minimum | Default |
| :----- | :-----: | :-----: |
| Number |    0    |  0.60   |

Specifies the height of the preview pane when it appears below the main content (in bottom
position mode). You can set the size to a percentage of the terminal height by using
fractions (e.g. 0.4 would be 40%). Values greater than 1 specify a fixed number of rows.

By default, the preview pane height is 40%.

#### Preview Pane Position (`position`)

| Type   |        Options         | Default |
| :----- | :--------------------: | :-----: |
| String | `right`, `bottom`, `auto` | `auto`  |

Specifies where the preview pane appears relative to the main content.

- `right` — the preview pane appears to the right of the main content (vertical split).
- `bottom` — the preview pane appears below the main content (horizontal split).
- `auto` — automatically chooses `right` when the terminal is wide enough, and switches
  to `bottom` when the main content would have fewer than 80 columns.

You can toggle the position at runtime with the <kbd>P</kbd> key.

By default, the position is `auto`.

### Refetch Interval in Minutes (`refetchIntervalMinutes`)

| Type    | Minimum | Default |
| :------ | :-----: | :-----: |
| Integer |    0    |   30    |

This setting defines how often the dashboard should fetch issues and PRs from GitHub. The
dashboard fetches work items for every section in the active view when the dashboard loads
and the first time you switch to the inactive view.

After the dashboard fetches the work items for the first time, it waits until this setting's
defined interval elapses before fetching the work items again.

By default, the dashboard refetches work items every 30 minutes.

To disable the refetching interval set it to 0.

You can always use the [refresh current section] or [refresh all sections] command to
refetch work items in the current view. If you change the search query for a view, the
dashboard fetches results for the updated query immediately.

[refresh current section]: /getting-started/keybindings/global/#r---refresh-current-section
[refresh all sections]: /getting-started/keybindings/global/#r---refresh-all-sections

### Date format (`dateFormat`)

| Type   |  Default   |
| :----- | :--------: |
| String | "relative" |

This setting defines how dates are formatted. The format either be "relative" or a [go time format].

By default, the format is "relative" which fits just inside the default column width of
updated at in the issues and pull request layouts.

You may need to adjust the layout column width depending on your format.

[go time format]: https://pkg.go.dev/time#pkg-constants

### Default View (`view`)

| Type   |              Options              | Default |
| :----- | :-------------------------------: | :-----: |
| String | "notifications", "prs", "issues" |  "prs"  |

This setting defines whether the dashboard should display the Notifications, PRs, or Issues
view when it first loads.

By default, the dashboard displays the PRs view.

### PR Approval (`prApproveComment`)

| Type   | Default |
| :----- | :-----: |
| String | "LGTM"  |

This setting defines the default comment used as a starting point when [approving a PR].
This can be set as an empty string to not prefill a comment.

By default, the comment is "LGTM".

[approving a PR]: /getting-started/keybindings/selected-pr/#v---approve-pr

## Confirm Quit (`confirmQuit`)

| Type    | Default |
| :------ | :-----: |
| Boolean |  false  |

This setting specifies whether the user needs to confirm when quitting `gh-dash`
When this is on, `gh-dash` shows a prompt that requires the user to press <kbd>y</kbd>/<kbd>Enter</kbd> to actually quit.
Pressing any other key dismisses the message.

By default, dash doesn't need a confirmation.

[approving a PR]: /getting-started/keybindings/selected-pr/#v---approve-pr


## Include Read Notifications (`includeReadNotifications`)

| Type    | Default |
| :------ | :-----: |
| Boolean |  true   |

This setting controls whether the default notification view includes read notifications
alongside unread ones, matching GitHub’s default behavior.

When set to `true` (the default), notification sections with no explicit `is:` filter show
both read and unread notifications. When set to `false`, they show only unread notifications
plus any bookmarked items.

Explicit filters like `is:unread` or `is:read` in a section’s `filters` always override
this setting.

```yaml
# Show only unread notifications by default (old behavior)
includeReadNotifications: false
```

---

### Src Content Docs Configuration Examples (`docs/src/content/docs/configuration/examples.mdx`)

---
title: Examples
---

These examples show a few ways you might configure your dashboard.

## Complete Examples

- The config for the `gh-dash` repo under [.gh-dash.yml](https://github.com/dlvhdr/gh-dash/blob/main/.gh-dash.yml)
- My config under my dotfiles repo [dlvhdr/dotfiles](https://github.com/dlvhdr/dotfiles/blob/main/nix/module/gh-dash/configs/config.yml)
- Many other configs found by [searching GitHub](https://github.com/search?q=path%3Agh-dash%2Fconfig.yml&type=code)

## Default Values

<div style="max-height: 500px; overflow-y:scroll;">

```
/* Detailed source-code truncated for AI context efficiency. */
```

</div>

## Theming Example

The color palette in this example is inspired by the [Monokai Pro Spectrum Filter][01] palette.

```yaml
theme:
  colors:
    text:
      primary: "#F7F1FF"
      secondary: "#5AD4E6"
      inverted: "#F7F1FF"
      faint: "#3E4057"
      warning: "#FC618D"
      success: "#7BD88F"
    background:
      selected: "#535155"
    border:
      primary: "#948AE3"
      secondary: "#7BD88F"
      faint: "#3E4057"
```

[01]: https://www.vscolors.com/themes/f5d7ffda-c1d6-4070-ba80-803c705a1ee6-3ed72ace

## Custom Keybindings Example

Utilizing `tmux` we can launch other TUIs:

```yaml
keybindings:
  universal:
    - key: g
      name: lazygit
      command: >
        cd {{.RepoPath}} && lazygit
  prs:
    - key: O
      builtin: checkout
    - key: m
      command: gh pr merge --admin --repo {{.RepoName}} {{.PrNumber}}
    - key: C
      name: code review
      command: >
        tmux new-window -c {{.RepoPath}} '
        nvim -c ":silent Octo pr edit {{.PrNumber}}"
        '
    - key: a
      name: lazygit add
      command: >
        cd {{.RepoPath}} && git add -A && lazygit
    - key: v
      name: approve
      command: >
        gh pr review --repo {{.RepoName}} --approve --body "$(gum input --prompt='Approval Comment: ')" {{.PrNumber}}
```

## Repo Paths Example

Configure [`repoPaths`](/configuration/repo-paths) in order to check out PRs in
the right git directory.

```yaml
repoPaths:
  dlvhdr/*: ~/code/personal/*
  my-work-org/*: ~/code/my-work-org/*
  charmbracelet/*: ~/code/charm/*
  dlvhdr/dotfiles: ~/dotfiles
```

---

### Src Content Docs Configuration Issue Section (`docs/src/content/docs/configuration/issue-section.mdx`)

---
title: Issue Sections
---

# Issues Section Options (`issuesSections`)

Defines a section in the dashboard's issues view.

- Every section must define a [`title`] and [`filters`].
- When you define [`limit`] for a section, that value overrides the
  [`defaults.issuesLimit`] setting.
- When you define [`layout`] for a section, that value overrides the
  [`defaults.layout.issue`] setting.

[`title`]: #issues-title-title
[`filters`]: #issues-filters-filters
[`limit`]: #issues-fetch-limit-limit
[`layout`]: #issues-section-layout-layout
[`defaults.issuesLimit`]: /configuration/defaults/#issue-fetch-limit-issueslimit
[`defaults.layout.issue`]: /configuration/defaults/#layout-options-layout

## Issues Title (`title`)

This setting defines the section's name. The dashboard displays this value in the tabs for
the issues view.

## Issues Filters (`filters`)

This setting defines the [GitHub search filters][01] for the Issues in the section's table.

Don't specify `is:issue` for this setting. The dashboard always adds that filter for Issues
sections. 

Note issues from archived repositories are excluded by default with `archived:false`.

You can define any combination of search filters. To make it easier to read and maintain
your filters, we recommend using the `>-` syntax after the `filter` key and writing one
filter per line.

For example:

```yaml
- # Involved
  filter: >-
    is:open
    involves:@me
    -author:@me
    updated:>={{ nowModify "-2w" }}
```

For more information about writing filters for searching GitHub, see [Searching].

[Searching]: /configuration/searching

## Issues Section Layout (`layout`)

You can define how a Issues section displays items in its table by setting options for the
available columns. You can define a column's width, whether it grows to fill available space,
and whether the column should be visible at all.

Note that if the length of a column's text exceeds the defined column [`width`], the view
truncates the column's text to two characters shorter than the column's width. For example, if
the width is `6`, `gh-dash` displays as `gh-d`.

Column headings have their color defined by the [`theme.colors.text.issueimary`] setting.

[`width`]: /configuration/layout/options#layout-options-width
[`theme.colors.text.issueimary`]: /configuration/theme

## Issues Fetch Limit (`limit`)

| Type    | Minimum | Default |
| :------ | :-----: | :-----: |
| Integer |    1    |   20    |

This setting defines how many Issues the dashboard should fetch for the section when:

- The dashboard first loads.
- The [fetch interval] elapses.
- You navigate to the next issue in a table without another fetched issue to display.
- You use the [refresh current section] or [refresh all sections] commands.

This setting overrides the [`defaults.issuesLimit`] setting.

[01]: https://docs.github.com/en/search-github/searching-on-github/searching-issues-and-pull-requests
[fetch interval]: /configuration/defaults/#refetch-interval-in-minutes-refetchintervalminutes
[refresh current section]: /getting-started/keybindings/global/#r---refresh-current-section
[refresh all sections]: /getting-started/keybindings/global/#r---refresh-all-sections
[`defaults.issuesLimit`]: /configuration/defaults/#issue-fetch-limit

---

### Src Content Docs Configuration Notification Section (`docs/src/content/docs/configuration/notification-section.mdx`)

---
title: Notification Sections
---

# Notification Section Options (`notificationsSections`)

Defines sections in the dashboard's Notifications view.

- Every section must define a [`title`] and [`filters`].
- When you define [`limit`] for a section, that value overrides the
  [`defaults.notificationsLimit`] setting.

[`title`]: #notification-title-title
[`filters`]: #notification-filters-filters
[`limit`]: #notification-fetch-limit-limit
[`defaults.notificationsLimit`]: /configuration/defaults/#notifications-fetch-limit-notificationslimit

## Search Section

The Notifications view includes a search section (indicated by a magnifying glass icon) as the first tab. This serves as a scratchpad for one-off searches without modifying your configured sections.

- Default filter: `archived:false`
- Respects `smartFilteringAtLaunch`: when enabled and running from a git repository, the search automatically scopes to that repo
- Use the `/` key to focus the search bar and enter custom queries

## Default Sections

By default, the dashboard includes these notification sections:

```yaml
notificationsSections:
  - title: All
    filters: ""
  - title: Created
    filters: "reason:author"
  - title: Participating
    filters: "reason:participating"
  - title: Mentioned
    filters: "reason:mention"
  - title: Review Requested
    filters: "reason:review-requested"
  - title: Assigned
    filters: "reason:assign"
  - title: Subscribed
    filters: "reason:subscribed"
  - title: Team Mentioned
    filters: "reason:team-mention"
```

You can customize these by defining your own `notificationsSections` in your config file.

## Notification Title (`title`)

This setting defines the section's name. The dashboard displays this value in the tabs for
the Notifications view.

## Notification Filters (`filters`)

This setting defines the filters for notifications in the section's table. Notification filters differ from PR and Issue filters because they use client-side filtering.

### Available Filters

#### Read State Filters

| Filter | Description |
|--------|-------------|
| `is:unread` | Show only unread notifications |
| `is:read` | Show only read notifications |
| `is:all` | Show both read and unread notifications |
| `is:done` | Show archived/done notifications |

#### Reason Filters

| Filter | Description |
|--------|-------------|
| `reason:author` | Activity on threads you created |
| `reason:comment` | Someone commented on a thread you're subscribed to |
| `reason:mention` | You were @mentioned |
| `reason:review-requested` | Your review was requested on a PR |
| `reason:assign` | You were assigned |
| `reason:subscribed` | Activity on threads you're watching |
| `reason:team-mention` | Your team was @mentioned |
| `reason:state-change` | Thread state changed (merged, closed, etc.) |
| `reason:ci-activity` | CI workflow activity |
| `reason:participating` | Meta-filter that expands to: author, comment, mention, review-requested, assign, state-change |

#### Repository Filters

| Filter | Description |
|--------|-------------|
| `repo:owner/name` | Show notifications only from the specified repository |

### Filter Examples

```yaml
# Show only notifications where you were mentioned
- title: Mentioned
  filters: "reason:mention"

# Show unread notifications from a specific repo
- title: My Project
  filters: "is:unread repo:myorg/myproject"

# Show notifications where you're actively participating
- title: Participating
  filters: "reason:participating"

# Combine multiple reason filters
- title: Review & Mentions
  filters: "reason:review-requested reason:mention"
```

### Filter Behavior

- **Default behavior**: With no filters or empty filters, the section shows all notifications (both read and unread), matching GitHub's default behavior. To show only unread notifications by default, set `includeReadNotifications: false` in your config.
- **Explicit `is:unread`**: Shows only unread notifications, excluding bookmarked read notifications. This overrides the `includeReadNotifications` setting.
- **Reason filters**: Applied client-side after fetching from GitHub's API

## Notification Fetch Limit (`limit`)

| Type    | Minimum | Default |
| :------ | :-----: | :-----: |
| Integer |    1    |   20    |

This setting defines how many notifications the dashboard should fetch for the section when:

- The dashboard first loads.
- You navigate to the next notification in a table without another fetched notification to display.
- You use the [refresh current section] or [refresh all sections] commands.

This setting overrides the [`defaults.notificationsLimit`] setting.

[refresh current section]: /getting-started/keybindings/global/#r---refresh-current-section
[refresh all sections]: /getting-started/keybindings/global/#r---refresh-all-sections
[`defaults.notificationsLimit`]: /configuration/defaults/#notifications-fetch-limit-notificationslimit

---

### Src Content Docs Configuration Pr Section (`docs/src/content/docs/configuration/pr-section.mdx`)

---
title: PR Sections
---

# PR Section Options (`prSections`)

Defines a section in the dashboard's PRs view.

- Every section must define a [`title`] and [`filters`].
- When you define [`limit`] for a section, that value overrides the
  [`defaults.prsLimit`] setting.
- When you define [`layout`] for a section, that value overrides the
  [`defaults.layout.pr`] setting.

[`title`]: #pr-title-title
[`filters`]: #pr-filters-filters
[`limit`]: #pr-fetch-limit-limit
[`layout`]: #pr-section-layout-layout
[`defaults.prsLimit`]: /configuration/defaults/#pr-fetch-limit
[`defaults.layout.pr`]: /configuration/defaults/#layout-options-layout

## PR Title (`title`)

This setting defines the section's name. The dashboard displays this value in the tabs for
the PRs view.

## PR Filters (`filters`)

This setting defines the [GitHub search filters][01] for the PRs in the section's table.

Don't specify `is:pr` for this setting. The dashboard always adds that filter for PR
sections.

Note pull requests from archived repositories are excluded by default with `archived:false`.

You can define any combination of search filters. To make it easier to read and maintain
your filters, we recommend using the `>-` syntax after the `filter` key and writing one
filter per line.

For example:

```yaml
- # Involved
  filter: >-
    is:open
    involves:@me
    -author:@me
    updated:>={{ nowModify "-2w" }}
```

For more information about writing filters for searching GitHub, see [Searching].

[Searching]: /configuration/searching

## PR Section Layout (`layout`)

You can define how a PR section displays items in its table by setting options for the
available columns. You can define a column's width, whether it grows to fill available space,
and whether the column should be visible at all.

Note that if the length of a column's text exceeds the defined column [`width`], the view
truncates the column's text to two characters shorter than the column's width. For example, if
the width is `6`, `gh-dash` displays as `gh-d`.

Column headings have their color defined by the [`theme.colors.text.primary`] setting.

[`width`]: /configuration/layout/options#layout-options-width
[`theme.colors.text.primary`]: /configuration/theme

## PR Fetch Limit (`limit`)

| Type    | Minimum | Default |
| :------ | :-----: | :-----: |
| Integer |    1    |   20    |

This setting defines how many PRs the dashboard should fetch for the section when:

- The dashboard first loads.
- The [fetch interval] elapses.
- You navigate to the next issue in a table without another fetched issue to display.
- You use the [refresh current section] or [refresh all sections] commands.

This setting overrides the [`defaults.prsLimit`] setting.

[01]: https://docs.github.com/en/search-github/searching-on-github/searching-issues-and-pull-requests
[fetch interval]: /configuration/defaults/#refetch-interval-in-minutes-refetchintervalminutes
[refresh current section]: /getting-started/keybindings/global/#r---refresh-current-section
[refresh all sections]: /getting-started/keybindings/global/#r---refresh-all-sections
[`defaults.prsLimit`]: /configuration/defaults/#pr-fetch-limit

---

### Src Content Docs Configuration Repo Paths (`docs/src/content/docs/configuration/repo-paths.mdx`)

---
title: Repo Paths
---

You can use the `repoPaths` setting to map repository names (as keys) to local paths
(as values). This map configures where to locate repositories when checking out PRs.

The mappings can be exact matches, like the full name or path of a repository, or wildcard
matches using the `owner` and a partial path.

An exact match for the full repository name to a full path takes priority over a matching
wildcard. Wildcard keys must match to a wildcard path.

The `RepoName` and `RepoPath` keybinding arguments are fully expanded when sent to the
command.

## Examples

### Matching Repositories

```yaml
repoPaths:
  dlvhdr/*: ~/code/repos/*
  dlvhdr/gh-dash: ~/code/gh-dash
```

In this example, the first key is defined with a wildcard (`*`) as `dlvhdr/*`, so the
dashboard will use this entry to resolve the path for any repo in the `dlvhdr`
namespace, like `dlvhdr/jb` or `dlvhdr/harbor`. Note that the value for this key
also uses a wildcard. If the key specifies a wildcard, the value must specify one too.

If a repository in the `dlvhdr` namespace has been cloned into the `~/code/repos`
folder, the dashboard will be able to checkout PRs for that repository locally.

If the repository isn't found, the checkout command raises an error.

The second key defines an exact mapping between the `dlvhdr/gh-dash` repository and the
`~/code/gh-dash` folder. Because this is a non-wildcard mapping, the dashboard will use
this value to resolve the repository path for `dlvhdr/gh-dash` even though there's also
an entry for `dlvhdr/*`.

## Pattern Properties

### With a Wildcard

If the key for an `repoPath` entry ends with a wildcard (`*`), its value must also have
a wildcard. If a key ends with a wildcard but the value doesn't, `gh-dash` won't be
able to correctly map repositories to folders.

### Without a Wildcard

If the key for an `repoPath` entry doesn't have a wildcard (`*`), its value must not
have a wildcard. If a key ends without a wildcard but the value does, `gh-dash` won't
be able to correctly map repositories to folders.

---

### Src Content Docs Configuration Reusing (`docs/src/content/docs/configuration/reusing.mdx`)

---
title: Reusing Settings
---

`DASH` supports defining global settings that will always be applied, and lets you override them with a per-repo or one-time basis.

This lets you set your [theme](./theme), [keybindings](./keybindings) and any other setting by defining them once.

## The Global Config

The global config is usually under `$HOME/.config/gh-dash/config.yml` - but that follows the XDG spec. See [How to Configure](/configuration) for more details.

The global config is loaded first, with the option to override anything it defines.
Here you'd usually want to define stuff like your theme, keybindings etc.

## Per-Repo / One-Time Overrides

`DASH` supports passing ad-hoc or per-repo config files by:

- Creating a `.gh-dash.yml` file in a git repo's root directory.
- Passing a path to a `.yml` file you supplied with the `--config` flag or the `GH_DASH_CONFIG` environment variable.

Any settings defined here will override your global config settings.

## Example

Your global config under `~/.config/gh-dash/config.yml` could look like this:

```yaml
pager:
  diff: diffnav
theme:
  colors:
    text:
      primary: "#E2E1ED"
      secondary: "#666CA6"
      inverted: "#242347"
      # ...
keybindings:
  universal:
    - key: g
      name: lazygit
      command: cd {{.RepoPath}} && lazygit
```

Then in a git repo you could create a `.gh-dash.yml` file defining just the
sections:

```yaml
prSections:
  - title: Bugs
    filters: is:open author:@me [BUG]
  - title: Our Packages
    filters: is:open review-requested:@me repo:work-org/our-pkg
```

Starting `DASH` from the git repo, the final config used will have the `pager`, `theme` and `keybindings`
from your global config and the `prSections` from your repo's config.

## Including Other Config Files

Any config file can pull in other config files with the `include` directive, which
takes a list of paths to other config files:

```yaml
include:
  - /var/lib/gh-dash/system-shared.yml
  - ~/.config/gh-dash/themes/tokyonight.yml
  - ./shared-keybindings.yml

prSections:
  - title: Bugs
    filters: is:open author:@me [BUG]
```

Included files are merged in using the same rules as the global/override merge:
the file doing the including takes precedence over the files it includes, and
included files are merged in the order they're listed (later ones overriding
earlier ones). `keybindings` are unioned across all files, and `sections` are
taken from the file that defines them.

Paths are resolved relative to the file declaring the `include`, and a leading
`~` is expanded to your home directory. Included files may declare their own
`include` directives, which are resolved recursively.

---

### Src Content Docs Configuration Schema (`docs/src/content/docs/configuration/schema.mdx`)

---
title: Schema
---

The `dash` configuration schema is published here:

[`https://gh-dash.dev/schema.json`][02]

## Using the Schema in Neovim

1. Install the [yaml-language-server](https://github.com/redhat-developer/yaml-language-server) LSP
2. Follow the guide in [nvim-lspconfig](https://github.com/neovim/nvim-lspconfig/blob/master/doc/configs.md#yamlls) to set it up
3. Add the following line to the top of your configuration file:

   ```
   # yaml-language-server: $schema=https://gh-dash.dev/schema.json
   ```

With the directive comment at the top of your configuration or the VS Code settings file, you can
then open your configurations and edit them with support for validation. When you hover on an
option in your configuration file, you'll get a brief synopsis of the option and a link to its
documentation on this site.

## Using the Schema in VS Code

You can get edit-time feedback, validation, and IntelliSense for your configurations in VS Code by
following these steps:

1. Install [Red Hat's YAML extension for VS Code][03].
1. Open your `dash` configuration file.
1. Add the following line to the top of your configuration file:

   ```
   # yaml-language-server: $schema=https://gh-dash.dev/schema.json
   ```

1. Instead of adding a comment to your configuration file, you could create the
   `.vscode/settings.json` file in your `dash` configuration folder and add this setting:

   ```json
   {
     "yaml.schemas": {
       "https://gh-dash.dev/schema.json": "*.yml"
     }
   }
   ```

[01]: /getting-started/usage#--config
[02]: /schema.json
[03]: https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml

---

### Src Content Docs Configuration Searching (`docs/src/content/docs/configuration/searching.mdx`)

---
title: Searching
linkTitle: >-
  &nbsp;Searching
summary: >-
  How to search and filter issues and prs
weight: 3
---

# Searching

Searching for prs and issues is done by defining sections and their filters.
Search filters are defined using [GitHub search filters][01].

For example, this section, shows open PRs authored by anyone but me, which were updated in the last 2 weeks.

```yaml
prsSections:
  - title: Review
    filter: >-
      is:open
      -author:@me
      updated:>={{ nowModify "-2w" }}
```

Note: don't specify `is:pr` for this setting. The dashboard always adds that filter for PR
sections. Results from archived repositories are excluded by default with `archived:false`.

You can define any combination of search filters. To make it easier to read and maintain
your filters, we recommend using the `>-` syntax after the `filter` key and writing one
filter per line.

For more information about writing filters for searching GitHub, see [Searching issues and pull requests][02].

## Search Templates

In addition to GitHub's filters, gh-dash adds templating functions.

### `nowModify`

The `nowModify` function helps you calculate relative dates in the ISO-8601 format (which is what GitHub expects).

Given the date today is 2025-02-02, a search filter of `updated:>={{ nowModify "-1mo" }}` will output `updated:>=2025-01-02`.

A duration string is a possibly signed sequence of decimal numbers, each with optional fraction and a unit suffix, such as `1w`, `-8h` or `1mo2w`.

The available units are:

- [Go's builtin durations](https://pkg.go.dev/time#ParseDuration) - `ns`, `us` (or `µs`), `ms`, `s`, `m`, `h`
- Additionally:
  - `d`/`D` for days
  - `w`/`W` for weeks
  - `M`/`mo` for months
  - `y`/`Y` for years

## Smart Filtering

By default, if the directory you launch `dash` from is a clone of a remote GitHub repo (or if you
have the `GH_REPO` environment variable set to a particular remote), then for any of your PR
sections and issue sections with `filters` values in your [configuration](/configuration) that don’t
have an explicit `repo:` field, `dash` adds a `repo:<RepoName>` field to the search-bar value for
them (where _`<RepoName>`_ is the name of the remote repo).

That is, `dash` further filters those sections down to only the PRs/issues for the GitHub
repo name specified in your `GH_REPO` environment variable — or else the repo name of the remote
tracked by the clone directory from which `dash` launched.

For that, `dash` first checks and uses the repo name in the `GH_REPO` environment variable (if
you have that set). If `dash` doesn’t find that, then it next checks for the value of the remote
repo name tracked by the clone directory from which you launched `dash` — by looking through all
GitHub remotes configured for that clone in the following order:

1. `upstream`
2. `github`
3. `origin`

…and, otherwise, if `dash` finds no remotes with any of those names, then it uses the repo name
for the first remote in the output that `git remote` shows.

To disable Smart Filtering at launch, set `smartFilteringAtLaunch` to `false` in your [configuration](/configuration).

```yaml
smartFilteringAtLaunch: false
```

To toggle Smart Filtering on or off for the current section you’re currently viewing, either use the
`t` key — or else use whatever custom keybinding you have set for the `togglesearch` builtin in the
`keybindings` section of your [configuration](/configuration).

You can also manually edit the search bar (press `/`) to remove or replace the `repo:` filter, then
press Enter. The Smart Filtering state automatically syncs to match your edit — so if you remove the
`repo:` filter from the search bar, Smart Filtering turns off for that section, and vice versa.

[01]: https://docs.github.com/en/search-github/searching-on-github/searching-issues-and-pull-requests
[02]: https://docs.github.com/en/search-github/getting-started-with-searching-on-github/understanding-the-search-syntax

---

### Src Content Docs Configuration Theme (`docs/src/content/docs/configuration/theme.mdx`)

---
title: Theme
---

import { Aside } from "@astrojs/starlight/components";

# Theme Options

This setting defines the dashboard's theme. It only effects the presentation of the dashboard,
not the data. Currently, the theme only defines colors and icons. To control how table columns
and preview pane display for the views, use the [`defaults`], [`prSections`], and
[`issueSections`] settings.

To define any color for your dashboard, you **must** define **every** color. All properties are
required properties. Every color for the dashboard's theme must be a valid [hex color] like
`#a3c` or `#aa33cc`, or an ANSI color index from `0` to `255`.

To find hex colors to use in your dashboard, visit [`color-hex.com`]. You can browse colors,
inspect a given color, get alternate shades and tints for a color, derive a color palette, and
more.

[`defaults`]: /configuration/defaults
[`prSections`]: /configuration/pr-section
[`issueSections`]: /configuration/issue-section
[hex color]: https://developer.mozilla.org/en-US/docs/Web/CSS/hex-color
[`color-hex.com`]: https://www.color-hex.com/

## Defaults

```yaml
ui:
  sectionsShowCount: true
table:
  showSeparators: true
  compact: false
colors:
  text:
    primary: "#ffffff"
    secondary: "#c6c6c6"
    inverted: "#303030"
    faint: "#8a8a8a"
    warning: "#800000"
    success: "#008000"
    actor: "#c6c6c6"
  background:
    selected: "#808080"
  border:
    primary: "#808080"
    secondary: "#c0c0c0"
    faint: "#000000"
  inline:
    icons:
      newcontributor: "077"
      contributor: "075"
      collaborator: "178"
      member: "178"
      owner: "178"
      unknownrole: "178"
icons:
  inline:
    newcontributor: "󰎔"
    contributor: ""
    collaborator: ""
    member: ""
    owner: ""
    unknownrole: "󰭙"
```

## UI Settings (`ui`)

### Sections Show Count

| Property            | Type    | default |
| :------------------ | :------ | :------ |
| `sectionsShowCount` | boolean | true    |

Whether the number of results show up next to each section's title in the tab bar.

### Table Settings (`table`)

#### Show Separators

| Property         | Type    | default |
| :--------------- | :------ | :------ |
| `showSeparators` | boolean | true    |

Whether to show the separators between lines in the prs/issues tables.

#### Compact

| Property  | Type    | default |
| :-------- | :------ | :------ |
| `compact` | boolean | false   |

Whether to show table rows in a compact way or not

## Theme Colors (`colors`)

This setting defines a map of colors for the dashboard's text, background, and border
colors.

The following elements can't be styled through your configuration and have their colors
set as:

| Element                                 |          Color           |
| :-------------------------------------- | :----------------------: |
| Search input terms when inactive        | Terminal default (faint) |
| Search input terms when active          |     Terminal default     |
| Inactive section names in the tab list  |     Terminal default     |
| The status icon for open issues and PRs |        `#42A0FA`         |
| The status icon for closed issues       |        `#C38080`         |
| The status icon for closed PRs          |        `#C38080`         |
| The status icon for merged PRs          |        `#A371F7`         |

Required:

- text
- background
- border

### Text Colors (`text`)

Defines the foreground (text) colors for the dashboard.

#### Primary Text Color

| Property  | Type | default                                   |
| :-------- | :--- | :---------------------------------------- |
| `primary` | color | `#ffffff` for dark or `#000000` for light |

This setting determines the color of the text for the following elements in the
dashboard UI:

- The active section's name in the tab list
- The active view's name
- The column headers for the section's table of work items
- Open work item entries in the table except when a column's icon has an alternate
  color.
- The keybindings in the help view
- The title of the work item in the preview pane heading
- The comments and checks headers in the preview pane.
- The username for comment authors in the preview pane.

#### Secondary Text Color

| Property    | Type | default                                   |
| :---------- | :--- | :---------------------------------------- |
| `secondary` | color | `#c6c6c6` for dark or `#808080` for light |

This setting determines the color of the text for the following elements in the
dashboard UI:

- The search icon, `is:pr`, and `is:issue` components of the search bar
- The inactive view's name
- The work item number in the table entries
- The work item number and repository name in the preview pane heading
- The base and target branch in the preview pane for PRs

#### Inverted Text Color

| Property   | Type | default                                   |
| :--------- | :--- | :---------------------------------------- |
| `inverted` | color | `#303030` for dark or `#ffffff` for light |

This setting determines the color of the text for the following elements in the
dashboard UI:

- The work item status in the preview pane
- Work item labels

#### Faint Text Color

| Property | Type | default                                   |
| :------- | :--- | :---------------------------------------- |
| `faint`  | color | `#8a8a8a` for dark or `#c0c0c0` for light |

This setting determines the color of the text for the following elements in the
dashboard UI:

- Closed work item entries in the table
- The current time, active/total work item count, and fetched work item count
  beneath the table
- The help text for the keybinding commands
- The percentage scrolled at the bottom of the preview pane
- The date/time information on comments in the preview pane
- The review status icon when a PR is waiting for a review

#### Warning Text Color

| Property  | Type | default                                   |
| :-------- | :--- | :---------------------------------------- |
| `warning` | color | `#800000` for dark or `#800000` for light |

This setting determines the color of the text for the following elements in the
dashboard UI:

- The icon for the `reviewStatus` column's icon when a PR has requested changes
- The icon for the `ci` column's icon when a PR has failing checks
- The icon for failing checks for PRs in the preview pane
- Error messages for commands, like when the dashboard fails to fetch work items.

#### Success Text Color

| Property  | Type | default                                  |
| :-------- | :--- | :--------------------------------------- |
| `success` | color | `#008000` for dark or `008000` for light |

This setting determines the color of the text for the following elements in the
dashboard UI:

- The icon for the `reviewStatus` column's icon when a PR is approved
- The icon for the `ci` column's icon when a PR's checks are all passing
- The icon for passing checks for PRs in the preview pane
- Success messages for commands, like when the dashboard fetches work items.

#### Actor Text Color

| Property | Type | default                                   |
| :------- | :--- | :---------------------------------------- |
| `actor`  | color | `#c6c6c6` for dark or `#808080` for light |

This setting determines the color of the text for the following elements in the
dashboard UI:

- The username of the person who triggered a notification, displayed after the
  notification title in the notifications view

### Background Colors (`background`)

Defines the background colors for the dashboard. By default, the background color for
all elements in the dashboard UI is the terminal's background color.

Required:

- selected

#### Selected Background Color

| Property   | Type | default                                   |
| :--------- | :--- | :---------------------------------------- |
| `selected` | color | `#808080` for dark or `#c0c0c0` for light |

This setting determines the background color for the following elements in the
dashboard UI:

- The active section's name in the tab list
- The active view's name
- The active entry in the section's work item table.

### Border Colors (`border`)

| Property | Type | default                                   |
| :------- | :--- | :---------------------------------------- |
| `border` | color | `#808080` for dark or `#c0c0c0` for light |

Defines the border colors for the dashboard.

Required:

- primary
- secondary
- faint

#### Primary Border Color

| Property  | Type | default                                   |
| :-------- | :--- | :---------------------------------------- |
| `primary` | color | `#808080` for dark or `#ff00ff` for light |

This setting determines the color for the following elements in the dashboard UI:

- The border beneath the section tabs
- The border around the search input
- The border between the table and the preview pane
- The border above the command help info

#### Secondary Border Color

| Property    | Type | default                                   |
| :---------- | :--- | :---------------------------------------- |
| `secondary` | color | `#c0c0c0` for dark or `#808080` for light |

This setting determines the color for the following elements in the dashboard UI:

- The borders that separate the sections in the tab list

#### Faint Border Color

| Property | Type | default                                   |
| :------- | :--- | :---------------------------------------- |
| `faint`  | color | `#000000` for dark or `#e4e4e4` for light |

This setting determines the color for the following elements in the dashboard UI:

- The border between rows in the table

### Icon Colors (`inline.icons`)

Defines author-role icon colors for the dashboard.

#### New Contributor Role Icon Color

`newcontributor`
| Property | Type | default |
| :-------- | :--- | :---------------------------------------- |
| `newcontributor` | color | |

Specifies the icon color for the new-contributor-role icon.

#### Contributor Role Icon Color

| Property      | Type | default |
| :------------ | :--- | :------ |
| `contributor` | color |         |

Specifies the icon color for the contributor-role icon.

#### Collaborator Role Icon Color

collaborator:
| Property | Type | default |
| :-------- | :--- | :---------------------------------------- |
| `collaborator` | color | |

Specifies the icon color for the collaborator-role icon.

#### Member Role Icon Color

| Property | Type | default |
| :------- | :--- | :------ |
| `member` | color |         |

Specifies the icon color for the member-role icon.

#### Owner Role Icon Color

Specifies the icon color for the owner-role icon.

#### Unknown Role Icon Color

| Property  | Type | default |
| :-------- | :--- | :------ |
| `unknown` | color |         |

Specifies the icon color for the unknown-role icon.

## Icons (`icons.inline`)

This setting defines a map of author-role icons for the dashboard.

### New Contributor Role Icon

Specifies the character to use as the new-contributor-role icon.

| Property         | Type   | default |
| :--------------- | :----- | :------ |
| `newcontributor` | string | 󰎔       |

### Contributor Role Icon Color

Specifies the character to use as the contributor-role icon.

| Property      | Type   | default |
| :------------ | :----- | :------ |
| `contributor` | string |        |

### Collaborator Role Icon Color

Specifies the character to use as the collaborator-role icon.

| Property       | Type   | default |
| :------------- | :----- | :------ |
| `collaborator` | string |        |

### Member Role Icon Color

Specifies the character to use as the member-role icon.

| Property | Type   | default |
| :------- | :----- | :------ |
| `member` | string |        |

### Owner Role Icon Color

Specifies the character to use as the owner-role icon.

| Property | Type   | default |
| :------- | :----- | :------ |
| `owner`  | string |        |

### Unknown Role Icon Color

Specifies the character to use as the unknown-role icon.

| Property      | Type   | default |
| :------------ | :----- | :------ |
| `unknownrole` | string | 󰭙       |

---

### Src Content Docs Getting Started Updating (`docs/src/content/docs/getting-started/updating.mdx`)

---
title: Updating
---

You can update `dash` either with the [GitHub CLI](https://cli.github.com) or by
downloading the binaries manually.

## Update Using `gh`

To update `dash` simply run:

```sh
gh extension upgrade dlvhdr/gh-dash
```

You should see an output similar to:

```sh
[dash]: upgraded from v4.16.2 to v4.17.0
✓ Successfully checked extension upgrades
```

Run `gh extension --help` for info on more commands.

## Update Manually

To manually update `dash`, you can download the binaries from the latest release on GitHub under:
https://github.com/dlvhdr/gh-dash/releases

Search for the binary that corresponds to your operating system and CPU
architecture.

---

### Src Content Docs Getting Started Usage (`docs/src/content/docs/getting-started/usage.mdx`)

---
title: Usage
linkTitle: >-
  &nbsp;Usage
summary: >-
  Get started using `dash`.
sidebar:
  order: 2
---

To use `dash`, follow these steps after you've [installed it][01]:

1. Run

   ```bash
   gh dash
   ```

2. Press <kbd>?</kbd> for help.
3. Run `gh dash --help` for more info:

   ```bash
   Usage:
     gh dash [flags]

   Flags:
     -c, --config string   use this configuration file (default lookup: a .gh-dash.yml file if inside a git repo, $GH_DASH_CONFIG env var, or if not set, $XDG_CONFIG_HOME/gh-dash/config.yml)
         --debug           passing this flag will allow writing debug output to debug.log
     -h, --help            help for Dash
   ```

## Flags

### `--config`

Specify the path to a configuration file to use for the dashboard. If the configuration file
doesn't exist or is invalid, `dash` returns an error.

```bash
gh dash --config path/to/configuration/file.yml
```

| Aliases |  Type  | Default                                                                                                                   |
| :------ | :----: | :------------------------------------------------------------------------------------------------------------------------ |
| `-c`    | String | `.gh-dash.yml` file if inside a git repo, `$GH_DASH_CONFIG` env var, or if not set, `$XDG_CONFIG_HOME/gh-dash/config.yml` |

If you don't specify this flag, `dash` uses the default configuration.
If the file doesn't exist, `dash` will create it.

The location of the default configuration file depends on your system:

1. If `$GH_DASH_CONFIG` is a non-empty string, `dash` will use this file for
   its configuration.
2. If `$GH_DASH_CONFIG` isn't set and you're in a git repository, it will look for `.gh-dash.yml` or `.gh-dash.yaml`
   in the repository root.
3. If neither of the above applies, then:
   - If `$XDG_CONFIG_HOME` is a non-empty string, the default path is `$XDG_CONFIG_HOME/gh-dash/config.yml`.
   - If `$XDG_CONFIG_HOME` isn't set, then:
     - On Linux and macOS systems, the default path is `$HOME/.config/gh-dash/config.yml`.
     - On Windows systems, the default path is `%USERPROFILE%\.config\gh-dash\config.yml`.

For more information about authoring configurations, see [Configuration][02].

### `--debug`

Specify whether `dash` should write logs to the `debug.log` file in the current directory. By
default, `dash` doesn't output debug information.

```bash
gh dash --debug
```

| Aliases |  Type   | Default |
| :------ | :-----: | :------ |
| (None)  | Boolean | `false` |

When you use this flag, `dash` creates the `debug.log` file in the current directory if it doesn't exist. If the file does exist, `dash` appends new log entries to it.

### `--help`

Use this flag to display the help information for `dash` in the terminal. If you specify this
flag, `dash` ignores all other flags. It only displays the help information.

```bash
gh dash --help
```

| Aliases |  Type   | Default |
| :------ | :-----: | :------ |
| `-h`    | Boolean | `false` |

### `--version`

Use this flag to display the version information for `dash` in the terminal. If you specify this
flag with the `--config` or `--debug` flags, `dash` ignores them. It only displays the version
information.

```bash
gh dash --version
```

| Aliases |  Type   | Default |
| :------ | :-----: | :------ |
| `-v`    | Boolean | `false` |

When you use this flag, `dash` emits the following information:

```text
gh-dash version <version>
commit: <commit_sha>
built at: <build_timestamp>
built by: <build_user>
goos: <operating_system>
goarch: <cpu_architecture>
```

- `<version>` is the extension's semantic version without a `v` prefix.
- `<commit_sha>` is the exact commit SHA the extension was built from.
- `<build_timestamp>` is the UTC date and time when the extension was built.
- `<build_user>` is who built the extension. For official releases, this is always `goreleaser`.

For example, the version information for the [v3.7.7 release][03] on Windows with an x64 processor
is:

```text
gh-dash version 3.7.7
commit: 6ce3f89ab0d73dd88e359133699d1cf920f88699
built at: 2023-04-15T08:42:16Z
built by: goreleaser
goos: windows
goarch: amd64
```

## Default Keybindings

When you use `dash`, it displays the dashboard as a terminal UI (TUI). In the TUI, you can use
several commands by pressing key combinations to navigate and interact with the dashboard.

You can press the <kbd>?</kbd> key to toggle the help menu in the UI. The help menu lists the available
keybindings for the current context.

You can press the <kbd>q</kbd> key to quit the dashboard and return to your normal terminal view.

For more information about the keybindings for the dashboard, see [Keybindings][04].

[01]: /getting-started/
[02]: /configuration/
[03]: https://github.com/dlvhdr/gh-dash/releases/tag/v3.7.7
[04]: /getting-started/keybindings/

---

### Src Content Docs Companions Enhance Dash Integration (`docs/src/content/docs/companions/enhance/dash-integration.mdx`)

---
title: DASH Integration
---

In order to launch `ENHANCE` from `DASH` [add a custom keybind](../../../configuration/keybindings) to your
`DASH` config:

```yaml
keybindings:
  prs:
    - key: T
      command: gh enhance -R {{.RepoName}} {{.PrNumber}}
```

_Note: You can change the <kbd>T</kbd> keybind to whatever you want, I just remember it
by the `Test` mnemonic._

## Using `tmux`

If you're working with `tmux`, you can also launch it in a new window:

```yaml
keybindings:
  prs:
    - key: T
      command: >-
        tmux new-window '
          gh enhance -R {{.RepoName}} {{.PrNumber}}
        '
```

---

### Src Content Docs Companions Enhance Keybindings (`docs/src/content/docs/companions/enhance/keybindings.mdx`)

---
title: Keybindings
---

`ENHANCE` supports the following keybindings.

## Navigating

| Key            | Action        |
| -------------- | ------------- |
| <kbd>j/↓</kbd> | next row      |
| <kbd>k/↑</kbd> | previous row  |
| <kbd>l</kbd>   | next pane     |
| <kbd>h</kbd>   | previous pane |
| <kbd>g</kbd>   | go to top     |
| <kbd>G</kbd>   | go to bottom  |
| <kbd>→</kbd>   | move right    |
| <kbd>←</kbd>   | move left     |
| <kbd>?</kbd>   | toggle help   |

## Searching

| Key               | Action         |
| ----------------- | -------------- |
| <kbd>/</kbd>      | search in pane |
| <kbd>esc</kbd>    | cancel search  |
| <kbd>enter</kbd>  | apply search   |
| <kbd>ctrl+n</kbd> | next match     |
| <kbd>ctrl+p</kbd> | prev match     |

## Actions

| Key               | Action                           |
| ----------------- | -------------------------------- |
| <kbd>m</kbd>      | switch between flat/grouped mode |
| <kbd>o</kbd>      | open in browser                  |
| <kbd>O</kbd>      | open PR                          |
| <kbd>R</kbd>      | refresh all                      |
| <kbd>ctrl+r</kbd> | rerun                            |

---

### Src Content Docs Companions Enhance Theme (`docs/src/content/docs/companions/enhance/theme.mdx`)

---
title: Theming
---

`ENHANCE` supports all the themes listed in [bubbletint's website](https://lrstanley.github.io/bubbletint/).

The site shows a preview of the themes as well as provide their IDs.

## Get a Theme's ID

Go to [bubbletint's website](https://lrstanley.github.io/bubbletint/) and copy a theme's ID.

## Using a Theme

To use a theme, pass the `ENHANCE_THEME` environment variable with the theme's ID, like so:

```bash
ENHANCE_THEME=dracula gh enhance <PR_URL>
```

---

### Src Content Docs Companions Enhance Usage (`docs/src/content/docs/companions/enhance/usage.mdx`)

---
title: Usage
---

To use `enhance`, follow these steps after you've [installed it][01]:

1. Run

   ```bash
   gh enhance [<pr-url> | <pr-number> | <run-url>] [--flags]
   ```

   **Examples:**

   ```bash
   # watch all recent runs of the current git repo
   gh enhance

   # watch all recent runs of the specified repo
   gh enhance -R neovim/neovim

   # look up via a full URL to a GitHub PR
   gh enhance https://github.com/dlvhdr/gh-dash/pull/767

   # look up via a PR number when inside a clone of dlvhdr/gh-dash
   # will look at checks of https://github.com/dlvhdr/gh-dash/pull/767
   gh enhance 767

   # look up via a full URL to a GitHub Actions run
   gh enhance https://github.com/dlvhdr/gh-dash/actions/runs/23687980056

   # look up via a run ID (--run disambiguates from PR numbers)
   gh enhance --run 23687980056
   ```

2. Press <kbd>?</kbd> for help.

Run `gh enhance --help` for more info:

```
Usage:
  gh enhance [<pr-url> | <pr-number> | <run-url>] [--flags]

Flags:
      --debug         passing this flag will allow writing debug output to debug.log
      --flat          passing this flag will present checks as a flat list
  -h, --help          help for gh-enhance
  -R, --repo string   [HOST/]OWNER/REPO   Select another repository using the [HOST/]OWNER/REPO format
  -v, --version       version for gh-enhance
```

---

### Src Content Docs Configuration Keybindings Issues (`docs/src/content/docs/configuration/keybindings/issues.mdx`)

---
title: Issues
linkTitle: >-
  &nbsp;Issues
weight: 2
summary: >-
  Documentation for defining commands in the Issues view of your GitHub dashboard.
schematize: keybindings.issues
outputs:
  - HTML
  - Schematize
---

---

### Src Content Docs Configuration Layout Issue (`docs/src/content/docs/configuration/layout/issue.mdx`)

---
title: Issue Layout
---

import { Aside, Code } from "@astrojs/starlight/components";
import NerdFontIcon from "../../../../components/NerdFontIcon.astro";

# Issues Section Layout

You can define how an Issue section displays items in its table by setting options for the
available columns. You can define a column's width, whether it grows to fill available space,
and whether the column should be visible at all.

Note that if the length of a column's text exceeds the defined column [`width`], the view
truncates the column's text to two characters shorter than the column's width. For example, if
the width is `6`, `gh-dash` displays as `gh-d`.

Column headings have their color defined by the [`theme.colors.text.primary`] setting.

[`width`]: /configuration/layout/options#column-width
[`theme.colors.text.primary`]: /configuration/theme#primary-text-color

By default, Issue views display the following columns in the order they're listed:

1. [`updatedAt`] with a width of 7 columns.
1. [`state`] with a width of 3 columns.
1. [`repo`] with a width of 15 columns.
1. [`title`], set to grow to fill available space.
1. [`creator`] with a width of 10 columns.
1. [`comments`] with a width of 3 columns.
1. [`reactions`] with a width of 3 columns.

<Aside type="caution" title="Watch out!">
  Even though the `state`, `title`, `comments`, and `reactions` settings
  aren't explicitly defined in your configuration file, they're added to
  the table unless you set their [`hidden`] option to `false`.

[`hidden`]: /configuration/layout/options#hide-column

</Aside>
      
[`updatedAt`]:    #issues-updated-at-column
[`state`]:        #issues-state-column
[`repo`]:         #issues-repo-column
[`title`]:        #issues-title-column
[`creator`]:       #issues-creator-column
[`comments`]:           #issues-comments-column
[`reactions`]:        #issues-reactions-column

```yaml
title:
  grow: true
assignees:
  hidden: true
  width: 20
creator:
  width: 10
repo:
  width: 15
updatedAt:
  width: 7
```

## Issue Updated At Column

| Property    | Type | Default                                            |
| :---------- | :--- | :------------------------------------------------- |
| `updatedAt` | yaml | <Code code={`width: 7`} lang="yaml" frame="none"/> |

This column displays how recently the Issue was updated. The entry shows the time elapsed
since the last update, like `1h` or `3d`.

The heading for this column is <NerdFontIcon icon="nf-oct-clock"/>

## Issue State Column

| Property | Type | Default                                            |
| :------- | :--- | :------------------------------------------------- |
| `state`  | yaml | <Code code={`width: 3`} lang="yaml" frame="none"/> |

This column displays the issue's state. When an issue is open, the column displays the icon <NerdFontIcon icon="nf-oct-issue_opened"/>
with the color set to `#42a0fa`. When an issue is closed, the
column displays the icon <NerdFontIcon icon="nf-oct-issue_closed"/> with the color set to
[`theme.colors.text.faint`].

The heading for this column is <NerdFontIcon icon="nf-oct-issue_opened"/>.

[`theme.colors.text.faint`]: /configuration/theme#faint-text-color

## Issue Repo Column

| Property | Type | Default                                             |
| :------- | :--- | :-------------------------------------------------- |
| `repo`   | yaml | <Code code={`width: 15`} lang="yaml" frame="none"/> |

This column displays the name of the repository the Issue is filed in. The entry shows the
name of the repository without the owner, like `gh-dash` for the
`https://github.com/dlvhdr/gh-dash` repository.

The heading for this column is <NerdFontIcon icon="nf-oct-repo"/>

[`width`]: /configuration/layout/options#column-width

## Issue Title Column

| Property | Type | Default                                              |
| :------- | :--- | :--------------------------------------------------- |
| `title`  | yaml | <Code code={`grow: true`} lang="yaml" frame="none"/> |

This column displays the Issue's number followed by its title. This column is always displayed
unless you set [`hidden`] to `false`. By default, it grows to fill the available space
in the terminal after accounting for other column widths.

The heading for this column is `Title`.

The [`theme.colors.text.primary`] setting defines the issue number's color.

[`hidden`]: /configuration/layout/options#hide-column
[`theme.colors.text.primary`]: /configuration/theme#primary-text-color

## Issue Creator Column

| Property  | Type | Default                                             |
| :-------- | :--- | :-------------------------------------------------- |
| `creator` | yaml | <Code code={`width: 10`} lang="yaml" frame="none"/> |

This column displays the username for the person who created the Issue.

The heading for this column is `Creator`.

## Issue Author Role Icon

| Property      | Type | Default                                                |
| :------------ | :--- | :----------------------------------------------------- |
| `creatorIcon` | yaml | <Code code={`hidden: true`} lang="yaml" frame="none"/> |

This setting affects display of the role icon for the person who created the Issue.

## Issue Assignees Column

| Property    | Type | Default                                                           |
| :---------- | :--- | :---------------------------------------------------------------- |
| `assignees` | yaml | <Code code={`width: 20\nhidden: true`} lang="yaml" frame="none"/> |

This column displays the usernames for the people assigned to the Issue.

The heading for this column is `Assignees`.

## Issue Comments Column

| Property   | Type | Default                                            |
| :--------- | :--- | :------------------------------------------------- |
| `comments` | yaml | <Code code={`width: 3`} lang="yaml" frame="none"/> |

This column displays the count of comments on the issue as an integer.

The heading for this column is <NerdFontIcon icon="nf-oct-comment_discussion"/>

## Issue Reactions Column

| Property    | Type | Default                                            |
| :---------- | :--- | :------------------------------------------------- |
| `reactions` | yaml | <Code code={`width: 3`} lang="yaml" frame="none"/> |

This column displays the count of all reactions on the issue as an integer.

The heading for this column is <NerdFontIcon icon="nf-oct-thumbsup"/>

---

### Src Content Docs Configuration Layout Options (`docs/src/content/docs/configuration/layout/options.mdx`)

---
title: Valid Options
---

## Valid Layout Options

Any column can define the [`align`], [`grow`], [`width`], and [`hidden`] options.

[`align`]: #column-alignment
[`hidden`]: #hide-column
[`grow`]: #grow-column
[`width`]: #column-width

## Grow Column

| Property | Type    | Default |
| :------- | :------ | :------ |
| `grow`   | boolean | false   |

Specify whether the column should grow to fill the available space.

Set this value to `true` and the column's width expands to fill any leftover space in the
terminal after accounting for other columns and the preview pane. Set this value to `false`
to use the value of [`width`] instead.

We recommend only setting this for one column in a given section layout.

[`width`]: #column-width

## Column Width

| Property | Type    | Minimum |
| :------- | :------ | :------ |
| `width`  | integer | 1       |

Specify the column's width by character count. Because the dashboard expects the terminal
font to be monospace, this is a reliable way to ensure a minimum width for readability.

## Hide Column

| Property | Type    | Default |
| :------- | :------ | :------ |
| `hidden` | boolean | false   |

Specify whether the column should be hidden from view. Set this value to `true` to hide the
column or `false` to show it.

## Column Alignment

| Property | Type   | Default |
| :------- | :----- | :------ |
| `align`  | string | `left`  |

Specify the horizontal alignment of the column's content. Valid values are:

- `left` — Align content to the left (default)
- `right` — Align content to the right
- `center` — Center the content

This is useful for numeric columns like comment counts where right-alignment improves readability.

```yaml
prs:
  layout:
    numComments:
      width: 5
      align: right
```

---

### Src Content Docs Configuration Layout Pr (`docs/src/content/docs/configuration/layout/pr.mdx`)

---
title: PR Layout
---

import { Aside, Code } from "@astrojs/starlight/components";
import NerdFontIcon from "../../../../components/NerdFontIcon.astro";

# PR Section Layout

You can define how a PR section displays items in its table by setting options for the
available columns. You can define a column's width, whether it grows to fill available space,
and whether the column should be visible at all.

Note that if the length of a column's text exceeds the defined column [`width`], the view
truncates the column's text to two characters shorter than the column's width. For example, if
the width is `6`, `gh-dash` displays as `gh-d`.

Column headings have their color defined by the [`theme.colors.text.primary`] setting.

[`width`]: /configuration/layout/options/#column-width
[`theme.colors.text.primary`]: /configuration/theme#primary-text-color

By default, PR views display the following columns in the order they're listed:

1. [`updatedAt`] with a width of 7 columns.
1. [`state`] with a width of 3 columns.
1. [`repo`] with a width of 15 columns.
1. [`title`], set to grow to fill available space.
1. [`author`] with a width of 10 columns.
1. [`labels`] with a width of 22 columns, hidden by default.
1. [`numComments`] with a width of 3 columns.
1. [`reviewStatus`] with a width of 3 columns.
1. [`ci`] with a width of 3 columns.
1. [`lines`] with a width of 16 columns.

<Aside type="caution" title="Watch out!">
  Even though the `state`, `title`, `comments`, and `reactions` settings
  aren't explicitly defined in your configuration file, they're added to
  the table unless you set their [`hidden`] option to `false`.

[`hidden`]: /configuration/layout/options/#hide-column

</Aside>
      
[`updatedAt`]:    #pr-updated-at-column
[`state`]:        #pr-updated-at-column
[`repo`]:         #pr-repo-column
[`title`]:        #pr-title-column
[`author`]:       #pr-author-column
[`labels`]:       #pr-labels-column
[`numComments`]: #pr-number-of-comments-column
[`reviewStatus`]: #pr-review-status-column
[`ci`]:           #pr-continuous-integration-column
[`lines`]:        #pr-lines-column

```yaml
updatedAt:
  width: 7
repo:
  width: 15
title:
  grow: true
author:
  width: 15
labels:
  width: 22
  hidden: true
assignees:
  width: 20
  hidden: true
base:
  width: 15
  hidden: true
lines:
  width: 16
```

## PR Updated At Column

| Property    | Type | Default                                            |
| :---------- | :--- | :------------------------------------------------- |
| `updatedAt` | yaml | <Code code={`width: 7`} lang="yaml" frame="none"/> |

This column displays how recently the PR was updated. The entry shows the time elapsed
since the last update, like `1h` or `3d`.

The heading for this column is <NerdFontIcon icon="nf-oct-clock"/>

## PR State Column

| Property | Type | Default                                            |
| :------- | :--- | :------------------------------------------------- |
| `state`  | yaml | <Code code={`width: 3`} lang="yaml" frame="none"/> |

This column displays the PR's state as one of the following icons:

- When a PR is open and ready for review, the icon is <NerdFontIcon icon="nf-oct-git_pull_request"/> and
  the color is `#42a0fa`.
- When a PR is in draft mode, the icon is <NerdFontIcon icon="nf-oct-git_pull_request_draft"/> and the color is
  set to the value of [`theme.colors.text.faint`].
- When a PR is merged, the icon is <NerdFontIcon icon="nf-oct-feed_merged"/> and the color is `#a371f7`.
- When a PR is closed without merging, the icon is <NerdFontIcon icon="nf-oct-trash"/> and the
  color is `#c38080`.

This heading for this column is <NerdFontIcon icon="nf-dev-git_merge"/>

[`theme.colors.text.faint`]: /configuration/theme#faint-text-color

## PR Repo Column

| Property | Type | Default                                             |
| :------- | :--- | :-------------------------------------------------- |
| `repo`   | yaml | <Code code={`width: 15`} lang="yaml" frame="none"/> |

This column displays the name of the repository the PR is filed in. The entry shows the
name of the repository without the owner, like `gh-dash` for the
`https://github.com/dlvhdr/gh-dash` repository.

The heading for this column is <NerdFontIcon icon="nf-oct-repo"/>

[`width`]: /configuration/layout/options/#column-width

## PR Title Column

| Property | Type | Default                                                         |
| :------- | :--- | :-------------------------------------------------------------- |
| `title`  | yaml | <Code code={`width: 15\ngrow: true`} lang="yaml" frame="none"/> |

This column displays the PR's number followed by its title. This column is always displayed
unless you set [`hidden`] to `false`. By default, it grows to fill the available space
in the terminal after accounting for other column widths.

The heading for this column is `Title`.

The [`theme.colors.text.primary`] setting defines the issue number's color.

[`hidden`]: /configuration/layout/options/#hide-column
[`theme.colors.text.primary`]: /configuration/theme#primary-text-color

## PR Author Column

| Property | Type | Default                                             |
| :------- | :--- | :-------------------------------------------------- |
| `author` | yaml | <Code code={`width: 15`} lang="yaml" frame="none"/> |

This column displays the username for the person who created the PR.

The heading for this column is `Author`.

## PR Author Role Icon

| Property     | Type | Default                                            |
| :----------- | :--- | :------------------------------------------------- |
| `authorIcon` | yaml | <Code code={`width: 3`} lang="yaml" frame="none"/> |

This setting affects display of the role icon for the person who created the PR.

## PR Assignees Column

| Property    | Type | Default                                                           |
| :---------- | :--- | :---------------------------------------------------------------- |
| `assignees` | yaml | <Code code={`width: 20\nhidden: true`} lang="yaml" frame="none"/> |

This column displays the usernames for the people assigned to the PR.

The heading for this column is `Assignees`.

## PR Base Column

| Property | Type | Default                                                           |
| :------- | :--- | :---------------------------------------------------------------- |
| `base`   | yaml | <Code code={`width: 15\nhidden: true`} lang="yaml" frame="none"/> |

This column displays the base branch the PR is targeting, like `main`.

The heading for this column is `Base`.

## PR Number of Comments Column

| Property      | Type | Default                                            |
| :------------ | :--- | :------------------------------------------------- |
| `numComments` | yaml | <Code code={`width: 3`} lang="yaml" frame="none"/> |

This column displays the number of comments left on a PR.
This is a sum of the direct comments and the number of review threads.

The heading for this column is <NerdFontIcon icon="nf-fa-comments_o"/>.

[`theme.colors.text.faint`]: /configuration/theme#faint-text-color
[`theme.colors.text.primary`]: /configuration/theme#primary-text-color
[`theme.colors.text.warning`]: /configuration/theme#warning-text-color

## PR Review Status Column

| Property       | Type | Default                                            |
| :------------- | :--- | :------------------------------------------------- |
| `reviewStatus` | yaml | <Code code={`width: 3`} lang="yaml" frame="none"/> |

This column displays the review status of a PR as an icon:

- When the PR hasn't been reviewed, the icon is <NerdFontIcon icon="nf-fa-clock" /> and the
  color is the value of [`theme.colors.text.faint`].
- When the PR is approved, the icon is <NerdFontIcon icon="nf-cod-check" /> and the color is
  the value of [`theme.colors.text.primary`].
- When the PR has requested changes, the icon is <NerdFontIcon icon="nf-md-keyboard_return" /> and the
  color is the value of [`theme.colors.text.warning`].

The heading for this column is <NerdFontIcon icon="nf-md-account_check_outline"/>.

[`theme.colors.text.faint`]: /configuration/theme#faint-text-color
[`theme.colors.text.primary`]: /configuration/theme#primary-text-color
[`theme.colors.text.warning`]: /configuration/theme#warning-text-color

## PR Continuous Integration Column

| Property | Type | Default                                            |
| :------- | :--- | :------------------------------------------------- |
| `ci`     | yaml | <Code code={`width: 3`} lang="yaml" frame="none"/> |

This column displays the CI status of a PR as an icon:

- When the checks haven't finished running, the icon is <NerdFontIcon icon="nf-fa-clock"/> and
  the color is the value of [`theme.colors.text.faint`].
- When the checks have all passed, the icon is <NerdFontIcon icon="nf-md-check_circle"/> and the
  color is the value of [`theme.colors.text.success`].
- When at least one check failed, the icon is <NerdFontIcon icon="nf-md-close_circle"/> and the
  color is the value of [`theme.colors.text.warning`].

The heading for this column is <NerdFontIcon icon="nf-oct-checklist"/>

[`theme.colors.text.faint`]: /configuration/theme#faint-text-color
[`theme.colors.text.primary`]: /configuration/theme#primary-text-color
[`theme.colors.text.warning`]: /configuration/theme#warning-text-color

## PR Labels Column

| Property | Type | Default                                                           |
| :------- | :--- | :---------------------------------------------------------------- |
| `labels` | yaml | <Code code={`width: 22\nhidden: true`} lang="yaml" frame="none"/> |

This column displays the labels assigned to a PR as colored pills.
Up to 6 labels per PR are fetched and displayed.

The heading for this column is <NerdFontIcon icon="nf-md-label_multiple_outline"/>.

# PR Lines Column

| Property | Type | Default                                             |
| :------- | :--- | :-------------------------------------------------- |
| `lines`  | yaml | <Code code={`width: 16`} lang="yaml" frame="none"/> |

This column displays the line changes for a PR. The column represents the changes as
`<added> / -<removed>`. For example, `66 / -46` indicates 66 lines added and 46
lines removed.

The heading for this column is <NerdFontIcon icon="nf-oct-diff"/>.

---

### Src Content Docs Getting Started Keybindings Completions (`docs/src/content/docs/getting-started/keybindings/completions.mdx`)

---
title: Completions
linkTitle: >-
  &nbsp;Completions Popup
weight: 6
summary: >-
  Lists the default keybindings for interacting with the completions popup for input boxes.
---

## `ctrl+n` - Next Suggestion

Press <kbd>ctrl+n</kbd> to move to the next suggestion.

## `ctrl+p` - Previous Suggestion

Press <kbd>ctrl+p</kbd> to move to the previous suggestion.

## `ctrl+y` - Accept Current Suggestion

Press <kbd>ctrl+y</kbd> to accept the currently selected suggestion and add it to the inputbox.

## `ctrl+f` - Refresh Suggestions

Press <kbd>ctrl+f</kbd> to fetch suggestions and refresh the list.

## `ctrl+h` - Toggle Suggestions

Press <kbd>ctrl+h</kbd> to toggle if the suggestions popup is shown or hidden.

---

### Src Content Docs Getting Started Keybindings Global (`docs/src/content/docs/getting-started/keybindings/global.mdx`)

---
title: Global
linkTitle: >-
  &nbsp;Global
weight: 1
summary: >-
  Lists the default keybindings for controlling the dashboard globally.
---

This section lists the default keybindings for controlling the dashboard globally. These are
available in both the PRs and Issues views.

## `?` - Toggle Help

Press <kbd>?</kbd> to toggle the help menu in the UI. The help menu lists the available
keybindings for the current context.

## `/` - Search

Press <kbd>/</kbd> to focus on the dashboard's search input box. When you move the focus to the
search input box you can edit the current section's GitHub search criteria. To refresh the section
with your updated query, press <kbd>Enter</kbd>. After the dashboard updates, focus is returned to
the active section.

Any changes you make to the search query for a section aren't persistent. If you close the
dashboard and reopen it, the dashboard displays the sections with the queries defined in your
[configuration file](/configuration/). To make persistent changes to your sections
or add a new section, update your configuration.

## `r` - Refresh Current Section

Press <kbd>r</kbd> to refresh the current section's work items. When you do, the dashboard reruns
the defined query for the section and displays the returned work items.

## `R` - Refresh All Sections

Press <kbd>R</kbd> to refresh every section in the dashboard's current view. When you do, the
dashboard reruns the defined query for every section and displays the returned work items for the
current section. When you navigate to another section, it displays the updated work items for that
section.

## `s` - Switch View

Press the <kbd>s</kbd> key to switch the dashboard from the PRs view to the Issues view or the
Issues view to the PRs view. The first time you switch to a view in your dashboard, the dashboard
runs the defined query for every section in that view.

## `q` - Quit

Press the <kbd>q</kbd> key to quit the dashboard and return to your normal terminal view.

---

### Src Content Docs Getting Started Keybindings Navigation (`docs/src/content/docs/getting-started/keybindings/navigation.mdx`)

---
title: Navigation
linkTitle: >-
  &nbsp;Navigation
weight: 2
summary: >-
  Lists the default keybindings for navigating the dashboard.
---

## `↑/k` - Move Up

Press <kbd>↑</kbd> or <kbd>k</kbd> to move to the previous work item in the current section.

## `↓/j` - Move Down

Press <kbd>↓</kbd> or <kbd>j</kbd> to move to the next work item in the current section.

## `←/h` - Previous Section

Press <kbd>←</kbd> or <kbd>h</kbd> to move to the previous section in the current view.

## `→/l` - Next Section

Press <kbd>→</kbd> or <kbd>l</kbd> to move to the next section in the current view.

## `g/home` - First Item

Press <kbd>g</kbd> or <kbd>Home</kbd> to move to the first work item in the current section.

## `G/end` - Last Item

Press <kbd>G</kbd> or <kbd>End</kbd> to move to the last work item in the current section.

---

### Src Content Docs Getting Started Keybindings Preview (`docs/src/content/docs/getting-started/keybindings/preview.mdx`)

---
title: Preview Pane
linkTitle: >-
  &nbsp;Preview Pane
weight: 6
summary: >-
  Lists the default keybindings for interacting with the preview pane in the Dashboard.
---

## `p` - Toggle Preview Pane

Press <kbd>p</kbd> to open the preview pane for the selected work item if it's hidden or hide the
preview pane if it's visible.

## `P` - Toggle Preview Position

Press <kbd>P</kbd> (shift+p) to toggle the preview pane between the right side and bottom of the
dashboard. In `auto` mode, resizing the terminal resets this override.

## `ctrl+d` - Preview Page Down

Press <kbd>Ctrl</kbd>+<kbd>d</kbd> to shift the view for the preview pane down one step. The first line in
the updated view is always the line after the last line of the previous view.

## `ctrl+u` - Preview Page Up

Press <kbd>Ctrl</kbd>+<kbd>u</kbd> to shift the view for the preview pane up one step. The last line in the
updated view is always the line before the first line of the previous view.

## `[` - Previous Preview Tab

Press <kbd>[</kbd> to move to the previous tab in the preview sidebar, if one exists.

## `]` - Next Preview Tab

Press <kbd>]</kbd> to move to the next tab in the preview sidebar, if one exists.

---

### Src Content Docs Getting Started Keybindings Selected Issue (`docs/src/content/docs/getting-started/keybindings/selected-issue.mdx`)

---
title: Selected Issue
linkTitle: >-
  &nbsp;Selected Issue
weight: 4
summary: >-
  Lists the default keybindings for interacting with an actively selected item
  in the Issues view for the dashboard.
---

import { Aside } from "@astrojs/starlight/components";

## `a` - Assign Issue

Press <kbd>a</kbd> to assign one or more users to the issue. When you do, the dashboard opens the
preview pane and displays a new input.

When the unassign input is active, you can specify one or more GitHub usernames to assign to the
issue. By default, the input includes your username if you're not already assigned. If you're
already assigned, the input is empty by default.

To assign more than one user to the issue, specify additional users after one or more whitespace
characters, like a space, tab, or newline. We recommend separating the additional users with a
newline by pressing <kbd>Enter</kbd> after each username.

To submit the list of users to assign to the issue, press <kbd>Ctrl</kbd>+<kbd>d</kbd>. To cancel the
change instead, press <kbd>Ctrl</kbd>+<kbd>c</kbd> or <kbd>Esc</kbd>.

## `A` - Unassign Issue

Press <kbd>A</kbd> to unassign one or more users from the issue. When you do, the dashboard opens
the preview pane and displays a new input.

When the unassign input is active, you can specify one or more GitHub usernames to unassign from
the issue. By default, the input includes all assigned users separated by newlines.

Make sure the list of users to unassign only includes the users you want to unassign before you
submit the list.

To submit the list of users to unassign from the issue, press <kbd>Ctrl</kbd>+<kbd>d</kbd>. To cancel the
change instead, press <kbd>Ctrl</kbd>+<kbd>c</kbd> or <kbd>Esc</kbd>.

## `c` - Comment on Issue

Press <kbd>c</kbd> to add a comment to the issue. When you do, the dashboard opens a preview pane and
displays a new input.

You can write your comment as GitHub-flavored Markdown in the input.

To submit the comment on the issue, press <kbd>Ctrl</kbd>+<kbd>d</kbd>. To cancel the comment instead, press

<kbd>Ctrl</kbd>+<kbd>c</kbd> or <kbd>Esc</kbd>.

## `C` - Checkout Issue Branch

Press <kbd>C</kbd> to create and checkout a local branch for the issue. When you do, the dashboard
runs `gh issue develop --checkout` in the repository's local path.

The local path for the repository must be configured in your `config.yml` under `repoPaths`.
If no local path is configured for the repository, the command will fail with an error.

## `x` - Close Issue

Press <kbd>x</kbd> to close the issue. When you do, the dashboard uses the `gh issue close` command
to close the issue.

<Aside type="caution" title="Watch out!">
**Prior to v3.10.0:** When you use this command, the dashboard closes the issue immediately and
without prompting for confirmation. Only use this command when you're sure you
want to close the issue.

**Since v3.10.0:** When you use this command, the dashboard displays a confirmation prompt and
closes the issue only after you approve the action.

This command doesn't support closing the issue with a comment. If you want to
add a comment that explains why you're closing the issue, use the
[comment](#c---comment-on-issue) command before or after you use this one.

</Aside>

## `X` - Reopen Issue

Press <kbd>X</kbd> to reopen a closed issue. When you do, the dashboard uses the `gh issue reopen`
command to reopen the issue.

<Aside type="caution" title="Watch out!">
**Prior to v3.10.0:** When you use this command, the dashboard reopens the issue immediately and
without prompting for confirmation. Only use this command when you're sure you
want to reopen the closed issue.

**Since v3.10.0:** When you use this command, the dashboard displays a confirmation prompt and
reopens the issue only after you approve the action.

</Aside>

---

### Src Content Docs Getting Started Keybindings Selected Item (`docs/src/content/docs/getting-started/keybindings/selected-item.mdx`)

---
title: Selected Item
weight: 3
summary: >-
  Lists the default keybindings for interacting with active items in the dashboard in any view.
---

## `o` - Open in GitHub

Press <kbd>o</kbd> to open the selected item on GitHub in your default web browser.

## `y` - Copy Number

Press <kbd>y</kbd> to copy the selected item's issue or PR number without the `#` prefix.

## `Y` - Copy URL

Press <kbd>Y</kbd> to copy the URL to the selected item on GitHub.

---

### Src Content Docs Getting Started Keybindings Selected Notification (`docs/src/content/docs/getting-started/keybindings/selected-notification.mdx`)

---
title: Selected Notification
weight: 5
---

## Key Bindings

| Key   | Action                                             |
| ----- | -------------------------------------------------- |
| D     | Mark as done (removes from inbox)                  |
| Alt+d | Mark all as done                                   |
| m     | Mark as read                                       |
| M     | Mark all as read                                   |
| u     | Unsubscribe from thread                            |
| b     | Toggle bookmark                                    |
| t     | Toggle smart filtering (filter to current repo)    |
| y     | Copy PR/Issue number                               |
| Y     | Copy URL                                           |
| S     | Sort by repository                                 |
| s     | Switch to PRs view                                 |
| o     | Open in browser                                    |
| Enter | View notification (fetches content, marks as read) |

### PR/Issue Keybindings in Notifications View

When viewing a PR notification in the preview pane, all PR-specific keybindings become available:

| Key     | Action                  |
| ------- | ----------------------- |
| v       | Approve PR              |
| a       | Assign                  |
| A       | Unassign                |
| c       | Comment                 |
| d       | View diff               |
| C/Space | Checkout branch         |
| x       | Close PR                |
| X       | Reopen PR               |
| W       | Mark ready for review   |
| m       | Merge PR                |
| u       | Update from base branch |
| w       | Watch checks            |
| [       | Previous sidebar tab    |
| ]       | Next sidebar tab        |
| e       | Expand description      |

Similarly, when viewing an Issue notification, Issue-specific keybindings are available:

| Key | Action            |
| --- | ----------------- |
| L   | Add/remove labels |
| a   | Assign            |
| A   | Unassign          |
| c   | Comment           |
| x   | Close issue       |
| X   | Reopen issue      |

The `?` help display dynamically updates to show the applicable keybindings based on what type of notification content is being viewed.

---

### Src Content Docs Getting Started Keybindings Selected Pr (`docs/src/content/docs/getting-started/keybindings/selected-pr.mdx`)

---
title: Selected PR
weight: 5
summary: >-
  Lists the default keybindings for interacting with an actively selected item
  in the PRs view for the dashboard.
---

import { Aside } from "@astrojs/starlight/components";

## `a` - Assign PR

Press <kbd>a</kbd> to assign one or more users to the PR. When you do, the dashboard opens the
preview pane and displays a new input.

When the unassign input is active, you can specify one or more GitHub usernames to assign to the
PR. By default, the input includes your username if you're not already assigned. If you're already
assigned, the input is empty by default.

To assign more than one user to the PR, specify additional users after one or more whitespace
characters, like a space, tab, or newline. We recommend separating the additional users with a
newline by pressing <kbd>Enter</kbd> after each username.

To submit the list of users to assign to the PR, press <kbd>Ctrl</kbd>+<kbd>d</kbd>. To cancel the
change instead, press <kbd>Ctrl</kbd>+<kbd>c</kbd> or <kbd>Esc</kbd>.

## `A` - Unassign PR

Press <kbd>A</kbd> to unassign one or more users from the PR. When you do, the dashboard opens the
preview pane and displays a new input.

When the unassign input is active, you can specify one or more GitHub usernames to unassign from
the PR. By default, the input includes all assigned users separated by newlines.

Make sure the list of users to unassign only includes the users you want to unassign before you
submit the list.

To submit the list of users to unassign from the PR, press <kbd>Ctrl</kbd>+<kbd>d</kbd>. To cancel the
change instead, press <kbd>Ctrl</kbd>+<kbd>c</kbd> or <kbd>Esc</kbd>.

## `c` - Comment on PR

Press <kbd>c</kbd> to add a comment to the PR. When you do, the dashboard opens a preview pane and
displays a new input.

You can write your comment as GitHub-flavored Markdown in the input.

To submit the comment on the PR, press <kbd>Ctrl</kbd>+<kbd>d</kbd>. To cancel the comment instead, press <kbd>Ctrl</kbd>+<kbd>c</kbd> or <kbd>Esc</kbd>.

## `C` - Checkout PR

Press <kbd>C</kbd> to checkout the PR locally. The dashboard checks for the `repoPaths` key in your
configuration to find the repository on your local filesystem.

The dashboard errors if you haven't defined `repoPaths` in your configuration or if the dashboard
can't determine where the repository for this PR is located using that setting.

If the dashboard is able to locate the repository for the PR on your local filesystem, it uses the
`gh pr checkout` command to checkout the PR locally.

## `d` - View PR Diff

Press <kbd>d</kbd> to display the PRs diff in the terminal. The dashboard uses the `pager.diff`
setting in your configuration, which defaults to `less`, to display the diff.

The dashboard view is replaced by PRs change diff displayed with the configured pager. When you
exit the pager, the view returns to the dashboard.

## `e` - Expand Description

Press <kbd>e</kbd> to display the full description for the PR.
By default `dash` only displays the first 5 lines.

## `m` - Merge PR

Press <kbd>m</kbd> to merge the PR. When you do, the dashboard uses the `gh pr merge` command to
merge the PR.

## `u` - Update PR

Press <kbd>u</kbd> to update the PR branch. When you do, the dashboard uses the
`gh pr update-branch` command to update the PR. This command updates the branch with a merge commit.

## `v` - Approve PR

Press <kbd>v</kbd> to approve the PR. When you do, the dashboard uses the
`gh pr review --approve` command to approve the PR. This will prompt you to add an optional comment to the approval. The comment prompt will be prefilled with
`defaults.prApproveComment` if it is set in your configuration, which defaults to "LGTM".

## `w` - Watch PR checks

Press <kbd>w</kbd> to watch the PR check and get a desktop notification if they succeed or fail. When you do, the dashboard uses the
`gh pr checks --watch` command to watch the PR checks.

## `W` - Mark PR as Ready for Review

Press <kbd>W</kbd> to mark the PR as ready for review. When you do, the dashboard uses the
`gh pr ready` command to convert the PR from draft status to ready for review.

## `x` - Close PR

Press <kbd>x</kbd> to close the PR. When you do, the dashboard uses the `gh pr close` command to
close the PR.

## `X` - Reopen PR

Press <kbd>X</kbd> to reopen a closed PR. When you do, the dashboard uses the `gh pr reopen`
command to reopen the PR.

<Aside type="caution" title="Watch out!">
**Prior to v3.10.0:** When you use some commands, the dashboard acts immediately and without
prompting for confirmation.

**Since v3.10.0:** When you use these commands, the dashboard displays a confirmation prompt.

</Aside>

---

--- METRICS ---
- Files Extracted: 47
- Estimated Token Budget: ~35505 tokens
- Canonical Reference: https://codewiki.google/github.com/dlvhdr/gh-dash
