---
title: Meeting Rooms (one-click speed-dial for your meeting links)
---

# Meeting Rooms

## What it is

### What it is

Meeting Rooms is a speed-dial for video conferencing links across multiple platforms: Zoom, Google Meet, Microsoft Teams, Skype, Webex, and any other meeting URL. Store recurring meeting URLs and people's personal room links, then launch them with one click or a keyboard shortcut. There is no API integration or OAuth for any platform; the feature is a local bookmark + launcher that opens links in your default browser via `shell.openExternal()`.

The feature appears as a **Video** icon entry in the Omniscio sidebar under the agent tools group. It is **disabled by default** (`meetingRoomsEnabled: false` in Settings). When the user enables it at **Settings → Agent Tools → Meeting Rooms**, the sidebar row is created and the Ctrl+Shift+Z palette shortcut becomes active. When disabled, the sidebar entry is hidden and the palette shortcut is suppressed. Stored rooms are preserved across toggles.

Two use cases:

1. **General** — store predetermined meeting links (recurring standups, team syncs, one-on-ones) so you don't have to dig through calendar invites or Slack messages.
2. **Personal rooms** — store people's standing personal room links ("Sarah's Room" with her personal meeting URL) for instant access. Personal rooms are tagged with a badge so you can tell them apart from one-off meeting links.

All data is **local-only** — rooms live in the SQLite `zoom_rooms` table inside `mission-control.db`. Nothing syncs to any external service.

## Where to find it

The **Meeting Rooms** entry in the sidebar opens the room list; the **Ctrl+Shift+Z** command palette reaches a room from anywhere. The enable switch is in **Settings → Agent Tools → Meeting Rooms**.

## How it behaves

### Supported platforms

Each room has a `platform` field identifying which conferencing service it belongs to. The platform is auto-detected from the URL when creating or editing a room, and can be overridden manually via a dropdown.

| Platform     | Detection                                          | Badge color |
| ------------ | -------------------------------------------------- | ----------- |
| Zoom         | `*.zoom.us`, `zoom.us`, `*.zoom.com`, `zoom.com`  | Blue        |
| Google Meet  | `meet.google.com`                                  | Green       |
| Teams        | `teams.microsoft.com`, `teams.live.com`            | Purple      |
| Skype        | `*.skype.com`, `join.skype.com`                    | Cyan        |
| Webex        | `*.webex.com`                                      | Orange      |
| Other        | Any unrecognized URL                               | Gray        |

Detection uses `new URL(url).hostname` matching (not regex) to prevent subdomain spoofing. The detection logic lives in [src/shared/meeting-platform.ts](../../src/shared/meeting-platform.ts).

### How to use it

### Add a room

1. Click the **Meeting Rooms** entry in the sidebar to open the virtual project view.
2. Click the **+ Add Room** button in the header (or the call-to-action in the empty state).
3. Fill in the form:
   - **Name** (required) — a short label like "Daily Standup" or "Sarah's Room".
   - **Meeting URL** (required) — the full meeting URL. Must start with `https://` (the `http://` protocol is auto-upgraded).
   - **Platform** — auto-detected from the URL, shown as a dropdown. Can be overridden manually.
   - **Category** (optional) — free-text grouping like "Engineering", "1:1s", "All Hands". Rooms with the same category are grouped together in the view.
   - **Personal Room** (optional) — toggle on if this is someone's standing personal room. Adds a "Personal" badge to the room card.
   - **Keyboard Shortcut** (optional) — a text label for the shortcut (display-only in v1; per-room global shortcuts are deferred).
4. Press **Ctrl+Enter** or click **Save**.

### Launch a room

- **From the view**: Click any room card. Omniscio opens the URL in your default browser via `shell.openExternal()` and records the launch time.
- **From the command palette**: Press **Ctrl+Shift+Z** to open the Meeting Rooms palette. Type to filter by name, URL, or category. Press Enter or click a result to launch. Recently-launched rooms sort first.

### Edit or delete a room

Each room card has pencil (edit) and trash (delete) buttons. Edit opens the same form as Add, pre-filled. Delete shows a confirmation dialog before removing the room.

### Reorder rooms

Rooms display in `display_order` within their category group. Drag any room card within its category to reorder it — the new position persists immediately via the `meeting-rooms:reorder` IPC. Each category group is an independent drag zone (rooms cannot be dragged across categories). The drag interaction uses the standard `useDragReorder` hook with a Notion-style drop indicator.

### Command palette (Ctrl+Shift+Z)

The palette is built on `CommandPaletteShell` — the same shell used by Super Prompts (Ctrl+Shift+K) and Session Search (Ctrl+K). It:

- Opens centered at the top of the window with a search input.
- Filters rooms by name, URL, or category as you type (case-insensitive substring match).
- Sorts results by most-recently-launched first (rooms never launched sort last, alphabetically).
- Shows a colored platform badge next to each room name.
- Launches on Enter or click, then closes.
- Has a "Manage rooms" footer link that navigates to the Meeting Rooms virtual project.
- Lazy-loads via `MeetingPaletteGate` (a `CustomEvent`-driven gate component mounted in `App.tsx`) so the palette code is not in the main bundle.

The shortcut is defined in `keybindings.ts` as `openMeetingPalette` with default binding `Ctrl+Shift+Z`. It is suppressed when `meetingRoomsEnabled` is `false`.

### Settings

**Settings → Agent Tools → Meeting Rooms** holds a single **Enable Meeting Rooms** toggle bound to the `meetingRoomsEnabled` setting (default `false`). When toggled on, the main process creates the virtual project row in the sidebar and emits `PROJECTS_CHANGED`. The Ctrl+Shift+Z palette shortcut and `MeetingPaletteGate` event listener are also gated on this flag. When off, the sidebar entry is hidden and the palette is inactive. Stored rooms are preserved — nothing is deleted.

The setting is searchable via the settings search index with keywords: meeting, zoom, video call, room, standup, quick launch, video conference, google meet, teams, skype, webex.

### Data model

The `zoom_rooms` table (migration v166, platform column added by ledger migration):

| Column             | Type    | Notes                                                |
| ------------------ | ------- | ---------------------------------------------------- |
| `id`               | TEXT PK | UUID, generated on create                            |
| `name`             | TEXT    | NOT NULL, room display name                          |
| `url`              | TEXT    | NOT NULL, must be `https://`                         |
| `platform`         | TEXT    | NOT NULL, DEFAULT 'zoom', one of the 6 platform ids  |
| `category`         | TEXT    | Nullable, free-text grouping                         |
| `is_personal_room` | INTEGER | 0 or 1, default 0                                   |
| `shortcut`         | TEXT    | Nullable, display-only label                         |
| `display_order`    | INTEGER | NOT NULL, sequential within the full list            |
| `last_launched_at` | TEXT    | Nullable ISO timestamp, updated on launch            |
| `created_at`       | TEXT    | NOT NULL, ISO timestamp                              |
| `updated_at`       | TEXT    | NOT NULL, ISO timestamp                              |

Indexes: `idx_zoom_rooms_category` on `category`, `idx_zoom_rooms_order` on `display_order`.

## For agents

### How it works

- **Platform detection**: [src/shared/meeting-platform.ts](../../src/shared/meeting-platform.ts) — `MeetingPlatform` type, `detectPlatformFromUrl()`, `PLATFORM_DISPLAY` config.
- **Queries**: [src/main/db/meeting-rooms-queries.ts](../../src/main/db/meeting-rooms-queries.ts) — `listMeetingRooms`, `createMeetingRoom`, `updateMeetingRoom`, `deleteMeetingRoom`, `reorderMeetingRooms`, `touchLastLaunched`. Follows the `bookmarks-queries.ts` pattern (internal `DbRow` + camelCase API mapper).
- **Launcher**: [src/main/services/meeting-launcher.ts](../../src/main/services/meeting-launcher.ts) — validates `https:` protocol, calls `shell.openExternal()`, updates `last_launched_at`, per-id 200ms debounce.
- **IPC handlers**: [src/main/ipc/meeting-rooms-handlers.ts](../../src/main/ipc/meeting-rooms-handlers.ts) — 6 handlers via `wrapHandler()`, mutations emit `MEETING_ROOMS_CHANGED` push.
- **IPC channels**: `meeting-rooms:list`, `meeting-rooms:create`, `meeting-rooms:update`, `meeting-rooms:delete`, `meeting-rooms:launch`, `meeting-rooms:reorder`, plus `meeting-rooms:changed` push event.
- **Zustand store**: [src/renderer/src/stores/meeting-rooms-store.ts](../../src/renderer/src/stores/meeting-rooms-store.ts) — rooms, loading, CRUD actions, push-listener re-fetch.
- **View**: [src/renderer/src/features/meeting-rooms/MeetingRoomsView.tsx](../../src/renderer/src/features/meeting-rooms/MeetingRoomsView.tsx) — virtual project panel with category-grouped room cards; each category group is an independent `useDragReorder` drag zone. Platform badges render next to room names.
- **Utils**: [src/renderer/src/features/meeting-rooms/meeting-rooms-utils.ts](../../src/renderer/src/features/meeting-rooms/meeting-rooms-utils.ts) — `groupByCategory` + `buildReorderedIds`.
- **Form**: [src/renderer/src/features/meeting-rooms/MeetingRoomFormModal.tsx](../../src/renderer/src/features/meeting-rooms/MeetingRoomFormModal.tsx) — `DialogShell`-based create/edit form with platform dropdown and URL-based auto-detection.
- **Palette**: [src/renderer/src/features/meeting-rooms/MeetingPalette.tsx](../../src/renderer/src/features/meeting-rooms/MeetingPalette.tsx) — `CommandPaletteShell`-based speed-dial with platform badges.
- **Palette gate**: [src/renderer/src/features/meeting-rooms/MeetingPaletteGate.tsx](../../src/renderer/src/features/meeting-rooms/MeetingPaletteGate.tsx) — lazy-loads `MeetingPalette` on `toggle-meeting-palette` CustomEvent.
- **UI registry**: [src/renderer/src/integrations/ui-registry.ts](../../src/renderer/src/integrations/ui-registry.ts) — `Video` icon, `text-blue-500`, lazy panel.
- **Integration manifest**: [src/shared/integrations/meeting-rooms.ts](../../src/shared/integrations/meeting-rooms.ts) — id `meeting-rooms`, `parentGroupId: 'agent-tools'`.
- **CLI routes**: [src/main/services/cli/cli-server-meeting-rooms-routes.ts](../../src/main/services/cli/cli-server-meeting-rooms-routes.ts) — 6 routes at `/meeting-rooms/*` for external automation.

## Related

### Related

- [bookmarks.md](bookmarks.md) — Bookmarks is a general-purpose launcher (URLs, paths, executables, commands). Meeting Rooms is purpose-built for video conferencing links with categories, personal-room badges, platform detection, and a dedicated command palette.
- [keyboard-shortcuts.md](keyboard-shortcuts.md) — Ctrl+Shift+Z is the Meeting Rooms palette shortcut; rebindable via Settings → Keyboard Shortcuts.

