---
title: Quick Email (Control Space → Email tab)
---

# Quick Email (Control Space → Email tab)

## What it is

A tab inside the Quick Launch / Control Space floating composer (Ctrl+Space → **Email** tab) for firing off a short email in two keystrokes. Add one **or several** recipients, type a body, press Ctrl/Cmd+Enter — the email sends through your connected Gmail account after a short **undoable** delay, and the composer closes immediately so you get back to what you were doing.

This is the "I just need to fire a one-liner to a person (or a few people) I email constantly" path. It is **not** a full mail client: there is no rich text, no thread view, no inbox. You **can** address **several people on one email's To line** (up to **10** — a quick note, not a mailing list); everyone is on To (they can see each other), and it goes out as a single email. **Cc and Bcc are supported too** — a small "Add Cc/Bcc" link reveals optional Cc and Bcc chip fields (each also up to 10, all on the same one email; Bcc recipients are hidden as usual). It **does** support attachments — paste a screenshot, click the paperclip, or drag files in (see _Attach files & screenshots_ below). The dominant use case is body-only quick notes ("running 5 late", "shipped — see attached", "approved, go ahead"). The subject field is optional and hidden by default.

The tab is **gated on `quickEmailEnabled`** (off by default). With Quick Email disabled at **Settings → System → Quick Email**, the tab is hidden from the Quick Launch strip — the same way Calendar Quick Add is hidden when `calendarEnabled` is false. Sending also requires a connected Gmail account (the same one Omniscio's Email Summarizer / Gmail integration uses); the actual `sendEmail` call runs main-side through the shared Gmail service.

What it looks like (Email tab, with at least one saved recipient):

- A **Recipient** chip field. Type a name or address to search; add each person as a removable **chip** by clicking a suggestion or pressing **Enter/Tab** (Backspace on the empty field removes the last chip). It suggests your **saved recipients** merged with the people you email, and lets you add **any address** — up to **10** recipients, all on one email's To line. It **starts empty** on open — nobody is preselected — unless a per-recipient hotkey targeted someone (see below). **The cursor starts here** whenever you open the tab without a specific person already chosen — via **Alt+E**, clicking the Email tab, or cycling to it — so you pick who to email first; focusing it also drops the people list open. (When a per-recipient hotkey picked the person for you, the cursor starts in the Body instead — see below.)
- An optional **Subject** field. When `quickEmailShowSubjectByDefault` is off (the default), the field is collapsed behind a small **Add subject** link; click it to reveal the input. When the setting is on, the Subject field is shown on open. You can also jump to it (revealing it first if it's collapsed) with **Ctrl/Cmd+Shift+S** from anywhere in the form. The Control Space window is **one fixed size for every tab, sized around this composer** — so the message box always has room to breathe, revealing the Subject or Cc/Bcc never moves or resizes anything (the fields fill space the layout already reserves), and switching tabs never resizes the window (resizing it live is what used to flash a white strip for a frame on Windows).
- A **Body** textarea with placeholder _"Type your message…"_. It's **focused on open when a per-recipient hotkey already chose the person** (the "who" is settled, so you go straight to typing); on a plain open (Alt+E / tab click) the cursor starts on the Recipient instead. You can jump back to it any time with **Ctrl/Cmd+Shift+M** from anywhere in the form. Because the body is a real multi-line message, **plain Enter (and Shift+Enter) inserts a newline** — you send with **Ctrl/Cmd+Enter** (see _Send_ below). This is the one quick-add tab where plain Enter does NOT submit; the single-shot tabs (Alarm, Task, …) still submit on Enter. Supports **emoji input**: type `:` followed by two characters (e.g. `:thu`) for a colon-autocomplete typeahead, or click the smiley-face button in the footer for a searchable emoji picker with categories and recents (with the emoji list open, plain Enter picks the highlighted emoji before any newline). A small **eraser** in the box's top-right corner clears the whole draft (recipient, subject, and body) with an undo — it stays hidden until you've entered something. The body also **auto-capitalizes as you type** — the first word, the start of each sentence (after `.`, `!`, `?`), and the start of each new paragraph — while leaving links, file paths, and abbreviations (Dr., e.g., etc.) alone; it's on by default and you can turn it off at **Settings → System → Quick Email → Auto-capitalize body**.
- A footer with an **emoji picker** and a **paperclip** (📎 attach files) button (left), **Cancel** + a **Send** button (right) — the app's standard accent **send icon** (a paper-plane), the same control the chat composers use, labelled **Send email** and firing on Ctrl/Cmd+Enter from anywhere in the tab (it shows a spinner while a send is in flight). Send is disabled until **at least one recipient** is added **and** there's something to send — a subject, a body, **or at least one attachment**; a subject-only or attachment-only quick email is allowed, only a completely blank send is blocked.

If you open the Email tab with **zero saved recipients**, the tab renders an empty state — a short _"This tab needs a saved recipient before you can send a quick email."_ line plus two buttons: **Cancel** and a primary **Add a recipient in Settings**. Clicking **Add a recipient in Settings** closes the Quick Launch window, brings the main Omniscio window forward, and deep-links straight to **Settings → System → Quick Email**, scrolling to and flashing the **Recipients** box — so you can add one and start using the tab without hunting for the setting. As of 2026-06-03 a pinned Email tab shows in the strip as soon as Quick Email is enabled, **even with no recipients** (the registry gate was relaxed from `quickEmailEnabled && recipients>0` to `quickEmailEnabled` alone), so this empty state is the normal first-run view rather than a rarely-seen fallback. `quickEmailEnabled` stays the master gate — `requestSend` throws when it's off, so a tab that could never send is still hidden.

## Where to find it

Quick Email lives in exactly two places: the **Email** tab of the Quick Launch / Control Space floating composer, and its own card at **Settings → System → Quick Email**, where you switch the feature on and keep your saved recipients.

### Open the tab

Press Ctrl+Space (or your rebind) to open Quick Launch. If you have the Email tab pinned and Quick Email is enabled, **Email** is one of the entries in the top strip — click it or press Ctrl+Tab to cycle to it. You can also open Quick Launch **directly onto** the Email tab, pre-targeted at a specific person, with a per-recipient global hotkey (below).

## How it behaves

### Pick recipient(s), type a body

The **To** field starts empty — add one or more people: pick from the dropdown or type any address, pressing **Enter/Tab** (or clicking a suggestion) to turn each into a chip. Everyone you add rides one email's To line (up to 10). Type your message in the Body box. Optionally click **Add subject** and type a subject line (it ships as the email's subject; leave it blank and the email goes out with a single hyphen (**-**) as the subject line). A subject-only quick email (a subject with no body) sends a blank message the same way.

### Cc / Bcc

Need to copy people? Click **Add Cc/Bcc** (next to _Add subject_) to reveal two more chip fields — **Cc** and **Bcc** — that work exactly like the To line (add several people, contact autocomplete, up to 10 each). Everyone still rides the **same one email**: Cc recipients are visible to all, Bcc recipients are hidden. They're optional and stay collapsed until you open them; a send with no Cc/Bcc goes out exactly as before. You still need at least one **To** recipient — Cc/Bcc alone can't send. Cc/Bcc are remembered in your draft and cleared by the eraser like the rest, and they ride along on a **"send later"** scheduled email too.

### Composer keyboard shortcuts

A few chords jump the cursor between fields from anywhere in the tab: **Ctrl/Cmd+Shift+O** → **Recipient**, **Ctrl/Cmd+Shift+S** → **Subject** (revealing it if it's collapsed behind **Add subject**), and **Ctrl/Cmd+Shift+M** → the **Message** body. **Ctrl/Cmd+Enter** sends the email; **Ctrl/Cmd+Shift+L** opens **Send later**.

### Attach files & screenshots

Add files to a quick email three ways:

- **Paste a screenshot** — copy an image (Print Screen / Snip, or copy an image file) and paste it (Ctrl/Cmd+V) into the message box; it attaches instead of pasting as text. A plain-text paste still pastes normally.
- **Paperclip** — click the 📎 button in the footer to pick files (images, PDFs, `.docx`/`.xlsx`/`.pptx`, `.txt`/`.md`/`.csv`, …).
- **Drag & drop** — drag files onto the compose area (a subtle highlight shows the drop target).

Each attachment shows as a small chip — a thumbnail for images, a file icon otherwise — with an **×** to remove it (middle-click removes too); drag a chip to reorder. Unsupported, legacy-Office, or too-large files are skipped with a short inline note; the total is capped at about **20 MB** (Gmail's own message limit) and the count at 20. Attachments go out **with the email** through your connected Gmail account. Like the rest of the draft, staged attachments are **kept** if you close without sending, are wiped (undoably) by the eraser, and clear on send. An **attachment-only** email — a screenshot with no subject or body — is allowed.

### Send (with an undo window)

Press **Ctrl/Cmd+Enter** (or click **Send email**) — from anywhere in the tab, including the Subject field. A **plain Enter never sends**: in the body it makes a newline, and in the single-line Subject it jumps the cursor down to the Body (like Gmail's compose). The composer closes immediately and a **"Sending to <name>…"** toast appears in the main Omniscio window with an **Undo** button (and a Ctrl+Z hint) — for several recipients it reads as a short summary (e.g. _"Sending to Alice +2…"_). The email does **not** go out yet — it is held for a configurable number of seconds (default **10**, clamped 1–30 at **Settings → System → Quick Email → Undo window**).

During that window you can cancel the send three ways:

1. Click **Undo** on the toast.
2. Press **Ctrl+Z** (global — works even if Omniscio isn't focused; see "The Ctrl+Z global undo" below).
3. (Indirectly) disable Quick Email or remove the recipient — the service cancels any pending send for that reason.

When the window elapses without an undo, the email actually sends through Gmail. The pending toast is replaced by a brief **"Sent to <name>"** success toast. If the send fails (Gmail error, network), you get a **"Failed to send to <name>: <reason>"** error toast instead. If you cancelled, you get a **"Send to <name> cancelled"** info note.

**Undoing does not lose the email.** When you undo a send (the Undo button _or_ Ctrl+Z), the Control Space reopens on the Email tab with the whole message restored — recipients, subject, body, and attachments — ready to edit or resend. A **failed** send keeps the email too (it's there the next time you open the composer), so you can retry it. The one exception: if you'd already started composing a **new** email during the undo window, that in-progress email is kept and the undone one is not forced back over it (your visible work is never overwritten).

If the _scheduling_ step fails (e.g. the recipient was removed between open and send, or Quick Email got disabled), the tab shows an inline amber hint — _"Could not send. Try again or open Settings → Quick Email."_ — and stays open so you can copy the body out before dismissing.

### Send later (schedule for a future time)

Instead of sending now, you can schedule a quick email for later. Press **Ctrl/Cmd+Shift+L** — or click the **clock** button in the footer (next to the emoji and paperclip) — to open a small **Send later** picker: choose a preset (the same time-relevant options as snooze — "2 Hours From Now", "Tomorrow Morning", "Next Week", …) or type a time in plain words ("tomorrow 9am", "in 3 days", "friday 3pm"), with a live preview of exactly when it will go. Pick a time and the composer closes with a **"Scheduled for &lt;time&gt; · Cancel"** toast in the main window.

Unlike the 10-second undo window, a scheduled send is **durable** — it's saved to disk and delivered at the chosen time through the same Gmail path (with your signature applied), so it still goes out even if you close and reopen Omniscio in between. Because the scheduling runs inside the app (not a cloud service), a send fires while Omniscio is running; if your computer happened to be off at the exact moment, it goes out as soon as Omniscio is next up. Click **Cancel** on the confirmation toast to call it off before it fires. A send that fails at its scheduled time retries a few times, then surfaces the same failed-send toast **and** a durable inbox note as an immediate send would.

The **Send later** button and chord are disabled until there's a recipient and something to send, exactly like **Send email**. (Ctrl/Cmd+Shift+L is the same chord the main window uses for a _session's_ "Send Later" — but the Quick Email composer is a separate window, so the two never collide.)

### Your draft is saved — and the Clear button

If you close the popup **without sending** — Escape, click away, or **Cancel** — your half-written email is **kept**, exactly like the regular New-Session composer: reopen the Email tab and your recipients, subject, and body are all still there. This follows the same **Settings → Quick Launch → "Remember unsent Quick Launch text"** switch (on by default); turn it off and the Email tab starts blank after every close. (Restoring the recipients is your own earlier pick coming back — Omniscio still never auto-addresses a quick email to a default person. Because the draft remembers the actual addresses, a recipient whose saved entry you deleted in the meantime comes back as its plain email chip — the exact same address you chose, never silently re-pointed at someone else.)

To throw a draft away on purpose, click the small **eraser** in the top-right corner of the message box (it only appears once there's something to clear). It wipes the whole email — recipient, subject, and body — and shows a **"Draft cleared · Undo"** pill; click **Undo** (or press **Ctrl+Z**) to get it all back. **Sending** clears the draft too, so your next quick email always starts fresh.

Two caveats worth knowing: the draft is remembered **in memory only** — it survives closing and reopening the popup, but a full app restart starts blank (nothing is written to disk). And if you **undo a send** within the undo window, the email is cancelled but the draft is **not** brought back — retype it if you need it.

### Per-recipient global hotkeys (optional)

Each saved recipient can carry its own **global hotkey**. When set (and both `quickEmailEnabled` and `quickEmailHotkeysEnabled` are on), pressing that hotkey from anywhere — even when Omniscio is in the background — pops open Quick Launch **directly on the Email tab, preselected to that recipient**. So a hotkey bound to your manager opens a blank quick-note addressed to them; type a line, Ctrl+Enter, done.

These are off by default at two levels: the per-recipient hotkey master toggle (`quickEmailHotkeysEnabled`) is off, and each recipient's hotkey is empty until you set one. The fixed app hotkeys (focus app, Omni briefing, Quick Launch) always win conflicts; among recipients, the one higher in the Settings list wins a shared accelerator (the loser is silently skipped, logged as a conflict).

### The Ctrl+Z global undo

While **any** Quick Email send is pending, Omniscio claims a global **Ctrl+Z** (`CommandOrControl+Z`) hotkey at the OS level so you can undo from any app — you don't have to click back into Omniscio to reach the toast. Pressing it cancels the **most-recently-scheduled** pending send (LIFO — "undo the thing I just did"). The moment the last pending send drains (whether it fired, got cancelled, or errored), Omniscio **releases** the Ctrl+Z hotkey so it stops shadowing undo in your other apps. So Ctrl+Z is only claimed during the brief send windows, never persistently.

This is deliberately LIFO and single-shot: if you queue two quick emails in quick succession, the first Ctrl+Z cancels the second one (the latest), a second Ctrl+Z cancels the first.

### Saved recipients (Settings → System → Quick Email)

The Quick Email settings card lives under **Settings → System**:

- **Enable Quick Email** — the master toggle (`quickEmailEnabled`). Off hides the Email tab and unregisters all per-recipient hotkeys.
- **Recipients** — up to **50** saved addresses (a high safety ceiling, not a feature limit — a hand-typed list never approaches it; the bound just guards a corrupt config), each with a display **Name** (optional — just a label) and an **Email** (required; validated as an email) plus an optional **hotkey**. These are the rows the composer dropdown shows. Click **Add Recipient** to get a blank row, type into it, and it saves automatically when you click away (on blur) — but only once the email is valid, so a half-typed or blank row never triggers a "could not save" error. Removing a recipient or setting its hotkey saves immediately. **Drag a row by its grip handle (⋮⋮) to reorder** — this order is the composer dropdown's order, so put your most-used recipient on top for the quickest pick. (There's no default recipient — the composer's To field starts blank — so reordering sets the list order, not a preselection. The grip is desktop-only.) Above the rows there's also a **Search your contacts** box that fills a row for you from your real people — see [Auto-detect from your contacts](#auto-detect-from-your-contacts) below.
- **Recipient hotkeys** — the per-recipient global-hotkey master toggle (`quickEmailHotkeysEnabled`). Off means no recipient hotkey registers regardless of each recipient's `hotkey` value.
- **Undo window** — seconds the email is held before it actually sends (`quickEmailUndoSeconds`, default 10, clamped 1–30).
- **Show subject by default** — whether the composer shows the Subject field on open (`quickEmailShowSubjectByDefault`, default off).
- **Auto-capitalize body** — capitalize the message body as you type: the first word, sentence starts (after `. ! ?`), and the start of each new paragraph, skipping links, paths, and abbreviations (`autoCapitalizeQuickEmail`, default **on**). Turn it off if you'd rather control capitalization yourself. It reuses the same capitalization used by the Tasks quick-add box, so it behaves consistently across the app; it's a free local text tidy that never sends anything anywhere or costs anything.
- **Signature** — an optional short sign-off (`quickEmailSignature`, default empty) appended to the **body** of every quick email you send, after a blank line. It's a free-text box saved when you click away (on blur), and it renders markdown like a body does. This is **Quick-Email-specific** — it is NOT your Gmail web signature (the API send path never applies that); leave it blank (the default) for bare quick emails, so nothing changes until you type one. A subject-only quick email with a signature set sends the signature as its body.

### Auto-detect from your contacts

Building the recipient list by hand is optional. At the top of the **Recipients** box there's a **Search your contacts** field: start typing a name or email and Omniscio suggests your real people — your most-emailed contacts first — and picking one drops in a filled-in row (name + email). It pulls from **three places at once**: your **Google Contacts** address book (for the names), **who you email most** (a scan of your recent sent mail, for the ranking), and **who emails you** (a scan of your recent inbox, so people you've only *received* mail from also show up). People already in your list are never suggested twice, and the box hides once you hit the recipient cap.

#### Address book contacts (People API)

Omniscio reads your Google Contacts address book (up to 300 contacts) via the People API `contacts.readonly` scope. This is additive to the existing Gmail scope — a **read-only** permission that Omniscio asks for separately from sending. The contact lookup happens entirely inside Omniscio; suggestions are never saved to disk.

**Existing users** whose Google token predates this feature see a one-time **Reconnect Google** inbox alert the first time the address book lookup fails for a missing scope. Clicking it grants the new permission; until then, the mail-scan sources still work on their own. **New users** connecting Google for the first time get both scopes up front.

#### Three-source merge

The three sources are merged into a single ranked list:

1. **Most-emailed first** — ranked by frequency, combining your **sent** mail (weighted higher) and your **received** mail (weighted lower), so people you actually write to lead the list and people who only email you still appear.
2. **Address-book contacts not in the mail sample** — sorted alphabetically.
3. **De-duplicated by email** — when a person appears in more than one source, the address-book name wins over a mail-header display name.

**Automated senders** (no-reply, mailer-daemon, notifications, and the like) are filtered out of the received-mail source so your inbox robots don't clutter suggestions. Reading your inbox needs **no new permission** — it's covered by the Gmail access Omniscio already has. Any source can fail independently without breaking the others; if all of them come up empty and one failed, the picker shows a status hint and you can always type an address manually.

#### Live search as you type (composer)

In the Quick Email composer's recipient box, once you've typed **two or more letters** Omniscio *also* runs a quick **live search of your Google Contacts** and adds any further matches beneath the instant local list — so a saved contact that wasn't in the pre-loaded batch still turns up. It's debounced (it searches when you pause, not on every keystroke), never blocks the instant matches, and silently does nothing if it can't reach Google. This live search covers your **saved contacts**; people you've emailed or received from are already covered by the pre-loaded list above.

#### Forward Email automation autocomplete

The same contact suggestions also power the **Forward Email** automation's recipient picker. When configuring a `forward_email` automation action, the `MultiRecipientPicker` component offers autocomplete from the same `QUICK_EMAIL_SUGGEST_CONTACTS` channel — so you get the same people suggestions (including the received-mail sources) when setting up automation forwarding rules as you do in the Quick Email composer. It **also runs the same live search of your Google Contacts as you type** (2+ letters), merged below the instant matches and deduped against the recipients you've already added.

The first time you use contact suggestions in either surface you may see a one-click **Reconnect Google** (or **Connect Google**) prompt. If contacts can't be read for any reason, the picker says so and you can still type addresses by hand — nothing breaks. Contact suggestions are **desktop-only** (there is no mobile Quick Launch or automation-config surface).

### Defaults

- **Quick Email**: disabled (`quickEmailEnabled: false`). You opt in.
- **Recipients**: none (`quickEmailRecipients: []`); cap is 50 (a defensive ceiling, not a real limit). Saved order = composer dropdown order (drag to reorder).
- **Per-recipient hotkeys**: disabled (`quickEmailHotkeysEnabled: false`), and each recipient's hotkey is empty.
- **Undo window**: 10 seconds (`quickEmailUndoSeconds: 10`).
- **Subject field**: hidden on open (`quickEmailShowSubjectByDefault: false`) — body-only is the common case.
- **Auto-capitalize body**: on (`autoCapitalizeQuickEmail: true`) — the one default-on Quick Email setting; opt out in Settings if you'd rather control capitalization yourself.
- **Signature**: empty (`quickEmailSignature: ''`) — no signature is appended until you type one.
- **Recipient preselection**: none by default — the **To** field starts blank. The only two things that fill it in are a per-recipient hotkey (fresh explicit intent) and a restored unsent draft (your own earlier pick coming back); Omniscio never auto-picks a default recipient.

### Design decisions worth knowing

1. **Send-with-undo instead of a confirm dialog.** A "are you sure?" modal would defeat the two-keystroke goal. The undo window lets the common case (send and move on) stay frictionless while still giving you a safety net for the typo'd recipient or the half-finished thought. The default 10s is enough to notice "wait, wrong person" without making correct sends feel slow.

2. **The composer schedules; the service owns the timer.** The Quick Launch tab closes on submit, so it can't host the undo window itself. The main-side service holds the pending map and the timers, and the toast layer lives in the persistent main window (`useQuickEmailPushEvents` mounted from `App.tsx`). That separation is why the undo toast survives the composer closing.

3. **`ShortcutBridge` is injected, not imported.** The service singleton is constructed at module-import time — well before `app.whenReady()`, when Electron can't register OS hotkeys yet. Injecting the bridge after ready (and letting tests pass `vi.fn()` pairs) keeps the service unit-testable with zero Electron mocking, and lets `setShortcutBridge(null)` cleanly release the hotkey on shutdown.

4. **Ctrl+Z is claimed only during pending windows.** A persistent global Ctrl+Z would shadow undo in every other app forever. Claiming on 0→1 and releasing on 1→0 means the hotkey is live for at most a few seconds at a time, only while there's actually something to undo.

5. **The hotkey planner is pure logic, split from Electron.** The "which accelerator wins, which is skipped and why" decisions are unit-tested without touching `globalShortcut`. The same split predates Quick Email (it already covered focus/Omni/Quick Launch); per-recipient hotkeys just extend the candidate list.

6. **Recipients capped at 50, and reorderable by drag.** Originally a 6-row speed-dial; the cap was raised to **50** — a defensive ceiling against a runaway/corrupt config, not a real limit a user would hit — so the list can grow without a wall. Rows became **drag-reorderable** (shared `useDragReorder` hook + the pure `reorderRecipients` reducer), so the dropdown order, and the preselected first row, is the user's call rather than insertion order. The grip handle is desktop-only (Quick Email is a desktop feature).

## For agents

Everything the app does behind that surface — the tab component and its fixed window size, the main-side send pipeline and its undo timer, the durable send-later path, how contact suggestions are ranked and searched, the global Ctrl+Z shortcut bridge, the settings schema that owns the field names and their bounds, and every key file — is in [Quick Email (Control Space → Email tab) (part 2)](quick-email-part-2.md).

## Related

- [quick-launch-modal.md](quick-launch-modal.md) — the parent feature. Email is one tab inside Quick Launch; everything about the global hotkey, the floating BrowserWindow, voice mic suppression, project chip, and tab strip behavior lives there.
- [alarm-quick-add.md](alarm-quick-add.md) / [calendar-quick-add.md](calendar-quick-add.md) — sibling Quick Launch tabs. Same "single-purpose tab inside Control Space" shape; those two share a natural-language parser, whereas Quick Email is a structured recipient + body form.
- [keyboard-shortcuts.md](keyboard-shortcuts.md) — Ctrl+Space (Quick Launch) and how to rebind app hotkeys. Per-recipient Quick Email hotkeys are configured in the Quick Email settings card, not the Keybindings panel.
