I recently opened WhatsApp Web and counted: 52 conversations where someone was waiting on a reply from me, scattered through hundreds of group chats and notification threads.
The native filter strip (All / Unread / Favorites / Groups) does not have a “to reply” view. Unread only catches genuinely unread messages, not the ones I opened at 11pm and forgot to answer. So I wrote a small Chrome extension, around 250 lines of JavaScript and no dependencies, to surface that missing view.

The idea
Each row in the sidebar shows a preview of the latest message. When I am the one who sent it, the preview includes a small icon (the familiar sent / delivered / read checkmark). When the other person sent it, no icon is rendered. So the heuristic is straightforward: icon present = answered, icon absent = unanswered.
function classifyRow(row) {
const sentByMe = row.querySelector(SENT_ICONS);
if (sentByMe || otherPersonReacted(row)) {
row.classList.add('wa-answered');
return true;
}
row.classList.add('wa-unanswered');
return false;
}A MutationObserver scoped to #pane-side watches the sidebar and applies the class as conversations move. A CSS rule controlled by a toggle button hides the answered ones.
The reaction edge case
The naive version got one thing wrong. When someone reacts to one of my messages with an emoji, the preview becomes a notification line:
Margaux a réagi par 😂 à : “Sur ceux qui ont testé…”
There is no checkmark on that line, even though the last sent message was mine. The fix is to detect those reaction phrases per language and treat them as answered:
const REACTION_PATTERNS = [
/\ba réagi par\b.{1,30}\bà\b/i, // FR
/\breacted\b.{1,30}\bto\b/i, // EN
/\breagiert\b/i, // DE
/\breaccionó\b/i, // ES
/\breagito\b/i, // IT
/\breagiu\b/i, // PT
/\bgereageerd\b/i, // NL
];The regex is applied to span[title] and span[dir] elements only, otherwise a contact whose name contains “réagi” would also trigger a match.
