fix(macos): push-to-talk + permission prompts - #4

Merged
pango07 merged 1 commit into
masterfrom
bugfix/macos
Apr 30, 2026
Merged

fix(macos): push-to-talk + permission prompts#4
pango07 merged 1 commit into
masterfrom
bugfix/macos

Conversation

@pango07

@pango07pango07 commented Apr 30, 2026

Copy link
Copy Markdown
Owner

Summary

  • PTT fix.globalShortcut on macOS fires once per press (no key-repeat), so the press-and-hold debounce always stopped recording ~250ms after start — mic indicator popped up and immediately disappeared. Falls back to toggle on darwin (tap to start, tap to stop). Windows/Linux unchanged.
  • Permissions banner. New banner in the panel that surfaces missing macOS microphone / screen-recording grants on launch. Grant buttons trigger the OS prompt when status is not-determined and deeplink to the right System Settings pane when status is denied. Auto-hides on grant via the existing 1.5s permission poll.
  • Dev script.bun run start now sets VITE_DEV_SERVER=1 so Electron loads renderers from the Vite dev server. Added start:prod for the previous file-loading behavior.

Test plan

  • Typecheck passes (bun run typecheck).
  • macOS: press hotkey → recording starts; press again → stops and processes. Verified the OS mic indicator stays on while recording.
  • macOS: with mic or screen perm denied, banner appears with Grant buttons; clicking deeplinks to System Settings.
  • Windows: confirm press-and-hold still works (no behavior change expected).
  • After granting screen recording, verify banner clears on next launch.

🤖 Generated with Claude Code

Push-to-talk was broken on macOS because Electron's globalShortcut fires
exactly once per press there (no key-repeat), so the press-and-hold
debounce stopped recording 250ms after the first fire. Fall back to
toggle behavior on darwin: tap to start, tap to stop. Windows/Linux
keep press-and-hold.
Add a permissions banner in the panel that surfaces missing macOS
microphone and screen-recording grants on launch. Grant buttons either
trigger the OS prompt (when status is not-determined) or deeplink to
the relevant System Settings pane (when denied). Banner auto-hides
once status flips to granted via the existing 1.5s permission poll.
Also: make `bun run start` set VITE_DEV_SERVER=1 so Electron loads
renderers from the Vite dev server in development. Add `start:prod`
for the previous file-loading behavior.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@vercel

vercelBot commented Apr 30, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
flickyIgnoredIgnoredApr 30, 2026 6:31pm

Request Review

@pango07
pango07 requested a review from aaddrriannApril 30, 2026 18:50
@pango07
pango07 merged commit e3f521b into masterApr 30, 2026
6 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@pango07
, '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

fix(macos): push-to-talk + permission prompts - #4

Merged
pango07 merged 1 commit into
masterfrom
bugfix/macos
Apr 30, 2026
Merged

fix(macos): push-to-talk + permission prompts#4
pango07 merged 1 commit into
masterfrom
bugfix/macos

Conversation

@pango07

@pango07pango07 commented Apr 30, 2026

Copy link
Copy Markdown
Owner

Summary

  • PTT fix.globalShortcut on macOS fires once per press (no key-repeat), so the press-and-hold debounce always stopped recording ~250ms after start — mic indicator popped up and immediately disappeared. Falls back to toggle on darwin (tap to start, tap to stop). Windows/Linux unchanged.
  • Permissions banner. New banner in the panel that surfaces missing macOS microphone / screen-recording grants on launch. Grant buttons trigger the OS prompt when status is not-determined and deeplink to the right System Settings pane when status is denied. Auto-hides on grant via the existing 1.5s permission poll.
  • Dev script.bun run start now sets VITE_DEV_SERVER=1 so Electron loads renderers from the Vite dev server. Added start:prod for the previous file-loading behavior.

Test plan

  • Typecheck passes (bun run typecheck).
  • macOS: press hotkey → recording starts; press again → stops and processes. Verified the OS mic indicator stays on while recording.
  • macOS: with mic or screen perm denied, banner appears with Grant buttons; clicking deeplinks to System Settings.
  • Windows: confirm press-and-hold still works (no behavior change expected).
  • After granting screen recording, verify banner clears on next launch.

🤖 Generated with Claude Code

Push-to-talk was broken on macOS because Electron's globalShortcut fires
exactly once per press there (no key-repeat), so the press-and-hold
debounce stopped recording 250ms after the first fire. Fall back to
toggle behavior on darwin: tap to start, tap to stop. Windows/Linux
keep press-and-hold.
Add a permissions banner in the panel that surfaces missing macOS
microphone and screen-recording grants on launch. Grant buttons either
trigger the OS prompt (when status is not-determined) or deeplink to
the relevant System Settings pane (when denied). Banner auto-hides
once status flips to granted via the existing 1.5s permission poll.
Also: make `bun run start` set VITE_DEV_SERVER=1 so Electron loads
renderers from the Vite dev server in development. Add `start:prod`
for the previous file-loading behavior.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@vercel

vercelBot commented Apr 30, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
flickyIgnoredIgnoredApr 30, 2026 6:31pm

Request Review

@pango07
pango07 requested a review from aaddrriannApril 30, 2026 18:50
@pango07
pango07 merged commit e3f521b into masterApr 30, 2026
6 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@pango07
, '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

fix(macos): push-to-talk + permission prompts - #4

Merged
pango07 merged 1 commit into
masterfrom
bugfix/macos
Apr 30, 2026
Merged

fix(macos): push-to-talk + permission prompts#4
pango07 merged 1 commit into
masterfrom
bugfix/macos

Conversation

@pango07

@pango07pango07 commented Apr 30, 2026

Copy link
Copy Markdown
Owner

Summary

  • PTT fix.globalShortcut on macOS fires once per press (no key-repeat), so the press-and-hold debounce always stopped recording ~250ms after start — mic indicator popped up and immediately disappeared. Falls back to toggle on darwin (tap to start, tap to stop). Windows/Linux unchanged.
  • Permissions banner. New banner in the panel that surfaces missing macOS microphone / screen-recording grants on launch. Grant buttons trigger the OS prompt when status is not-determined and deeplink to the right System Settings pane when status is denied. Auto-hides on grant via the existing 1.5s permission poll.
  • Dev script.bun run start now sets VITE_DEV_SERVER=1 so Electron loads renderers from the Vite dev server. Added start:prod for the previous file-loading behavior.

Test plan

  • Typecheck passes (bun run typecheck).
  • macOS: press hotkey → recording starts; press again → stops and processes. Verified the OS mic indicator stays on while recording.
  • macOS: with mic or screen perm denied, banner appears with Grant buttons; clicking deeplinks to System Settings.
  • Windows: confirm press-and-hold still works (no behavior change expected).
  • After granting screen recording, verify banner clears on next launch.

🤖 Generated with Claude Code

Push-to-talk was broken on macOS because Electron's globalShortcut fires
exactly once per press there (no key-repeat), so the press-and-hold
debounce stopped recording 250ms after the first fire. Fall back to
toggle behavior on darwin: tap to start, tap to stop. Windows/Linux
keep press-and-hold.
Add a permissions banner in the panel that surfaces missing macOS
microphone and screen-recording grants on launch. Grant buttons either
trigger the OS prompt (when status is not-determined) or deeplink to
the relevant System Settings pane (when denied). Banner auto-hides
once status flips to granted via the existing 1.5s permission poll.
Also: make `bun run start` set VITE_DEV_SERVER=1 so Electron loads
renderers from the Vite dev server in development. Add `start:prod`
for the previous file-loading behavior.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@vercel

vercelBot commented Apr 30, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
flickyIgnoredIgnoredApr 30, 2026 6:31pm

Request Review

@pango07
pango07 requested a review from aaddrriannApril 30, 2026 18:50
@pango07
pango07 merged commit e3f521b into masterApr 30, 2026
6 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@pango07
, '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

fix(macos): push-to-talk + permission prompts - #4

Merged
pango07 merged 1 commit into
masterfrom
bugfix/macos
Apr 30, 2026
Merged

fix(macos): push-to-talk + permission prompts#4
pango07 merged 1 commit into
masterfrom
bugfix/macos

Conversation

@pango07

@pango07pango07 commented Apr 30, 2026

Copy link
Copy Markdown
Owner

Summary

  • PTT fix.globalShortcut on macOS fires once per press (no key-repeat), so the press-and-hold debounce always stopped recording ~250ms after start — mic indicator popped up and immediately disappeared. Falls back to toggle on darwin (tap to start, tap to stop). Windows/Linux unchanged.
  • Permissions banner. New banner in the panel that surfaces missing macOS microphone / screen-recording grants on launch. Grant buttons trigger the OS prompt when status is not-determined and deeplink to the right System Settings pane when status is denied. Auto-hides on grant via the existing 1.5s permission poll.
  • Dev script.bun run start now sets VITE_DEV_SERVER=1 so Electron loads renderers from the Vite dev server. Added start:prod for the previous file-loading behavior.

Test plan

  • Typecheck passes (bun run typecheck).
  • macOS: press hotkey → recording starts; press again → stops and processes. Verified the OS mic indicator stays on while recording.
  • macOS: with mic or screen perm denied, banner appears with Grant buttons; clicking deeplinks to System Settings.
  • Windows: confirm press-and-hold still works (no behavior change expected).
  • After granting screen recording, verify banner clears on next launch.

🤖 Generated with Claude Code

Push-to-talk was broken on macOS because Electron's globalShortcut fires
exactly once per press there (no key-repeat), so the press-and-hold
debounce stopped recording 250ms after the first fire. Fall back to
toggle behavior on darwin: tap to start, tap to stop. Windows/Linux
keep press-and-hold.
Add a permissions banner in the panel that surfaces missing macOS
microphone and screen-recording grants on launch. Grant buttons either
trigger the OS prompt (when status is not-determined) or deeplink to
the relevant System Settings pane (when denied). Banner auto-hides
once status flips to granted via the existing 1.5s permission poll.
Also: make `bun run start` set VITE_DEV_SERVER=1 so Electron loads
renderers from the Vite dev server in development. Add `start:prod`
for the previous file-loading behavior.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@vercel

vercelBot commented Apr 30, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
flickyIgnoredIgnoredApr 30, 2026 6:31pm

Request Review

@pango07
pango07 requested a review from aaddrriannApril 30, 2026 18:50
@pango07
pango07 merged commit e3f521b into masterApr 30, 2026
6 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@pango07
, '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

fix(macos): push-to-talk + permission prompts - #4

Merged
pango07 merged 1 commit into
masterfrom
bugfix/macos
Apr 30, 2026
Merged

fix(macos): push-to-talk + permission prompts#4
pango07 merged 1 commit into
masterfrom
bugfix/macos

Conversation

@pango07

@pango07pango07 commented Apr 30, 2026

Copy link
Copy Markdown
Owner

Summary

  • PTT fix.globalShortcut on macOS fires once per press (no key-repeat), so the press-and-hold debounce always stopped recording ~250ms after start — mic indicator popped up and immediately disappeared. Falls back to toggle on darwin (tap to start, tap to stop). Windows/Linux unchanged.
  • Permissions banner. New banner in the panel that surfaces missing macOS microphone / screen-recording grants on launch. Grant buttons trigger the OS prompt when status is not-determined and deeplink to the right System Settings pane when status is denied. Auto-hides on grant via the existing 1.5s permission poll.
  • Dev script.bun run start now sets VITE_DEV_SERVER=1 so Electron loads renderers from the Vite dev server. Added start:prod for the previous file-loading behavior.

Test plan

  • Typecheck passes (bun run typecheck).
  • macOS: press hotkey → recording starts; press again → stops and processes. Verified the OS mic indicator stays on while recording.
  • macOS: with mic or screen perm denied, banner appears with Grant buttons; clicking deeplinks to System Settings.
  • Windows: confirm press-and-hold still works (no behavior change expected).
  • After granting screen recording, verify banner clears on next launch.

🤖 Generated with Claude Code

Push-to-talk was broken on macOS because Electron's globalShortcut fires
exactly once per press there (no key-repeat), so the press-and-hold
debounce stopped recording 250ms after the first fire. Fall back to
toggle behavior on darwin: tap to start, tap to stop. Windows/Linux
keep press-and-hold.
Add a permissions banner in the panel that surfaces missing macOS
microphone and screen-recording grants on launch. Grant buttons either
trigger the OS prompt (when status is not-determined) or deeplink to
the relevant System Settings pane (when denied). Banner auto-hides
once status flips to granted via the existing 1.5s permission poll.
Also: make `bun run start` set VITE_DEV_SERVER=1 so Electron loads
renderers from the Vite dev server in development. Add `start:prod`
for the previous file-loading behavior.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@vercel

vercelBot commented Apr 30, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
flickyIgnoredIgnoredApr 30, 2026 6:31pm

Request Review

@pango07
pango07 requested a review from aaddrriannApril 30, 2026 18:50
@pango07
pango07 merged commit e3f521b into masterApr 30, 2026
6 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@pango07
, '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

fix(macos): push-to-talk + permission prompts - #4

Merged
pango07 merged 1 commit into
masterfrom
bugfix/macos
Apr 30, 2026
Merged

fix(macos): push-to-talk + permission prompts#4
pango07 merged 1 commit into
masterfrom
bugfix/macos

Conversation

@pango07

@pango07pango07 commented Apr 30, 2026

Copy link
Copy Markdown
Owner

Summary

  • PTT fix.globalShortcut on macOS fires once per press (no key-repeat), so the press-and-hold debounce always stopped recording ~250ms after start — mic indicator popped up and immediately disappeared. Falls back to toggle on darwin (tap to start, tap to stop). Windows/Linux unchanged.
  • Permissions banner. New banner in the panel that surfaces missing macOS microphone / screen-recording grants on launch. Grant buttons trigger the OS prompt when status is not-determined and deeplink to the right System Settings pane when status is denied. Auto-hides on grant via the existing 1.5s permission poll.
  • Dev script.bun run start now sets VITE_DEV_SERVER=1 so Electron loads renderers from the Vite dev server. Added start:prod for the previous file-loading behavior.

Test plan

  • Typecheck passes (bun run typecheck).
  • macOS: press hotkey → recording starts; press again → stops and processes. Verified the OS mic indicator stays on while recording.
  • macOS: with mic or screen perm denied, banner appears with Grant buttons; clicking deeplinks to System Settings.
  • Windows: confirm press-and-hold still works (no behavior change expected).
  • After granting screen recording, verify banner clears on next launch.

🤖 Generated with Claude Code

Push-to-talk was broken on macOS because Electron's globalShortcut fires
exactly once per press there (no key-repeat), so the press-and-hold
debounce stopped recording 250ms after the first fire. Fall back to
toggle behavior on darwin: tap to start, tap to stop. Windows/Linux
keep press-and-hold.
Add a permissions banner in the panel that surfaces missing macOS
microphone and screen-recording grants on launch. Grant buttons either
trigger the OS prompt (when status is not-determined) or deeplink to
the relevant System Settings pane (when denied). Banner auto-hides
once status flips to granted via the existing 1.5s permission poll.
Also: make `bun run start` set VITE_DEV_SERVER=1 so Electron loads
renderers from the Vite dev server in development. Add `start:prod`
for the previous file-loading behavior.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@vercel

vercelBot commented Apr 30, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
flickyIgnoredIgnoredApr 30, 2026 6:31pm

Request Review

@pango07
pango07 requested a review from aaddrriannApril 30, 2026 18:50
@pango07
pango07 merged commit e3f521b into masterApr 30, 2026
6 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@pango07
, '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

fix(macos): push-to-talk + permission prompts - #4

Merged
pango07 merged 1 commit into
masterfrom
bugfix/macos
Apr 30, 2026
Merged

fix(macos): push-to-talk + permission prompts#4
pango07 merged 1 commit into
masterfrom
bugfix/macos

Conversation

@pango07

@pango07pango07 commented Apr 30, 2026

Copy link
Copy Markdown
Owner

Summary

  • PTT fix.globalShortcut on macOS fires once per press (no key-repeat), so the press-and-hold debounce always stopped recording ~250ms after start — mic indicator popped up and immediately disappeared. Falls back to toggle on darwin (tap to start, tap to stop). Windows/Linux unchanged.
  • Permissions banner. New banner in the panel that surfaces missing macOS microphone / screen-recording grants on launch. Grant buttons trigger the OS prompt when status is not-determined and deeplink to the right System Settings pane when status is denied. Auto-hides on grant via the existing 1.5s permission poll.
  • Dev script.bun run start now sets VITE_DEV_SERVER=1 so Electron loads renderers from the Vite dev server. Added start:prod for the previous file-loading behavior.

Test plan

  • Typecheck passes (bun run typecheck).
  • macOS: press hotkey → recording starts; press again → stops and processes. Verified the OS mic indicator stays on while recording.
  • macOS: with mic or screen perm denied, banner appears with Grant buttons; clicking deeplinks to System Settings.
  • Windows: confirm press-and-hold still works (no behavior change expected).
  • After granting screen recording, verify banner clears on next launch.

🤖 Generated with Claude Code

Push-to-talk was broken on macOS because Electron's globalShortcut fires
exactly once per press there (no key-repeat), so the press-and-hold
debounce stopped recording 250ms after the first fire. Fall back to
toggle behavior on darwin: tap to start, tap to stop. Windows/Linux
keep press-and-hold.
Add a permissions banner in the panel that surfaces missing macOS
microphone and screen-recording grants on launch. Grant buttons either
trigger the OS prompt (when status is not-determined) or deeplink to
the relevant System Settings pane (when denied). Banner auto-hides
once status flips to granted via the existing 1.5s permission poll.
Also: make `bun run start` set VITE_DEV_SERVER=1 so Electron loads
renderers from the Vite dev server in development. Add `start:prod`
for the previous file-loading behavior.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@vercel

vercelBot commented Apr 30, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
flickyIgnoredIgnoredApr 30, 2026 6:31pm

Request Review

@pango07
pango07 requested a review from aaddrriannApril 30, 2026 18:50
@pango07
pango07 merged commit e3f521b into masterApr 30, 2026
6 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@pango07
, '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

fix(macos): push-to-talk + permission prompts - #4

Merged
pango07 merged 1 commit into
masterfrom
bugfix/macos
Apr 30, 2026
Merged

fix(macos): push-to-talk + permission prompts#4
pango07 merged 1 commit into
masterfrom
bugfix/macos

Conversation

@pango07

@pango07pango07 commented Apr 30, 2026

Copy link
Copy Markdown
Owner

Summary

  • PTT fix.globalShortcut on macOS fires once per press (no key-repeat), so the press-and-hold debounce always stopped recording ~250ms after start — mic indicator popped up and immediately disappeared. Falls back to toggle on darwin (tap to start, tap to stop). Windows/Linux unchanged.
  • Permissions banner. New banner in the panel that surfaces missing macOS microphone / screen-recording grants on launch. Grant buttons trigger the OS prompt when status is not-determined and deeplink to the right System Settings pane when status is denied. Auto-hides on grant via the existing 1.5s permission poll.
  • Dev script.bun run start now sets VITE_DEV_SERVER=1 so Electron loads renderers from the Vite dev server. Added start:prod for the previous file-loading behavior.

Test plan

  • Typecheck passes (bun run typecheck).
  • macOS: press hotkey → recording starts; press again → stops and processes. Verified the OS mic indicator stays on while recording.
  • macOS: with mic or screen perm denied, banner appears with Grant buttons; clicking deeplinks to System Settings.
  • Windows: confirm press-and-hold still works (no behavior change expected).
  • After granting screen recording, verify banner clears on next launch.

🤖 Generated with Claude Code

Push-to-talk was broken on macOS because Electron's globalShortcut fires
exactly once per press there (no key-repeat), so the press-and-hold
debounce stopped recording 250ms after the first fire. Fall back to
toggle behavior on darwin: tap to start, tap to stop. Windows/Linux
keep press-and-hold.
Add a permissions banner in the panel that surfaces missing macOS
microphone and screen-recording grants on launch. Grant buttons either
trigger the OS prompt (when status is not-determined) or deeplink to
the relevant System Settings pane (when denied). Banner auto-hides
once status flips to granted via the existing 1.5s permission poll.
Also: make `bun run start` set VITE_DEV_SERVER=1 so Electron loads
renderers from the Vite dev server in development. Add `start:prod`
for the previous file-loading behavior.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@vercel

vercelBot commented Apr 30, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
flickyIgnoredIgnoredApr 30, 2026 6:31pm

Request Review

@pango07
pango07 requested a review from aaddrriannApril 30, 2026 18:50
@pango07
pango07 merged commit e3f521b into masterApr 30, 2026
6 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@pango07