e6f99d2744
Use compliant permission prompts, align cloud ASR privacy disclosures, and default Flow sessions to a shorter inactivity window for safer resubmission.
122 lines
13 KiB
HTML
122 lines
13 KiB
HTML
<!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>
|
||
<link rel="icon" href="../assets/app-icon.png" type="image/png">
|
||
<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> July 23, 2026 · <em>v1.0</em></p>
|
||
<p>OSGKeyboard is a custom iOS keyboard that turns your voice into text. It runs as a Custom Keyboard Extension on iOS 26 and later, and uses Apple's on-device <code>SpeechAnalyzer</code> + <code>DictationTranscriber</code> for transcription by default. An optional cloud ASR engine (explicit opt-in) uploads recordings to the provider you configure. After transcription, text may be polished or translated via a cloud LLM. 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 the default <strong>local engine</strong>, audio is transcribed on-device with Apple's <code>SpeechAnalyzer</code> + <code>DictationTranscriber</code> and raw audio is not uploaded. If you explicitly enable the <strong>cloud engine</strong> (a confirmation dialog is shown first), your recordings are uploaded to the ASR provider you configure (e.g. OpenAI, Qwen DashScope, Zhipu) for transcription; that provider's privacy policy applies. OSGKeyboard never stores or proxies your audio on its own servers.</li>
|
||
<li><strong>Transcribed text</strong> — after on-device ASR, the transcript (not audio) is sent for polish. On the <strong>local engine</strong>, polish uses a built-in DeepSeek endpoint configured at build time. On the <strong>cloud engine</strong>, polish and optional translation use the OpenAI-compatible API you configure (e.g. OpenAI, Qwen DashScope, Moonshot, Zhipu, Xiaomi MiMo, or your own server).</li>
|
||
<li><strong>API credentials</strong> — your cloud-engine LLM API key is stored in the iOS Keychain on your device and is read only when an LLM request is made. It is shared with the main app through a shared Keychain group, never through UserDefaults.</li>
|
||
<li><strong>App preferences</strong> — engine mode, recognition language, polish intensity, translation target, handedness, cursor-navigation toggle, and keyboard settings are stored in App Group <code>UserDefaults</code> on your device so the main app and keyboard extension stay in sync.</li>
|
||
<li><strong>Personal dictionary</strong> — terms and aliases you add in the Dictionary tab are stored locally on your device. They are included in LLM polish prompts so your vocabulary is preserved; dictionary data is not uploaded to a separate server.</li>
|
||
<li><strong>Voice history</strong> — the host app may keep a list of recent successful transcripts in its History tab. History is capped at 300 entries. When iCloud settings sync is enabled, history may also sync through your private iCloud Key-Value Store.</li>
|
||
<li><strong>Usage statistics</strong> — cumulative dictation time, dictation characters, translation characters, and dictionary entry count are computed and stored locally on the home screen stats card.</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, crash reporting, or advertising SDKs.</li>
|
||
<li>We do <strong>not</strong> upload raw audio anywhere on the default local engine. The only exception is the optional cloud ASR engine: if you explicitly enable it (a confirmation dialog is shown first), recordings go to the ASR provider <em>you</em> configure — never to servers of ours.</li>
|
||
<li>We do <strong>not</strong> sell personal data.</li>
|
||
</ul>
|
||
|
||
<h2>How the keyboard extension talks to the host app</h2>
|
||
<p>OSGKeyboard uses a long-lived "Flow session" hosted in the main app. The keyboard extension writes tiny "start / stop" signals into an App Group, the main app captures the audio, transcribes it (on-device by default; via your configured cloud ASR provider if you opted into the cloud engine), then sends the transcript for polish (and optional translation) before writing the result back. On the default local engine audio never leaves your device; only transcribed text is sent to the LLM endpoint (built-in DeepSeek on the local engine, or your configured API on the cloud engine).</p>
|
||
|
||
<h2>Permissions</h2>
|
||
<ul>
|
||
<li><strong>Microphone</strong> (<code>NSMicrophoneUsageDescription</code>) — required for voice input and the long-lived voice session.</li>
|
||
<li><strong>Speech recognition</strong> (<code>NSSpeechRecognitionUsageDescription</code>) — required for on-device transcription via Apple's APIs.</li>
|
||
<li><strong>Full Access</strong> — required so the keyboard can reach the microphone, read your API key from the shared Keychain, and request the polished transcript from the host app. Full Access does <em>not</em> grant us access to everything you type; we do not exfiltrate keystrokes.</li>
|
||
</ul>
|
||
|
||
<h2>Third parties</h2>
|
||
<p>After on-device ASR, transcribed text is sent for polish and optional translation. On the local engine this goes to a built-in DeepSeek endpoint. On the cloud engine it goes to the OpenAI-compatible API endpoint you configured in Settings. That provider's privacy policy applies to those requests. OSGKeyboard does not proxy, log, or aggregate your requests.</p>
|
||
|
||
<h2>Data retention</h2>
|
||
<p>Settings remain on your device until you delete the app or reset settings. When iCloud settings sync is enabled, API keys replicate through iCloud Keychain and preferences, statistics, and history may sync through your private iCloud account. Transcription results are passed to the host app you are typing in and are not stored long-term by OSGKeyboard. Voice history is capped at 300 entries; you can clear it from the History tab or by resetting settings.</p>
|
||
|
||
<h2>Children's privacy</h2>
|
||
<p>OSGKeyboard is not directed to children under 13 and does not knowingly collect personal data from children.</p>
|
||
|
||
<h2>Changes to this policy</h2>
|
||
<p>We may update this policy as the app evolves. The "Last updated" date at the top will always reflect the current version. Material changes will be called out in the project <a href="https://github.com/hkgood/OSGKeyboard/blob/main/CHANGELOG.md">CHANGELOG</a>.</p>
|
||
|
||
<h2>License</h2>
|
||
<p>OSGKeyboard is distributed under the <a href="https://github.com/hkgood/OSGKeyboard/blob/main/LICENSE">OSGKeyboard Source Available License</a> — personal learning and non-commercial local use only. No commercial use, redistribution, or public forks without permission.</p>
|
||
|
||
<h2>Contact</h2>
|
||
<p>Questions or privacy requests: open an issue at <a href="https://github.com/hkgood/OSGKeyboard">github.com/hkgood/OSGKeyboard</a>, or email <a href="mailto:rocky.hk@gmail.com">rocky.hk@gmail.com</a>.</p>
|
||
|
||
<hr id="zh">
|
||
<h1>OSGKeyboard 隐私政策</h1>
|
||
<p><strong>更新日期:</strong>2026 年 7 月 23 日 · <em>v1.0</em></p>
|
||
<p>OSGKeyboard 是一款 iOS 自定义键盘,可将语音转为文字。它以自定义键盘扩展的形式运行,需要 iOS 26 及以上系统,默认使用 Apple 端侧的 <code>SpeechAnalyzer</code> + <code>DictationTranscriber</code> 转写;可选的云端识别引擎(需显式二次确认开启)会把录音上传到你配置的服务商。转写完成后,文字可能经云端 LLM 润色或翻译。本政策说明应用处理哪些数据及用途。</p>
|
||
|
||
<h2>我们处理的数据</h2>
|
||
<ul>
|
||
<li><strong>语音音频</strong> — 仅在你主动录音时采集。默认<strong>本地引擎</strong>下,音频在设备端通过 <code>SpeechAnalyzer</code> + <code>DictationTranscriber</code> 转写,原始录音不会上传。若你显式开启<strong>云端引擎</strong>(会先弹出确认对话框),录音会上传到你配置的识别服务商(如 OpenAI、通义 DashScope、智谱)完成转写,适用该服务商的隐私政策。OSGKeyboard 自身绝不存储或中转你的音频。</li>
|
||
<li><strong>转写文字</strong> — 端侧 ASR 完成后,转写文字(非音频)会发送润色。<strong>本地引擎</strong>使用构建时配置的内置 DeepSeek 端点;<strong>云端引擎</strong>的润色与可选翻译使用你配置的 OpenAI 兼容 API(OpenAI / 通义 DashScope / Moonshot / 智谱 / 小米 MiMo / 自建服务等)。</li>
|
||
<li><strong>API 凭证</strong> — 云端引擎的 LLM API Key 保存在设备 Keychain,仅在发起 LLM 请求时读取;通过共享 Keychain 组与主 App 共享,<strong>不会</strong>写入 <code>UserDefaults</code>。</li>
|
||
<li><strong>应用偏好</strong> — 引擎模式、识别语言、润色档位、翻译目标、握持偏好、光标导航开关、键盘设置等保存在 App Group <code>UserDefaults</code>,仅用于主 App 与键盘扩展之间的状态同步。</li>
|
||
<li><strong>个性词库</strong> — 你在「词库」Tab 添加的词条与别名保存在本机。润色时会写入 LLM 提示词以保留你的词汇;词库数据不会上传到独立服务器。</li>
|
||
<li><strong>语音历史</strong> — 主 App 可在「历史」页保留近期成功转写,上限 300 条。开启 iCloud 设置同步后,历史也可能经私有 iCloud 键值存储同步。</li>
|
||
<li><strong>用量统计</strong> — 首页统计卡片的累计听写时长、听写字数、翻译字数、词库词条数均在本地计算与保存。</li>
|
||
</ul>
|
||
|
||
<h2>我们不收集的内容</h2>
|
||
<ul>
|
||
<li>我们<strong>不会</strong>记录或上传你平时在键盘上的击键内容。</li>
|
||
<li>我们<strong>不会</strong>集成分析、崩溃上报或广告 SDK。</li>
|
||
<li>默认本地引擎下,我们<strong>不会</strong>将原始录音上传至任何服务器。唯一例外是可选的云端识别引擎:你显式开启后(会先弹出确认对话框),录音会发送到<em>你</em>配置的识别服务商——绝不会发送到我们的服务器。</li>
|
||
<li>我们<strong>不会</strong>出售个人数据。</li>
|
||
</ul>
|
||
|
||
<h2>键盘扩展与主 App 的通信方式</h2>
|
||
<p>OSGKeyboard 采用主 App 维护的「Flow 会话」机制:键盘扩展在 App Group 中写入轻量的「开始 / 停止」信号,主 App 采集音频并完成转写(默认在设备端;若你开启云端引擎则经你配置的识别服务商),再将转写文字发送润色(及可选翻译)后回写结果。默认本地引擎下音频不会离开设备;发送给 LLM 的仅为转写文字(本地引擎走内置 DeepSeek,云端引擎走你配置的 API)。</p>
|
||
|
||
<h2>权限说明</h2>
|
||
<ul>
|
||
<li><strong>麦克风</strong>(<code>NSMicrophoneUsageDescription</code>)— 语音输入与长生命周期语音会话所需。</li>
|
||
<li><strong>语音识别</strong>(<code>NSSpeechRecognitionUsageDescription</code>)— 调用 Apple 端侧语音能力进行转写所需。</li>
|
||
<li><strong>完全访问</strong> — 使键盘能使用麦克风、从共享 Keychain 读取 API Key,并从主 App 获取润色结果。完全访问<strong>不</strong>代表我们会获取你输入的所有内容,绝不外传击键。</li>
|
||
</ul>
|
||
|
||
<h2>第三方</h2>
|
||
<p>端侧 ASR 完成后,转写文字会发送润色与可选翻译。本地引擎发送至内置 DeepSeek 端点;云端引擎发送至你在设置中配置的 OpenAI 兼容 API 端点。该服务商的隐私政策适用于相关请求。OSGKeyboard 不代理、不记录、不聚合这些请求。</p>
|
||
|
||
<h2>数据保留</h2>
|
||
<p>设置保留在设备上,直至卸载或重置。开启 iCloud 设置同步后,API 密钥经 iCloud 钥匙串同步,偏好、统计与历史可能经私有 iCloud 账户同步。识别结果写入你正在使用的宿主 App,OSGKeyboard 不会长期存储。语音历史上限 300 条,可随时在「历史」页清空或通过重置设置清除。</p>
|
||
|
||
<h2>儿童隐私</h2>
|
||
<p>OSGKeyboard 不面向 13 岁以下儿童,亦不会明知地从儿童处收集个人信息。</p>
|
||
|
||
<h2>政策变更</h2>
|
||
<p>本政策可能随应用演进而更新,更新日期始终显示在文首。重大变更会在项目 <a href="https://github.com/hkgood/OSGKeyboard/blob/main/CHANGELOG.md">CHANGELOG</a> 中标注。</p>
|
||
|
||
<h2>许可协议</h2>
|
||
<p>OSGKeyboard 基于 <a href="https://github.com/hkgood/OSGKeyboard/blob/main/LICENSE">OSGKeyboard 源码可见许可协议</a> 发布 —— 仅限个人学习与非商用本地使用;禁止商用、再分发及公开 fork。</p>
|
||
|
||
<h2>联系</h2>
|
||
<p>问题反馈或隐私相关请求:<a href="https://github.com/hkgood/OSGKeyboard">github.com/hkgood/OSGKeyboard</a> 提 Issue,或邮件 <a href="mailto:rocky.hk@gmail.com">rocky.hk@gmail.com</a>。</p>
|
||
</body>
|
||
</html>
|