narada नारद
mail & chat

narada

नारद · “the divine messenger”

Gmail and Google Chat without leaving the terminal, with an agent that can read, draft and send for you.

v0.5.1 latest9 releases6 decisions recordedMIT license

narada's mail tab: the inbox as cards on the left, the open thread on the right with its formatting, a table and numbered links

Narada (नारद) is Sanskrit for "message": the thing carried from one person to another, whichever road it took.

Checking mail and Google Chat usually means a browser tab: a context switch, a mouse, and a page that pulls you into everything else. narada keeps a local copy of both, puts the unread counts in your tmux status line and opens the full screen with prefix e, laid out like sangam. It runs like lazygit: type narada in any terminal. And because it ships an MCP server, you can tell Claude "read today's mails" or "mail Priya that Thursday is fine".

#Features

#Install

Requirements: Linux, a Google account (Google Chat needs a Google Workspace account; a personal Gmail gets mail only). Optional: tmux for the popup and status line, secret-tool (libsecret) for the keyring, notify-send for notifications, ffmpeg for GIFs and video previews on WhatsApp, fzf for the label picker, wl-copy or xclip for copying links, Claude Code for the AI keys.

With kosha:

kosha install narada

Or with the installer, which downloads the release binary into ~/.local/share/narada (or builds it with Go) and links ~/.local/bin/narada:

curl -fsSL https://raw.githubusercontent.com/Theyashsawarkar/narada/main/install.sh | bash

Or from source (Go 1.26+):

git clone https://github.com/Theyashsawarkar/narada && cd narada
make && sudo make install          # or: make install PREFIX=~/.local

Arch: cd packaging/arch && makepkg -si.

Update by running the installer again; install.sh --uninstall removes it.

#Getting started

Try it first on made-up mail, no Google needed:

narada demo

Then just run narada (or press prefix e in tmux). With no credentials yet it opens a setup screen in three steps. 1, the OAuth client: it asks where your client file is (Tab completes the path, Enter on a folder opens it), checks it, and copies it into ~/.config/narada/client.json, so the download can be deleted; a pasted JSON or a typed client ID and secret work too. 2, sign in: Enter opens Google's sign-in in your browser (Tab switches between a work account and a personal Gmail). 3, the first sync, with a progress bar, and then the inbox.

KeySetup screen
TabSwitch to the next path completion (Enter on a folder opens it)
EnterSave the OAuth client file at this path, or start the Google sign-in
Ctrl+tEnter the OAuth client ID and secret by hand instead
Ctrl+oOpen the Google Cloud console credentials page
Ctrl+gShow the steps for creating the OAuth client
Ctrl+dStart the demo on example mail instead
nRename the account before signing in
cPick a different OAuth client file
yCopy the sign-in link

To use your own mail, narada needs an OAuth client of your own (Google doesn't hand out one for everyone's terminal tools). This takes about five minutes, once:

  1. Open the Google Cloud console, create a project (any name), and enable the Gmail API, the Google Chat API and the People API (APIs & Services → Library).
  2. OAuth consent screen: for a Workspace account choose Internal (no Google review needed; your admin may have to allow it). For a personal Gmail choose External, add yourself as a test user, then Publish it, or Google signs you out every 7 days.
  3. Google Chat API → Configuration: fill in an app name, an avatar URL and a description, and turn off "interactive features". Chat's API wants this even though narada only acts as you.
  4. Credentials → Create credentials → OAuth client ID → Desktop app, and download the JSON.

Then either run narada and follow the setup screen, or do the same from the command line:

narada auth setup ~/Downloads/client_secret_*.json
narada auth add work                  # opens Google's sign-in page
narada auth add personal --no-chat    # a personal Gmail: mail only
narada service install                # background sync and notifications
claude mcp add --scope user narada -- narada mcp
narada doctor                         # checks all of it

narada opens the screen.

#The screen

A Google Chat conversation in rounded bubbles: yours on the right outlined in the accent colour, theirs on the left with a quoted reply, a reaction and the time inside The WhatsApp tab: the chat list on one panel with the picked chat in a green rounded card, rounded message bubbles with a photo inside, and read ticks on your message

All screenshots use narada demo: made-up mail, chats and people.

Sections on top, the list on the left, the selected thread or space on the right, keys at the bottom.

#Keys

The screen opens in normal mode: letters are commands. /, s and @ switch to typing; Enter or Esc switches back. ? shows every key.

Move and find

KeyDoes
j / kMove to the next / previous thread or space (j at the end loads older mail)
+ / -Set how many older mails j at the end loads (10, 25, 50, 100)
g / GJump to the first / last
h / lSwitch to the previous / next section
Tab / Shift+TabSwitch to the next / previous of mail, chat and WhatsApp
Alt+m / Alt+c / Alt+wSwitch straight to mail / chat / WhatsApp
1 / 2Focus the list / the preview
EnterOpen the thread or space (marks it read)
J / KScroll the preview down / up
EToggle every message in the thread open / folded
QToggle the quoted text in the thread
oOpen a link from the preview by its number
Ctrl+d / Ctrl+uScroll the preview half a page down / up
/ or sOpen the search window (searches where you are: this section, or this chat)
WSave the current search as a section
XRemove the current saved-search section
uSwitch account (all, then each one)

Act

KeyDoes
cCreate a new mail, or a new message in this space (compose)
rSend a reply to the thread (in chat: to the picked message, quoting it)
aSend a reply to everyone on the thread (reply all)
fSend the thread on to someone else (forward)
eMove the thread out of the inbox (archive; or every selected one)
dMove the thread to the trash (or every selected one)
mSet the thread or chat as read (mark read; or every selected one)
MSet the thread or chat as unread (mark unread; or every selected one)
*Toggle the star on the thread
LAdd or remove a label (fzf picker)
xSelect the thread or chat for e / d / m / M (pick several)
Ctrl+xSelect every thread or chat in the list (again clears)
Alt+rSet everything in this list as read (mark all read)
iStart typing a chat message right in the preview (Ctrl+t sends it later)
Enter / 2 (chat)Pick messages in the chat with j/k (k past the first loads earlier ones)
Enter (picking)Jump to the message a reply quotes (again goes further back); on a photo, view it full size
Space (picking)Open the picked photo or GIF full size (h/l previous / next, v opens it, Esc back)
Backspace (picking)Jump back to the reply you came from
e (picking)Toggle a reaction on the picked message (yours are marked ✓; picking one removes it)
E (picking)Edit your picked message in the message box
d d (picking)Delete your picked message, for everyone
pToggle the chat pinned on top of the list
[ / ]Switch to the previous / next chat (staying in the conversation)
Ctrl+kOpen the chat switcher (search chats, people and messages)
Ctrl+o (typing)Add a file to the chat message you're typing
Ctrl+v (typing)Paste a copied image (a screenshot) into the chat message as a file
Enter (typing)Send the chat message and keep typing the next one (Esc leaves the box)
Alt+Enter / Ctrl+j (typing)Start a new line in the chat message
←→ Alt+b/f Ctrl+a/e (typing)Move the cursor in the message by letter, word, line start / end
↑↓ (typing)Move the cursor up / down a line in a long message
Ctrl+w / Ctrl+k / Ctrl+u (typing)Delete the word before the cursor / to the end / the whole message
L (WhatsApp, not linked)Add this machine to WhatsApp (link it) with a QR code shown in the tab
P (WhatsApp, not linked)Add this machine to WhatsApp (link it) with your phone number and a code
tMove a scheduled send to another time (in Scheduled; Enter edits it)
nRename the chat (spaces and groups on Google Chat; a DM only here)
NStart a conversation (opens the one you have with them, earlier messages and all)
vOpen the attachments in their apps (kept in ~/Downloads/narada; picker when several)
VSave the attachments to ~/Downloads/narada without opening them
USend a file into this chat (Google Chat or WhatsApp; file picker with preview)
zCancel the last change, or a send in its undo window (undo)
AShow the sends an agent is waiting on you to approve
RReload mail and chat from Google now (sync)
bOpen the thread or space in the browser
yCopy the link to the thread or space

Claude

KeyDoes
@Start a question to Claude, with this thread or space as context (ask)
SShow Claude's summary of the thread or the space's recent messages
DCreate a reply draft with Claude, then edit it in your editor
TShow today's digest: what came in and what needs you

Other

KeyDoes
?Show every key
q / EscGo back, then quit

Keys (?): a window in the middle of the screen with every key, grouped, and a filter: type send and only the keys that send stay.

Picking files (Ctrl+o in a mail, + when reviewing, U in chat): a window listing the files under the folder you're in (Ctrl+r switches to home or Downloads, Ctrl+h shows hidden ones). Type to narrow it down; the right side previews the highlighted file: text with line numbers, an image's size (the picture itself with chafa installed), a PDF's first page (with pdftotext). Tab picks several, Enter adds them.

The conversation is drawn as rounded bubbles, as on a phone: theirs on the left with a soft outline, their name once per run of messages, yours on the right outlined in the accent colour, each with its time (and your ticks) at the bottom right inside it. A reply's quote sits inside its bubble, files (v opens one) and numbered links (o opens one) inside too, reactions as chips underneath and "(edited)" where a message was changed.

The lists (mail, chat, WhatsApp) are rows on one panel, divided by hairlines, the picked one a rounded card in the tab's colour; list_style = "cards" draws a box around each instead. In a mail thread read messages fold to one line each, and a run of four or more to a single "⋯ N earlier messages" line (Enter opens them all). The message box holds what you're replying to and the files you're sending inside its frame, above the text. A red new line marks where what you haven't read starts, and the chat opens there. The top line lists who's in it. The chat list is grouped (pinned, today, earlier); a chat that mentions you shows a peach @N badge.

Replying to a message in chat: Enter (or 2) on a chat moves into the conversation; j / k now pick a message (highlighted) instead of scrolling. r replies to the picked one: the message box shows "↩ replying to …", and the reply quotes it the way Google Chat's own reply does, right in the conversation. From the list, r replies to the latest message from someone else. Enter on a reply jumps to the message it quotes (fetching earlier messages if it's older than what's shown); on a reply to a reply, Enter again keeps going back; Backspace retraces the way you came. Replies others send that quote a message show the quote above them (❝ You: …).

Starting a conversation (N in chat): type a name and pick the person (people from chat, contacts from mail, and your Workspace directory); Tab adds another for a group. With two or more, Enter first asks for a name: with one the group is a named space everyone sees, without one a group chat (name it later with n). If your sign-in predates the permission starting chats needs, the window says so and Enter signs you in again in the browser, then carries on. narada opens the DM you already have with them, fetching the earlier messages if this machine hasn't seen them, or starts a new one, and puts you in the message box. The chat search (/) finds conversations and people by name too, not just words in messages: Enter on a person opens your conversation with them. Claude can do the same: chat_send takes to (email addresses) instead of a space.

Renaming a chat (n): a space is renamed on Google Chat, so everyone sees the new name; a group chat gets its name on Google Chat too (that makes it a space, with the same people and messages) (Google lets only its managers do it; narada asks for the permission when you sign in, so an older sign-in needs narada auth add <account> once). DMs and unnamed group chats can't be named on Google; the name you give them stays on this machine. An empty name goes back to the default.

Searching (/ or s): a floating window that searches where you are. In a mail section it looks in that section (Today: today's mail, Sent: what you sent); in chat, the space you're on. Tab widens it to all mail or every chat. Results from this machine show a moment after you stop typing, matches highlighted, with a preview; then Gmail's own search adds what isn't here yet (☁). Gmail syntax works: from:priya has:attachment newer_than:7d. Nothing waits on it: you can keep typing, move or close the window while it looks. Enter opens a result (a chat at that message).

KeySearch
Up / DownMove between the results (Ctrl+p / Ctrl+n too)
EnterOpen the result (mail results stay listed as a search section)
TabSwitch where it looks: this section or all mail, this chat or every chat
Ctrl+uClear the search
EscClose the search window

Writing a mail (c, r, a, f, or D): a new mail takes the whole screen; a reply keeps the message you're answering on the left (PgUp/PgDn scrolls it) and your reply on the right. Type a name or part of an address in To and your contacts appear, best first (people you write to most, then people who write to you, and colleagues from your Google Workspace directory, which needs the People API enabled in your Cloud project); the typed letters are highlighted. Recipients become pills; a peach one says first time for someone you've never written to. Cc and Bcc stay hidden until Ctrl+b (a reply-all shows them). Your Gmail signature is added under the body (Ctrl+g leaves it out), a reply's original stays folded under it, and the draft is saved on disk every few seconds: if the popup closes, the same c or r picks it up again. Prefer your editor? Ctrl+e takes the whole mail there and back, or set compose = "editor".

KeyCompose
Tab / Shift+TabMove to the next / previous field (Tab adds what you typed first)
Up / DownPick a contact from the suggestions
Enter / ,Add the picked contact or typed address, and stay for more
BackspaceRemove the last recipient (in an empty To, Cc or Bcc)
Ctrl+sSend the mail (after the undo window)
Ctrl+tSend the mail later (pick or type when: tomorrow 9am, fri 6pm, in 2h)
Ctrl+dSave the mail as a Gmail draft and close it
Ctrl+oAdd files to the mail (file picker with preview; x removes one in Files)
Ctrl+eEdit the whole mail in your editor, then come back
Ctrl+qToggle the quoted text under a reply or forward
Left / RightSelect a recipient pill (in an empty To, Cc or Bcc; Backspace removes it)
Ctrl+bToggle the Cc and Bcc fields
Ctrl+gToggle your Gmail signature under the mail
Ctrl+fSwitch the account the mail is sent from
PgUp / PgDnScroll the message you're replying to
EscCancel the mail (twice once something is written)

Reviewing your message (chat written in the editor, or mail with compose = "editor") and approving an agent's (A, or the popup):

KeyReviewApprove
ySend the message you wrote (after the undo window)Send the message an agent wrote (after the undo window)
tSend the message later (pick or type when)
eEdit the message again in your editorEdit the agent's message in your editor first
+Add a file to the message (attach; file picker with preview)
-Remove the last file added to the message
dSave the message as a Gmail draft instead of sending
nDelete the message you wrote (discard)Cancel the agent's message (decline; nothing is sent)
qLeave the agent's message waiting and go back

#Sending later

Ctrl+t in a mail, t on the review screen, or Ctrl+t while typing a chat message (i) asks when: pick one (in an hour, this evening, tomorrow morning or afternoon, Monday morning) or type it the way you'd say it: tomorrow 9am, fri 6pm, in 2h, 3 nov 10:30, 03/11 9am, 2026-12-01 18:00. It shows what it understood before you confirm. The message waits in narada's outbox and the background service sends it then (Gmail's API has no scheduled send of its own), so this computer must be on at that time: if it wasn't, the message goes out as soon as it is, and a notification says it went out late. Scheduled mail is listed in its own Scheduled tab (next to Sent) and scheduled chat messages in the chat's Scheduled tab, soonest first, with their time: t moves one, Enter edits it, z cancels it. From the shell: --at "tomorrow 9am" on mail send and chat send; narada outbox reschedule <id> <when>. Agents can schedule too (send_at), still after your approval.

#Sent mail

The Sent section (next to Starred) lists mail you sent with who it went to (→ Priya, Arjun) and whether they answered: ↩ Priya replied 09:58 or no reply yet · 2d. Mail still in the outbox sits on top: sending in 7s (z cancels), an agent's waiting for your OK (A), or failed in red (R sends it again). Scheduled mail has its own tab, Scheduled.

#Older mail

The first sync is quick: the last initial_days (30) of mail, at most max_threads. Older mail stays on Gmail until you want it: press j at the end of a list and the next 10 older threads of that section come in (+ / - make it 25, 50 or 100; older_page sets the default), or search (/) and Gmail finds it wherever it is. Want everything here anyway? keep = "all" (or "1y", "6m") downloads older mail in the background, ~150 threads a minute, with a progress bar in the top bar.

#Files

#WhatsApp

narada links to your WhatsApp the way WhatsApp Web does: as a linked device of your phone's account. Open the WhatsApp tab (Tab twice) and press L: the QR code shows right there; scan it from WhatsApp → Settings → Linked devices. P links with your phone number instead (you type a code on the phone). A progress bar follows while the phone sends your recent chats. From a terminal it's the same:

narada whatsapp link                  # scan the QR code
narada whatsapp link --phone +9198…   # or type a code on the phone instead

Keep it open after scanning: it waits until the phone has logged the new device in and sent your recent chats (up to two minutes), then hands over to the background service. Tab in the screen now goes Mail → Chat → WhatsApp, with sections All, Unread, People, Groups and Scheduled; i types a message, r on a picked message replies quoting it, and opening a chat marks it read (the sender sees blue ticks). The status line shows 󰖣 N for WhatsApp chats with unread messages, and new messages notify like chat DMs. The background service keeps WhatsApp online; without it, whichever narada is open (the screen, narada mcp) holds the connection.

Know the risk. WhatsApp doesn't allow programs other than its own to link to an account. This works the same way WhatsApp Web does (through whatsmeow), and normal one-to-one use looks like WhatsApp Web, but an account that sends a lot from such a device, especially to strangers or the same text to many, can be banned. So narada:

Don't want to link? narada whatsapp send +9198… "text" (and the whatsapp_send tool) then opens WhatsApp's own click-to-chat page with the message typed in, and you press Send there. --link does that even when linked.

Photos, GIFs, stickers and videos show inside the conversation: on kitty (and terminals that speak its graphics protocol) as real pictures, in tmux and its popups too (needs set -g allow-passthrough on); GIFs and video previews play, and elsewhere you get coloured blocks. images in the config chooses (auto, kitty, blocks, off). New photos, stickers and GIFs up to 8 MB download as they arrive and larger files when you open them, into ~/.cache/narada/media. Pick a message and press Space (or Enter) to see a picture as big as the screen allows; h/l go through the chat's pictures. To send one, press Ctrl+o while typing (or U in the chat), or Ctrl+v to paste a copied image such as a screenshot (needs wl-paste or xclip): a small preview of each file shows above the box, what you type becomes the first file's caption, and each file goes as its own message.

Ticks beside your messages show how far they got, as on the phone: ✓ sent, ✓✓ delivered, blue ✓✓ read. In a group narada shows at most delivered, as blue ticks need every member to have read it. A message still in its undo window shows under the conversation, counting down (z cancels it), and so does one waiting for your approval. GIFs and video previews need ffmpeg, as WhatsApp sends GIFs as MP4.

Photos from before this feature carry no download details, so they stay a "📷 Photo: caption" line until WhatsApp sends them again, which it may do when you link anew.

Not yet: reactions, editing and deleting, starting groups. narada whatsapp unlink logs this machine out and forgets the chats. WhatsApp unlinks devices whose phone has been offline for about two weeks; link again then.

#Claude and other agents

narada doesn't embed a model. It offers tools over MCP, and whichever agent you use calls them. Add it once and every Claude Code session can use it:

claude mcp add --scope user narada -- narada mcp

Then ask in plain words:

you     read today's mails
claude  → digest → mail_read
        3 new. Priya needs a yes/no on Thursday's release by end of day.
        Arjun asked for a review on #412. Staging DB credentials rotate at 18:00.

you     tell priya we're good for thursday, cc arjun
claude  → contacts_find → mail_send
        (a popup shows the mail; you press y)
        Sent.
ToolDoes
mail_listThreads in a section (default Inbox), today, unreadreads
mail_searchGmail search syntax, or the local copy offlinereads
mail_readA whole thread as text; attachments listed, not openedreads
mail_modifyArchive, unarchive, trash, untrash, mark read/unread, starchanges, undoable
mail_draftSave a Gmail draft (replies fill in recipients and quoting; optional html beside the text)changes
mail_sendSend a mail or a reply (optional html beside the text, for a table)asks you
chat_spacesSpaces and DMs with unread countsreads
chat_readA space's recent messagesreads
chat_sendPost in a space, DM or threadasks you
whatsapp_chatsWhatsApp chats with unread countsreads
whatsapp_readA WhatsApp chat's recent messages (by name, number or id)reads
whatsapp_sendOne message to one WhatsApp chat, optionally replying to a message; opens click-to-chat when not linkedalways asks you
contacts_findA name to an address you've written toreads
digestToday's mail and unread chat, ready to summarisereads

The @, S, D and T keys in the screen run claude -p (your ai_command) with the same server, so they use your Claude login. No API key. Any other MCP client works the same way: the server is narada mcp on stdio.

#Sending safely

Mail is outward-facing and hard to take back, and the mail an agent reads is written by strangers. So:

#Command line

Every command has --help; the read commands take --json.

CommandDoes
naradaThe screen
narada --tab chat|whatsappThe screen, opened on that tab (--tab mail is the default); also with --popup
narada mail list [--today] [--unread] [--section S]Threads (ls)
narada mail read <thread> [--mark-read]A whole thread as text
narada mail search <query> [--local]Gmail search syntax; --local searches the local copy
narada mail send --to A --subject S [--reply THREAD [--all]]Send; the body from stdin or $EDITOR; waits the undo window (Ctrl+c cancels)
narada mail archive|unarchive|trash|untrash|mark-read|unread|star|unstar <thread>...Change threads
narada chat list [--unread]Spaces and DMs
narada chat read <space> [--mark-read]A space's recent messages (<space> is its id or part of its name)
narada chat send <space> <text> [--thread T]Post in a space or DM
narada whatsapp link [--phone N]Link your WhatsApp (QR code, or a code to type on the phone)
narada whatsapp unlinkLog this machine out of WhatsApp and forget its chats
narada whatsapp list [--unread]WhatsApp chats (wa ls)
narada whatsapp read <chat> [--mark-read]A chat's recent messages (<chat>: a name, a number or its id)
narada whatsapp send <to> <text> [--at WHEN] [--link]Send one message (--link: open click-to-chat instead); @919820147460 (a phone number with its country code) tags that person
narada status [--json|--tmux]Unread counts
narada syncSync every account now
narada outbox / outbox cancel <id>Sends of the last week; stop one in its undo window
narada approve [id]Answer an agent's send that waits for you
narada auth setup <client.json>Install your OAuth client
narada auth add <name> [--email E] [--no-chat]Sign in a Google account
narada auth list / auth remove <name>The accounts
narada mcpThe MCP server (stdio)
narada daemonThe background sync, in the foreground
narada service install|remove|statusThe background sync as a systemd user unit
narada configPrint an example config file
narada demoThe screen on example mail, with a fake Google inside the process
narada doctorCheck the setup

Options: --account NAME on most commands (default: the first account), -h, -V.

#Using it inside tmux

narada is a command first; the tmux plugin adds a key and a status segment. With TPM:

set -g @plugin 'Theyashsawarkar/narada'
set -g status-right '#{narada_status} %H:%M'   # 󰇮 3  󰭹 2  󰖣 1

prefix e opens narada in a popup. If narada isn't on your PATH, the plugin builds its own copy with Go the first time.

OptionDefault
@narada-keyeKey after the prefix; none binds nothing
@narada-width / @narada-height96% / 94%Popup size
@narada-title narada Popup title
@narada-launcherYour own popup command, run with display-popup's arguments appended (e.g. "~/.tmux/scripts/popup.sh '#{client_name}'")

The key carries a bind -N note, and scripts/keybindings lists the keys inside the screen as # keybind: lines, so both show up in tmux's prefix ? and in Vayu's keybinding search.

#Configuration

~/.config/narada/config.toml; every line is optional. narada config prints this:

send_policy   = "confirm"   # confirm | known-contacts | allow | trust (see Sending safely)
undo_seconds  = 10          # every mail waits this long; z cancels
chat_undo_seconds = 0       # the same for chat (default: sent at once)
agent_undo_seconds = 10     # the least a send by an agent waits (matters under trust)
mail_interval = "60s"       # how often the background sync checks Gmail
chat_interval = "30s"       # and Google Chat
initial_days  = 30          # how far back the first sync goes
max_threads   = 150         # at most this many threads on the first sync (older mail: search)
notify        = true        # desktop notifications for new mail and DMs
list_style    = "panel"  # the lists: panel (rows, the picked one a card) or cards (a box each)
images        = "auto" # photos in the screen: auto (kitty graphics, else coloured blocks), kitty, blocks, off
whatsapp_per_hour = 30      # at most this many WhatsApp sends an hour
ai_command    = ["claude", "-p"]   # what @, S, D and T run
# editor      = "nvim"             # default: $VISUAL, $EDITOR, else the first one installed
# compose     = "editor"           # write mail in the editor instead of the compose screen
# include     = "~/.local/state/varna/narada.toml"   # a theme file; its [colors] win

# Sections are the tabs on top. label: a Gmail label id (INBOX, STARRED,
# UNREAD, or a label's id), query: a Gmail search run on the server,
# today: only threads with mail from today.
[[section]]
name  = "Inbox"
label = "INBOX"

[[section]]
name  = "GitHub"
query = "from:notifications@github.com newer_than:14d"

[colors]           # Catppuccin Mocha by default
accent  = "#74c7ec"
accent2 = "#cba6f7"

Colours follow varna's desktop theme (~/.local/state/varna/palette.json) and change live when it does; anything set under [colors] wins. Colour names: accent, accent2, text, subtle, muted, surface, border, base, mantle, green, yellow, red, blue, peach. With varna, point include at the file it writes and the screen follows your theme.

#Files and environment

Path
~/.config/narada/config.tomlSettings
~/.config/narada/client.jsonYour OAuth client (auth setup)
keyring, service naradaSign-in tokens (secret-tool search service narada); without a keyring, ~/.config/narada/tokens/ (mode 600)
~/.local/share/narada/cache.dbThe local copy (SQLite)
~/.local/share/narada/whatsapp.dbThis device's WhatsApp keys (mode 600; whatsapp unlink logs out)
~/.local/state/narada/agent.logWhat agents did
~/.local/state/narada/sections.jsonSearches saved with W
~/.config/systemd/user/narada.serviceThe background sync (service install)

NARADA_HOME puts all of narada's files under one folder (tests and demo use it). NARADA_GOOGLE_URL sends every API call to a fake Google (the test suite's). The usual XDG_* variables are respected.

#How it works

Design decisions are recorded in docs/adr.

#Troubleshooting

#Contributing

make check runs what CI runs: go vet, gofmt, ShellCheck, the tests (against a fake Google, internal/fake) and the website check. Keys live in internal/tui/keys.go; after changing one, run go test ./internal/tui -update (it rewrites scripts/keybindings) and update the tables above. Every change gets a CHANGELOG entry.

#Roadmap

#License

MIT