Changelog
Every change to narada, newest first. Releases are git tags (all tags, GitHub releases); the source of this page is CHANGELOG.md.
v0.5.12026-11-02release ↗
- Tag people on WhatsApp: an
@followed by a phone number with its country code (@919820147460) in a WhatsApp message you or an agent send is now a real tag, so that person gets a mention notification in the group. Before, it went as plain text. - Tables with long cells show as tables: a table with a header row (like a daily status report's Time | Tasks) is drawn as a grid even when its cells hold whole sentences; they wrap inside their column, with a rule between rows. Before, such a table was taken for page layout and came out as loose lines, and a long cell in a drawn table was cut off with "…".
v0.5.02026-11-02release ↗
- Renamed from sandesh to narada (नारद, the divine messenger who carries word between worlds). The command is
narada, the repository github.com/Theyashsawarkar/narada (the old address redirects), the MCP servernarada, the servicenarada.service. The first run moves your folders (mail cache, WhatsApp link, settings) and keyring sign-ins to the new name, so nothing needs linking or signing in again;kosha updatemoves the install. - Quiet by default: no desktop notification for new mail, chat or WhatsApp (
notify = truebrings them back). The tmux capsule still shows what came; a send an agent asks for still shows its undo notification.
v0.4.32026-11-02release ↗
- Quieter: bubbles and the picked list row lose their colour fill: just a rounded outline, plain text, and the time dim inside the bubble.
v0.4.22026-11-02release ↗
- Really rounded: bubbles and the picked list row get rounded borders (╭ ╮ ╰ ╯) in their colour; the half-block corners of v0.4.1 were too small to read as round.
v0.4.12026-11-02release ↗
- Fixed: sending files on WhatsApp:
Usaid "files isn't on WhatsApp yet" (a leftover guard); it sends now, andv/Vopen and save WhatsApp files. The key bar showsU send a file. - Rounded: one-line messages are pills, longer ones rounded blocks; the picked list row is rounded too, and keeps its colours (name capsules showed as dark blobs on it).
- Switching places:
Shift+Tabgoes back (Mail ← Chat ← WhatsApp),Alt+m/Alt+c/Alt+wgo straight to one. - Picking several, marking all read:
xpicks chats too,Ctrl+xpicks the whole list (again clears),m/Mact on what's picked, andAlt+rmarks everything in the list read.
v0.4.02026-11-02release ↗
- Filled bubbles: chat and WhatsApp messages are filled blocks, yours in the accent colour, with the time and ticks inside; one name per run.
- One panel for the lists: mail, chat and WhatsApp rows divided by hairlines, the picked one filled in the tab's colour (
list_style, replacingchat_list;chat_list = "cards"still works). - Mail threads fold: read messages to one line, a long run to one line in all.
- One frame for the message box: the reply and the files go inside it.
- A clearer approval: "Claude Code wants to send a mail to …", the reason as a badge, the agent's own
why(new onmail_send,chat_sendandwhatsapp_send) andy send in 10s.
v0.3.02026-11-02release ↗
- Screenshots in the README and on the website (from
sandesh demo). - Ticks: ✓ sent, ✓✓ delivered and blue ✓✓ read beside your WhatsApp messages, from the phone's receipts and its history.
- Paste a screenshot:
Ctrl+vwhile typing attaches a copied image; files about to go show as small previews above the box. - Pictures full size:
Space(orEnter) on a picked photo or GIF fills the screen;h/lgo through the chat's pictures. - Compact chat list: two rows per chat instead of a box, so about twice as many fit;
chat_list = "cards"brings the boxes back. - The undo window where you look: a message counting down to send, or waiting for approval, shows under the conversation;
zcancels the open chat's own first. - Clearer: the unread count sits on Unread, not All; the list title says "chats"; a one-to-one chat shows the number, not "You, Amma · 2 people"; the hint under the message box, which repeated the key bar, is gone.
- Photos, GIFs and files on WhatsApp: they show in the conversation (on kitty as real pictures, in tmux popups too, and GIFs play; elsewhere as coloured blocks; the
imagesoption chooses), andCtrl+owhile typing orUsends them, with the text as the first file's caption. - Link WhatsApp from its tab:
Lshows the QR code,Pa phone code, and a bar follows the sync, with no separate terminal. send_policy = "trust"andask_first: agents send without asking unless you told them to ask, after an undo window with a notification that can cancel it (ADR 6). The approval screen is redesigned.- The chat box grows: long messages wrap and the box gets taller, and Enter sends and keeps you typing. The active tab is a filled pill in its own colour.
- Fixed: WhatsApp names and mentions showing as numbers;
@and the AI keys not findingclaudeorsandeshfrom a tmux popup.
- WhatsApp:
sandesh whatsapp linklinks your WhatsApp as a device (QR code, or--phonefor a code to type on the phone), and its chats become a third tab (Tab: Mail → Chat → WhatsApp) with unread counts insandesh statusand the tmux segment, notifications, read receipts and quoted replies.sandesh whatsapp list|read|send|unlinkon the command line,whatsapp_chats,whatsapp_readandwhatsapp_sendfor agents. Every send goes through the outbox; an agent's always waits for you, and WhatsApp sends are capped atwhatsapp_per_hour(30). Without linking,whatsapp sendopens WhatsApp's click-to-chat page with the text typed in instead. Linking isn't allowed by WhatsApp's terms (see the README's WhatsApp section and ADR 5).
- HTML mail, for tables and the like:
mail_sendandmail_drafttake an optionalhtml(andsandesh mail sendan--html FILE). It goes out beside the plain text asmultipart/alternative, so mail apps show the HTML and the plain text is still there for those that don't; a reply quotes the thread in the HTML too. Plain text alone can't make a table Gmail shows as one.
v0.2.02026-10-28release ↗
--tab chat:sandesh --tab chat(andsandesh --popup --tab chat) opens the screen on the chat tab, so a status bar's chat count can open chat and its mail count mail.
vopens files: an attachment or chat file opens in the app your desktop uses for it (kept in ~/Downloads/sandesh);Vonly saves.
- Take a reaction back: in the reaction window (
e), the ones you added are marked ✓, and picking one removes it.
- Jump to the original: Enter on a picked reply jumps to the message it quotes, loading earlier messages until it's there; Enter again follows the chain further back, Backspace retraces it.
- Chat, redone as bubbles (option A from the mockup): theirs left, yours right; quotes, files and numbered links inside the bubble; reactions underneath; "(edited)"; a red "new" line where unread starts (the chat opens there); who's in the chat on top.
- Chat list in groups: pinned (
p), today, earlier;@Nbadges for unread mentions of you. - More on a picked message:
ereacts (an emoji window),Eedits yours,d ddeletes yours;kpast the first message loads 50 earlier ones. [/]move between chats without leaving the conversation;Ctrl+kopens the chat switcher;Ctrl+oadds files to the message you're typing.
- Reply to a specific chat message: Enter (or 2) on a chat lets j/k pick messages;
rreplies to the picked one, quoting it like Google Chat (quotedMessageMetadata), with "↩ replying to …" over the message box; from the listranswers the latest message from someone else.ycopies andvsaves the picked message. - Quoted replies show: a message that quotes another shows it above (
❝ You: …); recent chats are fetched again once to fill this in. - No more "reply in a thread" labels: Google reports every space as threaded, and replies show inline as quotes, as in the browser.
- Name a group: starting a chat with two or more people asks for a name (named: a space; unnamed: a group chat), and
nnames an existing group chat on Google Chat (it becomes a space, same people and messages). - Sign in again without leaving: when Google wants the newer permission (starting chats, naming groups), the window says so and Enter signs in again in the browser, then carries on with what you were doing.
- Start a conversation (
Nin chat): pick people (from chat, mail contacts and the Workspace directory); sandesh opens the DM you already have with them (found on Google, earlier messages fetched) or starts one, a group chat for several, and puts you in the message box. - Chat search finds people and conversations: CONVERSATIONS, PEOPLE and MESSAGES groups; Enter on a person opens (or starts) your chat with them.
- MCP
chat_sendtakesto(email addresses) instead of a space.
- Scheduled tabs: scheduled mail has its own Scheduled section next to Sent, and scheduled chat messages a Scheduled tab in chat, soonest first with their time and counts on the tabs (
tmoves, Enter edits,zcancels). Sent goes back to mail that went (and what's sending or failed).
- Send later:
Ctrl+tin a mail,ton review,Ctrl+twhile typing a chat message: pick a time or type it ("tomorrow 9am", "fri 6pm", "in 2h", "3 nov 10:30"). Scheduled sends wait in the outbox and the background service sends them on time (on its own loop now, so a slow sync never delays one); a send that goes out late because the computer was off says so. They're listed on top of Sent (tmoves, Enter edits,zcancels). CLI--atandoutbox reschedule; MCPsend_at.
- Search no longer freezes the screen: a one-letter search took ~5 s on a real mailbox (the full-text index was queried once per thread); it is now one lookup (~20-50 ms), and it runs in the background after a short pause in typing, with stale answers dropped and Gmail's search cancelled when you type on. Previews are drawn in the background, once.
- Search where you are: a mail section searches that section (Today, Sent, Inbox...), a chat space searches that space; Tab widens to all mail or every chat. Opening a chat result scrolls to the message and marks it.
?is a window: every key, grouped in columns in the middle of the screen, with a filter as you type.- A file picker of its own (replacing fzf): a window over the screen with fuzzy matching and a preview of the highlighted file (text, image size or the picture itself with chafa, a PDF's first page with pdftotext); Tab picks several; Ctrl+r switches folder, Ctrl+h hidden.
- Rename a chat (
n): spaces on Google Chat (newchat.spacespermission; sign in again once), DMs and unnamed groups by a name kept on this machine. - The popup is bigger by default (96% × 94%).
- Round ends on every filled label: @mentions in chat, the active tab, the mode label, key hints, the send button and the approval banner use Nerd Font half circles like the avatars (
nerd_font = falsekeeps square).
- A search window:
/(ors) opens a floating search over the screen. Mail and chat from this machine show as you type, matches highlighted, with a preview of the highlighted result; when typing pauses, Gmail's own search adds what isn't here yet (☁). Gmail search syntax works. Replaces the old local filter and separate server search. - Older mail on demand: no background download by default any more (
keep = "none"; it competed with searches for Gmail's rate limit).jat the end of a list loads the next 10 older threads of that section;+/-change the batch (10, 25, 50, 100),older_pagethe default. - Search results survive a refresh: they're kept like a section.
- Rounded everywhere, round avatars: the selected card keeps rounded corners (heavier sides mark it), mail tables have rounded corners, and initials sit in round pills (Nerd Font half circles;
nerd_font = falsefor plain ones).
- Compose, redone (from the approved mockup): a new mail gets the whole screen; a reply keeps the original on the left (PgUp/PgDn). Recipients are pills with initials (←/→ selects, Backspace removes); someone you've never written to is marked first time. Suggestions highlight the typed letters and say why they're there (
wrote 4× · 2d ago,wrote you 9×,directory). Cc/Bcc hidden untilCtrl+b. Your Gmail signature is fetched and added (Ctrl+gtoggles). Drafts are saved on disk every few seconds and reopened by the same key. A status line with recipients, files, words and buttons;Ctrl+fswitches the sending account. Tab now adds a typed contact and moves on. - A Sent section: who you wrote to, and whether they answered (
↩ Priya replied 09:58,no reply yet · 2d); mail in the outbox (sending, waiting for approval, failed) on top,zcancels,Rretries a failed send. - All your mail, not just 30 days: after the first sync, older mail is downloaded in the background (~150 threads a minute, newest first) until the mailbox is complete, with a progress bar in the top bar.
keeplimits it ("1y","6m","none").
- A compose screen:
c,r,a,fandDopen a form in the right panel instead of a bare file in the editor: From, To, Cc, Bcc as chips, Subject, Files and the body, with a reply's quote folded underneath. Recipients autocomplete from your contacts (ranked by how often you write to them) and from your Google Workspace directory (People API).Ctrl+ssends,Ctrl+dsaves a draft,Ctrl+oattaches,Ctrl+estill takes the whole mail to your editor and back;compose = "editor"keeps the old way. An agent's message is edited here too.
- Syncs ~10× cheaper: a sync with nothing new went from 23 Google calls (12.6 s) to 2 (1.1 s) on a real account. Lookups that fail (a DM's title, a person's name) are remembered and retried every 6 hours instead of on every sync; changed spaces are fetched four at a time; cached spaces are read in one query. The background service has a soft 128 MB memory cap.
- Chat read state follows the browser: a space read on the web or phone turns read here too, without waiting for a new message.
Mon a space is Chat's own "mark as unread" (it stays unread after a sync, and marks the latest message from someone else, even when you wrote last). - Forwarding keeps attachments: they're listed as
Attach: original: …in the editor (delete to drop) and fetched from Gmail when sent. - File picker (
+,U) starts in the folder you're in; the review screen shows each file's name, size and folder, and says when one is missing. - Fixes:
Wno longer glues the name onto the search (an empty name keeps the search);mail archiveand friends say what they did; the outbox names files;sandesh mcpexits quietly when its client closes it; the setup screen's border no longer shifts on the title line. SANDESH_DEBUG_HTTP=1logs every Google request with its time.
- Compose works without $EDITOR: with no editor set, sandesh used
vi, which many systems don't have, soc,rand friends failed at once. It now picks the first installed of nvim, vim, vi, helix, micro, nano, kak and emacs, and says which editor failed and how to set one.
- Chat sends instantly: chat messages skip the 10-second undo window (
chat_undo_seconds, default 0; mail keepsundo_seconds), appear in the conversation as soon as Chat accepts them, and sending always jumps to the end of the chat.
- The tmux popup runs the current sandesh: tmux's environment often lacks
~/.local/bin, so the plugin fell back to a copy built once in its own folder and kept running it after updates. It now looks in~/.local/binand~/go/bintoo, and rebuilds its own copy whenever the code is newer. - New chat messages show up: a conversation scrolled to the bottom stays at the bottom when messages arrive, like a chat app; before, they landed below the visible part. The space list says "You:" for your own last message.
- Files, both ways:
vsaves a mail's attachments or a chat's files to~/Downloads/sandesh(an fzf picker when there are several),Vsaves and opens them. Send files withAttach:in the mail editor,+on the review screen, orUin a chat space;--attachonmail sendandchat send;mail save/chat savedownload from the shell. Big mails (over 4 MB) go through Gmail's upload endpoint. Files are copied privately when queued, so what you reviewed is what is sent. - Agents and files:
mail_send,mail_draftandchat_sendtakeattachments; such sends always ask for approval, which lists each file. Newattachment_savetool, confined to the downloads folder. - Other people's chat messages get a solid bar in their colour.
- Follows the desktop theme live: colours come from varna's
palette.json(sandesh's own pick undertools.sandeshif the theme has one) and change on the running screen when the theme changes;[colors]in the config still win.SANDESH_NO_VARNA=1turns it off. - Cleaner borders: panels and frames use the
bordercolour instead of one almost the same as the background; the selected card is a heavy accent frame instead of a background fill, which looked muddy on translucent terminals. - No red error when Chat has no app configured: marking a space read works on this machine, and a quiet line says what to set up; messages that were cached empty are fetched again.
- Syncs in the background, not when you open it: the screen shows the local copy at once and leaves syncing to the background service (setup now installs it); it syncs by itself only when the service isn't running. After a send, an archive or another change it syncs again shortly so the copy matches Google. Only one process syncs an account at a time.
- Never hits Gmail's rate limit: requests are paced (40 quota units a second), Google's "slow down" answers are retried with backoff, and a first sync cut short resumes instead of starting over. The first sync takes the newest 150 threads (
max_threads); older mail comes through search. - Real names in chat: names come from Chat's own messages, sandesh finds which member is you from your DMs (no People API needed), DMs are named after the other person and groups "Naeem, Rahul, Rugved +2"; placeholder "user 1234" names are no longer stored.
- Chat is compact: one name line per group, a coloured bar per message, no boxes; messages that are only an attachment or a card say so.
- Errors get their own line (Esc hides it) instead of covering the keys, and the common Google errors say what to do. Card borders are brighter (new
bordercolour).
- A new look: the mail list is one bordered card per thread with gaps between them; the thread view puts each message in its own card with a From / To / Date header and renders HTML mail as terminal formatting (headings, bold, lists, tables, buttons, numbered links), folding older messages and quoted replies (
E,Q,oopens a link). Chat reads like a conversation: grouped by sender, yours on the right, day separators, thread replies and mentions marked;itypes a message in place. mmarks read andMmarks unread (no more toggle), for the thread or every selected one, in mail and chat.- Setup asks for the client file's path (with completion) instead of looking in Downloads, copies it into its config, and shows the three steps with a progress bar for the first sync.
- Chat works without the People API: names fall back to "user 1234" instead of the whole chat sync failing.
- The local copy keeps each message's HTML; existing copies refetch once.
- Setup screen: opening sandesh (or
prefix e) with no credentials no longer stops with an error. It says what's missing and takes it right there: the client file found in~/Downloads, a path or pasted JSON, or a typed client ID and secret; then the Google sign-in in your browser (work account or personal Gmail) and the first sync, straight into the inbox.dtries the demo instead.
v0.1.02026-10-26release ↗
First release.
- The screen: Gmail and Google Chat in one keyboard-driven terminal UI, laid out like sangam: sections on top (Inbox, Today, Unread, Starred, saved Gmail searches; All, Unread, DMs, Spaces for chat), the list on the left, the thread or space on the right. Vim keys,
?for all of them. - Write in your editor: compose, reply, reply all, forward and chat messages open
$EDITOR; a review step shows exactly what goes out, thenysends,dsaves a Gmail draft. - Undo:
zundoes archive, trash, read and star, and cancels a send in its 10-second undo window. - Background sync (
sandesh service install): Gmail's change feed and Chat's active spaces into a local SQLite copy with full-text search; desktop notifications for new inbox mail, DMs and mentions. - MCP server (
sandesh mcp) with 11 tools for Claude Code and other agents. Agents' sends wait for your approval in a tmux popup,Ain the screen orsandesh approve; mail content reaches them marked untrusted;send_policysets how much they may send alone. - Claude keys in the screen:
@ask,Ssummarise,Ddraft a reply,Ttoday's digest, throughclaude -p. - Command line for everything, with
--json:mail,chat,status,sync,outbox,approve,auth,doctor,demo. - tmux plugin:
prefix epopup and#{sandesh_status}for the status line.