Index: crates/codegen/xai-grok-voice/src/audio/mod.rs
--- crates/codegen/xai-grok-voice/src/audio/mod.rs.orig
+++ crates/codegen/xai-grok-voice/src/audio/mod.rs
@@ -1,34 +1,47 @@
 //! Microphone capture (optional `audio` feature).
 //!
-//! Three backends share one interface (`spawn_pcm_capture`, `capture_pcm_for_duration`, `input_device_info`, `CaptureHandle`):
+//! Four backends share one interface (`spawn_pcm_capture`,
+//! `capture_pcm_for_duration`, `input_device_info`, `CaptureHandle`):
 //!
-//! - **Linux**: a subprocess recorder; the static-musl release binary cannot link `cpal`'s `alsa-sys`. See [`capture_linux`].
-//! - **macOS**: the self-exec `__mic-capture` helper subprocess; in-process CoreAudio memory is never returned. See [`capture_subprocess`].
+//! - **Linux**: a subprocess recorder (`pw-record`/`parec`/`arecord`) — the
+//!   static-musl release binary cannot link `cpal` → `alsa-sys`; see
+//!   [`capture_linux`].
+//! - **OpenBSD**: a subprocess recorder (`aucat`) via sndio — cpal has no
+//!   OpenBSD host (Null → "no default input audio device"); see
+//!   [`capture_openbsd`].
+//! - **macOS**: a subprocess too — the self-exec `__mic-capture` helper —
+//!   because in-process CoreAudio memory is never returned after the stream
+//!   drops; see [`capture_subprocess`].
 //! - **Windows**: `cpal` (WASAPI) in-process; its memory cost is modest.
 //!
-//! The fixed-duration probe capture stays in-process on macOS/Windows.
-//! It only runs in short-lived diagnostic processes, where the memory dies at exit.
+//! The fixed-duration probe capture stays in-process on macOS/Windows: it only
+//! runs in short-lived diagnostic processes, where the memory dies at exit.
 //!
-//! `CaptureHandle` is deliberately one name per platform, resolved by the re-exports below:
-//! - Linux: `pipe::ChildCaptureHandle` (recorder subprocess);
-//! - macOS: `capture_subprocess::CaptureHandle`, an enum over the helper subprocess and the in-process fallback;
-//! - Windows: `capture::CaptureHandle` (in-process cpal stream).
+//! `CaptureHandle` is deliberately one name per platform, resolved by the
+//! re-exports below:
+//! - Linux → `pipe::ChildCaptureHandle` (recorder subprocess);
+//! - OpenBSD → `pipe::ChildCaptureHandle` (`aucat` subprocess);
+//! - macOS → `capture_subprocess::CaptureHandle`, an enum over the helper
+//!   subprocess and the in-process fallback;
+//! - Windows → `capture::CaptureHandle` (in-process cpal stream).
 
-// cpal-based capture: the Windows backend, the macOS fallback, and the macOS `__mic-capture` child implementation
-#[cfg(not(target_os = "linux"))]
+// cpal-based capture: the Windows backend, the macOS fallback, and the macOS
+// `__mic-capture` child implementation. Not used on Linux/OpenBSD (subprocess).
+#[cfg(not(any(target_os = "linux", target_os = "openbsd")))]
 mod capture;
-// Wire protocol shared by the `__mic-capture` child (writer, in `capture`) and the macOS parent (parser, in `capture_subprocess`)
-#[cfg(not(target_os = "linux"))]
+// Wire protocol shared by the `__mic-capture` child (writer, in `capture`)
+// and the macOS parent (parser, in `capture_subprocess`).
+#[cfg(not(any(target_os = "linux", target_os = "openbsd")))]
 mod protocol;
-#[cfg(not(target_os = "linux"))]
+#[cfg(not(any(target_os = "linux", target_os = "openbsd")))]
 pub use capture::capture_pcm_for_duration;
-#[cfg(not(target_os = "linux"))]
+#[cfg(not(any(target_os = "linux", target_os = "openbsd")))]
 pub(crate) use capture::run_capture_child_cli;
 #[cfg(target_os = "windows")]
 pub use capture::{CaptureHandle, input_device_info, spawn_pcm_capture};
 
-// Shared PCM-over-pipe handling for the two subprocess backends
-#[cfg(any(target_os = "linux", target_os = "macos"))]
+// Shared PCM-over-pipe plumbing for the subprocess backends.
+#[cfg(any(target_os = "linux", target_os = "macos", target_os = "openbsd"))]
 mod pipe;
 
 #[cfg(target_os = "macos")]
@@ -42,3 +55,10 @@ mod capture_linux;
 pub use capture_linux::{
     CaptureHandle, capture_pcm_for_duration, input_device_info, spawn_pcm_capture,
 };
+
+#[cfg(target_os = "openbsd")]
+mod capture_openbsd;
+#[cfg(target_os = "openbsd")]
+pub use capture_openbsd::{
+    CaptureHandle, capture_pcm_for_duration, input_device_info, spawn_pcm_capture,
+};
