---
title: Quick SMS (Control Space → SMS tab)
---

# Quick SMS (Control Space → SMS tab)

## What it is

A tab inside the Quick Launch / Control Space floating composer (Ctrl+Space → **SMS** tab) for firing off a text without leaving the keyboard — the SMS sibling of the [Quick Email](quick-email.md) tab. Pick a recipient, type a message, press **Ctrl/Cmd+Enter**; the text sends through Omniscio's existing SMS pipeline after a few-second **undoable** delay, and the composer closes immediately.

This is the "quick text to someone I message a lot" path. It is **not** a full SMS client — there is no picture/GIF/MMS, no conversation thread, no inbox. Those live in the main **SMS** view; the Quick Launch tab is deliberately a lean text-only quick-send.

The tab is **gated on `smsEnabled`** (off by default). With SMS disabled at **Settings → SMS**, the tab is hidden from the Quick Launch strip. When SMS is enabled but the provider (Pushbullet or the native phone endpoint) isn't connected yet, the tab shows a short "SMS isn't connected yet — open Settings → SMS" message instead of a form that couldn't send.

What it looks like (SMS tab, connected):

- A **To** combobox. It merges your **saved SMS favorites** with people you've **recently texted** (from your SMS conversations), deduplicated by number with favorites first. Because a phone number is an **open** set (unlike the closed Message/DM roster), you can also just **type any number** — a "Text \<number\>" row appears once what you've typed looks like a phone number. The cursor starts here on open.
- A **Message** textarea with placeholder _"Type your message…"_. Like the Email tab, **plain Enter (and Shift+Enter) inserts a newline** — you send with **Ctrl/Cmd+Enter**.
- A footer with **Cancel** + **Send text** (the latter also fires on Ctrl/Cmd+Enter). Send is disabled until a recipient is set **and** the message is non-empty.

Because you can always type a number, the tab is **never a dead-end** — even with zero favorites and no texting history you can address a text.

## Where to find it

The tab lives inside the **Quick Launch / Control Space** floating composer: press **Ctrl+Space** and click the **SMS** tab. If the tab isn't already in the strip, pin it first from **Settings → Quick Launch tabs**. It only appears when SMS is enabled at **Settings → SMS**, and that same Settings page is where the **SMS Favorites** card sits.

## How it behaves

### How to use it

1. **Open** — Ctrl+Space, then click the **SMS** tab (pin it first from **Settings → Quick Launch tabs** if it isn't in the strip). SMS must be enabled.
2. **Pick who** — choose a favorite or a recently-texted contact from the dropdown, or type any phone number.
3. **Type + send** — write your message and press **Ctrl/Cmd+Enter** (or click **Send text**). The composer closes and a **"Sending to \<name\>…"** toast appears in the main Omniscio window with an **Undo** button and a ~6-second countdown. The text does **not** go out yet.
4. **Undo (optional)** — click **Undo** on the toast within the window and nothing is sent. When the window elapses, the text sends through your SMS provider and a brief **"Sent to \<name\>"** confirmation replaces the toast. If the send fails (phone offline, rate-limited, auth expired) you get a humanized error toast instead — never a silent drop.

If the _scheduling_ step is rejected (SMS turned off, or the number doesn't validate), the tab stays open with an inline hint so you can fix it or copy the message out.

### SMS Favorites (Settings → SMS)

Under **Settings → SMS** there's an **SMS Favorites** card — pin the people you text most so they're one pick away in the SMS tab. Each favorite is a **Name** (optional — just a label; only the number is texted) and a **phone number** (up to **50** favorites — a defensive ceiling, not a real limit). Click **Add Favorite** for a blank row; it saves when you click away, but only once the number looks valid, so a blank/half-typed row never triggers a save error. Removing a favorite saves immediately. You don't have to build this list by hand — everyone you've already texted shows up in the SMS tab automatically; favorites just pin the ones you use most.

## For agents

### How it works (for repo-aware readers)

- **Tab + picker**: [QuickLaunchSmsTab.tsx](../../src/renderer/src/features/quick-launch/QuickLaunchSmsTab.tsx) loads favorites (`SETTINGS_GET → quickSmsRecipients`), suggestions (`SMS_LIST_CONVERSATIONS`), and the connected gate (`SMS_STATUS`) on mount, then renders [QuickSmsRecipientPicker.tsx](../../src/renderer/src/features/quick-launch/QuickSmsRecipientPicker.tsx) (favorites + suggestions merged/deduped by digits + a type-any-number ad-hoc row) plus the message box. `canSend` needs a resolved recipient + a non-empty body; a `submittingRef` blocks the Enter+Click double-fire. On a successful schedule it calls `onSuccess()` (the composer closes); a failure keeps it open with a hint.
- **Action registry**: `id: 'quick-sms'` in [quick-launch-actions.ts](../../src/shared/quick-launch-actions.ts) (`enabledSelector` = `smsEnabled`, icon `MessageSquareText`), component map entry in [quick-launch-action-components.ts](../../src/renderer/src/features/quick-launch/quick-launch-action-components.ts). Default **unpinned**.
- **Send-with-undo relay**: the composer can't host the undo toast (it closes on submit), so — like the **Message/DM** tab — it fires `QUICK_SMS_SCHEDULE` and the "Sending… Undo" toast + the timed send run in the **main window**. [quick-sms-handlers.ts](../../src/main/ipc/quick-sms-handlers.ts) validates + gates (re-checks `smsEnabled`, canonicalizes + validates the number via `phone-utils`), mints a `scheduleId`, and re-emits `QUICK_SMS_SCHEDULE_REQUEST`; [quick-sms-scheduler.ts](../../src/renderer/src/app/quick-sms-scheduler.ts) (wired in `useAppPushListeners`) shows the toast (`QUICK_SMS_UNDO_SECONDS = 6`, fixed), arms a timer, and on fire sends through the **existing** `IPC.SMS_SEND` — a provider `data.success:false` throws a humanized error toast. Undo is a **toast button only** (no global Ctrl+Z), so it never collides with Quick Email's global undo.
- **Favorites**: `quickSmsRecipients` (`[{id,name,phone}]`, default `[]`) lives in the single-source Zod slice [hotkeys-quicklaunch-settings.ts](../../src/shared/types/settings/hotkeys-quicklaunch-settings.ts); the settings card is [QuickSmsRecipientsCard.tsx](../../src/renderer/src/features/settings/sections/sms/QuickSmsRecipientsCard.tsx), which edits a local draft and commits only the valid subset (`selectPersistable` in [quick-sms-recipients-ops.ts](../../src/renderer/src/features/settings/sections/quick-sms/quick-sms-recipients-ops.ts)) on blur/remove — so a blank in-progress row never autosaves.
- **Push scope**: `QUICK_SMS_SCHEDULE_REQUEST` is registered **desktop-only** (no mobile Quick Launch surface) in [mobile-push-listener-coverage.test.ts](../../tests/unit/lint/mobile-push-listener-coverage.test.ts); `QUICK_SMS_SCHEDULE` is CLI-parity-exempt (`feature-scoped-surface`) + web-invoke-baselined.
- **Behavior lock**: [QuickLaunchSmsTab.test.tsx](../../tests/unit/features/quick-launch/QuickLaunchSmsTab.test.tsx), [quick-sms-scheduler.test.ts](../../tests/unit/app/quick-sms-scheduler.test.ts), [quick-sms-recipients-ops.test.ts](../../tests/unit/features/settings/quick-sms-recipients-ops.test.ts).

### Design decisions worth knowing

1. **DM-style relay, not the email service.** The SMS send lives in the main process already (`sendOperatorSms`), so the tab reuses the lighter **Message/DM** pattern (a main-window scheduler that fires `SMS_SEND`) rather than re-implementing Quick Email's main-process pending-map service. Less code, and the fire reuses the already-tested SMS send + its dedup.
2. **Toast-button undo, no global Ctrl+Z.** Quick Email owns a global Ctrl+Z while a send is pending; giving SMS its own would collide. The SMS undo is the toast button only — simpler and conflict-free.
3. **Reuse your text history for suggestions.** Unlike email (which had no contact store and built its own), SMS already has your conversations — so suggestions come from there for free, and favorites are an optional curated layer on top.
4. **Text-only.** Pictures/GIFs/threads stay in the full SMS view; the quick tab is a lean two-keystroke text.

## Related

The parent feature is [quick-launch-modal.md](quick-launch-modal.md) — the global hotkey, the floating window, and the tab strip this tab lives in. The email sibling is [quick-email.md](quick-email.md): it is the richer of the two (per-recipient hotkeys, Google-contact suggestions, and a main-process undo service), while SMS is the leaner take. Anything the quick tab deliberately leaves out — pictures, GIFs, conversation threads, the SMS inbox — belongs to the full SMS surfaces, whose provider connection is covered by [set-up-sms-integration.md](set-up-sms-integration.md).
