feat: add voice dictation beta - #5213

Open
t3-code[bot] wants to merge 6 commits into
mainfrom
feat/voice-dictation-beta
Open

feat: add voice dictation beta#5213
t3-code[bot] wants to merge 6 commits into
mainfrom
feat/voice-dictation-beta

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

summary

  • add opt-in voice dictation beta with waveform, timer, and stop controls in the composer
  • support simple cloud-first BYOK transcription with OpenAI first/default and Groq
  • proxy authenticated, size-limited audio through fixed provider endpoints
  • use portable MediaRecorder APIs for Linux, macOS, and Windows desktop builds

providers

  • OpenAI: gpt-4o-mini-transcribe
  • Groq: whisper-large-v3-turbo
  • Claude has no native speech-to-text API, so it is not included

demo

https://t3bot-production.up.railway.app/files/jnX8qH7ZPKYJaOkK-_lBmwYO/t3code-voice-dictation-beta-demo.mp4

testing

  • transcription and client settings tests
  • server, web, and contracts typechecks
  • formatting and lint
  • full server suite: transcription tests pass; 3 unrelated permission-sensitive tests fail under this root runner

Note

Medium Risk
New authenticated proxy sends user audio and API keys to third-party providers; scope is bounded by auth, size limits, and fixed endpoints, but misconfiguration or key handling still matters.

Overview
Adds an opt-in voice dictation beta: record in the chat composer, transcribe via the connected T3 server, and append text to the draft.

Client: New client settings (voiceTranscriptionEnabled, provider OpenAI/Groq, optional local API key, model). Beta settings loads models from the provider and shows whether OPENAI_API_KEY / GROQ_API_KEY exist on the server (booleans only). useVoiceTranscription uses MediaRecorder (5‑minute cap, waveform UI); ChatComposer adds mic/stop and VoiceTranscriptionPanel. macOS desktop builds add NSMicrophoneUsageDescription.

Server: Authenticated routes GET/POST /api/transcription and GET /api/transcription/models proxy to fixed OpenAI/Groq endpoints with a 25 MB limit, client key or env fallback, and structured errors. CORS allows the x-t3-transcription-* headers.

Reviewed by Cursor Bugbot for commit 14315f5. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add voice dictation beta to the chat composer

  • Adds a mic button to ChatComposer that lets users record audio and append the transcription to the prompt; recording is capped at 5 minutes and 25 MB.
  • Introduces server endpoints GET/POST /api/transcription and GET /api/transcription/models that proxy audio to OpenAI or Groq and return transcribed text or available models.
  • Adds a Beta Settings panel section where users configure the provider, API key, and model; the panel dynamically loads available models and reflects server-side environment key availability.
  • Adds useVoiceTranscription hook managing MediaRecorder lifecycle, AudioContext level sampling, elapsed time, and error reporting with full cleanup on unmount.
  • macOS desktop build now declares NSMicrophoneUsageDescription in Info.plist for the microphone permission prompt.
  • Risk: microphone access and transcription provider calls are new runtime dependencies; missing model selection or unsupported browser capabilities surface as user-facing errors.

Macroscope summarized 14315f5.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 2, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Effect service conventions review of the voice dictation changes. Three findings, all in the new server-side transcription path (apps/server/src/transcription.ts and its route in apps/server/src/http.ts). The web, contracts, and desktop changes look consistent with the conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/http.ts Outdated
Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/http.ts Outdated
Comment threadapps/web/src/hooks/useVoiceTranscription.ts
Comment threadapps/server/src/http.ts Outdated
Comment threadpackages/contracts/src/settings.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/hooks/useVoiceTranscription.ts
Comment threadapps/server/src/http.ts Outdated
Comment threadapps/web/src/hooks/useVoiceTranscription.ts
@macroscopeapp

macroscopeappBot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a complete voice dictation feature with new server endpoints, external API integrations (OpenAI/Groq), microphone recording capabilities, and API key handling. New features of this scope warrant human review. Additionally, there's an open bug report about state management blocking recording restarts.

You can customize Macroscope's approvability policy. Learn more.

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Effect service conventions review: one finding in apps/server/src/transcription.ts. The earlier issues (environment-acquired HttpClient, tagged errors with structured attributes, no raw provider payloads in messages, catchTags at the route) are resolved.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/transcription.ts
Comment threadapps/server/src/transcription.ts

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One convention issue found in the new server transcription module. Everything else (tagged errors with structured attributes, HttpClient acquired from the environment, route-level catchTags) looks consistent with the service conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/transcription.ts Outdated
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Aug 2, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 14315f5. Configure here.

}
const recorder = recorderRef.current;
if (recorder?.state === "recording") recorder.stop();
}, [cleanupCapture]);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Restart blocked after cancel start

Medium Severity

stop during startup sets cancelStartingRef and returns UI to idle, but leaves startingRef true. start bails out while that flag is set, so tapping start again does nothing until the still-pending getUserMedia call settles.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 14315f5. Configure here.

@KachurPro

Copy link
Copy Markdown

I rebased this work onto the current main and extended it with the Codex-style cancel / insert / send flow plus native mobile support in #6625.

The new PR preserves the web/desktop server proxy from this branch, adds secure mobile BYOK storage, and fixes recorder reset and send-race behavior.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@KachurPro@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat: add voice dictation beta - #5213

Open
t3-code[bot] wants to merge 6 commits into
mainfrom
feat/voice-dictation-beta
Open

feat: add voice dictation beta#5213
t3-code[bot] wants to merge 6 commits into
mainfrom
feat/voice-dictation-beta

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

summary

  • add opt-in voice dictation beta with waveform, timer, and stop controls in the composer
  • support simple cloud-first BYOK transcription with OpenAI first/default and Groq
  • proxy authenticated, size-limited audio through fixed provider endpoints
  • use portable MediaRecorder APIs for Linux, macOS, and Windows desktop builds

providers

  • OpenAI: gpt-4o-mini-transcribe
  • Groq: whisper-large-v3-turbo
  • Claude has no native speech-to-text API, so it is not included

demo

https://t3bot-production.up.railway.app/files/jnX8qH7ZPKYJaOkK-_lBmwYO/t3code-voice-dictation-beta-demo.mp4

testing

  • transcription and client settings tests
  • server, web, and contracts typechecks
  • formatting and lint
  • full server suite: transcription tests pass; 3 unrelated permission-sensitive tests fail under this root runner

Note

Medium Risk
New authenticated proxy sends user audio and API keys to third-party providers; scope is bounded by auth, size limits, and fixed endpoints, but misconfiguration or key handling still matters.

Overview
Adds an opt-in voice dictation beta: record in the chat composer, transcribe via the connected T3 server, and append text to the draft.

Client: New client settings (voiceTranscriptionEnabled, provider OpenAI/Groq, optional local API key, model). Beta settings loads models from the provider and shows whether OPENAI_API_KEY / GROQ_API_KEY exist on the server (booleans only). useVoiceTranscription uses MediaRecorder (5‑minute cap, waveform UI); ChatComposer adds mic/stop and VoiceTranscriptionPanel. macOS desktop builds add NSMicrophoneUsageDescription.

Server: Authenticated routes GET/POST /api/transcription and GET /api/transcription/models proxy to fixed OpenAI/Groq endpoints with a 25 MB limit, client key or env fallback, and structured errors. CORS allows the x-t3-transcription-* headers.

Reviewed by Cursor Bugbot for commit 14315f5. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add voice dictation beta to the chat composer

  • Adds a mic button to ChatComposer that lets users record audio and append the transcription to the prompt; recording is capped at 5 minutes and 25 MB.
  • Introduces server endpoints GET/POST /api/transcription and GET /api/transcription/models that proxy audio to OpenAI or Groq and return transcribed text or available models.
  • Adds a Beta Settings panel section where users configure the provider, API key, and model; the panel dynamically loads available models and reflects server-side environment key availability.
  • Adds useVoiceTranscription hook managing MediaRecorder lifecycle, AudioContext level sampling, elapsed time, and error reporting with full cleanup on unmount.
  • macOS desktop build now declares NSMicrophoneUsageDescription in Info.plist for the microphone permission prompt.
  • Risk: microphone access and transcription provider calls are new runtime dependencies; missing model selection or unsupported browser capabilities surface as user-facing errors.

Macroscope summarized 14315f5.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 2, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Effect service conventions review of the voice dictation changes. Three findings, all in the new server-side transcription path (apps/server/src/transcription.ts and its route in apps/server/src/http.ts). The web, contracts, and desktop changes look consistent with the conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/http.ts Outdated
Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/http.ts Outdated
Comment threadapps/web/src/hooks/useVoiceTranscription.ts
Comment threadapps/server/src/http.ts Outdated
Comment threadpackages/contracts/src/settings.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/hooks/useVoiceTranscription.ts
Comment threadapps/server/src/http.ts Outdated
Comment threadapps/web/src/hooks/useVoiceTranscription.ts
@macroscopeapp

macroscopeappBot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a complete voice dictation feature with new server endpoints, external API integrations (OpenAI/Groq), microphone recording capabilities, and API key handling. New features of this scope warrant human review. Additionally, there's an open bug report about state management blocking recording restarts.

You can customize Macroscope's approvability policy. Learn more.

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Effect service conventions review: one finding in apps/server/src/transcription.ts. The earlier issues (environment-acquired HttpClient, tagged errors with structured attributes, no raw provider payloads in messages, catchTags at the route) are resolved.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/transcription.ts
Comment threadapps/server/src/transcription.ts

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One convention issue found in the new server transcription module. Everything else (tagged errors with structured attributes, HttpClient acquired from the environment, route-level catchTags) looks consistent with the service conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/transcription.ts Outdated
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Aug 2, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 14315f5. Configure here.

}
const recorder = recorderRef.current;
if (recorder?.state === "recording") recorder.stop();
}, [cleanupCapture]);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Restart blocked after cancel start

Medium Severity

stop during startup sets cancelStartingRef and returns UI to idle, but leaves startingRef true. start bails out while that flag is set, so tapping start again does nothing until the still-pending getUserMedia call settles.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 14315f5. Configure here.

@KachurPro

Copy link
Copy Markdown

I rebased this work onto the current main and extended it with the Codex-style cancel / insert / send flow plus native mobile support in #6625.

The new PR preserves the web/desktop server proxy from this branch, adds secure mobile BYOK storage, and fixes recorder reset and send-race behavior.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@KachurPro@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add voice dictation beta - #5213

Open
t3-code[bot] wants to merge 6 commits into
mainfrom
feat/voice-dictation-beta
Open

feat: add voice dictation beta#5213
t3-code[bot] wants to merge 6 commits into
mainfrom
feat/voice-dictation-beta

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

summary

  • add opt-in voice dictation beta with waveform, timer, and stop controls in the composer
  • support simple cloud-first BYOK transcription with OpenAI first/default and Groq
  • proxy authenticated, size-limited audio through fixed provider endpoints
  • use portable MediaRecorder APIs for Linux, macOS, and Windows desktop builds

providers

  • OpenAI: gpt-4o-mini-transcribe
  • Groq: whisper-large-v3-turbo
  • Claude has no native speech-to-text API, so it is not included

demo

https://t3bot-production.up.railway.app/files/jnX8qH7ZPKYJaOkK-_lBmwYO/t3code-voice-dictation-beta-demo.mp4

testing

  • transcription and client settings tests
  • server, web, and contracts typechecks
  • formatting and lint
  • full server suite: transcription tests pass; 3 unrelated permission-sensitive tests fail under this root runner

Note

Medium Risk
New authenticated proxy sends user audio and API keys to third-party providers; scope is bounded by auth, size limits, and fixed endpoints, but misconfiguration or key handling still matters.

Overview
Adds an opt-in voice dictation beta: record in the chat composer, transcribe via the connected T3 server, and append text to the draft.

Client: New client settings (voiceTranscriptionEnabled, provider OpenAI/Groq, optional local API key, model). Beta settings loads models from the provider and shows whether OPENAI_API_KEY / GROQ_API_KEY exist on the server (booleans only). useVoiceTranscription uses MediaRecorder (5‑minute cap, waveform UI); ChatComposer adds mic/stop and VoiceTranscriptionPanel. macOS desktop builds add NSMicrophoneUsageDescription.

Server: Authenticated routes GET/POST /api/transcription and GET /api/transcription/models proxy to fixed OpenAI/Groq endpoints with a 25 MB limit, client key or env fallback, and structured errors. CORS allows the x-t3-transcription-* headers.

Reviewed by Cursor Bugbot for commit 14315f5. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add voice dictation beta to the chat composer

  • Adds a mic button to ChatComposer that lets users record audio and append the transcription to the prompt; recording is capped at 5 minutes and 25 MB.
  • Introduces server endpoints GET/POST /api/transcription and GET /api/transcription/models that proxy audio to OpenAI or Groq and return transcribed text or available models.
  • Adds a Beta Settings panel section where users configure the provider, API key, and model; the panel dynamically loads available models and reflects server-side environment key availability.
  • Adds useVoiceTranscription hook managing MediaRecorder lifecycle, AudioContext level sampling, elapsed time, and error reporting with full cleanup on unmount.
  • macOS desktop build now declares NSMicrophoneUsageDescription in Info.plist for the microphone permission prompt.
  • Risk: microphone access and transcription provider calls are new runtime dependencies; missing model selection or unsupported browser capabilities surface as user-facing errors.

Macroscope summarized 14315f5.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 2, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Effect service conventions review of the voice dictation changes. Three findings, all in the new server-side transcription path (apps/server/src/transcription.ts and its route in apps/server/src/http.ts). The web, contracts, and desktop changes look consistent with the conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/http.ts Outdated
Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/http.ts Outdated
Comment threadapps/web/src/hooks/useVoiceTranscription.ts
Comment threadapps/server/src/http.ts Outdated
Comment threadpackages/contracts/src/settings.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/hooks/useVoiceTranscription.ts
Comment threadapps/server/src/http.ts Outdated
Comment threadapps/web/src/hooks/useVoiceTranscription.ts
@macroscopeapp

macroscopeappBot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a complete voice dictation feature with new server endpoints, external API integrations (OpenAI/Groq), microphone recording capabilities, and API key handling. New features of this scope warrant human review. Additionally, there's an open bug report about state management blocking recording restarts.

You can customize Macroscope's approvability policy. Learn more.

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Effect service conventions review: one finding in apps/server/src/transcription.ts. The earlier issues (environment-acquired HttpClient, tagged errors with structured attributes, no raw provider payloads in messages, catchTags at the route) are resolved.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/transcription.ts
Comment threadapps/server/src/transcription.ts

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One convention issue found in the new server transcription module. Everything else (tagged errors with structured attributes, HttpClient acquired from the environment, route-level catchTags) looks consistent with the service conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/transcription.ts Outdated
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Aug 2, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 14315f5. Configure here.

}
const recorder = recorderRef.current;
if (recorder?.state === "recording") recorder.stop();
}, [cleanupCapture]);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Restart blocked after cancel start

Medium Severity

stop during startup sets cancelStartingRef and returns UI to idle, but leaves startingRef true. start bails out while that flag is set, so tapping start again does nothing until the still-pending getUserMedia call settles.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 14315f5. Configure here.

@KachurPro

Copy link
Copy Markdown

I rebased this work onto the current main and extended it with the Codex-style cancel / insert / send flow plus native mobile support in #6625.

The new PR preserves the web/desktop server proxy from this branch, adds secure mobile BYOK storage, and fixes recorder reset and send-race behavior.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@KachurPro@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add voice dictation beta - #5213

Open
t3-code[bot] wants to merge 6 commits into
mainfrom
feat/voice-dictation-beta
Open

feat: add voice dictation beta#5213
t3-code[bot] wants to merge 6 commits into
mainfrom
feat/voice-dictation-beta

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

summary

  • add opt-in voice dictation beta with waveform, timer, and stop controls in the composer
  • support simple cloud-first BYOK transcription with OpenAI first/default and Groq
  • proxy authenticated, size-limited audio through fixed provider endpoints
  • use portable MediaRecorder APIs for Linux, macOS, and Windows desktop builds

providers

  • OpenAI: gpt-4o-mini-transcribe
  • Groq: whisper-large-v3-turbo
  • Claude has no native speech-to-text API, so it is not included

demo

https://t3bot-production.up.railway.app/files/jnX8qH7ZPKYJaOkK-_lBmwYO/t3code-voice-dictation-beta-demo.mp4

testing

  • transcription and client settings tests
  • server, web, and contracts typechecks
  • formatting and lint
  • full server suite: transcription tests pass; 3 unrelated permission-sensitive tests fail under this root runner

Note

Medium Risk
New authenticated proxy sends user audio and API keys to third-party providers; scope is bounded by auth, size limits, and fixed endpoints, but misconfiguration or key handling still matters.

Overview
Adds an opt-in voice dictation beta: record in the chat composer, transcribe via the connected T3 server, and append text to the draft.

Client: New client settings (voiceTranscriptionEnabled, provider OpenAI/Groq, optional local API key, model). Beta settings loads models from the provider and shows whether OPENAI_API_KEY / GROQ_API_KEY exist on the server (booleans only). useVoiceTranscription uses MediaRecorder (5‑minute cap, waveform UI); ChatComposer adds mic/stop and VoiceTranscriptionPanel. macOS desktop builds add NSMicrophoneUsageDescription.

Server: Authenticated routes GET/POST /api/transcription and GET /api/transcription/models proxy to fixed OpenAI/Groq endpoints with a 25 MB limit, client key or env fallback, and structured errors. CORS allows the x-t3-transcription-* headers.

Reviewed by Cursor Bugbot for commit 14315f5. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add voice dictation beta to the chat composer

  • Adds a mic button to ChatComposer that lets users record audio and append the transcription to the prompt; recording is capped at 5 minutes and 25 MB.
  • Introduces server endpoints GET/POST /api/transcription and GET /api/transcription/models that proxy audio to OpenAI or Groq and return transcribed text or available models.
  • Adds a Beta Settings panel section where users configure the provider, API key, and model; the panel dynamically loads available models and reflects server-side environment key availability.
  • Adds useVoiceTranscription hook managing MediaRecorder lifecycle, AudioContext level sampling, elapsed time, and error reporting with full cleanup on unmount.
  • macOS desktop build now declares NSMicrophoneUsageDescription in Info.plist for the microphone permission prompt.
  • Risk: microphone access and transcription provider calls are new runtime dependencies; missing model selection or unsupported browser capabilities surface as user-facing errors.

Macroscope summarized 14315f5.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 2, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Effect service conventions review of the voice dictation changes. Three findings, all in the new server-side transcription path (apps/server/src/transcription.ts and its route in apps/server/src/http.ts). The web, contracts, and desktop changes look consistent with the conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/http.ts Outdated
Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/http.ts Outdated
Comment threadapps/web/src/hooks/useVoiceTranscription.ts
Comment threadapps/server/src/http.ts Outdated
Comment threadpackages/contracts/src/settings.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/hooks/useVoiceTranscription.ts
Comment threadapps/server/src/http.ts Outdated
Comment threadapps/web/src/hooks/useVoiceTranscription.ts
@macroscopeapp

macroscopeappBot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a complete voice dictation feature with new server endpoints, external API integrations (OpenAI/Groq), microphone recording capabilities, and API key handling. New features of this scope warrant human review. Additionally, there's an open bug report about state management blocking recording restarts.

You can customize Macroscope's approvability policy. Learn more.

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Effect service conventions review: one finding in apps/server/src/transcription.ts. The earlier issues (environment-acquired HttpClient, tagged errors with structured attributes, no raw provider payloads in messages, catchTags at the route) are resolved.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/transcription.ts
Comment threadapps/server/src/transcription.ts

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One convention issue found in the new server transcription module. Everything else (tagged errors with structured attributes, HttpClient acquired from the environment, route-level catchTags) looks consistent with the service conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/transcription.ts Outdated
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Aug 2, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 14315f5. Configure here.

}
const recorder = recorderRef.current;
if (recorder?.state === "recording") recorder.stop();
}, [cleanupCapture]);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Restart blocked after cancel start

Medium Severity

stop during startup sets cancelStartingRef and returns UI to idle, but leaves startingRef true. start bails out while that flag is set, so tapping start again does nothing until the still-pending getUserMedia call settles.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 14315f5. Configure here.

@KachurPro

Copy link
Copy Markdown

I rebased this work onto the current main and extended it with the Codex-style cancel / insert / send flow plus native mobile support in #6625.

The new PR preserves the web/desktop server proxy from this branch, adds secure mobile BYOK storage, and fixes recorder reset and send-race behavior.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@KachurPro@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat: add voice dictation beta - #5213

Open
t3-code[bot] wants to merge 6 commits into
mainfrom
feat/voice-dictation-beta
Open

feat: add voice dictation beta#5213
t3-code[bot] wants to merge 6 commits into
mainfrom
feat/voice-dictation-beta

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

summary

  • add opt-in voice dictation beta with waveform, timer, and stop controls in the composer
  • support simple cloud-first BYOK transcription with OpenAI first/default and Groq
  • proxy authenticated, size-limited audio through fixed provider endpoints
  • use portable MediaRecorder APIs for Linux, macOS, and Windows desktop builds

providers

  • OpenAI: gpt-4o-mini-transcribe
  • Groq: whisper-large-v3-turbo
  • Claude has no native speech-to-text API, so it is not included

demo

https://t3bot-production.up.railway.app/files/jnX8qH7ZPKYJaOkK-_lBmwYO/t3code-voice-dictation-beta-demo.mp4

testing

  • transcription and client settings tests
  • server, web, and contracts typechecks
  • formatting and lint
  • full server suite: transcription tests pass; 3 unrelated permission-sensitive tests fail under this root runner

Note

Medium Risk
New authenticated proxy sends user audio and API keys to third-party providers; scope is bounded by auth, size limits, and fixed endpoints, but misconfiguration or key handling still matters.

Overview
Adds an opt-in voice dictation beta: record in the chat composer, transcribe via the connected T3 server, and append text to the draft.

Client: New client settings (voiceTranscriptionEnabled, provider OpenAI/Groq, optional local API key, model). Beta settings loads models from the provider and shows whether OPENAI_API_KEY / GROQ_API_KEY exist on the server (booleans only). useVoiceTranscription uses MediaRecorder (5‑minute cap, waveform UI); ChatComposer adds mic/stop and VoiceTranscriptionPanel. macOS desktop builds add NSMicrophoneUsageDescription.

Server: Authenticated routes GET/POST /api/transcription and GET /api/transcription/models proxy to fixed OpenAI/Groq endpoints with a 25 MB limit, client key or env fallback, and structured errors. CORS allows the x-t3-transcription-* headers.

Reviewed by Cursor Bugbot for commit 14315f5. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add voice dictation beta to the chat composer

  • Adds a mic button to ChatComposer that lets users record audio and append the transcription to the prompt; recording is capped at 5 minutes and 25 MB.
  • Introduces server endpoints GET/POST /api/transcription and GET /api/transcription/models that proxy audio to OpenAI or Groq and return transcribed text or available models.
  • Adds a Beta Settings panel section where users configure the provider, API key, and model; the panel dynamically loads available models and reflects server-side environment key availability.
  • Adds useVoiceTranscription hook managing MediaRecorder lifecycle, AudioContext level sampling, elapsed time, and error reporting with full cleanup on unmount.
  • macOS desktop build now declares NSMicrophoneUsageDescription in Info.plist for the microphone permission prompt.
  • Risk: microphone access and transcription provider calls are new runtime dependencies; missing model selection or unsupported browser capabilities surface as user-facing errors.

Macroscope summarized 14315f5.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 2, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Effect service conventions review of the voice dictation changes. Three findings, all in the new server-side transcription path (apps/server/src/transcription.ts and its route in apps/server/src/http.ts). The web, contracts, and desktop changes look consistent with the conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/http.ts Outdated
Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/http.ts Outdated
Comment threadapps/web/src/hooks/useVoiceTranscription.ts
Comment threadapps/server/src/http.ts Outdated
Comment threadpackages/contracts/src/settings.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/hooks/useVoiceTranscription.ts
Comment threadapps/server/src/http.ts Outdated
Comment threadapps/web/src/hooks/useVoiceTranscription.ts
@macroscopeapp

macroscopeappBot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a complete voice dictation feature with new server endpoints, external API integrations (OpenAI/Groq), microphone recording capabilities, and API key handling. New features of this scope warrant human review. Additionally, there's an open bug report about state management blocking recording restarts.

You can customize Macroscope's approvability policy. Learn more.

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Effect service conventions review: one finding in apps/server/src/transcription.ts. The earlier issues (environment-acquired HttpClient, tagged errors with structured attributes, no raw provider payloads in messages, catchTags at the route) are resolved.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/transcription.ts
Comment threadapps/server/src/transcription.ts

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One convention issue found in the new server transcription module. Everything else (tagged errors with structured attributes, HttpClient acquired from the environment, route-level catchTags) looks consistent with the service conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/transcription.ts Outdated
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Aug 2, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 14315f5. Configure here.

}
const recorder = recorderRef.current;
if (recorder?.state === "recording") recorder.stop();
}, [cleanupCapture]);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Restart blocked after cancel start

Medium Severity

stop during startup sets cancelStartingRef and returns UI to idle, but leaves startingRef true. start bails out while that flag is set, so tapping start again does nothing until the still-pending getUserMedia call settles.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 14315f5. Configure here.

@KachurPro

Copy link
Copy Markdown

I rebased this work onto the current main and extended it with the Codex-style cancel / insert / send flow plus native mobile support in #6625.

The new PR preserves the web/desktop server proxy from this branch, adds secure mobile BYOK storage, and fixes recorder reset and send-race behavior.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@KachurPro@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add voice dictation beta - #5213

Open
t3-code[bot] wants to merge 6 commits into
mainfrom
feat/voice-dictation-beta
Open

feat: add voice dictation beta#5213
t3-code[bot] wants to merge 6 commits into
mainfrom
feat/voice-dictation-beta

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

summary

  • add opt-in voice dictation beta with waveform, timer, and stop controls in the composer
  • support simple cloud-first BYOK transcription with OpenAI first/default and Groq
  • proxy authenticated, size-limited audio through fixed provider endpoints
  • use portable MediaRecorder APIs for Linux, macOS, and Windows desktop builds

providers

  • OpenAI: gpt-4o-mini-transcribe
  • Groq: whisper-large-v3-turbo
  • Claude has no native speech-to-text API, so it is not included

demo

https://t3bot-production.up.railway.app/files/jnX8qH7ZPKYJaOkK-_lBmwYO/t3code-voice-dictation-beta-demo.mp4

testing

  • transcription and client settings tests
  • server, web, and contracts typechecks
  • formatting and lint
  • full server suite: transcription tests pass; 3 unrelated permission-sensitive tests fail under this root runner

Note

Medium Risk
New authenticated proxy sends user audio and API keys to third-party providers; scope is bounded by auth, size limits, and fixed endpoints, but misconfiguration or key handling still matters.

Overview
Adds an opt-in voice dictation beta: record in the chat composer, transcribe via the connected T3 server, and append text to the draft.

Client: New client settings (voiceTranscriptionEnabled, provider OpenAI/Groq, optional local API key, model). Beta settings loads models from the provider and shows whether OPENAI_API_KEY / GROQ_API_KEY exist on the server (booleans only). useVoiceTranscription uses MediaRecorder (5‑minute cap, waveform UI); ChatComposer adds mic/stop and VoiceTranscriptionPanel. macOS desktop builds add NSMicrophoneUsageDescription.

Server: Authenticated routes GET/POST /api/transcription and GET /api/transcription/models proxy to fixed OpenAI/Groq endpoints with a 25 MB limit, client key or env fallback, and structured errors. CORS allows the x-t3-transcription-* headers.

Reviewed by Cursor Bugbot for commit 14315f5. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add voice dictation beta to the chat composer

  • Adds a mic button to ChatComposer that lets users record audio and append the transcription to the prompt; recording is capped at 5 minutes and 25 MB.
  • Introduces server endpoints GET/POST /api/transcription and GET /api/transcription/models that proxy audio to OpenAI or Groq and return transcribed text or available models.
  • Adds a Beta Settings panel section where users configure the provider, API key, and model; the panel dynamically loads available models and reflects server-side environment key availability.
  • Adds useVoiceTranscription hook managing MediaRecorder lifecycle, AudioContext level sampling, elapsed time, and error reporting with full cleanup on unmount.
  • macOS desktop build now declares NSMicrophoneUsageDescription in Info.plist for the microphone permission prompt.
  • Risk: microphone access and transcription provider calls are new runtime dependencies; missing model selection or unsupported browser capabilities surface as user-facing errors.

Macroscope summarized 14315f5.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 2, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Effect service conventions review of the voice dictation changes. Three findings, all in the new server-side transcription path (apps/server/src/transcription.ts and its route in apps/server/src/http.ts). The web, contracts, and desktop changes look consistent with the conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/http.ts Outdated
Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/http.ts Outdated
Comment threadapps/web/src/hooks/useVoiceTranscription.ts
Comment threadapps/server/src/http.ts Outdated
Comment threadpackages/contracts/src/settings.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/hooks/useVoiceTranscription.ts
Comment threadapps/server/src/http.ts Outdated
Comment threadapps/web/src/hooks/useVoiceTranscription.ts
@macroscopeapp

macroscopeappBot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a complete voice dictation feature with new server endpoints, external API integrations (OpenAI/Groq), microphone recording capabilities, and API key handling. New features of this scope warrant human review. Additionally, there's an open bug report about state management blocking recording restarts.

You can customize Macroscope's approvability policy. Learn more.

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Effect service conventions review: one finding in apps/server/src/transcription.ts. The earlier issues (environment-acquired HttpClient, tagged errors with structured attributes, no raw provider payloads in messages, catchTags at the route) are resolved.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/transcription.ts
Comment threadapps/server/src/transcription.ts

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One convention issue found in the new server transcription module. Everything else (tagged errors with structured attributes, HttpClient acquired from the environment, route-level catchTags) looks consistent with the service conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/transcription.ts Outdated
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Aug 2, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 14315f5. Configure here.

}
const recorder = recorderRef.current;
if (recorder?.state === "recording") recorder.stop();
}, [cleanupCapture]);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Restart blocked after cancel start

Medium Severity

stop during startup sets cancelStartingRef and returns UI to idle, but leaves startingRef true. start bails out while that flag is set, so tapping start again does nothing until the still-pending getUserMedia call settles.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 14315f5. Configure here.

@KachurPro

Copy link
Copy Markdown

I rebased this work onto the current main and extended it with the Codex-style cancel / insert / send flow plus native mobile support in #6625.

The new PR preserves the web/desktop server proxy from this branch, adds secure mobile BYOK storage, and fixes recorder reset and send-race behavior.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@KachurPro@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add voice dictation beta - #5213

Open
t3-code[bot] wants to merge 6 commits into
mainfrom
feat/voice-dictation-beta
Open

feat: add voice dictation beta#5213
t3-code[bot] wants to merge 6 commits into
mainfrom
feat/voice-dictation-beta

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

summary

  • add opt-in voice dictation beta with waveform, timer, and stop controls in the composer
  • support simple cloud-first BYOK transcription with OpenAI first/default and Groq
  • proxy authenticated, size-limited audio through fixed provider endpoints
  • use portable MediaRecorder APIs for Linux, macOS, and Windows desktop builds

providers

  • OpenAI: gpt-4o-mini-transcribe
  • Groq: whisper-large-v3-turbo
  • Claude has no native speech-to-text API, so it is not included

demo

https://t3bot-production.up.railway.app/files/jnX8qH7ZPKYJaOkK-_lBmwYO/t3code-voice-dictation-beta-demo.mp4

testing

  • transcription and client settings tests
  • server, web, and contracts typechecks
  • formatting and lint
  • full server suite: transcription tests pass; 3 unrelated permission-sensitive tests fail under this root runner

Note

Medium Risk
New authenticated proxy sends user audio and API keys to third-party providers; scope is bounded by auth, size limits, and fixed endpoints, but misconfiguration or key handling still matters.

Overview
Adds an opt-in voice dictation beta: record in the chat composer, transcribe via the connected T3 server, and append text to the draft.

Client: New client settings (voiceTranscriptionEnabled, provider OpenAI/Groq, optional local API key, model). Beta settings loads models from the provider and shows whether OPENAI_API_KEY / GROQ_API_KEY exist on the server (booleans only). useVoiceTranscription uses MediaRecorder (5‑minute cap, waveform UI); ChatComposer adds mic/stop and VoiceTranscriptionPanel. macOS desktop builds add NSMicrophoneUsageDescription.

Server: Authenticated routes GET/POST /api/transcription and GET /api/transcription/models proxy to fixed OpenAI/Groq endpoints with a 25 MB limit, client key or env fallback, and structured errors. CORS allows the x-t3-transcription-* headers.

Reviewed by Cursor Bugbot for commit 14315f5. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add voice dictation beta to the chat composer

  • Adds a mic button to ChatComposer that lets users record audio and append the transcription to the prompt; recording is capped at 5 minutes and 25 MB.
  • Introduces server endpoints GET/POST /api/transcription and GET /api/transcription/models that proxy audio to OpenAI or Groq and return transcribed text or available models.
  • Adds a Beta Settings panel section where users configure the provider, API key, and model; the panel dynamically loads available models and reflects server-side environment key availability.
  • Adds useVoiceTranscription hook managing MediaRecorder lifecycle, AudioContext level sampling, elapsed time, and error reporting with full cleanup on unmount.
  • macOS desktop build now declares NSMicrophoneUsageDescription in Info.plist for the microphone permission prompt.
  • Risk: microphone access and transcription provider calls are new runtime dependencies; missing model selection or unsupported browser capabilities surface as user-facing errors.

Macroscope summarized 14315f5.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 2, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Effect service conventions review of the voice dictation changes. Three findings, all in the new server-side transcription path (apps/server/src/transcription.ts and its route in apps/server/src/http.ts). The web, contracts, and desktop changes look consistent with the conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/http.ts Outdated
Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/http.ts Outdated
Comment threadapps/web/src/hooks/useVoiceTranscription.ts
Comment threadapps/server/src/http.ts Outdated
Comment threadpackages/contracts/src/settings.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/hooks/useVoiceTranscription.ts
Comment threadapps/server/src/http.ts Outdated
Comment threadapps/web/src/hooks/useVoiceTranscription.ts
@macroscopeapp

macroscopeappBot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a complete voice dictation feature with new server endpoints, external API integrations (OpenAI/Groq), microphone recording capabilities, and API key handling. New features of this scope warrant human review. Additionally, there's an open bug report about state management blocking recording restarts.

You can customize Macroscope's approvability policy. Learn more.

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Effect service conventions review: one finding in apps/server/src/transcription.ts. The earlier issues (environment-acquired HttpClient, tagged errors with structured attributes, no raw provider payloads in messages, catchTags at the route) are resolved.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/transcription.ts
Comment threadapps/server/src/transcription.ts

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One convention issue found in the new server transcription module. Everything else (tagged errors with structured attributes, HttpClient acquired from the environment, route-level catchTags) looks consistent with the service conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/transcription.ts Outdated
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Aug 2, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 14315f5. Configure here.

}
const recorder = recorderRef.current;
if (recorder?.state === "recording") recorder.stop();
}, [cleanupCapture]);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Restart blocked after cancel start

Medium Severity

stop during startup sets cancelStartingRef and returns UI to idle, but leaves startingRef true. start bails out while that flag is set, so tapping start again does nothing until the still-pending getUserMedia call settles.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 14315f5. Configure here.

@KachurPro

Copy link
Copy Markdown

I rebased this work onto the current main and extended it with the Codex-style cancel / insert / send flow plus native mobile support in #6625.

The new PR preserves the web/desktop server proxy from this branch, adds secure mobile BYOK storage, and fixes recorder reset and send-race behavior.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@KachurPro@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat: add voice dictation beta - #5213

Open
t3-code[bot] wants to merge 6 commits into
mainfrom
feat/voice-dictation-beta
Open

feat: add voice dictation beta#5213
t3-code[bot] wants to merge 6 commits into
mainfrom
feat/voice-dictation-beta

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

summary

  • add opt-in voice dictation beta with waveform, timer, and stop controls in the composer
  • support simple cloud-first BYOK transcription with OpenAI first/default and Groq
  • proxy authenticated, size-limited audio through fixed provider endpoints
  • use portable MediaRecorder APIs for Linux, macOS, and Windows desktop builds

providers

  • OpenAI: gpt-4o-mini-transcribe
  • Groq: whisper-large-v3-turbo
  • Claude has no native speech-to-text API, so it is not included

demo

https://t3bot-production.up.railway.app/files/jnX8qH7ZPKYJaOkK-_lBmwYO/t3code-voice-dictation-beta-demo.mp4

testing

  • transcription and client settings tests
  • server, web, and contracts typechecks
  • formatting and lint
  • full server suite: transcription tests pass; 3 unrelated permission-sensitive tests fail under this root runner

Note

Medium Risk
New authenticated proxy sends user audio and API keys to third-party providers; scope is bounded by auth, size limits, and fixed endpoints, but misconfiguration or key handling still matters.

Overview
Adds an opt-in voice dictation beta: record in the chat composer, transcribe via the connected T3 server, and append text to the draft.

Client: New client settings (voiceTranscriptionEnabled, provider OpenAI/Groq, optional local API key, model). Beta settings loads models from the provider and shows whether OPENAI_API_KEY / GROQ_API_KEY exist on the server (booleans only). useVoiceTranscription uses MediaRecorder (5‑minute cap, waveform UI); ChatComposer adds mic/stop and VoiceTranscriptionPanel. macOS desktop builds add NSMicrophoneUsageDescription.

Server: Authenticated routes GET/POST /api/transcription and GET /api/transcription/models proxy to fixed OpenAI/Groq endpoints with a 25 MB limit, client key or env fallback, and structured errors. CORS allows the x-t3-transcription-* headers.

Reviewed by Cursor Bugbot for commit 14315f5. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add voice dictation beta to the chat composer

  • Adds a mic button to ChatComposer that lets users record audio and append the transcription to the prompt; recording is capped at 5 minutes and 25 MB.
  • Introduces server endpoints GET/POST /api/transcription and GET /api/transcription/models that proxy audio to OpenAI or Groq and return transcribed text or available models.
  • Adds a Beta Settings panel section where users configure the provider, API key, and model; the panel dynamically loads available models and reflects server-side environment key availability.
  • Adds useVoiceTranscription hook managing MediaRecorder lifecycle, AudioContext level sampling, elapsed time, and error reporting with full cleanup on unmount.
  • macOS desktop build now declares NSMicrophoneUsageDescription in Info.plist for the microphone permission prompt.
  • Risk: microphone access and transcription provider calls are new runtime dependencies; missing model selection or unsupported browser capabilities surface as user-facing errors.

Macroscope summarized 14315f5.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 2, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Effect service conventions review of the voice dictation changes. Three findings, all in the new server-side transcription path (apps/server/src/transcription.ts and its route in apps/server/src/http.ts). The web, contracts, and desktop changes look consistent with the conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/http.ts Outdated
Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/http.ts Outdated
Comment threadapps/web/src/hooks/useVoiceTranscription.ts
Comment threadapps/server/src/http.ts Outdated
Comment threadpackages/contracts/src/settings.ts Outdated
Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/web/src/hooks/useVoiceTranscription.ts
Comment threadapps/server/src/http.ts Outdated
Comment threadapps/web/src/hooks/useVoiceTranscription.ts
@macroscopeapp

macroscopeappBot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a complete voice dictation feature with new server endpoints, external API integrations (OpenAI/Groq), microphone recording capabilities, and API key handling. New features of this scope warrant human review. Additionally, there's an open bug report about state management blocking recording restarts.

You can customize Macroscope's approvability policy. Learn more.

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Effect service conventions review: one finding in apps/server/src/transcription.ts. The earlier issues (environment-acquired HttpClient, tagged errors with structured attributes, no raw provider payloads in messages, catchTags at the route) are resolved.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/transcription.ts Outdated
Comment threadapps/server/src/transcription.ts
Comment threadapps/server/src/transcription.ts

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One convention issue found in the new server transcription module. Everything else (tagged errors with structured attributes, HttpClient acquired from the environment, route-level catchTags) looks consistent with the service conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/transcription.ts Outdated
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Aug 2, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 14315f5. Configure here.

}
const recorder = recorderRef.current;
if (recorder?.state === "recording") recorder.stop();
}, [cleanupCapture]);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Restart blocked after cancel start

Medium Severity

stop during startup sets cancelStartingRef and returns UI to idle, but leaves startingRef true. start bails out while that flag is set, so tapping start again does nothing until the still-pending getUserMedia call settles.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 14315f5. Configure here.

@KachurPro

Copy link
Copy Markdown

I rebased this work onto the current main and extended it with the Codex-style cancel / insert / send flow plus native mobile support in #6625.

The new PR preserves the web/desktop server proxy from this branch, adds secure mobile BYOK storage, and fixes recorder reset and send-race behavior.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@KachurPro@maria-rcks