Skip to content

Docs / Voice & remote

Voice and remote access

Two features leave the keyboard behind: dictation straight into the focused pane, and a remote listener that mirrors your terminal to the RavenRemote iOS app — over the LAN, over a tailnet, or through a relay you host yourself.

Voice dictation

Dictation records from the default microphone, and on stop the audio is transcribed through Deepgram and typed into the focused pane — prompt text for an agent, a commit message, whatever the cursor is on. Audio is captured as WAV, so the sample rate travels with the bytes and nothing is resampled. There is no chord for it: dictation is started from the notch companion and from the phone.

  • The Deepgram API key lives only on your Mac, written by Settings in the terminal — the phone never sees it.
  • No key configured → it reports that plainly instead of failing silently.

The iOS remote listener

raven-term remote start (or [remote] enable = true in the config, so a headless raven-muxd comes up serving) starts a TLS listener over a persistent self-signed certificate. The phone pairs once — raven-term pairing --qrprints the code — and pins the certificate's fingerprint; every request after that carries the pairing token. It then receives live terminal deltas and sends input back: approve an agent's prompt from the couch, or check on a long build from the train.

  • Same Wi-Fi needs nothing else. A tailnet works, and so does a raven-relayyou host yourself — the phone's TLS session runs end-to-end through the relay and terminates inside raven-term, so the relay sees ciphertext only.
  • Voice input from the phone rides the same path: audio goes to the Mac, the Mac calls Deepgram, the transcript lands in the pane.
  • The listener is off by default; raven-term remote stop and remote status are the rest of the family.

Remote shells

Separately from the bridge, any pane can be a remote shell: program = ["ssh", "host"] in the config launches an arbitrary command instead of $SHELL — the terminal semantics stay identical.

Something missing? Help improve these docs