---
title: PM Voice Actions
---

# PM Voice Actions

## What it is

**PM Voice Actions** are hands-free project management operations -- say what you want done on a
board instead of clicking.

Voice commands let you create, move, update status, read, and list PM items using natural speech.
The system recognizes ordinary phrasing (not rigid templates) and tolerates small words like
articles.

## Where to find it

There is no panel to open. Voice commands work on recognized speech, so they are available wherever
you are in the app -- you name the board or the item you mean and the command applies to it. Which
speech recognition engine is listening is a setting of its own, and changing it changes nothing
about which commands are understood.

## How it behaves

Supported actions:

- **Create an item** on a board
- **Move an item** to a different group or status
- **Update status** of an item
- **Read an item** aloud (name, status, assignee)
- **List items** on a board or assigned to you

Read and list commands work offline (they resolve against the local SQLite mirror). Create, move,
and status-update require a live connection and will not falsely report success when offline.

## For agents

Defined in `src/shared/ipc-channels/pm.ts`:

- `PM_VOICE_*` channels for voice command dispatch
- `PM_SEMANTIC_SEARCH` for meaning-based item lookup

Response types are in `src/shared/ipc-response-map/pm-voice.ts`.

The speech-to-text provider is swappable (`voiceSttProvider` setting) -- Deepgram by default, with
on-device Whisper as an alternative. The command layer works on recognized text, so changing the
provider changes nothing about command recognition.

Regex patterns in `voice-intent-regex-commands.ts` match voice input to PM intents. Pattern ordering
matters: `pm:list-items` must come before `pm:read-item` (whose trailing wildcard would otherwise
swallow list triggers). An optional-article pattern `(?:an?\s+)?` covers both "a" and "an".

Item resolution uses `findItemByName()` against the local SQLite mirror. Board resolution falls back
to `getFirstBoard()` when no board ID is given. Writes proxy through `pmAuthedFetch`.

**Settings**: `voiceSttProvider` -- which speech recognition provider to use.

## Related

The board operations these commands perform are described in
[mission-control.md](mission-control.md), the parent page. Because voice is a whole-app surface
rather than a board one, [voice-and-tts.md](voice-and-tts.md) is the page to read for the voice
system as a whole -- how speech is captured, and what else it can drive. The full behavioural
contract is recorded in
[pm-voice-actions-contract.md](../../.claude/memory/contracts/pm-voice-actions-contract.md), and
every other page in this library is listed in [INDEX.md](INDEX.md).
