diff --git a/client/components/Windows/Help.vue b/client/components/Windows/Help.vue
index 2ee7ea3e..d0715a2e 100644
--- a/client/components/Windows/Help.vue
+++ b/client/components/Windows/Help.vue
@@ -179,6 +179,26 @@
+
Alt A
diff --git a/client/js/keybinds.ts b/client/js/keybinds.ts
index 88ec48f7..079f293e 100644
--- a/client/js/keybinds.ts
+++ b/client/js/keybinds.ts
@@ -83,6 +83,35 @@ Mousetrap.bind(["alt+shift+up", "alt+shift+down"], function (e, keys) {
return false;
});
+// Switch to the next/previous unread chat
+Mousetrap.bind(["alt+mod+up", "alt+mod+down"], function (e, keys) {
+ if (isIgnoredKeybind(e)) {
+ return true;
+ }
+
+ const channels = store.state.networks
+ .map((net) =>
+ net.channels.filter(
+ (chan) => chan.unread || chan === store.state.activeChannel?.channel
+ )
+ )
+ .flat();
+
+ if (channels.length === 0) {
+ return;
+ }
+
+ let index = channels.findIndex((chan) => chan === store.state.activeChannel?.channel);
+
+ const length = channels.length;
+ const direction = keys.split("+").pop() === "up" ? -1 : 1;
+ index = (((index + direction) % length) + length) % length;
+
+ jumpToChannel(channels[index]);
+
+ return false;
+});
+
// Jump to the first window with a highlight in it, or the first with unread
// activity if there are none with highlights.
Mousetrap.bind(["alt+a"], function (e) {