Skip to content

Stream Deck

Open /streamdeck in the GUI to use the browser emulator, or install the physical Stream Deck + sidecar. Both surfaces show the same fleet state and provide the same agent controls.

Desktop Stream Deck emulator showing synthetic agent keys

Drive the four modes

ModeEnter itKeysTouch stripDials A to D
GridInitial viewUp to eight agent keysFleet summary, provider meters, pageA: no action. B: scroll physical provider panel. C: no action. D: page agents; press for next window.
CommandPress an agent keyPause/Play, Logs, Mic, Settings, Commands, plus Send and Cancel once dictation has textSelected agent status and progress, or the voice panel while dictatingA: Grid. B/C: no action. D: press for Logs.
SettingsPress Settings in CommandOne key per detected microphone, then TestMic and a paging key; text pane in the emulatorSelected microphone, or the voice panel while TestMic is heldA: Command.
LogsPress Logs or dial DUp to seven event keys plus LIVEFive transcript rowsA: scroll transcript; press for Command. B/C: no action. D: scroll event keys.
CommandsPress Commands in CommandHistory keys; then option keys, Mic, and Approve/CancelCommand question, reading, OPEN/ANSWERED statusA: back a view. D: page history or options; press to approve.
Control stateBehavior
PauseThe label reflects the selected agent's current state.
Read-only DashboardPause and Mic are disabled; Logs and Settings stay available because they change what you see, not what the fleet does.
MicMic is press-and-hold, not a click; capture stops on release, cancellation, or mode change.
PriorityThere is no prioritize key; the microphone took the fourth slot. Priority stays a Dashboard control and shows on the deck as a star and in Grid ranking.

Read the Logs surface

Logs runs from oldest at the far left to newest at the far right.

KeyMeaning
Ticket openedLeftmost origin; owns transcript lines before the first event.
Event keyOne ticket event: progress, phase, comment, CI, PR, decision, or attention.
LIVERightmost current view; uses the selected agent's lane, provider, ticket, and progress face.

Transcript lines stay beneath the event active when they arrived; agent prose is not promoted into extra event keys.

Selection and live typing

ActionResult
Press an event keyActivates it, scrolls to the event, and deactivates LIVE.
Press LIVEJumps to the newest transcript line.
Turn dial AScrolls the transcript and updates the active event key.
Enter LogsOpens at LIVE.
New text while LIVEReveals the message as it arrives and follows the feed.
Scroll away from LIVEStops following so history stays still.

Transcript styling

RowDisplay
Agent proseBright, without a label.
Tool callGlyph gutter; muted after completion.
Shell command$ prefix.
Operator messageColoured bar.
File editUnified diff with tinted added and removed rows.

Progress bars

StateMeaningDisplay
FreshRecent readingSolid green bar, slightly brighter at 100%.
UnknownNo reading has ever arrivedFull-width flat grey bar and dot, distinct from measured progress.
0%A real zero readingShort solid stub, so "just started" never looks like "no reading".

A bar that drops to an empty track and back is a bug; report it.

How Grid chooses agent keys

RuleOrder
State bucketsalertstuckrunningpausedqueued
Queued ticketsDependency-ready before blocked.
Slot orderColumn-major: 1/2, then 3/4, then 5/6, then 7/8.
PagingMoves by columns so each pair stays together.

The order is the same in the browser emulator and on the physical deck.

Physical sidecar status

The Linux x64 archive installs the sidecar, a systemd user service, and the udev rule required to access the device.

RequirementValue
HardwareStream Deck +
SessionArch Linux graphical session with systemd/logind
Device accessInstalled udev rule and users fallback ACL
UnsupportedAlpine/musl, ARM, and glibc older than 2.28

The supported deployment is Arch Linux on x64 glibc 2.28+.

The service applies STREAMDECK_BRIGHTNESS, reconnects after device hotplug, suspend, or a dashboard disconnect, and keeps the keys and touch strip current with the live fleet.

SettingWhere
AIUR_PHOENIX_URL~/.config/aiur/streamdeck.env
AIUR_DASHBOARD_USERNAME~/.config/aiur/streamdeck.env
AIUR_DASHBOARD_PASSWORD~/.config/aiur/streamdeck.env
STREAMDECK_BRIGHTNESSSidecar environment

The password mints the channel token and never enters the WebSocket URL.

The Stream Deck runbook covers installation, device access, pairing, and recovery.

Voice input

Voice input captures speech from a microphone attached to the sidecar machine, transcribes it to English text, and sends that text to the selected agent as an operator message.

The keys

Voice lives in the agent view, reached by pressing an agent key in Grid.

KeySlotBehavior
Pause/PlayFirstPauses or resumes the selected agent.
LogsSecondOpens the Logs surface.
MicThirdPress-and-hold; live only while held.
SettingsFourthOpens the microphone picker on the deck, or a text pane in the emulator; dial A backs out of either.
CommandsFifthOpens the agent's Command history; always present, so its absence can never be mistaken for "no Commands".
SendSixth, once dictation has textDelivers the accumulated text to the agent.
CancelSeventh, once dictation has textDiscards the accumulated text.

The emulator shows a text pane because the microphones are attached to the machine running the sidecar, which a browser tab cannot see.

Dictate to an agent

Select an agent in Grid, then hold Mic and speak.

StepWhat happens
Hold MicThe touch strip becomes the voice panel: scrolling waveform, level bar, and text as it settles.
ReleaseSettled text stays; the in-flight phrase is dropped, so a half-heard word cannot be sent.
Hold againTranscription accumulates across holds rather than replacing the previous phrase.
SendUses the same path as the Dashboard composer, so the message enters the agent transcript and its next turn.
CancelDiscards the buffer and leaves you in the agent view.
Back out to GridDiscards the buffer, so a message about one ticket never follows you into the next.

Open Logs after sending to find your own message at the live end of the feed.

Choose a microphone

Settings lists the microphones attached to the sidecar's machine, six to a page.

Control or stateBehavior
Microphone keySelects that device; the selected key wears the same plate, rail, and chip that marks the active key in Logs.
Paging keyEighth key; present when more than six devices are attached.
TestMicSeventh key; hold it to see the voice panel without delivering anything to an agent.
Stored choice~/.config/aiur/streamdeck-mic.json; survives a sidecar restart.
Chosen device absentCapture falls back to the first available device and keeps the stored preference.
No microphone at allThe pane says so rather than showing an empty grid.

The waveform and level bar are computed on the sidecar, so they keep moving with no ElevenLabs key configured; the panel then shows the reason where the text would be.

Voice replies are out of scope

The deck transcribes and does not speak, so it needs only the Speech to Text and User permissions.

The Dashboard agent conversation uses the same server-held credential for interactive spoken replies when Text to Speech permission and elevenlabs.voice_id are configured.

Configure it

SettingValue
API keyELEVENLABS_API_KEY in a private environment file.
Config referenceelevenlabs.api_key: $ELEVENLABS_API_KEY
Languageelevenlabs.language_code: eng
Required permissionsSpeech to Text and User; see ElevenLabs.
Optional voiceelevenlabs.voice_id; enables Dashboard spoken replies when set.
yaml
elevenlabs:
  api_key: $ELEVENLABS_API_KEY
  language_code: eng
  voice_id: null # optional; enables Dashboard spoken replies when set

Prefer the environment reference over a literal key. See Configuration for field defaults.

Availability and privacy

StateWhat the operator can expect
Key configuredHeld microphone audio goes to Aiur, then to ElevenLabs; returned text goes to the selected agent.
Key absentDevice selection, waveform, and level meters work; transcription does not; no audio leaves the machine.
Capture releasedAudio capture stops; there is no always-on listener or wake word.
Transcript returnedText stays in memory until sent or discarded; nothing writes it to disk.
Coding agent launchedELEVENLABS_API_KEY is removed from its environment and never logged.

The Units meter reads the ElevenLabs credit quota as percentage used and the amount due on the next invoice, not speech-to-text audio-minute spend; see ElevenLabs metering.

Without a key

The key is optional and its absence is not an error.

SurfaceBehavior with no key
Microphone selection, waveform, level metersKeep working; the sidecar computes them locally.
TranscriptionUnavailable, because there is nowhere to send audio.
Mic keyExplains itself with the connect-time reason Aiur has no ElevenLabs API key - transcription is off.

Where your voice goes

This is the one part of Aiur that sends operator data to a third party.

Aiur holds the credential and Aiur performs the ElevenLabs call. The sidecar never sees the key.

StepPath a spoken word takes
1The sidecar captures 16 kHz mono audio from the microphone on its own machine.
2It sends that audio to Aiur over the same authenticated Stream Deck channel it uses for fleet state, not to any third party.
3Aiur opens the ElevenLabs connection with the key from its own configuration and streams the audio on.
4ElevenLabs returns text and Aiur pushes it back to the deck.
5The sidecar corrects unambiguous mishearings of the coined name before display or delivery.
6The finished message reaches the agent through the ordinary agent-message path.
Heard asResult
aeor, iyer, ayer, A, yourCorrected to Aiur.
higher, iron, ire, IRLeft unchanged, rather than corrupting a real word or acronym.
ConditionConsequence
Key configuredMicrophone audio reaches ElevenLabs and the transcribed text comes back; both leave your machine.
Key absentNo audio leaves your machine and no ElevenLabs connection is opened.
Mic releasedCapture stops; there is no always-on listening and no wake word.
Waveform and level meterComputed on the sidecar, so "is my microphone working" is answered locally; only transcribed text makes the trip.
TranscriptsHeld in memory until sent or discarded; nothing writes them to disk.

Key handling

ELEVENLABS_API_KEY is a secret and is treated as one.

RuleWhy
Configured only in Aiur's own configurationNo sidecar environment file carries it; the sidecar is given no way to hold it.
Scrubbed from coding-agent environmentsEvery *_API_KEY variable is removed, so an agent cannot read it.
Never logged or attached to a failure reasonA connection failure is reported generically instead.

Supported microphones

PipeWire and PulseAudio microphones are supported, including ALSA, USB, and Bluetooth devices. Output-monitor sources are not offered as microphones.

Answer agent Commands

The Commands key on the agent row opens the focused agent's Command history — past Commands newest-first, active ones highlighted — and is always present, so its absence can never be mistaken for "no Commands".

KeyMeaning
Command keyOne Command; an amber OPEN badge marks an answerable one, a muted ANSWERED badge a completed one.
MicAlways present in an open Command's detail; press-and-hold to dictate.
ApproveAppears while dictated text is held; sending it is a deliberate second action.
CancelAppears while dictated text is held; discards it.

Answer one Command

Press a Command key to enter its detail: the description paints the bottom panel and the options paint the key row, four to a page.

StepWhat happens
Press an option keyReads that option's detail in the bottom panel. Selecting is reading, never committing.
Dial DPages the options (or the history, on the history view).
Press dial DApproves the selected option — the deliberate second action that turns a read into an answer.
Hold MicDictates a free-text response, shown building in the bottom panel.
ApproveSends the spoken text as the answer; it takes precedence over any listed option ("none of the above").
CancelDiscards the spoken text.
Back (dial A)Leaves the detail for history, then returns to the agent row.

The Approve state is unmistakable: when an answer is armed the strip shows a green APPROVE label, the one strip element that commits a durable operator decision. Completed Commands are read-only — they show what was asked and what was decided, with no Approve affordance.

Attribution

An answer given on the deck is recorded with operator attribution (operator / streamdeck) — the same authoritative path as a Dashboard answer. It is never an Executor answer with an operator flavour in free text.

That is also what lets the deck answer human_required Commands an Executor cannot. Answers are only accepted for the agent currently focused on the deck.

Authority

A plugged-in deck is a permanently-authorized operator client — equivalent to a permanently logged-in browser. The 300-second channel-token expiry bounds the socket, not the device's standing authority: the sidecar stores the dashboard credentials and re-mints the token itself over HTTP Basic.

A plugged-in deck stays authorized for as long as it sits on the desk; it is not a device whose authority expires and must be re-granted. That is by design, and it is what lets the deck answer human_required and irreversible Commands — the floor constrains automation, not the operator.

The same property means a stolen or unattended deck carries full operator authority, so treat it like a logged-in session rather than a token that quietly lapses. Answers remain version-checked regardless: the deck answers the exact Command version it read, and a stale press is rejected as a conflict — never recorded as a second decision.

Aiur holds a streaming connection to ElevenLabs, so transcription results can appear while you are still speaking rather than after you release the key. If the selected microphone stops producing audio or disconnects, capture reports the problem instead of remaining in a false listening state.

Command macro, delegate micro, maximize APM.