# Hush docs > How Hush sorts your GitHub notifications, and how to make it work your way. Source: https://hush-gh.com/docs Hush reads your GitHub notifications and sorts them into what **needs you** and what is only **FYI**. It follows whose turn it is on every pull request and issue that involves you, sends a push only when something waits on you, and lets you act on GitHub (approve, comment, merge, mark Done) without leaving your inbox. ## The idea in one minute - **Needs you** is short on purpose. A thread is there only when you are the next person who must act: your review is requested, CI fails on your PR, someone replied to you, your approved PR is ready to merge. See [what needs you](https://hush-gh.com/docs/inbox#what-needs-you). - **FYI** is everything else: team mentions, watched repositories, bots, merged and closed work. - **Whose turn** is one set of rules for the inbox and the [Pull requests and Issues tabs](https://hush-gh.com/docs/pull-requests-and-issues). An item is in Needs you exactly when it is “Your turn”. - **Hush follows up by itself.** When you approve, push a fix, or reply, the thread leaves Needs you with a note such as “✓ You approved”. When it needs you again, it comes back. - **Everything is a setting.** Rules, views, sections, menus, and keys are in one [settings.json](https://hush-gh.com/docs/settings) that you can edit, export, and share. ## Where to start - New to Hush: [Getting started](https://hush-gh.com/docs/getting-started). - An org's repositories are missing: [GitHub access](https://hush-gh.com/docs/github-access). - Too much noise, or not enough: [Rules](https://hush-gh.com/docs/rules) and [Notifications](https://hush-gh.com/docs/notifications). - You like the keyboard: [Keybinds](https://hush-gh.com/docs/keybinds). - You want every option: [settings.json](https://hush-gh.com/docs/settings). ## For agents Every page is also plain Markdown: add `.md` to its address (for example [/docs/settings.md](https://hush-gh.com/docs/settings.md)). [/llms.txt](https://hush-gh.com/llms.txt) lists the pages, and [/llms-full.txt](https://hush-gh.com/llms-full.txt) has all of them in one file. To change a user's setup, read [For agents](https://hush-gh.com/docs/agents) first. --- # Getting started > Sign in, learn the three tabs, turn on push, and triage your first threads. Source: https://hush-gh.com/docs/getting-started ## 1. Sign in Open [app.hush-gh.com](https://app.hush-gh.com) and choose **Sign in with GitHub**. GitHub asks you to let Hush read your notifications, your repositories, and your teams. If your org uses SAML single sign-on, GitHub also asks you to authorize Hush for it. After you sign in, Hush reads your notifications from the last 14 days. The first sync can take a minute; the inbox says “First sync in progress…” until it is done. After that, Hush checks GitHub every few minutes by itself (see [Limits](https://hush-gh.com/docs/limits)). The first time, **Welcome to Hush** is at the top of the inbox. It says what Hush found (“From 47 notifications, Hush found 5 things that need you. It moved 6 to FYI, and 36 that are already finished to Done.”), and asks three questions: - **Review requests to my teams need me**: on or off. Off, team requests are FYI, and show under “Your team's turn” on the Pull requests tab. - **Repositories you only want to read about**: the repositories with the most notifications that do not need you. Everything from the ones that you check goes to FYI (Hush adds a [rule](https://hush-gh.com/docs/rules) for each). - **Push to this device**: pushes what needs you. Choose **Done** to save, or **Skip**. You can change all of it later. If an org that you work in is missing, its owners may not have approved Hush yet. Hush shows the orgs it can see in a note after sign-in. See [GitHub access](https://hush-gh.com/docs/github-access). ## 2. Know the three tabs - **Inbox**: your GitHub notifications, sorted. The **Needs you** tab has only what waits on you; **FYI** has the rest. Snoozed, Done, and Muted are there too. See [Inbox](https://hush-gh.com/docs/inbox). - **Pull requests**: open PRs that involve you, from saved GitHub searches, grouped by whose turn it is. See [Pull requests and issues](https://hush-gh.com/docs/pull-requests-and-issues). - **Issues**: the same for issues. A number next to a tab is how many items are your turn there. ## 3. Triage Each thread in Needs you asks for one thing, shown on its main button: **Review**, **Fix CI**, **Reply**, **Merge**… Choose it to go to the right place on GitHub, or press `Space` to read it in the [peek](https://hush-gh.com/docs/peek) and act from there. When you are finished with a thread: - **Done** (`E`) moves it out of the inbox, and marks it done on GitHub. New activity brings it back. - **Snooze** (`S`) hides it until a time, or until something happens (“until CI passes”). - **Mute** (`M`) stops GitHub notifications for the thread. Often you do not need Done: when you approve, reply, or push a fix, Hush sees it and moves the thread to Done by itself, with a note such as “✓ You approved”. ## 4. Turn on push Go to **Settings → Notifications** and choose **Turn on** for this device. Hush pushes only “Needs you” threads by default. Do this on each browser or phone that should get pushes. On iPhone and iPad, first add Hush to your Home Screen (Share → Add to Home Screen), open it from there, and then turn on push. See [Notifications](https://hush-gh.com/docs/notifications). ## 5. Learn a few keys | Key | What it does | | --- | --- | | `J` or `↓` | Next | | `K` or `↑` | Previous | | `Space` | Peek (open or close) | | `O` or `Enter` | Main action (review, fix CI, reply…) | | `E` | Done | | `S` | Snooze until tomorrow 9:00 | | `⌘ K` / `Ctrl + K` | Search and commands | | `?` | Show shortcuts | You can change every key. See [Keybinds](https://hush-gh.com/docs/keybinds). ## 6. Make it yours - Too much in Needs you from one repository? Right-click a thread and choose **Make a rule…**. See [Rules](https://hush-gh.com/docs/rules). - Want a tab for one project? Type a filter such as `repo:acme/web-*` and choose **Save this filter as a view**. See [Saved views](https://hush-gh.com/docs/views). - Install Hush as an app: in Chrome or Edge, choose **Install** in the address bar; in Safari on macOS, choose **File → Add to Dock**. The app icon can show a badge (**Settings → General → Tab title & icon**). --- # GitHub access > What Hush can read and do on GitHub, why an org can be missing, and when to use a custom token. Source: https://hush-gh.com/docs/github-access ## What Hush asks for You sign in with GitHub. Hush asks for three scopes: | Scope | Why Hush needs it | | --------------- | ------------------------------------------------------------------------------------------------------------------------------------ | | `notifications` | Read your notifications, and mark them read, done, or muted. | | `repo` | Read the pull requests and issues behind them (CI, reviews, comments), and act on them when you ask: approve, comment, merge, close. | | `read:org` | Find your teams, for team review requests and `@team` sections. | GitHub's Notifications API accepts only these classic scopes, so Hush cannot ask for less. Hush stores the token encrypted. It acts on GitHub **only when you do**: when you choose Done, Mute, Read, or an action in the [peek](https://hush-gh.com/docs/peek). It never writes by itself. The one exception is reading: a thread that you read in the peek is marked as read on GitHub (you can turn this off with [`peekMarksRead`](https://hush-gh.com/docs/settings#peekmarksread)). ## What Hush does on GitHub | In Hush | On GitHub | | --------------------------------------------- | ----------------------------------------------------------------------------------- | | Done, or Hide until it changes on a dashboard | Marks the notification as done. | | Mute | Unsubscribes you from the thread, and marks it as done. | | Read | Marks the notification as read. | | Unread | Nothing. GitHub has no way to mark a notification as unread, so this stays in Hush. | | Snooze, Move to inbox, Unmute | Nothing. These stay in Hush. | | Actions in the peek | The action itself: a review, a comment, a merge, a re-run, a close. | ## When an org is missing Many orgs allow only the apps that an owner approved. **Until an owner approves Hush, GitHub hides that org completely**: its private repositories, its notifications, and even the fact that the org exists. So Hush cannot tell you which orgs are missing. It can only show the ones it sees. After you sign in, a note lists the orgs that Hush can see. The same list is in **Settings → General → GitHub access**, under “Orgs your GitHub sign-in can see”. If one is missing: 1. Choose **Request approval**. GitHub asks the org's owners to approve Hush. 2. Until they do, you can [use a custom token](#custom-token). **Don't show again** in the note hides it in this browser. **Show the note after sign-in again**, under the org list, brings it back. ### SAML single sign-on If an org uses SAML SSO, GitHub asks you to authorize Hush for it when you sign in. If you did not, the inbox shows “GitHub hides notifications from N orgs”. Sign in again and authorize the org. For a custom token, choose **Configure SSO** next to the token on github.com/settings/tokens. ## Custom token A custom token is a token that you give Hush in place of your GitHub sign-in. Use one only when an org has not approved Hush yet. 1. Get a token for **your own account** that can read notifications: - The GitHub CLI's token: run `gh auth token`. Many orgs already approved the GitHub CLI. - Or a classic personal access token with the `notifications`, `repo`, and `read:org` scopes, if the org allows classic tokens. 2. Go to **Settings → General → GitHub access** and choose **Use a custom token…**. 3. Paste the token and choose **Save**. Hush checks that it belongs to the account you signed in with, and syncs again at once. Fine-grained tokens do not work: GitHub's Notifications API does not accept them. While Hush uses a custom token, GitHub access shows a **Custom token** badge. Signing in again keeps the custom token. To stop using it, choose **Switch back to GitHub sign-in**; to change it, choose **Replace the token…**. ## Sign out and delete your account Both are in **Settings → General → Account**, and **Sign out** is also in the account menu. - **Sign out** ends the session in this browser and clears the Hush data cached in it. Hush keeps polling for your other devices. - **Delete account** stops polling and deletes everything Hush stores about you: your token, threads, settings, alert history, push devices, and feeds. It does not change anything on GitHub. To remove Hush's access on GitHub too, revoke it in GitHub's settings (Applications → Authorized OAuth Apps). ### Where you are signed in **Settings → General → Signed in** lists each browser where you are signed in, with when it was last used. **Sign out** next to one ends that session; **Sign out everywhere else** ends all but this one. Use it if you lose a device. A session ends after 7 days with no use, or 30 days after sign-in; then sign in again. When GitHub stops accepting your token (for example, you revoked Hush on GitHub), Hush signs you out everywhere. --- # Inbox > How Hush sorts notifications, what each tab and row shows, and how Done, Snooze, Mute, and Read work. Source: https://hush-gh.com/docs/inbox ## Tabs | Tab | What is in it | | ------------- | -------------------------------------------------------------------------------- | | **Needs you** | Threads where you are the next person who must act. | | **FYI** | Activity that you may want to know about, but that does not need you. | | **Snoozed** | Threads that you snoozed. They come back at the time, or when the thing happens. | | **Done** | Threads that you (or Hush, or a rule) finished. | | **Muted** | Threads that you muted, or that a rule mutes. | After these come your [saved views](https://hush-gh.com/docs/views). Keys `1` to `5` open the built-in tabs, and `6` to `9` your first four saved views. ## What needs you Hush reads each notification and the pull request or issue behind it (CI, reviews, comments, conflicts), and decides whose turn it is. A thread is in **Needs you** when one of these is true: **Your pull requests** (not drafts): - CI fails. - Someone requested changes. - It has merge conflicts. - It is approved, but review threads are still open. - It is approved and CI is not running: it is ready to merge. - A person commented after your newest push. **Other people's pull requests:** - Your review is requested from you by name (or again, after your review). - It is assigned to you. - New commits arrived since your review. - A review is requested from one of your teams, only with [`teamReviewsAreAction`](https://hush-gh.com/docs/settings#teamreviewsareaction) on. **Issues:** it is assigned to you; or someone replied on an issue that is assigned to you or that you opened. **Conversations:** a person mentioned you, or replied in a thread that you commented in (and you did not reply since). **Other:** security and Dependabot alerts, repository invitations, deployments that wait for your approval, and workflow runs that failed. Everything else is **FYI**: team mentions, repositories that you watch, merged and closed work, passing CI, releases. With [`botsAreFyi`](https://hush-gh.com/docs/settings#botsarefyi) on (the default), PRs, comments, and mentions by bots are FYI too. A review request to you by name still needs you, also on a bot's PR. The same rules make the “Your turn” group on the [Pull requests and Issues tabs](https://hush-gh.com/docs/pull-requests-and-issues), so an item is in Needs you exactly when it is your turn there. To change where threads go, write [rules](https://hush-gh.com/docs/rules). ## Rows Each row shows: - **What happened**, in one line: “CI failed on your PR”, “@alice requests your review”, “@github-actions commented on your PR”. - The title, the repository, and the number. - **Why GitHub notified you**: “Review requested”, “You opened this”, “Watching repo”… - **rule: …** when one of your rules sorted it. - **What changed since you looked**, for a PR or issue: “+2 commits”, “CI fails”, “@alice approved”, “3 new comments”. See [Since you looked](#since-you-looked). - A note such as “✓ You approved” when Hush moved it to Done by itself. - The time and the condition of a snooze. - A dot when it is unread. - The **main action** button: Review, Fix CI, Address, Resolve, Merge, Reply, Triage, or Open. It opens the right page on GitHub (the files of a PR to review, its checks to fix CI) and marks the thread as read. Click a row to [peek](https://hush-gh.com/docs/peek) at it. ### Since you looked Hush remembers what a pull request or issue looked like when you last looked at it: when it stays open in the peek for a moment, or when you open it on GitHub, from the inbox or from the Pull requests and Issues tabs. After that, its rows and its peek list what changed since then: - New commits, new comments, and new reviews (“@alice approved”, “@bob requested changes”). - CI: “CI fails”, “CI passes now”, “CI running”. - Your review requested again; merged, closed, or reopened; ready for review or back to draft; new labels. Before your first look, nothing is listed. Your own changes do not count. ## Triage Each action works on the row under the cursor, or on every selected row. | Action | Key | What it does | | ------------------------------ | -------------------- | ------------------------------------------------------------------------------------------ | | **Done** | `E` | Moves the thread to Done, and marks it done on GitHub. | | **Snooze** | `S` | Hides it until tomorrow at 9:00. The Snooze menu has more times and conditions. | | **Mute** | `M` | Moves it to Muted, and unsubscribes you on GitHub, so GitHub stops notifying you about it. | | **Read / Unread** | `U` | Marks it as read (also on GitHub) or unread (only in Hush). | | **Move to inbox** / **Unmute** | | In Snoozed, Done, and Muted: brings it back. | After each action, a message with **Undo** shows for a few seconds. **One record for each PR and issue.** Done on a pull request or issue also hides it on the [Pull requests and Issues tabs](https://hush-gh.com/docs/pull-requests-and-issues#actions), until it changes; Mute hides it there until you unmute it. **Hide until it changes** and **Mute** there do the same to its thread here. Moving it back (Undo, Move to inbox, Show again, Unmute) works on both. ### What comes back by itself - **New activity brings a Done thread back.** When GitHub sends a new notification for it, the thread is in the inbox again. A muted thread stays muted. - **Hush finishes threads for you.** When a thread in Needs you stops needing you (you approved, you pushed a fix, CI passes now, it was merged), Hush moves it to Done with a note that says why. If it needs you again within 7 days (someone requests changes again, CI fails again), it comes back to Needs you. - **FYI about work that closed** moves to Done when it is merged or closed. ## Doesn't need me When Hush puts a thread in Needs you and it does not need you, press `N`, or choose **Doesn't need me** at the top of the [peek](https://hush-gh.com/docs/peek) or in the right-click menu. Hush asks **Why doesn't this need you?**, and each answer fixes what would have been right: | Answer | What changes | | -------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | | **Someone else already reviewed it** | Sets [`reviewResolution`](https://hush-gh.com/docs/settings#reviewresolution) to `"any_review"`: a review by someone else settles a review request. | | **Team review requests don't need me** | Turns off [`teamReviewsAreAction`](https://hush-gh.com/docs/settings#teamreviewsareaction). | | **A bot opened it** | Turns on [`botsAreFyi`](https://hush-gh.com/docs/settings#botsarefyi). | | **I don't work on acme/website** | Adds a [rule](https://hush-gh.com/docs/rules) at the top: `repo:acme/website` is FYI. | | **Only this one** | Moves only this thread to FYI, until it changes (a new notification). For a PR or issue, also to Other on the Pull requests and Issues tabs. | Hush shows only the answers that would change something for this thread. After each one, **Undo** in the message puts everything back. A thread that you moved says “You said: doesn't need me”. ## Snooze The Snooze menu has times and conditions. A time is on your computer's clock. - For 1 hour, for 3 hours, until tomorrow 9:00, or until next Monday 9:00. - **Until something happens**: | Snooze until | For | Menu id | | --- | --- | --- | | CI passes | Pull requests | `until:ci_pass` | | CI finishes | Pull requests | `until:ci_done` | | Someone approves | Pull requests | `until:approved` | | A new review | Pull requests | `until:review` | | New commits | Pull requests | `until:commits` | | Someone replies | Pull requests and issues | `until:reply` | | It is merged or closed | Pull requests and issues | `until:closed` | A snooze “until” also ends after 7 days, so nothing sleeps forever. If the PR or issue is merged or closed first, the snooze ends at once, because the event can no longer happen. When a snooze ends because the thing happened, Hush pushes “Snooze over: CI passed”. Conditions that are already true are not offered. A [rule](https://hush-gh.com/docs/rules) can snooze threads for a number of hours when they arrive. ## Select many - `X` selects or deselects the row under the cursor. `Shift + J` and `Shift + K` extend the selection. - ⌘-click (Ctrl-click) adds a row; Shift-click selects a range; `⌘ A` / `Ctrl + A` selects all. - With a selection, a bar at the bottom has Done, Snooze, Mute, and Read. The keys and the right-click menu act on all selected rows. - `Esc` clears the selection. ## Filter The filter box above the list takes words and [query words](https://hush-gh.com/docs/query-language): ```query repo:acme/* needs:review -author:bots ``` Plain words must all be in the title, the repository, or the author. Suggestions show while you type; `/` goes to the box. When a filter has an error, the message shows under the box, and the part with the error is left out. To keep a filter, choose the bookmark button at the end of the box: **Save this filter as a view (a new tab)**. See [Saved views](https://hush-gh.com/docs/views). ### Search everywhere While the box has text, choose **Search: everywhere** under it to search every thread: Needs you, FYI, Snoozed, Done, and Muted. Each result says which list it is in. Done, Snooze, and Mute work on the results that are in the inbox; **Move to inbox** and **Unmute** on the others. **This tab** searches the tab again. ## Right-click menu Right-click a row (or choose “⋯” on a phone) for every action: Peek, the main action, Open on GitHub, Done, Snooze, Mute, Move to inbox, Mark as read, Copy link, **Make a rule…**, and selection. With a selection, the menu acts on all selected rows. You can change the items and their order: see [Menus](https://hush-gh.com/docs/appearance-and-menus#menus). **Make a rule…** opens **Settings → Inbox** with a new rule for this thread's repository and type. ## Sync Hush checks GitHub every few minutes by itself (see [Limits](https://hush-gh.com/docs/limits)), and open tabs update at once when something changes. The line under the tabs says “Synced 2m ago”, or “Syncing…” while a check runs. To check now, press `R` or choose the refresh button. This also looks again at up to 40 threads in the inbox, and moves the ones that no longer need you to Done. --- # Pull requests and issues > The dashboards of open work that involves you, grouped by whose turn it is. Source: https://hush-gh.com/docs/pull-requests-and-issues The **Pull requests** and **Issues** tabs show open work that involves you, also when GitHub sent no notification about it. Each tab is a set of saved GitHub searches, called **sections**. Hush groups the results by whose turn it is. ## Groups | Group | Means | | --------------------- | --------------------------------------------- | | **Your turn** | You are the next person who must act. | | **Your team's turn** | A review is requested from a team you are in. | | **Waiting on others** | You did your part. Someone else must act. | | **Other** | Drafts, and threads that only mention you. | Inside a group, the most urgent items come first (failing CI before a comment), then the ones that waited longest. Each item says why it is in its group: | Group | Pull requests | Issues | | ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- | | Your turn | CI failing · Changes requested · Merge conflict · Open review threads · Ready to merge · @alice commented (on your PR) · Review requested · Re-review requested · Assigned to you · New commits since your review | Assigned to you · @alice replied | | Your team's turn | Review for acme/web | | | Waiting on others | CI running · Waiting for review · Waiting on author · You approved · Waiting for a reply · @alice reviewed (with [`any_review`](https://hush-gh.com/docs/settings#reviewresolution)) | Waiting for replies · No replies yet · Waiting for a reply | | Other | Draft · Bot PR · the section's name | the section's name | The rules are the same as for the inbox's [Needs you](https://hush-gh.com/docs/inbox#what-needs-you). A row also lists what changed since you last looked at the item (“+2 commits”, “CI fails”), the same as in the inbox: see [Since you looked](https://hush-gh.com/docs/inbox#since-you-looked). ### Stale An item whose turn started more than 3 days ago is **stale**: it says how long it waited (“waiting 5d”) in amber. Change the number of days with [`dash.staleDays`](https://hush-gh.com/docs/settings#dash-staledays). ## Sections The sections are tabs above the list: **All**, then each section with its count. `0` shows all; `1` to `9` show one section. An item can be in more than one section. The default sections: - **Pull requests:** Review requested from you, Team review requests, Your PRs, You reviewed, Assigned to you, Mentions you. “Mentions your teams” is off. - **Issues:** Assigned to you, You opened, Mentions you, You commented. “Mentions your teams” is off. Change them in **Settings → PRs & issues**: - Each section has a name and a [GitHub search](https://docs.github.com/en/search-github/searching-on-github/searching-issues-and-pull-requests). `@me` is you. `@team` runs the search once for each team that you track. - Turn a section off with its switch, move it up or down, delete it, or choose **Add section**. The link button opens the same search on GitHub, to check it. - **Scope** is added to every search: for example `org:acme`, or `-repo:acme/website`. - **Teams** lists your teams. Turn off big teams (such as “everyone”) to cut noise. **Look up teams again** finds new teams at once; otherwise Hush looks every 6 hours. - **Defaults** puts back the default sections. Nothing changes until you choose **Save**. More options are only in [settings.json](https://hush-gh.com/docs/settings): hide others' drafts ([`dash.hideOthersDrafts`](https://hush-gh.com/docs/settings#dash-hideothersdrafts)), hide bots' PRs ([`dash.hideBots`](https://hush-gh.com/docs/settings#dash-hidebots)), and the stale days. ## Actions | Action | Key | What it does | | --------------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Peek | `Space` | Read it in the [peek](https://hush-gh.com/docs/peek), and act on GitHub from there. | | Main action | `O` or `Enter` | Review, Fix CI, Reply… on GitHub. | | Open on GitHub | `Shift + O` | The PR or issue itself. | | Hide until it changes | `E` | Hides the item until something new happens on it, and moves its thread in the inbox to Done (also on GitHub). Done in the inbox hides it here too. | | Mute | `M` | Hides the item until you unmute it, and mutes its thread in the inbox (you are unsubscribed on GitHub). Mute in the inbox mutes it here too. **Show hidden items** lists muted items, with **Unmute**. | | Show hidden items | `H` | Shows hidden items, to show one again. | | Copy link | `C` | Copies the links of the item or the selection. | | Refresh | `R` | Searches GitHub again now. | ### Not my turn When an item in **Your turn** is not your turn, press `N`, or choose **Not my turn** at the top of the [peek](https://hush-gh.com/docs/peek) or in its menu. The answers are the same as [Doesn't need me](https://hush-gh.com/docs/inbox#doesnt-need-me) in the inbox: they fix a setting, add a rule, or move only this item to Other (and its thread in the inbox to FYI) until it changes. ### Move an item to another group If Hush puts an item in the wrong group, drag it (by ⋮⋮) to another group or to another place in the list, or use **Move to** in its menu. The item stays where you put it **until it changes** on GitHub; then Hush sorts it again. “Moved by you” shows on it; **Undo move** puts it back. Your order inside a group stays too; new items come in on top. Select many items to move, hide, or copy them together, the same as in the [inbox](https://hush-gh.com/docs/inbox#select-many). ## Refresh Hush keeps the results for 15 minutes, and searches GitHub again when you open the tab after that. Press `R` to search now. When a search fails, a message says which one; if GitHub needs more access for it (for example an org that has not approved Hush), the message links to [GitHub access](https://hush-gh.com/docs/github-access). --- # Peek and GitHub actions > Read a pull request or issue without leaving Hush, and approve, comment, merge, or close it from there. Source: https://hush-gh.com/docs/peek ## Open the peek The peek shows one pull request or issue next to your list. Click a row, or press `Space`. On a wide screen, the list stays visible and the peek follows the cursor as you move with `J` or `↓` and `K` or `↑`. On a phone, the peek covers the list. - `Space` or `Esc` closes it. - The peek stays open when you go to another tab, and shows the same item until you move the cursor there. - The alert history (the bell) opens in the same place; the one that you opened last stays. Every thread has a peek. Besides pull requests and issues: | Thread | The peek shows | | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Workflow run** | The workflow, the branch, the commit, and the PR it ran for; each job with its result and time; the steps that failed; and the end of each failed job's log, up to its error. **Re-run failed jobs** runs them again. | | **Release** | The name, the tag, who published it and when, and the release notes. | | **Commit** | The message, the author, and the changed files. | | **Discussion** | The question or post, its category, whether it is answered, and the last 10 comments. | | **Dependabot alert** | The open alerts of the repository, newest first: severity, package, and the version that fixes it. GitHub shows alerts only to tokens that may read them; if it refuses, the peek says so. | Other kinds (an invitation, for example) show what GitHub sent, and a link to it. ## What it shows - **Why it is here**, at the top, in plain words: “Needs you: CI failed on your PR. GitHub: your workflow run. Rule: CI is FYI.” on the inbox, and “Your turn: Review requested, for 2d. Found by: Review requested from you.” on the Pull requests and Issues tabs. “Hush moved it: ✓ You approved” when Hush moved it by itself. Under it, what changed since you last looked (see [Since you looked](https://hush-gh.com/docs/inbox#since-you-looked)). - The title and `repo#number`. Both link to GitHub. - The state (open, draft, merged, closed), the author, and when it was opened. - For a PR: the branches, the size, the reviews (who approved and who requested changes), the review requests, and a warning when it has merge conflicts. - The checks: failed and running ones first. **Show all** lists every check. - The labels and the assignees. - The description, then the comments and reviews, oldest first. Inline review comments on the diff are counted, not shown. - A comment box at the end. A thread that stays open in the peek for a moment is marked as read, also on GitHub. Turn this off with [`peekMarksRead`](https://hush-gh.com/docs/settings#peekmarksread). ## The bottom bar The bar at the bottom of the peek has two parts: 1. The buttons of the page that you are on: **Done**, **Snooze**, **Mute**, and **Read** in the inbox; **Hide until it changes** and **Copy link** on the Pull requests and Issues tabs. 2. The **actions on GitHub**: a main button, and **More** for the rest. The main button is the action that fits what the thread asks of you: **Approve** for a review, **Re-run failed jobs** when CI fails on your PR, **Merge** when it is ready, and **Comment** for a reply or anything else. ## Actions on GitHub Hush shows only the actions that you can do now. An action that GitHub would refuse is in **More** with the reason, for example “GitHub does not let you review your own pull request” or “Required reviews or checks are missing”. | Action | Default key | Text | Safety | | --- | --- | --- | --- | | Approve | `a` | optional | Sent after 5 seconds; Undo stops it | | Request changes | `Shift+a` | required | | | Comment | `Shift+c` | required | | | Re-run failed jobs | `Shift+r` | | | | Merge | `Shift+m` | | Asks again: press twice | | Enable auto-merge | none (in “More”) | | Undo: turn off auto-merge | | Turn off auto-merge | none (in “More”) | | Undo: enable auto-merge | | Close | `Shift+x` | | Undo: reopen | | Close as not planned | none (in “More”) | | Undo: reopen | | Reopen | `Shift+x` | | Undo: close | - **Approve** waits 5 seconds before Hush sends it, because GitHub cannot take back an approval. **Undo** in the message stops it. **Approve with a comment…** (in More) opens the comment box. - **Request changes** and **Comment** need text: the comment box opens. `⌘ ↩` / `Ctrl + Enter` sends it. - **Merge** asks once more: the button becomes “Confirm: merge”. Press it (or the key) again. The merge uses the method chosen under **Merge method** in More, when the repository allows more than one. Hush merges only the commit that you saw: if someone pushed since, GitHub refuses, and you can look again. - **Enable auto-merge** shows when the repository allows it and the PR cannot merge yet: GitHub merges it when the checks and reviews pass. - **Close** and **Reopen** can be undone from the message. After an action, Hush checks the item again at once, so the lists update without a sync. The keys work while the peek is open. Change them in [Keybinds](https://hush-gh.com/docs/keybinds) (the “Peek” group). ## The comment box The box at the end of the conversation posts a comment. It can also approve or request changes with your text. `⌘ ↩` / `Ctrl + Enter` sends. You can write Markdown, the same as on GitHub. --- # Notifications > Push alerts on your devices, what gets pushed, quiet hours, the alert history, and counts on the tab. Source: https://hush-gh.com/docs/notifications ## Turn on push Hush sends native push notifications, also when Hush is closed. Push is per device: turn it on in each browser or installed app that should get alerts. 1. Go to **Settings → Notifications**. 2. Under **Devices**, choose **Turn on**. The browser asks for permission. 3. Choose **Send test** to check it. The list under **Devices** has every device that gets push, with “(this device)” next to this one. The trash button removes a device. Up to 10 devices can get push. **iPhone and iPad:** push works only in an installed web app (iOS 16.4 or later). Open Hush in Safari, choose Share → **Add to Home Screen**, open Hush from the Home Screen, and turn on push there. ## What gets pushed | Setting | Default | Pushes | | ------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------- | | **“Needs you” items** ([`pushAction`](https://hush-gh.com/docs/settings#pushaction)) | on | Review requests, failed CI on your PRs, replies, direct mentions: everything that arrives in Needs you. | | **FYI items** ([`pushFyi`](https://hush-gh.com/docs/settings#pushfyi)) | off | FYI threads too. Usually noisy. | | [`pushTurnChanges`](https://hush-gh.com/docs/settings#pushturnchanges) (settings.json) | on | A thread that becomes your turn with no new notification, for example new commits after your review. | | [`pushResolved`](https://hush-gh.com/docs/settings#pushresolved) (settings.json) | on | Replaces a recent alert with a quiet “✓ You approved” when it is resolved. | [Rules](https://hush-gh.com/docs/rules) decide for the threads they match: `"push": true` pushes even FYI threads, and `"push": false` stops the push even for Needs you. This is the best way to hear about one repository or one person. Hush checks GitHub every 5 minutes while push is on, so an alert can come a few minutes after the event. When more than 3 threads arrive in one check, they come as one push: “5 things need you”. A push opens the thread's main action (the PR's files to review, its checks…). When you finish a thread on one device (Done, Mute, Snooze, or when Hush sees that you approved), its alert on your other devices changes to a quiet note and closes. ## Quiet hours No pushes at the times that you choose. Turn on **Quiet hours** in **Settings → Notifications**, and set **From** and **to**. **All weekend** also makes Saturday and Sunday quiet. - A time range such as 22:00 to 07:00 ends the next morning. - The times are in one time zone, shown under the times. If you travel, choose **Use** with your current time zone. - During quiet hours, alerts still go in the alert history. When quiet hours end, **one push** lists what waited: “4 alerts while quiet”. In settings.json this is [`quietHours`](https://hush-gh.com/docs/settings#quiethours). ## Alert history The bell in the header lists every push alert from the last 30 days, newest first, also those that waited during quiet hours. Click an alert to peek at its thread, or open it on GitHub. An alert shows what happened to its thread since: Done, Muted, Snoozed, or the note such as “You approved”. ## Tab title and icon **Settings → General → Tab title & icon** puts a count on the browser tab and on the app icon. These settings are in this browser only. - **Count in the page title**: “(3) Hush”. **Format** is a total, or a breakdown such as “(7 · 3 PR · 2 issue)”. - **Dot on the tab icon**: a colored dot, with the number or only a dot. Safari may ignore icon changes after the page loads. - **Badge on the app icon**: only when Hush is installed as an app (Chrome, Edge, Safari on macOS). For each one, **Count** picks what counts: unread alerts (the default), Inbox: Needs you, Inbox: FYI, Pull requests: your turn, Pull requests: your team's turn, and Issues: your turn. Nothing is added when the count is 0. --- # Feeds > Read an inbox tab in any feed reader, with a private Atom feed. Source: https://hush-gh.com/docs/feeds Any inbox tab can be an Atom feed: Needs you, FYI, Needs you + FYI, or one of your [saved views](https://hush-gh.com/docs/views). Use it in a feed reader, a Slack feed app, or a script. ## Make a feed 1. Go to **Settings → Inbox → Views and feeds**. 2. Choose the feed button (the RSS icon) next to a tab. Hush makes the feed and copies its address. 3. Paste the address in your feed reader. Hush shows the address **only this once**: it keeps only a hash of it. Copy it from the message if the copy did not work. If you lose it, make a new one. The feed button of a tab with a feed has a menu: **New feed URL** and **Turn off feed**. **Keep the address secret.** Anyone who has it can read the feed, with no sign-in. If it leaks, choose **New feed URL** or **Turn off feed**: the old address stops working at once. ## What is in a feed The feed has the threads that are in the tab now, newest first. Each entry has: - The title: what happened and the thread's title, such as “CI failed on your PR: Fix login”. - The link: the thread's main action on GitHub. - The repository, the number, why GitHub notified you, and the newest comment. - The author, and the list (`action` or `fyi`) as a category. Feed readers usually check every few minutes; the feed can be up to 2 minutes old. A feed of a saved view stops working when you delete the view. --- # Rules > Send threads to Needs you, FYI, or Muted, turn pushes on or off, and move threads to Done or Snoozed by themselves. Source: https://hush-gh.com/docs/rules Hush's defaults decide what [needs you](https://hush-gh.com/docs/inbox#what-needs-you). Rules change that for the threads that you choose: a repository that is only FYI for you, a bot to mute, a person whose replies you always want pushed. ## How rules work - Hush sorts a thread with its defaults first. Then it checks your rules **from top to bottom**. **The first rule that matches wins**; the rules below it do not count for that thread. - A rule has **conditions** (when) and **effects** (then). All conditions must match. A condition with more than one value matches any of them. - When you save rules, Hush sorts your stored threads again, so the lists change at once. A rule can do one or more of these: | Effect | JSON | Does | | ---------------- | ---------------------------------------------------------------- | ---------------------------------------------------------------------- | | Put it in a list | `"category": "action"`, `"fyi"`, or `"muted"` | Needs you, FYI, or Muted. | | Push or not | `"push": true` or `false` | In place of the [push settings](https://hush-gh.com/docs/notifications#what-gets-pushed). | | Move it | `"triage": "done"`, or `"triage": "snooze"` with `"snoozeHours"` | To Done, or snoozed for 1 to 720 hours. | **Move it** acts when the thread has new activity or when the rule starts to match. If you bring a thread back to the inbox yourself, it stays there until its next activity. ## Make a rule In **Settings → Inbox → Rules**: - **New rule** adds an empty rule. **From a template** adds a finished example. - Or right-click a thread in the inbox and choose **Make a rule…**: the new rule has that thread's repository and type. Each rule is a card. Give it a name (it shows on the threads it sorts, as “rule: Docs repo is FYI”), add conditions, and choose what it does. The conditions are a [query](https://hush-gh.com/docs/query-language), such as `repo:acme/website type:pr`: write it as text, or pick the conditions one by one. The rule stores the text. Turn a rule off with its switch; move, duplicate, or delete it from its buttons. While you edit, each card shows how many of your stored threads it would catch, and the footer says what would change if you save: “If you save: 4 to FYI, 2 to Muted.” Nothing changes until you choose **Save rules**. ## Conditions A rule's conditions are one [query](https://hush-gh.com/docs/query-language). All of its conditions must match. | Query word | Matches | | ------------------------------ | --------------------------------------------------------- | | `repo:acme/*` | The repository. `*` matches anything. | | `author:dependabot*` | Who opened the PR or issue. | | `author:bots` / `-author:bots` | The author is a bot, or a person. | | `from:alice` | Who did the newest activity: a comment or a review. | | `from:bots` / `-from:bots` | The newest activity is by a bot, or by a person. | | `label:bug` | Has this label (the exact name, any case). | | `type:pr` | What it is: pr, issue, ci, release, discussion… | | `event:mentioned` | Why GitHub notified you. | | `needs:review` | What Hush thinks you must do, before your rules. | | `in:fyi` | Where Hush's defaults put it, before your rules. | | `is:draft` / `-is:draft` | A draft PR, or not. | | `is:open` | Open, closed, or merged. | | words | Each word is in the title, the repository, or the author. | Every word and value is in the [query language](https://hush-gh.com/docs/query-language) reference. ## Examples Most rules are one line. As queries, with what they do: | When | Then | | ------------------------------ | ------------------------ | | `repo:acme/website` | FYI | | `author:dependabot*` | Muted | | `needs:review is:draft` | No push | | `type:release repo:sveltejs/*` | Needs you, push | | `from:github-actions in:fyi` | Done | | `type:ci repo:acme/nightly` | Snooze 12 hours, no push | The same rules in [settings.json](https://hush-gh.com/docs/settings#rules): ```json settings { "rules": [ { "name": "Website is FYI", "when": "repo:acme/website", "then": { "category": "fyi" } }, { "name": "Mute dependabot", "when": "author:dependabot*", "then": { "category": "muted" } }, { "name": "Quiet reviews on drafts", "when": "needs:review is:draft", "then": { "push": false } }, { "name": "Svelte releases need me", "when": "type:release repo:sveltejs/*", "then": { "category": "action", "push": true } }, { "name": "Bot comments are done", "when": "from:github-actions in:fyi", "then": { "triage": "done" } }, { "name": "Nightly CI can wait", "when": "type:ci repo:acme/nightly", "then": { "triage": "snooze", "snoozeHours": 12, "push": false } } ] } ``` ## Tips - Put narrow rules above wide ones. A wide rule at the top (such as `repo:acme/*`) catches everything below it. - Use `in:` and `needs:` to change only part of Hush's sorting: `repo:acme/big-monorepo in:fyi` changes nothing about what needs you there. - To hear about something without seeing it in Needs you, use `"push": true` with `"category": "fyi"`. - A rule never sends a thread to GitHub: Muted by a rule stays in Hush. **Mute** in the inbox unsubscribes you on GitHub too. --- # Saved views > Extra inbox tabs that show only the threads you choose. Source: https://hush-gh.com/docs/views A saved view is an inbox tab with only the threads that match its conditions: one project, one team's repositories, broken CI, threads from one person. It does not move threads: a thread in a view is still in its own list (Needs you, FYI…), and Done, Snooze, and Mute work the same way there. ## Make a view - Type a [filter](https://hush-gh.com/docs/inbox#filter), such as `repo:acme/web-* needs:review`, and choose the bookmark button at the end of the box: **Save this filter as a view (a new tab)**. - Or choose **+** after the tabs: **New view**. In the view editor: - **Name**: the tab's label, up to 40 characters. - **Show threads from**: the base list. Needs you + FYI, Needs you, FYI, Snoozed, or Done. - **Only threads where**: a [query](https://hush-gh.com/docs/query-language), as text or picked one by one. It is the same language as [rules](https://hush-gh.com/docs/rules#conditions). No query: the view shows every thread of its base. Choose **Save view**. The new tab opens, with its count. ## Change a view - Open the view's tab and choose the pencil button, **Edit view**. **Delete view** is in the editor. - **Settings → Inbox → Views and feeds** lists your views: drag them to change their order, or edit or delete them there. - Keys `6` to `9` open your first four views. You can have up to 12 views. A view can have an [Atom feed](https://hush-gh.com/docs/feeds). ## In settings.json Views are the [`views`](https://hush-gh.com/docs/settings#views) setting: ```json settings { "views": [ { "id": "webreviews", "name": "Web reviews", "base": "action", "query": "repo:acme/web-* needs:review" }, { "id": "alice", "name": "From Alice", "base": "inbox", "query": "from:alice" } ] } ``` In a view, `in:` is the thread's list now, after your rules. In a rule, it is where Hush's defaults put it. --- # Query language > The one-line syntax of the filter box, saved views, and rules, with every word and value. Source: https://hush-gh.com/docs/query-language One short syntax filters the inbox, defines [saved views](https://hush-gh.com/docs/views), and writes the conditions of [rules](https://hush-gh.com/docs/rules): ```query repo:acme/* needs:review -author:bots label:"good first issue" login bug ``` ## Syntax - `word:value` is a condition. All conditions must match. - `word:a,b` (or the same word twice) matches **any** of the values: `repo:acme/web,acme/api`. - `*` matches anything, and `?` one character, in `repo:`, `author:`, and `from:`: `repo:acme/*`, `author:dependabot*`. - Quote a value that has spaces or commas: `label:"good first issue"`. - `author:bots` and `from:bots` mean any bot. `-author:bots` and `-from:bots` mean a person. - `is:draft` and `-is:draft`; `is:open`, `is:closed`, `is:merged`. - Other words must all be in the title, the repository, or the author. They are not case-sensitive. - Only `-author:bots`, `-from:bots`, and `-is:draft` can have a `-`. When a part has an error (an unknown word, a value that does not exist), Hush says so and leaves that part out. While you type, suggestions show the words and their values; ↑ and ↓ move, Enter or Tab picks one, and Esc closes the list. ## Words | Word | Filters on | Example | JSON condition | | --- | --- | --- | --- | | `repo:` | Repository (* matches anything) | `repo:acme/*` | `repo` | | `author:` | Who opened it; author:bots for any bot | `author:dependabot*` | `author`; `author:bots` sets `bot` | | `from:` | Who did the latest activity (a comment or a review); from:bots for any bot | `from:github-actions` | `by`; `from:bots` sets `byBot` | | `label:` | Has this label | `label:"good first issue"` | `label` | | `type:` | What it is | `type:pr` | `type` | | `event:` | Why GitHub notified you | `event:you-opened` | `reason` | | `needs:` | What Hush thinks you must do | `needs:review` | `kind` | | `in:` | Hush's list for it, before your rules | `in:fyi` | `category` | | `is:` | Draft, open, closed, or merged | `is:draft` | `draft`, `state` | | other words | Words that must all be in the title, repository, or author | `login bug` | `text` | ## Values ### type: What it is. | Value | Means | In JSON | | --- | --- | --- | | `pr` | Pull request | `"PullRequest"` | | `issue` | Issue | `"Issue"` | | `ci` | Workflow run | `"CheckSuite"` | | `release` | Release | `"Release"` | | `discussion` | Discussion | `"Discussion"` | | `commit` | Commit | `"Commit"` | | `vulnerability` | Vulnerability alert | `"RepositoryVulnerabilityAlert"` | | `dependabot` | Dependabot alerts | `"RepositoryDependabotAlertsThread"` | ### event: Why GitHub notified you. | Value | Means | In JSON | | --- | --- | --- | | `review-requested` | Your review was requested | `"review_requested"` | | `mentioned` | You were mentioned | `"mention"` | | `team-mentioned` | Your team was mentioned | `"team_mention"` | | `you-opened` | You opened it | `"author"` | | `you-commented` | You commented on it | `"comment"` | | `assigned` | You were assigned | `"assign"` | | `watching` | You watch the repository | `"subscribed"` | | `subscribed` | You subscribed to it | `"manual"` | | `state-changed` | You changed its state | `"state_change"` | | `your-ci` | Your workflow run | `"ci_activity"` | | `security` | Security alert | `"security_alert"` | | `invited` | Repository invitation | `"invitation"` | | `deploy-approval` | A deployment waits for your approval | `"approval_requested"` | | `feature-request` | Feature request | `"member_feature_requested"` | | `advisory-credit` | Security advisory credit | `"security_advisory_credit"` | ### needs: What Hush thinks you must do. | Value | Means | In JSON | | --- | --- | --- | | `review` | Review it | `"review"` | | `fix-ci` | Fix failing CI | `"fix_ci"` | | `changes` | Address review comments | `"address_review"` | | `conflict` | Resolve a merge conflict | `"resolve_conflict"` | | `merge` | Merge it | `"merge"` | | `reply` | Reply | `"reply"` | | `triage` | Triage it | `"triage"` | | `security` | Handle a security alert | `"security"` | | `nothing` | Nothing: FYI | `"none"` | ### in: Hush's list for it, before your rules. | Value | Means | In JSON | | --- | --- | --- | | `needs-you` | Needs you | `"action"` | | `fyi` | FYI | `"fyi"` | | `muted` | Muted | `"muted"` | ### is: | Value | Means | In JSON | | --- | --- | --- | | `is:draft` | A draft pull request | `"draft": true` | | `is:open` | Open | `"state": ["open"]` | | `is:closed` | Closed | `"state": ["closed"]` | | `is:merged` | Merged | `"state": ["merged"]` | `-is:draft` is `"draft": false`. ## `author:` and `from:` - `author:` is who **opened** the PR or issue. - `from:` is who did the **newest activity** on it: the newest comment or review. New commits count as activity too, but GitHub does not say who pushed them, so `from:` does not match them. For example, `from:github-actions` finds the threads where the newest thing is a comment by GitHub Actions. ## Examples | Query | Finds | | ---------------------------------- | -------------------------------------------------------------------- | | `repo:acme/*` | Everything in the acme org. | | `needs:review -author:bots` | Review requests from people. | | `type:pr is:open author:alice` | Open PRs that Alice opened. | | `event:mentioned,team-mentioned` | Threads where you or your team were mentioned. | | `needs:fix-ci repo:acme/web` | Failing CI on your PRs in one repository. | | `from:bots in:fyi` | FYI threads where a bot did the newest thing. | | `label:"good first issue" is:open` | Open threads with this label. | | `type:release,discussion` | Releases and discussions. | | `login timeout` | Threads with both words in the title, the repository, or the author. | ## In settings.json Rules and saved views store the query as text: the `when` of a [rule](https://hush-gh.com/docs/settings#rules) and the `query` of a [view](https://hush-gh.com/docs/settings#views). Hush checks it when you save: a query with a part that it does not understand is refused, with the error. ```json settings { "rules": [{ "when": "repo:acme/* needs:review -author:bots", "then": { "push": true } }] } ``` --- # Keybinds > Every keyboard shortcut, the command palette, and how to change any key. Source: https://hush-gh.com/docs/keybinds Hush works from the keyboard. Press `?` on any list to see the shortcuts for it, with your keys. ## Search and commands `⌘ K` / `Ctrl + K` opens the command palette. Type to find: - **Threads, pull requests, and issues** by title or repository. Choosing one peeks at it. - **Actions** on the item under the cursor or the selection: Mark as done, Snooze, Mute, Peek, Move to… - **Pages**: every inbox tab and saved view, Pull requests, Issues, and each settings page. - **Commands**: Sync with GitHub now, Refresh, a theme, Sign out. ## Change a key Go to **Settings → Keybinds**. It lists every command by where it works. - Choose **+** next to a command and press the new key. Esc cancels. - The × on a key removes it. A command can have up to 4 keys, or none. - If the key already does something where the command works, Hush says so. **Use it for …** moves the key to this command. - The reset button next to a changed command puts back its default keys; **Reset all** resets every command. - The search box finds a command by its name, or by a key: type a key to see what it does. Your keys are saved at once, and follow you to every device. In settings.json they are the [`keys`](https://hush-gh.com/docs/settings#keys) setting: ```json settings { "keys": { "inbox.done": ["d"], "inbox.mute": [], "list.peek": ["Space", "p"] } } ``` Mouse actions are not keys, and cannot change: ⌘-click (Ctrl-click) adds a row to the selection, Shift-click selects a range, and on the Pull requests and Issues tabs you drag ⋮⋮ to move an item. ## Where keys work A key works in one scope. Keys can repeat across scopes that are never active together (`E` is Done in the inbox and `E` is Hide on the Pull requests tab), but not inside scopes that are active at the same time. - **Everywhere**: on every page. - **Lists**: the inbox and the Pull requests and Issues tabs. - **Inbox** and **Pull requests and issues**: only on those pages. - **Peek**: while the [peek](https://hush-gh.com/docs/peek) is open. - **Text boxes**: while you type in the comment box or settings.json. Keys do not work while you type in a text box, except the “Text boxes” keys and Esc. ## All shortcuts The command id is the name in settings.json. `Mod` is ⌘ on a Mac and Ctrl on other computers. ### Everywhere | Command id | What it does | Default keys | | --- | --- | --- | | `palette` | Search and commands | `Mod+k` | ### Lists (inbox and dashboards) | Command id | What it does | Default keys | | --- | --- | --- | | `list.next` | Next | `j`, `ArrowDown` | | `list.prev` | Previous | `k`, `ArrowUp` | | `list.extendNext` | Extend the selection down | `Shift+j` | | `list.extendPrev` | Extend the selection up | `Shift+k` | | `list.select` | Select or deselect | `x` | | `list.selectAll` | Select all | `Mod+a` | | `list.peek` | Peek (open or close) | `Space` | | `list.escape` | Close the peek, or clear the selection | `Escape` | | `list.open` | Main action (review, fix CI, reply…) | `o`, `Enter` | | `list.openGitHub` | Open on GitHub | `Shift+o` | | `list.copy` | Copy link | `c` | | `list.refresh` | Sync with GitHub now | `r` | | `list.search` | Search | `/` | | `list.help` | Show shortcuts | `?` | ### Inbox | Command id | What it does | Default keys | | --- | --- | --- | | `inbox.done` | Done | `e` | | `inbox.snooze` | Snooze until tomorrow 9:00 | `s` | | `inbox.mute` | Mute the thread | `m` | | `inbox.read` | Mark as read / unread | `u` | | `inbox.notNeeded` | Doesn’t need me… | `n` | | `inbox.view.1` | View 1 (built-in) | `1` | | `inbox.view.2` | View 2 (built-in) | `2` | | `inbox.view.3` | View 3 (built-in) | `3` | | `inbox.view.4` | View 4 (built-in) | `4` | | `inbox.view.5` | View 5 (built-in) | `5` | | `inbox.view.6` | View 6 (your saved views) | `6` | | `inbox.view.7` | View 7 (your saved views) | `7` | | `inbox.view.8` | View 8 (your saved views) | `8` | | `inbox.view.9` | View 9 (your saved views) | `9` | ### Pull requests and issues | Command id | What it does | Default keys | | --- | --- | --- | | `dash.hide` | Hide until it changes (or show again) | `e` | | `dash.showHidden` | Show hidden items | `h` | | `dash.mute` | Mute (or unmute) | `m` | | `dash.notNeeded` | Not my turn… | `n` | | `dash.section.0` | Section: all | `0` | | `dash.section.1` | Section 1 | `1` | | `dash.section.2` | Section 2 | `2` | | `dash.section.3` | Section 3 | `3` | | `dash.section.4` | Section 4 | `4` | | `dash.section.5` | Section 5 | `5` | | `dash.section.6` | Section 6 | `6` | | `dash.section.7` | Section 7 | `7` | | `dash.section.8` | Section 8 | `8` | | `dash.section.9` | Section 9 | `9` | ### Peek: actions on GitHub | Command id | What it does | Default keys | | --- | --- | --- | | `peek.approve` | Approve | `a` | | `peek.requestChanges` | Request changes | `Shift+a` | | `peek.comment` | Comment | `Shift+c` | | `peek.rerun` | Re-run failed jobs | `Shift+r` | | `peek.merge` | Merge (press twice) | `Shift+m` | | `peek.closeReopen` | Close or reopen | `Shift+x` | ### Text boxes | Command id | What it does | Default keys | | --- | --- | --- | | `editor.send` | Send the comment | `Mod+Enter` | | `editor.save` | Save settings.json | `Mod+s` | --- # Appearance and menus > Themes, light and dark mode, the start page, and the items of the right-click menus. Source: https://hush-gh.com/docs/appearance-and-menus ## Appearance In **Settings → General → Appearance**. These settings are in this browser only; they are not in settings.json. - **Mode**: Light, Dark, or System (follows your computer). - **Theme**: choose **Change…** to see every theme. Each theme has a light and a dark version; the mode picks one. The command palette can change the theme too. The themes (from [tweakcn](https://tweakcn.com)) are listed [below](#themes). - **Start page**: the tab that Hush opens first: Inbox, Pull requests, or Issues. The counts on the browser tab and the app icon are here too: see [Tab title and icon](https://hush-gh.com/docs/notifications#tab-title-and-icon). ### Themes - Default - Caffeine - Catppuccin - Claude - Cosmic Night - Graphite - Gruvbox - Kodama Grove - Mono - Ocean Breeze - Solar Dusk - Supabase - T3 Chat - Twitter - Vercel - Vintage Paper ## Menus The right-click menu of a row (and its “⋯” menu on a phone) has the actions for it. You choose its items and their order, in **Settings → General → Menus**, for **Inbox** and for **PRs & issues**: - Drag items to change the order. The × removes one. - **Add item…** adds an item or a separator. Besides the main items, you can add one-click copies of choices from submenus, such as “Snooze until tomorrow 9:00” or “Move to Your turn”. - **Preview** shows the menu as it will look. - **Reset to default** puts back the default menu. Nothing changes until you choose **Save**. Items that do not apply to a row are left out when the menu opens: Done in the Done tab, or Open on GitHub when it is the same as the main action. ### Menu items In settings.json, menus are [`menus.inbox`](https://hush-gh.com/docs/settings#menus-inbox) and [`menus.dash`](https://hush-gh.com/docs/settings#menus-dash): lists of these ids. `"sep"` is a separator line. ### Inbox threads (menus.inbox) | Id | Item | Shows | In the default menu | | --- | --- | --- | --- | | `peek` | Peek | | yes | | `main` | Main action | Review, Reply, Fix CI… | yes | | `github` | Open on GitHub | When it differs from the main action | yes | | `done` | Done | Needs you and FYI | yes | | `snooze` | Snooze | Every time and condition | yes | | `mute` | Mute | Needs you and FYI | yes | | `restore` | Move to inbox / Unmute | Snoozed, Done, and Muted | yes | | `read` | Mark as read / unread | | yes | | `not-needed` | Doesn’t need me… | Needs you | yes | | `copy` | Copy link | | yes | | `rule` | Make a rule… | Opens the rule editor with this repo and type | yes | | `select` | Select / Deselect | | yes | | `selectAll` | Select all | | yes | | `snooze:1h` | Snooze for 1 hour | | no | | `snooze:3h` | Snooze for 3 hours | | no | | `snooze:tomorrow` | Snooze until Tomorrow 9:00 | | no | | `snooze:monday` | Snooze until Next Monday 9:00 | | no | | `until:ci_pass` | Snooze until cI passes | Pull requests | no | | `until:ci_done` | Snooze until cI finishes | Pull requests | no | | `until:approved` | Snooze until someone approves | Pull requests | no | | `until:review` | Snooze until a new review | Pull requests | no | | `until:commits` | Snooze until new commits | Pull requests | no | | `until:reply` | Snooze until someone replies | Pull requests and issues | no | | `until:closed` | Snooze until it is merged or closed | Pull requests and issues | no | The default order: `["peek","main","github","sep","done","snooze","mute","restore","read","not-needed","copy","rule","sep","select","selectAll"]` ### PRs and issues (menus.dash) | Id | Item | Shows | In the default menu | | --- | --- | --- | --- | | `peek` | Peek | | yes | | `main` | Main action | Review, Reply, Fix CI… | yes | | `github` | Open on GitHub | When it differs from the main action | yes | | `move` | Move to | Every group | yes | | `undoMove` | Undo move | Items you moved | yes | | `hide` | Hide until it changes / Show again | | yes | | `mute` | Mute / Unmute | Hidden until you unmute it | yes | | `not-needed` | Not my turn… | Your turn | yes | | `copy` | Copy link | | yes | | `select` | Select / Deselect | | yes | | `selectAll` | Select all | | yes | | `move:you` | Move to Your turn | | no | | `move:team` | Move to Your team's turn | | no | | `move:them` | Move to Waiting on others | | no | | `move:none` | Move to Other | | no | The default order: `["peek","main","github","sep","move","undoMove","hide","mute","not-needed","copy","sep","select","selectAll"]` ## Swipe actions On a phone or tablet, swipe a row to the right or to the left: - **A short swipe** rests open: the action shows as a button beside the row. Tap it to act. Tap the row, or swipe it back, to close it. - **A long swipe** (past about half of the row) acts at once. You choose the action of each direction, for the inbox and for the Pull requests and Issues tabs, in **Settings → General → Swipe actions**. The defaults: in the inbox, swipe right is **Done** and swipe left is **Snooze**; on the dashboards, swipe right is **Hide until it changes** and swipe left is **Mute**. An action that does not apply to a row (Done on a thread that is done) does nothing there. Only a finger swipes. A mouse or a pen never does, so on the dashboards they still drag rows. In settings.json, the actions are [`swipe.inbox`](https://hush-gh.com/docs/settings#swipe-inbox) and [`swipe.dash`](https://hush-gh.com/docs/settings#swipe-dash). --- # settings.json > Every Hush setting in one JSON file, what each one controls, its type and default, and how the file is checked and saved. Source: https://hush-gh.com/docs/settings All of your Hush settings are one JSON object. The settings pages edit parts of it; **settings.json** shows all of it, also the settings that no page shows. You can edit it by hand, export it to a file, import a file, or give it to an agent to write. Open it in **Settings → General → Edit settings.json** ([app.hush-gh.com/settings/json](https://app.hush-gh.com/settings/json)). ## How it works - **It has only your changes.** A setting that you did not change is not in the file; it uses its default. A new default in Hush then applies to you too. - **Remove a key to go back to its default.** - **Save replaces all your settings.** A setting that is not in the file goes back to its default. `⌘ S` / `Ctrl + S` saves. - **Hush checks the whole file first.** If one value is wrong, it shows the error, such as `Rule 2: "then" needs category, push, or triage.`, and saves nothing. Unknown keys are errors too. - **`dash` and `menus` are groups.** Write only the keys that you change: `{ "dash": { "staleDays": 5 } }` keeps the default sections. A list, such as `dash.pr` or `rules`, is always replaced as a whole. - **Changes apply at once**, on every device. A change to `rules`, `botsAreFyi`, `teamReviewsAreAction`, or `reviewResolution` sorts your stored threads again. A complete example: ```json settings { "pushFyi": false, "quietHours": { "from": 1320, "to": 420, "weekends": true, "timeZone": "America/New_York" }, "reviewResolution": "any_review", "teamReviewsAreAction": true, "rules": [ { "name": "Website is FYI", "when": "repo:acme/website", "then": { "category": "fyi" } }, { "name": "Mute renovate", "when": "author:renovate*", "then": { "category": "muted" } }, { "name": "Always push Alice", "when": "from:alice", "then": { "push": true } } ], "views": [{ "id": "web", "name": "Web", "base": "inbox", "query": "repo:acme/web-*" }], "dash": { "scope": "org:acme archived:false", "excludedTeams": ["acme/everyone"], "staleDays": 5 }, "keys": { "inbox.done": ["d"] } } ``` ### What is not in settings.json These are not settings of your account, so they are not in the file: - **This browser only:** the mode and theme, the start page, the tab title and icon counts, and notes that you chose “Don't show again” for. - **Your data:** push devices, feeds, and what you did to threads and items (Done, Snooze, Mute, hidden and moved items). - **Your GitHub access:** the custom token, if any. ## Settings file **Settings → General → Settings file** exports your settings to a file, and imports a file. Use it to keep a copy, to move to another account, or to share your rules. The file is your settings.json in a small wrapper: ```json { "hush": 2, "exportedAt": "2026-09-28T09:00:00.000Z", "settings": { "rules": [{ "when": "repo:acme/website", "then": { "category": "fyi" } }] } } ``` - `hush` is the file format version: `2`. A version `1` file (conditions as JSON objects) still imports: Hush writes its conditions as queries. - `settings` has only the changes, the same as settings.json. - **Import replaces all your settings**, like Save in settings.json. Hush asks first, and says how many rules and views the file has. Settings that Hush no longer has are left out. ## All settings | Key | Type | Default | In the app | | --- | --- | --- | --- | | [`pushAction`](#pushaction) | boolean | `true` | Settings → Notifications | | [`pushFyi`](#pushfyi) | boolean | `false` | Settings → Notifications | | [`pushTurnChanges`](#pushturnchanges) | boolean | `true` | settings.json only | | [`pushResolved`](#pushresolved) | boolean | `true` | settings.json only | | [`quietHours`](#quiethours) | object or null | `null` | Settings → Notifications | | [`peekMarksRead`](#peekmarksread) | boolean | `true` | settings.json only | | [`reviewResolution`](#reviewresolution) | "strict" or "any_review" | `"strict"` | settings.json only | | [`botsAreFyi`](#botsarefyi) | boolean | `true` | Settings → Inbox | | [`teamReviewsAreAction`](#teamreviewsareaction) | boolean | `false` | Settings → Inbox | | [`rules`](#rules) | array of rules | `[]` | Settings → Inbox | | [`views`](#views) | array of views | `[]` | Settings → Inbox | | [`dash.pr`](#dash-pr) | array of sections | (see below) | Settings → PRs & issues | | [`dash.issue`](#dash-issue) | array of sections | (see below) | Settings → PRs & issues | | [`dash.scope`](#dash-scope) | string | `"archived:false"` | Settings → PRs & issues | | [`dash.excludedTeams`](#dash-excludedteams) | array of strings | `[]` | Settings → PRs & issues | | [`dash.staleDays`](#dash-staledays) | whole number, 1 to 60 | `3` | settings.json only | | [`dash.hideOthersDrafts`](#dash-hideothersdrafts) | boolean | `true` | settings.json only | | [`dash.hideBots`](#dash-hidebots) | boolean | `true` | settings.json only | | [`menus.inbox`](#menus-inbox) | array of menu item ids | (see below) | Settings → General | | [`menus.dash`](#menus-dash) | array of menu item ids | (see below) | Settings → General | | [`swipe.inbox`](#swipe-inbox) | { "left": action, "right": action } | `{"right":"done","left":"snooze"}` | Settings → General | | [`swipe.dash`](#swipe-dash) | { "left": action, "right": action } | `{"right":"hide","left":"mute"}` | Settings → General | | [`keys`](#keys) | object: command id → array of keys | `{}` | Settings → Keybinds | ## Every setting ### pushAction **Type:** boolean · **Default:** `true` · **In the app:** Settings → Notifications Push “Needs you” threads: review requests, failed CI on your PRs, replies. When a thread arrives in **Needs you**, Hush sends a push to every device that has push on. A rule with `"push": false` stops the push for the threads it matches; with `"push": true` it sends one even when this is off. ### pushFyi **Type:** boolean · **Default:** `false` · **In the app:** Settings → Notifications Push FYI threads too. Usually noisy; a rule with "push" is often better. Also push FYI threads. Most people leave this off and write a rule with `"push": true` for the few repositories or people they care about. ### pushTurnChanges **Type:** boolean · **Default:** `true` · **In the app:** none (settings.json only) Push when a thread becomes your turn with no new notification from GitHub, for example new commits after your review. GitHub sends no notification for some changes that make a thread your turn: new commits after your review, CI that fails later, a snooze that ends. The inbox watcher looks at open threads every 15 minutes. When one of them becomes your turn, Hush moves it to Needs you and, with this on, pushes it. ### pushResolved **Type:** boolean · **Default:** `true` · **In the app:** none (settings.json only) Change an alert from the last day to a quiet “✓ You approved” (or “Done”, “CI passes now”…) when it is resolved, then close it. When an alert from the last day is resolved (you approved, CI passes now, you marked it Done on another device), Hush replaces it with a quiet alert such as “✓ You approved”, which then closes itself. Off: the old alert stays until you close it. ### quietHours **Type:** object or null · **Default:** `null` · **In the app:** Settings → Notifications No pushes at these times: { "from": minutes after midnight, "to": minutes, "weekends": true or false, "timeZone": "Europe/London" }, or null for off. No pushes at these times. The alerts still go in the alert history (the bell). When quiet hours end, one push lists what waited. - `from` and `to`: minutes after midnight, 0 to 1439. `from` later than `to` crosses midnight (22:00 to 07:00 is `1320` to `420`). They must differ. - `weekends`: `true` also makes all of Saturday and Sunday quiet. - `timeZone`: an IANA time zone name, such as `"Europe/London"` or `"America/New_York"`. ```json settings { "quietHours": { "from": 1320, "to": 420, "weekends": true, "timeZone": "Europe/London" } } ``` ### peekMarksRead **Type:** boolean · **Default:** `true` · **In the app:** none (settings.json only) A thread open in the peek for a moment is marked as read (also on GitHub). A PR or issue that stays open in the peek for 1.5 seconds is marked as read, in Hush and on GitHub. Off: only **Read** (or opening it on GitHub) marks it. ### reviewResolution **Type:** "strict" or "any_review" · **Default:** `"strict"` · **In the app:** none (settings.json only) When a review request stops being your turn. "strict": when GitHub no longer asks you. "any_review": also when someone else approves or asks for changes. When a review request stops being your turn. - `"strict"`: when GitHub no longer asks you: you reviewed, or the request was removed. - `"any_review"`: also when someone other than you and the author approves or requests changes after the newest push. Useful on teams where one review is enough. This also applies to team review requests. ### botsAreFyi **Type:** boolean · **Default:** `true` · **In the app:** Settings → Inbox Activity by bots (dependabot, renovate, codecov…) is FYI. PRs that bots open (dependabot, renovate…) are FYI, and they show in Other on the Pull requests tab, unless they ask for your review by name. Comments and mentions by bots do not count as replies. A bot is a login that ends in `[bot]`, or starts with dependabot, renovate, github-actions, or codecov. ### teamReviewsAreAction **Type:** boolean · **Default:** `false` · **In the app:** Settings → Inbox A review request to one of your teams is “Needs you”, not FYI. A review request to a team you are in goes to **Needs you** (and is pushed). Off, it is FYI in the inbox, and it shows under “Your team's turn” on the Pull requests tab. ### rules **Type:** array of rules · **Default:** `[]` · **In the app:** Settings → Inbox Inbox rules, top to bottom; the first match wins. Each is { "name", "enabled", "when": conditions, "then": { "category", "push", "triage", "snoozeHours" } }. Your inbox rules. Hush checks them from top to bottom, after its own defaults. The first enabled rule that matches a thread wins. A change to the rules sorts your stored threads again. See [Rules](https://hush-gh.com/docs/rules) for the editor, and [the query language](https://hush-gh.com/docs/query-language) for the conditions. A rule: - `name` (text, optional): shown on the thread as “rule: …”. - `enabled` (boolean, optional): `false` turns the rule off. Missing means on. - `when` (text): a [query](https://hush-gh.com/docs/query-language), such as `"repo:acme/* needs:review"`. All of its conditions must match. `""` matches every thread. A query with a part that Hush does not understand is refused. - `then` (object): what to do. It needs at least one of `category`, `push`, or `triage`. - `category`: `"action"` (Needs you), `"fyi"`, or `"muted"`. - `push`: `true` or `false`, in place of the push settings. - `triage`: `"done"` moves the thread to Done, `"snooze"` snoozes it for `snoozeHours` (a whole number from 1 to 720). Hush moves a thread only when it has new activity or when the rule starts to match, so a thread that you move back stays where you put it. ```json settings { "rules": [ { "name": "Docs repo is FYI", "when": "repo:acme/website", "then": { "category": "fyi" } }, { "name": "Mute dependabot", "when": "author:dependabot*", "then": { "category": "muted" } }, { "name": "Nightly CI can wait", "when": "type:ci repo:acme/nightly", "then": { "triage": "snooze", "snoozeHours": 12, "push": false } } ] } ``` ### views **Type:** array of views · **Default:** `[]` · **In the app:** Settings → Inbox Saved views: extra inbox tabs. Each is { "id", "name", "base", "when": conditions }. Saved views: extra tabs after the built-in inbox tabs, in this order. Up to 12. - `id`: 1 to 16 lower-case letters or digits. Unique. Feeds and links use it. - `name`: up to 40 characters. The tab label. - `base`: the list the view starts from: `"inbox"` (Needs you + FYI), `"action"` (Needs you), `"fyi"` (FYI), `"snoozed"` (Snoozed), `"done"` (Done). - `query`: a [query](https://hush-gh.com/docs/query-language), the same words as rules. `in:` here is the thread's list now, after your rules. `""` shows every thread of the base. ```json settings { "views": [ { "id": "web", "name": "Web team", "base": "inbox", "query": "repo:acme/web-*" }, { "id": "ci", "name": "Broken CI", "base": "action", "query": "needs:fix-ci" } ] } ``` ### dash.pr **Type:** array of sections · **Default:** below · **In the app:** Settings → PRs & issues Pull request sections: saved GitHub searches { "id", "name", "query", "enabled" }. @me is you; @team runs once per tracked team. The sections of the Pull requests tab. Each is a saved GitHub search. Up to 20. - `id`: 1 to 40 lower-case letters, digits, or dashes. Unique. - `name`: up to 60 characters. - `query`: a [GitHub search](https://docs.github.com/en/search-github/searching-on-github/searching-issues-and-pull-requests), 1 to 256 characters. `@me` is you. `@team` runs the search once for each team you track. - `enabled`: `false` hides the section and skips its search. A change to `dash.pr` replaces the whole list. To add a section, write the defaults below and your new one. The defaults: | id | name | query | enabled | | --- | --- | --- | --- | | `review-me` | Review requested from you | `is:pr is:open user-review-requested:@me` | true | | `review-team` | Team review requests | `is:pr is:open team-review-requested:@team` | true | | `mine` | Your PRs | `is:pr is:open author:@me` | true | | `reviewed` | You reviewed | `is:pr is:open reviewed-by:@me -author:@me` | true | | `assigned` | Assigned to you | `is:pr is:open assignee:@me` | true | | `mentioned` | Mentions you | `is:pr is:open mentions:@me` | true | | `team-mentioned` | Mentions your teams | `is:pr is:open team:@team` | false | ### dash.issue **Type:** array of sections · **Default:** below · **In the app:** Settings → PRs & issues Issue sections, the same as dash.pr. The sections of the Issues tab, the same as `dash.pr`. The defaults: | id | name | query | enabled | | --- | --- | --- | --- | | `assigned` | Assigned to you | `is:issue is:open assignee:@me` | true | | `mine` | You opened | `is:issue is:open author:@me` | true | | `mentioned` | Mentions you | `is:issue is:open mentions:@me` | true | | `commented` | You commented | `is:issue is:open commenter:@me -author:@me` | true | | `team-mentioned` | Mentions your teams | `is:issue is:open team:@team` | false | ### dash.scope **Type:** string · **Default:** `"archived:false"` · **In the app:** Settings → PRs & issues Added to every search, for example "org:acme archived:false". Added to the end of every section's search, up to 200 characters. Use it to keep the tabs to your work: `"org:acme archived:false"`, or `"-repo:acme/website"`. ### dash.excludedTeams **Type:** array of strings · **Default:** `[]` · **In the app:** Settings → PRs & issues "org/team" slugs that @team skips. Teams that `@team` sections skip, as `"org/team"` slugs. Hush finds your teams on GitHub (again every 6 hours); turn off big ones, such as “everyone”, to cut noise. A section searches the first 15 teams at most, and one tab runs up to 40 searches. ```json settings { "dash": { "excludedTeams": ["acme/everyone", "acme/contractors"] } } ``` ### dash.staleDays **Type:** whole number, 1 to 60 · **Default:** `3` · **In the app:** none (settings.json only) An item whose turn is older than this many days is marked stale (1 to 60). An item whose turn started more than this many days ago is **stale**: it shows how long it waited (“waiting 5d”) in amber. Items in the Other group are never stale. ### dash.hideOthersDrafts **Type:** boolean · **Default:** `true` · **In the app:** none (settings.json only) Hide draft PRs that you did not open. Leave out draft PRs that someone else opened. Your own drafts always show (in Other). ### dash.hideBots **Type:** boolean · **Default:** `true` · **In the app:** none (settings.json only) Hide PRs and issues that bots opened, unless your review is requested. Leave out PRs and issues that bots opened, unless your review is requested from you by name. ### menus.inbox **Type:** array of menu item ids · **Default:** below · **In the app:** Settings → General The right-click and “⋯” menu of inbox threads: item ids in order; "sep" is a line. The items of the right-click menu (and the “⋯” menu on phones) of inbox threads, in order. `"sep"` is a separator line. Items that you leave out are hidden. Items that do not apply to a thread, such as Done in the Done tab, are left out when the menu opens. See the item ids in [Menus](https://hush-gh.com/docs/appearance-and-menus#menu-items). ```json settings { "menus": { "inbox": ["peek", "main", "sep", "done", "snooze:tomorrow", "until:ci_pass", "mute", "sep", "copy"] } } ``` Hush adds `"v"` (the menu version) next to your menus. Leave it: it tells Hush which new items you have already seen. The default: ```json [ "peek", "main", "github", "sep", "done", "snooze", "mute", "restore", "read", "not-needed", "copy", "rule", "sep", "select", "selectAll" ] ``` ### menus.dash **Type:** array of menu item ids · **Default:** below · **In the app:** Settings → General The menu of PRs and issues, the same way. The menu of pull requests and issues on the dashboards, the same way as `menus.inbox`. The default: ```json [ "peek", "main", "github", "sep", "move", "undoMove", "hide", "mute", "not-needed", "copy", "sep", "select", "selectAll" ] ``` ### swipe.inbox **Type:** { "left": action, "right": action } · **Default:** `{"right":"done","left":"snooze"}` · **In the app:** Settings → General On touch screens: what a swipe on an inbox thread does, { "left": …, "right": … }. On a phone or tablet, swipe an inbox thread to the right or to the left to act on it: the row moves with your finger, shows the action, and acts when you let go past the line. A mouse or pen never swipes (on the dashboards it drags). The actions: `"none"` (Nothing), `"done"` (Done), `"snooze"` (Snooze…), `"mute"` (Mute), `"read"` (Read / unread), `"not-needed"` (Doesn’t need me…). ```json settings { "swipe": { "inbox": { "right": "done", "left": "mute" } } } ``` ### swipe.dash **Type:** { "left": action, "right": action } · **Default:** `{"right":"hide","left":"mute"}` · **In the app:** Settings → General What a swipe on a PR or issue does on the dashboards, the same way. The same for pull requests and issues on the dashboards. The actions: `"none"` (Nothing), `"hide"` (Hide until it changes), `"mute"` (Mute), `"not-needed"` (Not my turn…). ### keys **Type:** object: command id → array of keys · **Default:** `{}` · **In the app:** Settings → Keybinds Keyboard shortcuts you changed: { "command id": ["key", …] }, for example { "inbox.done": ["d"] }. [] turns a shortcut off. Keys: "j", "Shift+j", "Mod+k" (⌘ or Ctrl), "Enter", "Space", "?". The keyboard shortcuts that you changed. For each [command id](https://hush-gh.com/docs/keybinds#all-shortcuts), the keys that replace its default keys, up to 4. `[]` turns the shortcut off. Commands that you do not list keep their defaults. How to write a key: - Letters are lower case. Shift is a modifier: `"Shift+j"`, not `"J"`. - Modifiers come first, in the order `Mod`, `Alt`, `Shift`. `Mod` is ⌘ on a Mac and Ctrl on other computers. - Named keys: `Enter`, `Escape`, `Space`, `Tab`, `Backspace`, `Delete`, the arrows (`ArrowUp`…), `Home`, `End`, `PageUp`, `PageDown`, `F1` to `F12`. - Other characters are themselves, with no Shift: `"?"`, `"/"`, `"1"`. ```json settings { "keys": { "inbox.done": ["d", "e"], "inbox.mute": [], "palette": ["Mod+k", "Mod+p"] } } ``` --- # Limits, timing, and data > How often Hush checks GitHub, what it stores, how long it keeps it, and the limits on views, sections, and devices. Source: https://hush-gh.com/docs/limits ## Timing and limits | What | Limit | | --- | --- | | Poll for new notifications, when Hush is open or push is on | every 5 minutes | | Poll when idle (no open tab for 15 minutes, no push devices) | every 15 minutes | | First sync after sign-in | notifications from the last 14 days | | Inbox watcher (turn changes with no notification) | every 15 minutes | | Pull requests and Issues tabs | cached for 15 minutes; refresh any time | | Your teams | looked up again every 6 hours | | Polling stops with no visit for | 14 days (90 days with push devices); opening Hush starts it again | | A Done thread comes back when it needs you again, within | 7 days | | A snooze “until something happens” also ends after | 7 days | | Pushes per poll before they become one push (“5 things need you”) | 3 | | Alert history (the bell) | 30 days | | Done threads with no activity are forgotten after | 30 days | | Saved views | 12 | | Sections per tab (dash.pr, dash.issue) | 20 | | GitHub searches per tab | 40 | | Items per menu | 60 | | Keys per command | 4 | | Push devices | 10 | | Rule snooze (snoozeHours) | 1 to 720 hours | | Session | 7 days with no use, or 30 days after sign-in; then sign in again | Hush checks more often while you use it, because a check costs GitHub requests and Cloudflare requests for each user. When you open Hush after a pause, it checks again within a few seconds. ## What Hush sees Hush sees what GitHub puts in your notifications, and the facts of the pull requests and issues behind them. It does not read code. Some changes come with no notification (your own review, CI results, new commits after your review); the inbox watcher finds those within 15 minutes, and the dashboards on their next search. ## What Hush stores - **Your account**: your GitHub login, name, and avatar, and your token, encrypted. - **Your data**, in storage of its own for each user: your threads and their state, the facts of each PR and issue (CI, reviews, the newest comment), your settings, your alert history, your push devices, and your hidden and moved dashboard items. - **Sessions and feeds**: a hash of each sign-in session (with its browser and when it was last used), and a hash of each feed address. Hush keeps Done threads until they have had no activity for 30 days, and alerts for 30 days. **Delete account** (Settings → General → Account) deletes all of it at once. Nothing is shared with anyone, and Hush has no analytics. The browser keeps a copy of your lists, so that Hush opens at once. **Sign out** clears it. ## Open source Hush is open source: [github.com/ianmatson/hush](https://github.com/ianmatson/hush). It runs on Cloudflare Workers. --- # For agents > How an AI agent or a script can read these docs, write a user's settings.json, and check it before the user saves it. Source: https://hush-gh.com/docs/agents This page is for AI agents, scripts, and people who automate their setup. It says how to read the docs, and how to set up Hush for a user. ## Read the docs - [/llms.txt](https://hush-gh.com/llms.txt) lists every page, with its Markdown address. - [/llms-full.txt](https://hush-gh.com/llms-full.txt) has every page in one file. - Every page is Markdown at its address plus `.md`: [/docs/settings.md](https://hush-gh.com/docs/settings.md), [/docs/rules.md](https://hush-gh.com/docs/rules.md)… The docs home is [/docs/index.md](https://hush-gh.com/docs/index.md). The reference tables (settings, keys, query words, menu items) are made from Hush's own source code when the site is built, so they match the version that runs. ## What an agent can do Hush has no public API. Its API accepts only a signed-in browser session, and it may change at any time. So an agent sets Hush up **through the user**: 1. Write the user's settings as JSON (see below). 2. Give it to the user, who pastes it into **Settings → General → Edit settings.json** and chooses **Save**, or imports it as a file in **Settings → General → Settings file**. Hush checks the JSON and shows an error if something is wrong; nothing is saved then. Everything about sorting, pushes, views, sections, menus, and keys is in settings.json. The things that are not (appearance, push devices, feeds, a custom token) are listed in [settings.json](https://hush-gh.com/docs/settings#what-is-not-in-settings-json). ## Write settings.json - Write only what differs from the defaults. Leave out every setting that you do not change. - **Saving replaces all settings.** Ask the user for their current settings.json first (they can copy it from the page), and change that. A file without their rules deletes their rules. - `rules`, `views`, `dash.pr`, `dash.issue`, and the menus are lists: write the whole list. `dash` and `menus` are groups: write only the keys that you change. - Leave `"v"` in `menus` as it is. - Every key, type, default, and limit is in [settings.json](https://hush-gh.com/docs/settings). The conditions of rules and views are queries (text): every word is in the [query language](https://hush-gh.com/docs/query-language#words). To make a settings file to import, put the settings in this wrapper: ```json { "hush": 2, "exportedAt": "2026-09-28T09:00:00.000Z", "settings": { "botsAreFyi": true } } ``` ### Check it before the user saves it Check these, or Hush refuses the file: - Every rule has `when` (a query, as text; `""` matches every thread) and `then` with at least one of `category`, `push`, or `triage`. - `category` is `"action"`, `"fyi"`, or `"muted"`. `triage: "snooze"` has `snoozeHours`, a whole number from 1 to 720. - Queries (a rule's `when`, a view's `query`) use only the words and values of the [query language](https://hush-gh.com/docs/query-language#words), such as `needs:fix-ci`, `event:review-requested`, `type:pr`. Up to 300 characters. - View ids are 1 to 16 lower-case letters or digits, and unique; names are 1 to 40 characters; at most 12 views. - Section ids are 1 to 40 lower-case letters, digits, or dashes; queries are 1 to 256 characters; at most 20 sections for each tab. - Key names follow the [key format](https://hush-gh.com/docs/settings#keys); command ids are in the [keybinds table](https://hush-gh.com/docs/keybinds#all-shortcuts). - `quietHours.timeZone` is an IANA time zone, and `from` and `to` are minutes (0 to 1439) that differ. ## Recipes **“Only my repositories may need me.”** Rules have no “not”, so keep what needs you in your repositories with a first rule, and make everything else FYI with a wide rule after it: ```json settings { "rules": [ { "name": "My repos can need me", "when": "repo:acme/web,acme/api in:needs-you", "then": { "category": "action" } }, { "name": "Everything else is FYI", "when": "", "then": { "category": "fyi" } } ] } ``` A thread that needs you in acme/web or acme/api matches the first rule and stays in Needs you. Every other thread matches the second rule. A saved view per project is another way: it adds a tab and hides nothing. **“Push me only when someone reviews my PRs.”** ```json settings { "pushAction": false, "rules": [ { "name": "Reviews on my PRs", "when": "type:pr event:you-opened needs:changes,merge", "then": { "push": true } } ] } ``` **“Quiet at night and on weekends in Berlin.”** ```json settings { "quietHours": { "from": 1260, "to": 480, "weekends": true, "timeZone": "Europe/Berlin" } } ``` **“Done on D, Mute on Shift+D, and no key for Snooze.”** ```json settings { "keys": { "inbox.done": ["d"], "inbox.mute": ["Shift+d"], "inbox.snooze": [] } } ``` **“Show PRs in the acme org only, and skip the everyone team.”** ```json settings { "dash": { "scope": "org:acme archived:false", "excludedTeams": ["acme/everyone"] } } ``` ## Explain Hush to a user When a user asks why a thread is in Needs you, the answer is in [What needs you](https://hush-gh.com/docs/inbox#what-needs-you) and the [turn reasons](https://hush-gh.com/docs/pull-requests-and-issues#groups). The thread's row also says it: its summary (“CI failed on your PR”), and “rule: …” if a rule sorted it. --- # Troubleshooting > What to do when notifications are missing, pushes do not arrive, or Hush shows an error. Source: https://hush-gh.com/docs/troubleshooting ## An org or a repository is missing The org has probably not approved Hush. GitHub then hides the org completely. Check the list in **Settings → General → GitHub access**. If the org is not there, choose **Request approval**, and [use a custom token](https://hush-gh.com/docs/github-access#custom-token) until an owner approves Hush. If the org uses SAML single sign-on and the inbox says “GitHub hides notifications from N orgs”, sign in again and authorize Hush for those orgs. ## “Hush cannot read your notifications” The token no longer works: you revoked Hush on GitHub, the token expired, or a custom token was deleted. Choose **Sign in again**. With a custom token, replace it in **Settings → General → GitHub access**. ## A thread is in the wrong list - Look at the row: its summary says why Hush put it there, and “rule: …” names the rule that sorted it. - Check your [rules](https://hush-gh.com/docs/rules): the first rule that matches wins, so a wide rule at the top catches more than you expect. - Bots' activity is FYI by default ([`botsAreFyi`](https://hush-gh.com/docs/settings#botsarefyi)), and so are team review requests ([`teamReviewsAreAction`](https://hush-gh.com/docs/settings#teamreviewsareaction)). - Press `R` to check GitHub again now. ## A thread did not leave Needs you Hush sees your own review, reply, or push within 15 minutes, because GitHub sends no notification for them. Press `R` to check at once, or choose **Done**. ## Pushes do not arrive 1. In **Settings → Notifications**, check that this device says “Receives push notifications.”, and choose **Send test**. 2. Check that your system allows notifications from the browser, and that focus modes or Do Not Disturb are off. 3. Check [quiet hours](https://hush-gh.com/docs/notifications#quiet-hours), and that the thread is one that gets pushed: by default only Needs you. A rule with `"push": false` stops pushes too. 4. On iPhone and iPad, push works only when Hush is on the Home Screen. 5. Turn push off and on again for the device. Pushes can come a few minutes after the event: Hush checks GitHub every 5 minutes while push is on. ## The Pull requests or Issues tab is empty or incomplete - The sections are GitHub searches. Choose the link button next to a section in **Settings → PRs & issues** to try its search on GitHub. - Check the **Scope**: it is added to every search. - `@team` sections need your teams. If **Teams** says “GitHub reports no teams for you”, the token needs `read:org`, and SAML orgs must authorize it. Choose **Look up teams again** after you join a team. - Hidden items: press `H` to show them. - Drafts that others opened and PRs that bots opened are hidden by default: see [`dash.hideOthersDrafts`](https://hush-gh.com/docs/settings#dash-hideothersdrafts) and [`dash.hideBots`](https://hush-gh.com/docs/settings#dash-hidebots). ## settings.json does not save Hush shows the first error under the box, and saves nothing until the file is valid. The error names the setting, for example `"quietHours.timeZone is not a known time zone."`. The type and the allowed values of each setting are in [settings.json](https://hush-gh.com/docs/settings#every-setting). ## An action in the peek is not there Hush shows only the actions that you can do now. Look in **More**: a blocked action is there with the reason, such as “It has merge conflicts.” or “You cannot merge in this repository.” See [Actions on GitHub](https://hush-gh.com/docs/peek#actions-on-github). ## Still stuck Open an issue on [GitHub](https://github.com/ianmatson/hush/issues), with what you did, what you expected, and what Hush showed. --- # Pricing > What Hush costs, and what the money pays for. Source: https://hush-gh.com/pricing Hush is free while it is in beta. Paid plans are not open yet. - **Monthly:** $3 a month. Stop at any time. - **Yearly:** $30 a year. Two months free: $2.50 a month. Every plan has all of Hush: - Your inbox, sorted into Needs you and FYI - Pull requests and issues by whose turn it is - Push on every device, with quiet hours - Rules, saved views, and feeds - Approve, comment, and merge from Hush - Every setting in one settings.json The price pays for your share of the servers, card fees, and the upkeep of Hush. Hush has no ads, and it does not sell data. It is open source, so you can also run your own copy for free. --- # Privacy > What Hush stores about you, where it keeps it, who else sees it, and how to delete all of it. Source: https://hush-gh.com/privacy Hush is a small open-source app. It reads your GitHub notifications so that it can sort them for you, and that is all it uses your data for. It has no ads and no analytics, and it does not sell or share your data. Everything below is also in [the source code](https://github.com/ianmatson/hush). _Last updated: 28 September 2026._ ## The short version - Hush stores only what it needs to sort your notifications and show your lists. - Your GitHub token is encrypted. It never goes to your browser. - Nobody else gets your data, except the services that Hush runs on (below). - **Delete account** deletes all of it at once. ## What Hush stores **Your account:** - Your GitHub user id, login, name, and avatar address. Hush does not ask for your email address. - Your GitHub token, encrypted, and its scopes. If you add a [custom token](https://hush-gh.com/docs/github-access#custom-token), that one too. - Your [settings](https://hush-gh.com/docs/settings). **What it needs to sort your notifications:** - Your notification threads: the repository, the title, the link, why GitHub notified you, read or unread, and what you did with it (Done, Snoozed, Muted). - For each pull request and issue behind them: its state, author, labels, CI result, reviews and review requests, size, and the newest comment (its author, time, and text). - The results of your Pull requests and Issues searches, and the items that you hid or moved there. - Your teams (their names), for team review requests. Hush does not read code. The [peek](https://hush-gh.com/docs/peek) shows a PR's description and comments when you open it; Hush gets them from GitHub at that moment and does not keep them. **For push and feeds:** - Your alert history: the title and text of each push, for 30 days. - Each device that gets push: the address that its browser's push service gave it, its encryption keys, and a label such as “Chrome on macOS”. - A hash of the secret address of each [feed](https://hush-gh.com/docs/feeds) that you made, not the address itself. **To keep you signed in:** a hash of your session id, when the session started and was last used, and a label for its browser, such as “Chrome on macOS”. The session id itself is only in your browser's cookie. ## Where it is kept Hush runs on [Cloudflare](https://www.cloudflare.com) Workers. Your notifications, lists, settings, alerts, and devices are in a database of their own for your account (a Cloudflare Durable Object). Your account, sessions, and feeds are in one shared database (Cloudflare D1). ## Who else sees it - **GitHub**, where your data comes from. Hush sends GitHub only the requests that it needs, with your token. The app shows avatars and the images in comments from GitHub's own servers, so GitHub also sees those requests from your browser. - **Cloudflare**, which runs Hush and stores its data. Cloudflare also keeps request logs (addresses, status codes, and errors) for a few days, which Hush uses to find bugs. - **Your browser's push service** (Apple, Google, Mozilla, or Microsoft) carries each push to your device. The message is encrypted for your device, so the push service cannot read it; it sees only that a message went to it. That is all. There are no analytics, tracking, or advertising services, and no third-party scripts on the site or in the app. ## Your browser - One cookie: your session. It is `HttpOnly` and `Secure`. It ends after 7 days with no use, or 30 days after sign-in. - Local storage: a copy of your lists (so that Hush opens at once), and the choices that are for this browser only: theme and mode, start page, tab counts, and notes that you chose not to see again. **Sign out** clears the copy of your lists. ## How long it is kept - Done threads with no activity for 30 days, and the PR and issue facts that nothing uses for 30 days, are deleted by themselves. - Alerts are deleted after 30 days. - Everything else is kept until you delete your account. If you stop using Hush, it stops checking GitHub after 14 days (90 with push on), but it keeps your data until you delete it. ## Your choices - **Delete account** in **Settings → General → Account** deletes everything above at once. It does not change anything on GitHub. - To take back Hush's access to GitHub too, revoke Hush on GitHub: **Settings → Applications → Authorized OAuth Apps**. - **Export** in **Settings → General → Settings file** gives you your settings as a file. - Turn off push for a device, or turn off a feed, at any time. ## Changes When this page changes, the date at the top changes, and the change is in the [page's history](https://github.com/ianmatson/hush/commits/main/src/lib/about/pages/privacy.md). ## Questions Open an issue on [GitHub](https://github.com/ianmatson/hush/issues). --- # Security > For you and your org's owners, what Hush can do with GitHub access, how it keeps your token safe, and how to report a problem. Source: https://hush-gh.com/security Hush needs access to your GitHub notifications and repositories. This page says what it does with that access, and how it protects it. If you own a GitHub org and a member asks you to approve Hush, start with [For org owners](#for-org-owners). ## What Hush can do on GitHub Hush signs you in with a GitHub OAuth app, with the scopes `notifications`, `repo`, and `read:org`. GitHub's Notifications API accepts only these classic scopes, so Hush cannot ask for less. - **Hush reads** your notifications, the pull requests and issues behind them, the results of your saved searches, and your teams. - **Hush writes only when you do it.** Each write is one choice that you make in Hush: Done, Mute, or Read on a notification; or approve, request changes, comment, merge, auto-merge, re-run failed jobs, close, or reopen in the [peek](https://hush-gh.com/docs/peek). A thread that you read in the peek is marked as read on GitHub; you can [turn this off](https://hush-gh.com/docs/settings#peekmarksread). - Hush never writes by itself: no rule, schedule, or background job changes anything on GitHub. - Hush does not read code, change repositories or settings, or use admin rights. ## For org owners Your org may allow only the OAuth apps that an owner approved. Until you approve Hush, GitHub hides your org's private repositories and notifications from Hush. When you approve Hush, each member who signs in to Hush can use it with their own access, and no more: Hush sees what that member sees, and it acts as that member, only when they choose an action. Approval gives Hush no access of its own to your org. You can deny or revoke the approval at any time in your org's settings, under **Third-party access → OAuth app policy**. Members can revoke Hush for themselves in their own GitHub settings. ## How Hush protects your access - **Your token is encrypted** with AES-256-GCM before Hush stores it. The key is a secret of the server, not in the database. Each encrypted token is bound to your account, so it cannot be moved to another account and used there. Hush decrypts the token only on the server, to call GitHub, and never sends it to your browser. - **Sessions:** your browser keeps a random 256-bit session id in an `HttpOnly`, `Secure`, `SameSite=Lax` cookie. The server stores only its SHA-256 hash. A session ends after 7 days with no use, 30 days after sign-in, or when you sign out. **Settings → General → Signed in** lists every browser where you are signed in, with **Sign out everywhere else**. When GitHub stops accepting your token (you revoked Hush, for example), Hush signs you out everywhere. - **Sign-in** uses a random `state` value, so that another site cannot finish a sign-in for you. - **Requests that change things** must come from Hush's own address; others are refused. - **Your data is separate:** each account has a database of its own (a Cloudflare Durable Object). - **Feeds** have a random secret address of 192 bits. Hush stores only its hash, so it shows the address only once, when it makes it. A new address, or turning the feed off, makes the old address stop working at once. - **Push messages** are encrypted for your device (Web Push, with VAPID keys), so the push services that carry them cannot read them. - **Limits** on the number of requests protect sign-in, feeds, and the API against floods. - **The app and the public site** send a strict Content Security Policy: they run only their own scripts, connect only to their own server, and cannot be put in a frame on another site. The public site is static HTML. ## Open source All of Hush is at [github.com/ianmatson/hush](https://github.com/ianmatson/hush): the app, the server, and this site. What runs is the `main` branch. You can read what Hush does with your token, or run your own copy on your own Cloudflare account (see the README). ## Report a problem If you find a security problem, please do not describe it in a public issue. [Report it privately on GitHub](https://github.com/ianmatson/hush/security/advisories/new): only the maintainer can see the report. Thank you.