feat: harden Flow cold-start/force-quit and polish macOS dictation UX
Fix cold-start overlay recursion that overflowed the main-thread stack when recording began while the ready overlay was still up; also remove temporary on-screen Flow DEBUG panels after the orange-mic investigation, and land the macOS overlay/catalog/layout polish plus related Flow recovery hardening.
This commit is contained in:
+14
-14
@@ -6,7 +6,7 @@
|
||||
|
||||
<!-- Primary SEO -->
|
||||
<title>OSGKeyboard — On-device voice-to-text keyboard for iOS</title>
|
||||
<meta name="description" content="OSGKeyboard is a source-available iOS keyboard that turns speech into polished text in any app. On-device recognition (iOS 26+), AI polish, translation, and a personal dictionary. Local or cloud engine — your voice never leaves the device.">
|
||||
<meta name="description" content="OSGKeyboard is a source-available iOS keyboard that turns speech into polished text in any app. On-device recognition (iOS 26+), AI polish, translation, and a personal dictionary. On-device by default — your voice never leaves the device unless you opt into the cloud engine.">
|
||||
<meta name="keywords" content="voice keyboard, voice to text, dictation, iOS keyboard, speech to text, on-device ASR, SpeechAnalyzer, AI polish, translation keyboard, open source keyboard, OSGKeyboard">
|
||||
<meta name="author" content="OSGKeyboard">
|
||||
<meta name="robots" content="index, follow, max-image-preview:large">
|
||||
@@ -19,7 +19,7 @@
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:site_name" content="OSGKeyboard">
|
||||
<meta property="og:title" content="OSGKeyboard — On-device voice-to-text keyboard for iOS">
|
||||
<meta property="og:description" content="Turn speech into polished text in any app. On-device recognition (iOS 26+), AI polish, translation, personal dictionary. Your voice never leaves the device.">
|
||||
<meta property="og:description" content="Turn speech into polished text in any app. On-device recognition (iOS 26+), AI polish, translation, personal dictionary. On-device by default — audio stays on your phone unless you opt into the cloud engine.">
|
||||
<meta property="og:url" content="https://hkgood.github.io/OSGKeyboard/">
|
||||
<meta property="og:image" content="https://hkgood.github.io/OSGKeyboard/assets/app-icon.png">
|
||||
<meta property="og:image:width" content="1024">
|
||||
@@ -459,7 +459,7 @@
|
||||
<div class="hero-meta">
|
||||
<span><span class="material-symbols-outlined" aria-hidden="true">devices</span><span data-i18n="hero.meta1">On-device recognition</span></span>
|
||||
<span><span class="material-symbols-outlined" aria-hidden="true">bolt</span><span data-i18n="hero.meta2">Local or cloud AI</span></span>
|
||||
<span><span class="material-symbols-outlined" aria-hidden="true">lock</span><span data-i18n="hero.meta3">Audio never leaves your phone</span></span>
|
||||
<span><span class="material-symbols-outlined" aria-hidden="true">lock</span><span data-i18n="hero.meta3">On-device by default — audio stays on your phone</span></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -498,12 +498,12 @@
|
||||
<div class="feature">
|
||||
<div class="ficon"><span class="material-symbols-outlined" aria-hidden="true">devices</span></div>
|
||||
<h3 data-i18n="feat.ondevice.t">On-device recognition</h3>
|
||||
<p data-i18n="feat.ondevice.b">iOS 26 SpeechAnalyzer transcribes on your iPhone. Audio never leaves the device.</p>
|
||||
<p data-i18n="feat.ondevice.b">iOS 26 SpeechAnalyzer transcribes on your device by default — audio is uploaded only if you explicitly enable the cloud engine.</p>
|
||||
</div>
|
||||
<div class="feature">
|
||||
<div class="ficon"><span class="material-symbols-outlined" aria-hidden="true">auto_awesome</span></div>
|
||||
<h3 data-i18n="feat.polish.t">AI polish</h3>
|
||||
<p data-i18n="feat.polish.b">Punctuation, structure, and clarity in three intensity levels. Only text is sent — never audio.</p>
|
||||
<p data-i18n="feat.polish.b">Punctuation, structure, and clarity in three intensity levels. Polish sends only text — on the default engine your audio never goes online.</p>
|
||||
</div>
|
||||
<div class="feature">
|
||||
<div class="ficon"><span class="material-symbols-outlined" aria-hidden="true">translate</span></div>
|
||||
@@ -551,7 +551,7 @@
|
||||
<div>
|
||||
<span class="lock"><span class="material-symbols-outlined" aria-hidden="true">lock</span><span data-i18n="close.badge">Privacy by design</span></span>
|
||||
<h2 data-i18n="close.title">Your voice stays yours</h2>
|
||||
<p data-i18n="close.body">Speech is processed on-device. We never log ordinary keystrokes. Only transcribed text — never audio — is sent for polish or translation.</p>
|
||||
<p data-i18n="close.body">Speech is processed on-device by default (the optional cloud engine uploads recordings to the provider you configure). We never log ordinary keystrokes; polish and translation receive only transcribed text.</p>
|
||||
</div>
|
||||
<a class="btn btn-quiet" href="privacy/">
|
||||
<span class="material-symbols-outlined" aria-hidden="true">description</span>
|
||||
@@ -583,7 +583,7 @@
|
||||
"hero.cta.secondary": "Privacy",
|
||||
"hero.meta1": "On-device recognition",
|
||||
"hero.meta2": "Local or cloud AI",
|
||||
"hero.meta3": "Audio never leaves your phone",
|
||||
"hero.meta3": "On-device by default — audio stays on your phone",
|
||||
"mock.app": "Notes",
|
||||
"mock.line": "Tomorrow at 3 PM, sync with the design team on the new onboarding flow.",
|
||||
"mock.chipEngine": "On-device",
|
||||
@@ -593,9 +593,9 @@
|
||||
"feat.dictation.t": "Tap-to-talk dictation",
|
||||
"feat.dictation.b": "Tap to start, tap to stop. Up to 3.5 minutes per take, with a live countdown.",
|
||||
"feat.ondevice.t": "On-device recognition",
|
||||
"feat.ondevice.b": "iOS 26 SpeechAnalyzer transcribes on your iPhone. Audio never leaves the device.",
|
||||
"feat.ondevice.b": "iOS 26 SpeechAnalyzer transcribes on your device by default — audio is uploaded only if you explicitly enable the cloud engine.",
|
||||
"feat.polish.t": "AI polish",
|
||||
"feat.polish.b": "Punctuation, structure, and clarity in three intensity levels. Only text is sent — never audio.",
|
||||
"feat.polish.b": "Punctuation, structure, and clarity in three intensity levels. Polish sends only text — on the default engine your audio never goes online.",
|
||||
"feat.translate.t": "Built-in translation",
|
||||
"feat.translate.b": "Translate after polish into English, 中文, 日本語, 한국어 and more — right from the keyboard.",
|
||||
"feat.dict.t": "Personal dictionary",
|
||||
@@ -612,7 +612,7 @@
|
||||
"step3.b": "Switch to OSGKeyboard, tap the mic, speak, tap again. Polished text lands at your cursor.",
|
||||
"close.badge": "Privacy by design",
|
||||
"close.title": "Your voice stays yours",
|
||||
"close.body": "Speech is processed on-device. We never log ordinary keystrokes. Only transcribed text — never audio — is sent for polish or translation.",
|
||||
"close.body": "Speech is processed on-device by default (the optional cloud engine uploads recordings to the provider you configure). We never log ordinary keystrokes; polish and translation receive only transcribed text.",
|
||||
"close.cta": "Read the privacy policy",
|
||||
"footer.copy": "© OSGKeyboard · v0.3.6 · source available, non-commercial",
|
||||
"footer.source": "Source",
|
||||
@@ -628,7 +628,7 @@
|
||||
"hero.cta.secondary": "隐私政策",
|
||||
"hero.meta1": "设备端识别",
|
||||
"hero.meta2": "本地或云端 AI",
|
||||
"hero.meta3": "音频不离开手机",
|
||||
"hero.meta3": "默认端侧识别,音频留在手机",
|
||||
"mock.app": "备忘录",
|
||||
"mock.line": "明天下午三点,和设计团队同步新引导流程。",
|
||||
"mock.chipEngine": "本地",
|
||||
@@ -638,9 +638,9 @@
|
||||
"feat.dictation.t": "点按听写",
|
||||
"feat.dictation.b": "点一下开始,再点一下结束。单次最长 3.5 分钟,倒计时实时显示。",
|
||||
"feat.ondevice.t": "设备端识别",
|
||||
"feat.ondevice.b": "由 iOS 26 SpeechAnalyzer 在本机转写,音频不会离开设备。",
|
||||
"feat.ondevice.b": "默认由 iOS 26 SpeechAnalyzer 在本机转写——仅当你显式开启云端引擎时,录音才会上传到你配置的服务商。",
|
||||
"feat.polish.t": "AI 润色",
|
||||
"feat.polish.b": "自动补全标点、结构与表达,分三档强度。仅发送文字,绝不发送音频。",
|
||||
"feat.polish.b": "自动补全标点、结构与表达,分三档强度。润色仅发送文字;默认引擎下音频不联网。",
|
||||
"feat.translate.t": "内置翻译",
|
||||
"feat.translate.b": "润色后可翻译为 English、中文、日本語、한국어 等——直接在键盘上完成。",
|
||||
"feat.dict.t": "个性词库",
|
||||
@@ -657,7 +657,7 @@
|
||||
"step3.b": "切换到 OSGKeyboard,点麦克风,说话,再点结束,润色好的文字自动插入光标处。",
|
||||
"close.badge": "隐私优先设计",
|
||||
"close.title": "你的声音,始终属于你",
|
||||
"close.body": "语音在设备端处理,我们不记录普通击键。只有转写后的文字(绝非音频)会被发送用于润色或翻译。",
|
||||
"close.body": "默认在设备端处理语音(可选的云端引擎会把录音上传到你配置的服务商)。我们不记录普通击键;润色与翻译只接收转写文字。",
|
||||
"close.cta": "查看隐私政策",
|
||||
"footer.copy": "© OSGKeyboard · v0.3.6 · 源码可见,禁止商用",
|
||||
"footer.source": "源代码",
|
||||
|
||||
Reference in New Issue
Block a user