e6f99d2744
Use compliant permission prompts, align cloud ASR privacy disclosures, and default Flow sessions to a shorter inactivity window for safer resubmission.
350 lines
12 KiB
Markdown
350 lines
12 KiB
Markdown
# App Store Connect — OSGKeyboard v0.1.2
|
||
|
||
> Use this document as a single source of truth for App Store Connect
|
||
> version metadata. All values are Apple-compliant (character limits
|
||
> respected, no marketing claims that would trigger Guideline 4.0).
|
||
|
||
---
|
||
|
||
## App Information
|
||
|
||
| Field | Value | Notes |
|
||
|---|---|---|
|
||
| **App name** | `OSGKeyboard` | CFBundleDisplayName. ≤ 30 chars. |
|
||
| **Subtitle** | `Voice input, everywhere` | ≤ 30 chars. |
|
||
| **Bundle ID** | `com.osgkeyboard.ios` | project.yml `bundleIdPrefix` + target name. |
|
||
| **SKU** | `OSGKB-001` | Internal; not user-visible. |
|
||
| **Primary locale** | `en-US` | |
|
||
| **Category (primary)** | `Utilities` | LSApplicationCategoryType. |
|
||
| **Category (secondary)** | `Productivity` | Optional, helps discovery. |
|
||
| **Content rights** | `No third-party content` | Default. |
|
||
| **Age rating** | `4+` | No objectionable content. |
|
||
|
||
---
|
||
|
||
## URLs (required)
|
||
|
||
| Field | Value |
|
||
|---|---|
|
||
| **Support URL** | `https://github.com/hkgood/OSGKeyboard/issues` |
|
||
| **Marketing URL** | `https://github.com/hkgood/OSGKeyboard` |
|
||
| **Privacy Policy URL** | `https://hkgood.github.io/OSGKeyboard/privacy/` |
|
||
| **EULA** | *Leave blank* — use Apple's standard EULA |
|
||
|
||
---
|
||
|
||
## Pricing & Availability
|
||
|
||
| Field | Value |
|
||
|---|---|
|
||
| **Price** | Free (0 USD) |
|
||
| **In-App Purchases** | Optional voluntary tip — Consumable `ByRockyACoffee` (¥28 China tier; no feature unlock) |
|
||
| **Availability** | All App Store territories (default) |
|
||
| **Pre-order** | No |
|
||
| **Volume purchase** | No |
|
||
|
||
---
|
||
|
||
## Description (≤ 4000 chars)
|
||
|
||
```
|
||
OSGKeyboard is a free, open-source custom keyboard for iOS 26 that turns
|
||
your voice into clean, AI-polished text — in any app.
|
||
|
||
Hold the mic key, speak naturally, release. By default the keyboard
|
||
transcribes your voice entirely on-device (Apple's iOS 26
|
||
SpeechAnalyzer + DictationTranscriber), and only the final text is
|
||
sent to the AI you choose to polish it — your audio never leaves your
|
||
device unless you explicitly opt into the cloud ASR engine, which
|
||
uploads recordings to the provider you configure.
|
||
|
||
WHY OSGKEYBOARD
|
||
|
||
• Works everywhere — Messages, Notes, Mail, Slack, ChatGPT, Claude,
|
||
Cursor, browsers, terminal apps. Anywhere you can type, OSGKeyboard
|
||
types for you.
|
||
• Push-to-talk, the way voice should work. No more "Hey Siri" mode that
|
||
listens to the whole room.
|
||
• On-device speech recognition by default. Powered by Apple's iOS 26
|
||
speech pipeline — no audio upload unless you explicitly enable the
|
||
optional cloud ASR engine (confirmation required).
|
||
• Bring-your-own AI. Connect any OpenAI-compatible endpoint (OpenAI,
|
||
DeepSeek, Qwen DashScope, Moonshot, Zhipu, your own self-hosted
|
||
server). Your API key stays in the iOS Keychain.
|
||
• Three polish modes:
|
||
– Off: raw transcript.
|
||
– Transcribe: just the cleaned-up text.
|
||
– Polish: punctuation, structure, and grammar via your chosen LLM.
|
||
• Continuous flow. One session, many utterances — no need to re-open
|
||
the host app between thoughts.
|
||
• Zero dependencies. No trackers, no analytics, no crash reporters.
|
||
The whole project is ~8,700 lines of Swift you can audit in an
|
||
afternoon.
|
||
• Privacy first. PrivacyInfo.xcprivacy declares exactly what the app
|
||
touches (voice audio + transcripts, on-device by default, never
|
||
linked or tracked); we don't run a server.
|
||
|
||
OPTIONAL SUPPORT
|
||
|
||
OSGKeyboard is completely free — every feature is available without
|
||
payment. If you'd like to support development, Settings includes an
|
||
optional in-app tip (Consumable). It does not unlock anything extra.
|
||
|
||
BUILT FOR
|
||
|
||
• iOS 26 and later, iPhone and iPad.
|
||
• Anyone who types more than 100 words a day on their phone.
|
||
• Developers, writers, students, and translators who want voice input
|
||
that respects their privacy.
|
||
|
||
OPEN SOURCE
|
||
|
||
OSGKeyboard is MIT-licensed and developed in the open. Issues, pull
|
||
requests, and translations are welcome on GitHub.
|
||
|
||
https://github.com/hkgood/OSGKeyboard
|
||
```
|
||
|
||
---
|
||
|
||
## Promotional Text (≤ 170 chars, editable without new build)
|
||
|
||
```
|
||
Voice input, everywhere. Hold the mic, speak, release — AI-polished
|
||
text lands at your cursor. On-device speech, your own API key, zero
|
||
trackers. iOS 26+, free & open-source.
|
||
```
|
||
|
||
> Apple allows you to change the Promotional Text at any time without
|
||
> submitting a new build. Use it for launch-day announcements.
|
||
|
||
---
|
||
|
||
## Keywords (≤ 100 chars, comma-separated)
|
||
|
||
```
|
||
keyboard,voice,dictation,speech,transcribe,AI,polish,whisper,gpt,openai,productivity,accessibility
|
||
```
|
||
|
||
> 97 chars. Apple matches keywords against search terms; avoid the
|
||
> app name (already indexed) and competitor names.
|
||
|
||
---
|
||
|
||
## Release Notes (for v0.1.2, ≤ 4000 chars)
|
||
|
||
```
|
||
Welcome to OSGKeyboard v0.1.2 — our App Store debut!
|
||
|
||
This release focuses on review-driven polish for the iOS 26 launch:
|
||
|
||
NEW
|
||
• Dynamic ASR locale picker — Settings now lists every locale Apple's
|
||
speech framework supports, with an on-device badge so you know which
|
||
ones keep your audio on your phone.
|
||
• Apple-on-device flow polish — the continuous-capture session survives
|
||
app switching and can run for up to an hour in the foreground.
|
||
• Per-locale on-device indicator — choose Chinese (Simplified) and
|
||
you'll see the iPhone icon next to it, confirming audio never leaves
|
||
your device.
|
||
|
||
FIXED
|
||
• Light/dark mode is now consistent — cards and buttons follow the
|
||
active theme everywhere, including the in-app keyboard preview.
|
||
• iPhone-only lock — we removed iPad multitasking support; the app
|
||
declares iPhone as the only target family. This fixed TestFlight
|
||
error 90474 and the previously-misleading "supports iPad" badge.
|
||
• Keyboard preview cycling — tapping the disc now correctly cycles
|
||
through idle → recording → processing → idle, with sample
|
||
transcripts in the recording state.
|
||
• Embedded keyboard strings — Chinese and English keyboard strings
|
||
are now properly bundled into the extension binary, so language
|
||
switching works the moment you install the keyboard.
|
||
• Actool crash on iOS 26 — the legacy Icon Composer icon was removed
|
||
to stop App Store Connect rejecting the build.
|
||
|
||
CHANGED
|
||
• The keyboard's top divider line is gone — the subtle highlight
|
||
gradient is retained for visual structure without the hard separator.
|
||
• README is consistent with the implemented capability set (iOS 26
|
||
on-device SpeechAnalyzer + DictationTranscriber only).
|
||
|
||
KNOWN ISSUES
|
||
• Continuous mode requires Full Access (Apple's policy, not ours).
|
||
The onboarding flow walks you through enabling it.
|
||
• Some iCloud-synced keyboards can take a few seconds to appear in
|
||
the Add New Keyboard list. This is iOS 26 behavior.
|
||
|
||
We'd love to hear from you — open an issue on GitHub, or rate this
|
||
version to help others find it.
|
||
```
|
||
|
||
---
|
||
|
||
## What's New in This Version
|
||
|
||
*(Same as Release Notes, but shorter; the What's New field is also
|
||
capped at 4000 chars. Apple displays it in the Updates tab.)*
|
||
|
||
```
|
||
Welcome to v0.1.2 — our App Store debut!
|
||
|
||
NEW: Dynamic ASR locale picker with on-device indicator. Continuous
|
||
flow sessions survive app switching for up to an hour. Polish modes:
|
||
off / transcribe / polish.
|
||
|
||
FIXED: Light/dark mode is now consistent across the keyboard preview.
|
||
TestFlight error 90474 (iPhone-only) is resolved. Keyboard preview
|
||
disc correctly cycles idle → recording → processing. Keyboard
|
||
strings are properly embedded in the extension bundle for instant
|
||
language switching.
|
||
|
||
CHANGED: The hard divider line on the keyboard is gone; the subtle
|
||
gradient highlight remains.
|
||
|
||
We'd love your feedback — open an issue on GitHub or rate this app.
|
||
```
|
||
|
||
---
|
||
|
||
## App Privacy (App Store Connect "Privacy" section)
|
||
|
||
Choose **"Yes, we collect data from this app"** because optional cloud
|
||
recognition sends audio and cloud polish/translation sends user text to
|
||
the provider selected by the user. Declare **Audio Data** and **Other
|
||
User Content** for **App Functionality**, linked to the user, and not
|
||
used for tracking. The exact answers are listed under
|
||
[App Privacy answers](#app-privacy-answers).
|
||
|
||
On-device recognition remains the default and does not upload audio.
|
||
The app does not embed analytics, crash-reporting, advertising, or
|
||
tracking SDKs.
|
||
|
||
---
|
||
|
||
## Encryption (annual survey)
|
||
|
||
`Info.plist` declares `ITSAppUsesNonExemptEncryption = false`. The
|
||
annual survey will be auto-skipped on upload. If prompted manually:
|
||
|
||
* Does your app use encryption? **No** (the LLM call uses HTTPS, which
|
||
Apple classifies as "standard internet protocols" and is exempt
|
||
under category 5 part 2 note 4 of the EAR).
|
||
* Is your app exempt under Category 5 Part 2? **Yes** (HTTPS only).
|
||
|
||
---
|
||
|
||
## App Review information
|
||
|
||
When the build is uploaded and you click "Add for Review", fill in:
|
||
|
||
| Field | Value |
|
||
|---|---|
|
||
| **Sign-in required** | No (no account) |
|
||
| **Demo account** | n/a |
|
||
| **Contact info** | (your Apple Developer account email) |
|
||
| **Phone** | (your phone; only Apple sees it) |
|
||
| **Notes to reviewer** | (see below) |
|
||
|
||
### Notes to App Review
|
||
|
||
```
|
||
OSGKeyboard is a free, open-source custom keyboard. To test it end
|
||
to end, please:
|
||
|
||
1. Install the keyboard:
|
||
Settings → General → Keyboard → Keyboards → Add New Keyboard →
|
||
under "Third-Party Keyboards" choose "OSGKeyboard".
|
||
2. Enable Full Access for OSGKeyboard (onboarding in the app walks
|
||
through this, but you can also tap it in the keyboard settings).
|
||
Full Access is required for the continuous-capture flow session
|
||
(network access for the LLM polish step + shared App Group
|
||
container with the main app). On-device recognition is the default
|
||
and does not upload audio. If the user explicitly enables cloud
|
||
recognition, recordings are sent to the speech provider configured
|
||
in Settings. Transcribed text may also be sent to the configured
|
||
LLM endpoint for polish or translation.
|
||
3. In any app, switch to OSGKeyboard (globe key), then hold the
|
||
purple mic key, speak, and release.
|
||
4. For the LLM polish demo: open OSGKeyboard's main app, Settings,
|
||
Provider. Enter any OpenAI-compatible key (OpenAI, DeepSeek,
|
||
Qwen, Moonshot, Zhipu, or a self-hosted URL). The default
|
||
provider "Custom" works with a local mock server if you have
|
||
one running.
|
||
5. The privacy policy is at
|
||
https://hkgood.github.io/OSGKeyboard/privacy/
|
||
|
||
6. Optional tip (Consumable IAP ByRockyACoffee): open
|
||
Settings → "Support the Developer". All features remain free before
|
||
and after purchase; the tip does not unlock anything. Consumable
|
||
tips cannot be restored (stated in UI).
|
||
|
||
Source code: https://github.com/hkgood/OSGKeyboard
|
||
```
|
||
|
||
---
|
||
|
||
## App Privacy answers
|
||
|
||
Use these conservative disclosures in App Store Connect → App Privacy.
|
||
They cover optional cloud recognition and cloud text polish even though
|
||
on-device recognition remains the default.
|
||
|
||
### Data types collected
|
||
|
||
#### User Content → Audio Data
|
||
|
||
- **Collected:** Yes
|
||
- **Purpose:** App Functionality
|
||
- **Linked to the user:** Yes
|
||
- **Used for tracking:** No
|
||
|
||
Audio is sent off-device only after the user explicitly enables cloud
|
||
recognition. The configured provider may associate requests with the
|
||
user's provider account/API credential, so the conservative answer is
|
||
"linked".
|
||
|
||
#### User Content → Other User Content
|
||
|
||
- **Collected:** Yes
|
||
- **Purpose:** App Functionality
|
||
- **Linked to the user:** Yes
|
||
- **Used for tracking:** No
|
||
|
||
This covers transcripts, polish prompts, optional translation text, and
|
||
personal-dictionary terms included in those requests. A configured
|
||
provider may associate requests with the user's provider account/API
|
||
credential.
|
||
|
||
### Do not select
|
||
|
||
- Contact Info, Financial Info, Location, Contacts, Photos or Videos
|
||
- Browsing History, Search History, Purchases, Identifiers
|
||
- Usage Data or Diagnostics (stored locally/private iCloud only)
|
||
- Third-Party Advertising, Developer Advertising or Marketing,
|
||
Analytics, Product Personalization, or Other Purposes
|
||
- Tracking
|
||
|
||
### URLs
|
||
|
||
- **Privacy Policy URL:** `https://hkgood.github.io/OSGKeyboard/privacy/`
|
||
- **User Privacy Choices URL:** leave blank (optional); users can disable
|
||
cloud recognition/polish, clear history, reset settings, or delete the
|
||
app as described in the policy.
|
||
|
||
---
|
||
|
||
## Submission checklist
|
||
|
||
- [ ] All 10 screenshots replaced with real Simulator captures
|
||
(5 × 1290×2796 + 5 × 1179×2556)
|
||
- [ ] Archive in Xcode → Product → Archive → Distribute App → App
|
||
Store Connect → Upload
|
||
- [ ] Select the new build under "Builds" in the version
|
||
- [ ] Fill in metadata from this document
|
||
- [ ] Privacy: Audio Data + Other User Content; App Functionality;
|
||
linked to user; not used for tracking
|
||
- [ ] Encryption: skip (auto-skipped via Info.plist key)
|
||
- [ ] Add for review
|
||
- [ ] Submit
|