feat: TypeWhisper Flow sessions, Phase 4 UX, and GitHub Pages privacy site

Migrate keyboard dictation to continuous Flow sessions with auto-start,
tap-to-toggle recording, 60s countdown, five-step onboarding, and App Group
IPC. Add docs/ GitHub Pages site with en/zh privacy policy for App Store compliance.
This commit is contained in:
Rocky
2026-06-19 18:05:50 +08:00
parent 6148d05093
commit 7f059dbd45
48 changed files with 3815 additions and 1065 deletions
View File
+149
View File
@@ -0,0 +1,149 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>OSGKeyboard</title>
<meta name="description" content="OSGKeyboard — voice dictation keyboard for iOS with on-device ASR and optional LLM polish.">
<style>
:root {
color-scheme: light dark;
--bg: #f7f7f7;
--card: #fff;
--text: #1a1a1a;
--muted: #666;
--accent: #0a7a55;
--border: #e5e5e5;
}
@media (prefers-color-scheme: dark) {
:root {
--bg: #111;
--card: #1c1c1e;
--text: #f5f5f7;
--muted: #a1a1a6;
--accent: #34c759;
--border: #333;
}
}
* { box-sizing: border-box; }
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
line-height: 1.6;
margin: 0;
background: var(--bg);
color: var(--text);
}
.wrap {
max-width: 720px;
margin: 0 auto;
padding: 2.5rem 1.25rem 3rem;
}
header { margin-bottom: 2rem; }
h1 { font-size: 2rem; line-height: 1.2; margin: 0 0 0.5rem; }
.tagline { color: var(--muted); margin: 0; font-size: 1.05rem; }
.lang { font-size: 0.9rem; margin-top: 0.75rem; }
.lang a { color: var(--accent); }
.card {
background: var(--card);
border: 1px solid var(--border);
border-radius: 14px;
padding: 1.25rem 1.35rem;
margin-bottom: 1rem;
}
.card h2 { font-size: 1.05rem; margin: 0 0 0.5rem; }
.card p { margin: 0; color: var(--muted); }
.links { display: flex; flex-wrap: wrap; gap: 0.75rem; margin-top: 1.25rem; }
.btn {
display: inline-block;
padding: 0.65rem 1rem;
border-radius: 10px;
text-decoration: none;
font-weight: 600;
font-size: 0.95rem;
}
.btn-primary { background: var(--accent); color: #fff; }
.btn-secondary {
background: transparent;
color: var(--accent);
border: 1px solid var(--accent);
}
footer {
margin-top: 2rem;
font-size: 0.85rem;
color: var(--muted);
}
hr { border: none; border-top: 1px solid var(--border); margin: 2rem 0; }
</style>
</head>
<body>
<div class="wrap">
<header>
<h1>OSGKeyboard</h1>
<p class="tagline">Tap to talk. Polished text in any app.</p>
<p class="lang"><a href="#zh">中文</a></p>
</header>
<div class="card">
<h2>Voice dictation keyboard for iOS</h2>
<p>
OSGKeyboard is a custom keyboard extension that transcribes your voice on-device
and optionally polishes the result through an LLM you configure.
Works in WeChat, Notes, Mail, ChatGPT, and anywhere a keyboard appears.
</p>
<div class="links">
<a class="btn btn-primary" href="https://github.com/hkgood/OSGKeyboard">View on GitHub</a>
<a class="btn btn-secondary" href="privacy/">Privacy Policy</a>
</div>
</div>
<div class="card">
<h2>Privacy at a glance</h2>
<p>
Audio is processed on your device for transcription. We do not log ordinary keystrokes.
In Cloud polish mode, only the transcribed text (not audio) is sent to your chosen API provider.
</p>
<div class="links">
<a class="btn btn-secondary" href="privacy/">Read full policy</a>
</div>
</div>
<footer>
<p>© OSGKeyboard · <a href="https://github.com/hkgood/OSGKeyboard">Source code</a></p>
</footer>
<hr id="zh">
<header>
<h1>OSGKeyboard</h1>
<p class="tagline">点按说话,任意 App 里获得润色文字。</p>
</header>
<div class="card">
<h2>iOS 语音输入键盘</h2>
<p>
OSGKeyboard 是一款自定义键盘扩展:在设备端转写语音,并可选通过你配置的 LLM 润色结果。
适用于微信、备忘录、邮件、ChatGPT 等所有出现键盘的场景。
</p>
<div class="links">
<a class="btn btn-primary" href="https://github.com/hkgood/OSGKeyboard">GitHub 仓库</a>
<a class="btn btn-secondary" href="privacy/#zh">隐私政策</a>
</div>
</div>
<div class="card">
<h2>隐私摘要</h2>
<p>
音频在设备端转写。我们不会记录普通击键内容。
云端润色模式下,仅发送转写文字(非音频)到你选择的 API 服务商。
</p>
<div class="links">
<a class="btn btn-secondary" href="privacy/#zh">查看完整政策</a>
</div>
</div>
<footer>
<p>© OSGKeyboard · <a href="https://github.com/hkgood/OSGKeyboard">源代码</a></p>
</footer>
</div>
</body>
</html>
+88
View File
@@ -0,0 +1,88 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>OSGKeyboard Privacy Policy</title>
<style>
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; line-height: 1.6; max-width: 720px; margin: 2rem auto; padding: 0 1rem; color: #1a1a1a; }
h1, h2 { line-height: 1.3; }
a { color: #0a7; }
hr { margin: 2rem 0; border: none; border-top: 1px solid #ddd; }
.lang { font-size: 0.9rem; color: #666; }
</style>
</head>
<body>
<p class="lang"><a href="#zh">中文</a></p>
<h1>OSGKeyboard Privacy Policy</h1>
<p><strong>Last updated:</strong> June 19, 2026</p>
<p>OSGKeyboard is a custom iOS keyboard that turns your voice into text. This policy explains what data the app processes and how it is used.</p>
<h2>What we collect</h2>
<ul>
<li><strong>Voice audio</strong> — captured only while you actively record. On-device mode transcribes locally with Apples speech APIs; raw audio is not uploaded by OSGKeyboard.</li>
<li><strong>Transcribed text</strong> — in Cloud polish mode, the final text (not audio) may be sent to the LLM provider you configure (e.g. OpenAI) for punctuation and formatting.</li>
<li><strong>API credentials</strong> — stored in the iOS Keychain on your device and shared only between the main app and keyboard extension via an App Group.</li>
<li><strong>App preferences</strong> — engine mode, language, and keyboard settings stored in App Group UserDefaults on your device.</li>
</ul>
<h2>What we do not collect</h2>
<ul>
<li>We do <strong>not</strong> log or upload ordinary keystrokes you type with the keyboard.</li>
<li>We do <strong>not</strong> operate analytics or advertising SDKs.</li>
<li>We do <strong>not</strong> sell personal data.</li>
</ul>
<h2>Permissions</h2>
<ul>
<li><strong>Microphone</strong> — required for voice input and background voice sessions.</li>
<li><strong>Speech recognition</strong> — required for on-device transcription.</li>
<li><strong>Full Access</strong> — required so the keyboard can reach the microphone, read your API key, and communicate with the main app. Full Access does not grant us access to everything you type; we do not exfiltrate keystrokes.</li>
</ul>
<h2>Third parties</h2>
<p>When you choose Cloud polish mode, transcribed text is sent to the API endpoint you configure. That providers privacy policy applies to those requests.</p>
<h2>Data retention</h2>
<p>Settings and API keys remain on your device until you delete the app or reset settings. Transcription results are passed to the host app you are typing in and are not stored long-term by OSGKeyboard.</p>
<h2>Contact</h2>
<p>Questions: open an issue at <a href="https://github.com/hkgood/OSGKeyboard">github.com/hkgood/OSGKeyboard</a>.</p>
<hr id="zh">
<h1>OSGKeyboard 隐私政策</h1>
<p><strong>更新日期:</strong>2026 年 6 月 19 日</p>
<p>OSGKeyboard 是一款 iOS 自定义键盘,可将语音转为文字。本政策说明应用处理哪些数据及用途。</p>
<h2>我们处理的数据</h2>
<ul>
<li><strong>语音音频</strong> — 仅在你主动录音时采集。本地模式在设备端通过 Apple 语音识别转写,OSGKeyboard 不会上传原始录音。</li>
<li><strong>转写文字</strong> — 云端润色模式下,最终文字(非音频)可能发送到你配置的 LLM 服务商以整理标点和格式。</li>
<li><strong>API 凭证</strong> — 保存在设备 Keychain,仅通过 App Group 在主 App 与键盘扩展间共享。</li>
<li><strong>应用偏好</strong> — 引擎、语言等设置保存在设备 App Group 中。</li>
</ul>
<h2>我们不收集的内容</h2>
<ul>
<li>我们<strong>不会</strong>记录或上传你平时在键盘上的击键内容。</li>
<li>我们<strong>不会</strong>集成广告或第三方分析 SDK。</li>
<li>我们<strong>不会</strong>出售个人数据。</li>
</ul>
<h2>权限说明</h2>
<ul>
<li><strong>麦克风</strong> — 语音输入与后台语音会话所需。</li>
<li><strong>语音识别</strong> — 端侧转写所需。</li>
<li><strong>完全访问</strong> — 使键盘能使用麦克风、读取 API Key 并与主 App 通信。完全访问不代表我们会收集全部击键内容。</li>
</ul>
<h2>第三方</h2>
<p>选择云端润色时,转写文字会发往你配置的 API,该服务商的隐私政策适用于相关请求。</p>
<h2>数据保留</h2>
<p>设置与 API Key 保留在设备上,直至卸载或重置。识别结果写入你正在使用的宿主 App,OSGKeyboard 不会长期存储。</p>
<h2>联系</h2>
<p>问题反馈:<a href="https://github.com/hkgood/OSGKeyboard">github.com/hkgood/OSGKeyboard</a></p>
</body>
</html>