BetterSSC v0.2: a Discord-style client for Substack Chat
Send, react, reply, search, follow specific people, keyboard-driven. Runs entirely in your browser. No backend, no tracking, no data leaves your computer.
Substack Chat is where a lot of really good traders and writers share their thinking in real time. The native interface gets in the way: search rarely finds what you want, you can’t focus on three specific people in a busy chat of two hundred, notifications barely exist, and threads of ten replies show up as a flat wall of text.
BetterSSC is a Chrome extension that paints a Discord-style layout on top of Substack Chat. Same account, same chats, same messages — just a real client.
v0.2 is the first release where you can use it for everything, not just reading.
Send, react, reply
Send messages with optimistic UI — your message lands in the stream the instant you hit send, before the network round-trips.
React with any emoji from Substack’s full library. The picker hides duplicate glyphs so you don’t see
thumbs_upand+1as two separate 👍 buttons.Reply with a quoted block of the parent message. Click the quote to jump to the original and watch it flash.
@mention autocomplete pulls from people you’ve actually seen in this chat, ranked by recency.
Failed sends keep your text and show a Retry button instead of making you re-type.
Read the chat
Two-pane Discord layout. Messages center, member rail right, composer bottom.
Real emoji. No more
:flexed_biceps:rendering as literal text.Quoted replies are clickable accent cards. Click to jump + flash the original.
Inline images with lightbox. Click any image for full-screen, Esc to close.
Light and dark themes, one-click toggle, remembered across reloads.
Avatars heal. Failed CDN URLs retry after 60 seconds instead of leaving the face blank for your whole session.
Substack-palette default avatars — eight warm colors keyed off user id, so the same person always gets the same color.
Find anything
Full-text search across every loaded message. Type in the box, the feed filters live. Filter results jump to the most recent match, not the oldest — when you type @boz, you want the latest message, not one from two months ago.
Slash commands (leading / is optional):
/from:<name>show one person’s messages/meyour own messages/has:linkor/has:linksor/has:url(s)/has:imageor/has:imagesor/has:img(s)or/has:pic(s)or/has:picture(s)/has:reaction(s)or/has:emoji(s)/since:3last 3 days/since:2026-06-01on or after a date/helpreference
Enter blurs the search box back to the feed, so j/k vi nav works immediately without a mouse trip. 💬 thread badge on any message with replies focuses the stream on that conversation; Esc clears.
Follow specific people
📌 Pin anyone to the top of the member rail.
🔔 Bell each name to get desktop notifications when they post, even while BetterSSC is in another tab.
You’re auto-pinned at position 0, always, with the bell on by default. Your own row sits at the top regardless of sort. If you sent a message from your phone while at your desk, you’ll know.
Sort the rail by most-active (default) or alphabetically.
Notifications
Desktop banners for @mentions and watched users (the latter only while BetterSSC is hidden, so you don’t spam yourself).
“Notify on every new message” toggle in the header for full-attention mode.
Tab title unread count while you’re away:
(3) BetterSSC.Auto mark-viewed every 30 seconds so native Substack stays in sync.
Keyboard
KeyActionj / kNext / previous messageg / Shift+GTop / bottomCtrl+U / Ctrl+DHalf-page up / downn / Shift+NCycle search hits/Focus searchEnter (in search)Apply + return to feedEscClear search / close overlayrRefresh?Help overlay
Live updates
Polling every 12 seconds, same cadence Substack’s native client uses. WebSocket support is on the roadmap — the handshake works but Substack’s protocol returns “Invalid message” after auth and I haven’t decoded it yet. Polling handles things in the meantime.
Privacy
Everything stays on your computer.
There is no BetterSSC server. There is no BetterSSC database. There is no backend at all.
Every network call goes directly from your browser to
substack.comusing the session you already have.Nothing about your messages, identity, reactions, or settings ever gets sent to me, to a third party, or to anyone else. I cannot see what you read. I cannot see what you write. Nobody can.
No analytics. No telemetry. No third-party scripts. None.
Source is ~3000 lines of vanilla JavaScript in the repo. No build step, no minification. Read it, audit it, fork it.
Install
Three minutes, one-time. Step-by-step in the README. Download the ZIP, enable Developer Mode in chrome://extensions, click Load unpacked, pick the folder. Done. Keep one Substack tab open while you use it — that’s how the extension stays authenticated.
Known issues
Honest list. Full version in the README.
Reply quotes are local-only on the wire. Your reply shows the quoted block in BetterSSC, but on your phone in native Substack it looks like a standalone message. Fix needs a wire capture of the native reply flow.
Image upload isn’t built. Receive works fine; send doesn’t. Use native Substack to upload images for now.
macOS Tahoe 26.3 silently drops some notification banners. Chrome reports
grantedbut the OS doesn’t render. Not a BetterSSC bug.
What’s next
v0.3 Multi-chat. A left rail spanning every chat you’re in. Cmd-K quick switcher. Unread badges per chat.
v0.4 Direct messages, image upload, edit and delete your own messages.
Feedback shapes the roadmap. Open an issue.
Built by Inder Sabharwal. MIT licensed. Not affiliated with Substack.
