hermes - 💡(How to fix) Fix Hide or configure voice transcript status rows in editable dictation mode

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…

In editable dictation mode, the Ink TUI inserts the voice transcript into the composer but also appends a visible voice transcript: ... system/display line for every transcription. This creates noisy UI clutter even though the transcript is not auto-submitted.

Root Cause

The visible voice transcript: rows are easy to confuse with actual submitted user turns or model-visible context, especially because they appear in the transcript area as system/display messages.

For users trying to reduce LLM context bloat, the important contract is:

speech -> STT -> composer -> user edits -> Enter -> model receives final edited text

Repeated transcript display rows make it look like every STT chunk might be going into the conversation, even when dictation mode is correctly waiting for manual submission.

Fix Action

Workaround

Users can tolerate the clutter or locally patch the TUI to remove the sys(...) call, but local source patches are update-fragile. A supported config option would be cleaner.

Code Example

setInput(current => (current.trim() ? `${current.trimEnd()} ${text}` : text))
sys(`voice transcript: ${text}`)

---

voice:
  show_transcript_status: false

---

voice:
  dictation:
    show_transcript_status: false

---

speech -> STT -> composer -> user edits -> Enter -> model receives final edited text

---

case 'voice.transcript': {
  const text = String(ev.payload?.text ?? '').trim()

  if (process.env.HERMES_VOICE_AUTOSUBMIT === '0') {
    setInput(current => (current.trim() ? `${current.trimEnd()} ${text}` : text))
    sys(`voice transcript: ${text}`)
    return
  }

  setInput('')
  setTimeout(() => submitRef.current(text), 0)
  return
}
RAW_BUFFERClick to expand / collapse

Summary

In editable dictation mode, the Ink TUI inserts the voice transcript into the composer but also appends a visible voice transcript: ... system/display line for every transcription. This creates noisy UI clutter even though the transcript is not auto-submitted.

Environment

  • Hermes version observed locally: Hermes Agent v0.14.0 (2026.5.16)
  • Frontend: Ink TUI
  • Platform: WSL launched from Windows PowerShell
  • Voice mode: STT/local faster-whisper, HERMES_VOICE_AUTOSUBMIT=0, TTS disabled

Current behavior

When voice.transcript arrives and HERMES_VOICE_AUTOSUBMIT=0, the TUI does two things:

setInput(current => (current.trim() ? `${current.trimEnd()} ${text}` : text))
sys(`voice transcript: ${text}`)

The first behavior is good: it makes STT act like editable dictation by putting the transcript into the composer/input box.

The second behavior creates a visible transcript/status row for every voice snippet. During normal dictation, several snippets can accumulate as repeated voice transcript: ... display messages.

Expected behavior

Editable dictation mode should be quiet by default, or should have a config option to hide these rows.

When the user chooses dictation/no-autosubmit behavior, the transcript should be inserted into the composer and the user should decide what to send by pressing Enter. The TUI should not repeatedly show transcript rows unless the user enables debug/status display.

Possible config:

voice:
  show_transcript_status: false

or, more specific:

voice:
  dictation:
    show_transcript_status: false

Why this matters

The visible voice transcript: rows are easy to confuse with actual submitted user turns or model-visible context, especially because they appear in the transcript area as system/display messages.

For users trying to reduce LLM context bloat, the important contract is:

speech -> STT -> composer -> user edits -> Enter -> model receives final edited text

Repeated transcript display rows make it look like every STT chunk might be going into the conversation, even when dictation mode is correctly waiting for manual submission.

Technical context

Relevant code path in ui-tui/src/app/createGatewayEventHandler.ts:

case 'voice.transcript': {
  const text = String(ev.payload?.text ?? '').trim()

  if (process.env.HERMES_VOICE_AUTOSUBMIT === '0') {
    setInput(current => (current.trim() ? `${current.trimEnd()} ${text}` : text))
    sys(`voice transcript: ${text}`)
    return
  }

  setInput('')
  setTimeout(() => submitRef.current(text), 0)
  return
}

sys(...) is frontend display state; submitted model turns go through prompt.submit from useSubmission.ts. The current UI does not make that distinction obvious.

Workaround

Users can tolerate the clutter or locally patch the TUI to remove the sys(...) call, but local source patches are update-fragile. A supported config option would be cleaner.

Acceptance criteria

  • Editable dictation still inserts transcript text into the composer.
  • No transcript/status row is emitted by default in editable dictation mode, or a config option allows suppressing it.
  • Auto-submit voice behavior remains unchanged unless separately configured.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

FAQ

Expected behavior

Editable dictation mode should be quiet by default, or should have a config option to hide these rows.

When the user chooses dictation/no-autosubmit behavior, the transcript should be inserted into the composer and the user should decide what to send by pressing Enter. The TUI should not repeatedly show transcript rows unless the user enables debug/status display.

Possible config:

voice:
  show_transcript_status: false

or, more specific:

voice:
  dictation:
    show_transcript_status: false

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING