From f2e67a42c9c6e8fe2be90cee7c2ed32379e458e9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fatih=20Kadir=20Ak=C4=B1n?=
Date: Mon, 10 Aug 2026 20:32:22 +0300
Subject: [PATCH] Prepare Textream for Mac App Store distribution
---
README.md | 13 +-
Textream/Textream.xcodeproj/project.pbxproj | 110 +++++-
Textream/Textream/ContentView.swift | 16 +
Textream/Textream/Fonts/OpenDyslexic-OFL.txt | 94 +++++
Textream/Textream/PrivacyInfo.xcprivacy | 31 ++
Textream/Textream/TextreamApp.swift | 7 +-
app-store/README.md | 49 +++
app-store/app-privacy.md | 44 +++
app-store/metadata/en-US/copyright.txt | 1 +
app-store/metadata/en-US/description.txt | 30 ++
app-store/metadata/en-US/keywords.txt | 1 +
app-store/metadata/en-US/marketing_url.txt | 1 +
app-store/metadata/en-US/name.txt | 1 +
app-store/metadata/en-US/privacy_url.txt | 1 +
app-store/metadata/en-US/promotional_text.txt | 1 +
app-store/metadata/en-US/review_notes.txt | 14 +
app-store/metadata/en-US/subtitle.txt | 1 +
app-store/metadata/en-US/support_url.txt | 1 +
docs/index.html | 8 +-
docs/privacy.html | 299 ++++++++++++++++
docs/support.html | 325 ++++++++++++++++++
21 files changed, 1033 insertions(+), 15 deletions(-)
create mode 100644 Textream/Textream/Fonts/OpenDyslexic-OFL.txt
create mode 100644 Textream/Textream/PrivacyInfo.xcprivacy
create mode 100644 app-store/README.md
create mode 100644 app-store/app-privacy.md
create mode 100644 app-store/metadata/en-US/copyright.txt
create mode 100644 app-store/metadata/en-US/description.txt
create mode 100644 app-store/metadata/en-US/keywords.txt
create mode 100644 app-store/metadata/en-US/marketing_url.txt
create mode 100644 app-store/metadata/en-US/name.txt
create mode 100644 app-store/metadata/en-US/privacy_url.txt
create mode 100644 app-store/metadata/en-US/promotional_text.txt
create mode 100644 app-store/metadata/en-US/review_notes.txt
create mode 100644 app-store/metadata/en-US/subtitle.txt
create mode 100644 app-store/metadata/en-US/support_url.txt
create mode 100644 docs/privacy.html
create mode 100644 docs/support.html
diff --git a/README.md b/README.md
index e9083c3..a04b901 100644
--- a/README.md
+++ b/README.md
@@ -13,7 +13,7 @@
- Download · Features · How It Works · Build
+ Download · Features · How It Works · Build · Privacy
@@ -46,7 +46,7 @@ brew install textream
| Mode | Description | Microphone |
|---|---|---|
-| **Word Tracking** (default) | On-device speech recognition highlights each word as you say it. No cloud, no latency, works offline. Supports dozens of languages. | Required |
+| **Word Tracking** (default) | macOS speech recognition highlights each word as you say it. Depending on your Mac, language, and system availability, recognition may happen on-device or Apple may process microphone audio. | Required |
| **Classic** | Auto-scrolls at a constant speed. No microphone needed. | Not needed |
| **Voice-Activated** | Scrolls while you speak, pauses when you're silent or muted. Perfect for natural pacing. | Required |
@@ -111,7 +111,7 @@ View your teleprompter on **any device** — phone, tablet, or another computer
- **Real-time sync** — Words highlight, waveform animates, and progress updates in real time over WebSocket.
- **No app needed** — Works in any modern browser. No installation required on the remote device.
- **Configurable port** — Default port 7373, adjustable in advanced settings.
-- **Fully local** — All traffic stays on your local network. Nothing leaves your Wi-Fi.
+- **Direct local connection** — Textream does not relay Remote Connection traffic through a developer server. Enable it only on a local network and with devices you trust.
### Director Mode
@@ -138,7 +138,7 @@ Let someone else control your teleprompter remotely. A director can write, edit,
- **Tap to jump** — Tap any word in the overlay to jump the tracker to that position.
- **Pause & resume** — Go off-script, take a break, come back. The tracker picks up where you left off.
- **Mute / unmute** — Toggle the microphone on or off from the overlay in any mode.
-- **Completely private** — All processing happens on-device. No accounts, no tracking, no data leaves your Mac.
+- **Private by design** — No accounts, ads, analytics, or Textream-operated cloud service. Scripts and settings stay under your control. In Word Tracking mode, macOS speech recognition may send microphone audio to Apple for processing; see the [privacy policy](https://blog.fka.dev/textream/privacy.html).
- **Auto update checker** — Checks GitHub Releases for new versions on launch and from the Textream menu.
- **Open source** — MIT licensed. Contributions welcome.
@@ -185,7 +185,7 @@ Textream/
├── TextreamApp.swift # App entry point, deep link handling
├── ContentView.swift # Main text editor UI + About view
├── TextreamService.swift # Service layer, URL scheme handling
- ├── SpeechRecognizer.swift # On-device speech recognition engine
+ ├── SpeechRecognizer.swift # macOS speech recognition integration
├── NotchOverlayController.swift # Dynamic Island + floating overlay
├── ExternalDisplayController.swift # Sidecar / external display output
├── NotchSettings.swift # User preferences and presets
@@ -331,5 +331,6 @@ MIT
Original idea by Semih Kışlar — thanks to him!
- Made by Fatih Kadir Akin
+ Made by Fatih Kadir Akin
+ Privacy · Support
diff --git a/Textream/Textream.xcodeproj/project.pbxproj b/Textream/Textream.xcodeproj/project.pbxproj
index 96e3b13..53d5ad4 100644
--- a/Textream/Textream.xcodeproj/project.pbxproj
+++ b/Textream/Textream.xcodeproj/project.pbxproj
@@ -247,6 +247,63 @@
};
name = Release;
};
+ 446966C42F37E47400AF141F /* AppStore */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ DEVELOPMENT_TEAM = RJA7656U34;
+ EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = YES;
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MACOSX_DEPLOYMENT_TARGET = 15.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ SDKROOT = macosx;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ };
+ name = AppStore;
+ };
446966C22F37E47400AF141F /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
@@ -266,9 +323,10 @@
INFOPLIST_FILE = Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Textream;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
- INFOPLIST_KEY_NSHumanReadableCopyright = "";
+ INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2026 Fatih Kadir Akın";
+ INFOPLIST_KEY_NSLocalNetworkUsageDescription = "Textream lets nearby devices view or control your teleprompter over your local network.";
INFOPLIST_KEY_NSMicrophoneUsageDescription = "Textream needs microphone access to listen to your speech and highlight words as you read them.";
- INFOPLIST_KEY_NSSpeechRecognitionUsageDescription = "Textream uses speech recognition to follow along as you read and highlight the current word.";
+ INFOPLIST_KEY_NSSpeechRecognitionUsageDescription = "Textream uses Apple's speech-recognition service to follow along as you read and highlight the current word. Microphone audio may be processed by Apple.";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
@@ -305,9 +363,10 @@
INFOPLIST_FILE = Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Textream;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
- INFOPLIST_KEY_NSHumanReadableCopyright = "";
+ INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2026 Fatih Kadir Akın";
+ INFOPLIST_KEY_NSLocalNetworkUsageDescription = "Textream lets nearby devices view or control your teleprompter over your local network.";
INFOPLIST_KEY_NSMicrophoneUsageDescription = "Textream needs microphone access to listen to your speech and highlight words as you read them.";
- INFOPLIST_KEY_NSSpeechRecognitionUsageDescription = "Textream uses speech recognition to follow along as you read and highlight the current word.";
+ INFOPLIST_KEY_NSSpeechRecognitionUsageDescription = "Textream uses Apple's speech-recognition service to follow along as you read and highlight the current word. Microphone audio may be processed by Apple.";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
@@ -325,6 +384,47 @@
};
name = Release;
};
+ 446966C52F37E47400AF141F /* AppStore */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
+ CODE_SIGN_ENTITLEMENTS = Textream/Textream.entitlements;
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = RJA7656U34;
+ ENABLE_APP_SANDBOX = YES;
+ ENABLE_HARDENED_RUNTIME = YES;
+ ENABLE_PREVIEWS = YES;
+ ENABLE_USER_SELECTED_FILES = readwrite;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = Textream;
+ INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
+ INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2026 Fatih Kadir Akın";
+ INFOPLIST_KEY_NSLocalNetworkUsageDescription = "Textream lets nearby devices view or control your teleprompter over your local network.";
+ INFOPLIST_KEY_NSMicrophoneUsageDescription = "Textream needs microphone access to listen to your speech and highlight words as you read them.";
+ INFOPLIST_KEY_NSSpeechRecognitionUsageDescription = "Textream uses Apple's speech-recognition service to follow along as you read and highlight the current word. Microphone audio may be processed by Apple.";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ );
+ MARKETING_VERSION = 1.6.5;
+ PRODUCT_BUNDLE_IDENTIFIER = dev.fka.textream;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ REGISTER_APP_GROUPS = YES;
+ STRING_CATALOG_GENERATE_SYMBOLS = YES;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "APP_STORE $(inherited)";
+ SWIFT_APPROACHABLE_CONCURRENCY = YES;
+ SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
+ SWIFT_VERSION = 5.0;
+ };
+ name = AppStore;
+ };
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
@@ -333,6 +433,7 @@
buildConfigurations = (
446966BF2F37E47400AF141F /* Debug */,
446966C02F37E47400AF141F /* Release */,
+ 446966C42F37E47400AF141F /* AppStore */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@@ -342,6 +443,7 @@
buildConfigurations = (
446966C22F37E47400AF141F /* Debug */,
446966C32F37E47400AF141F /* Release */,
+ 446966C52F37E47400AF141F /* AppStore */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
diff --git a/Textream/Textream/ContentView.swift b/Textream/Textream/ContentView.swift
index 2913a29..9d103fc 100644
--- a/Textream/Textream/ContentView.swift
+++ b/Textream/Textream/ContentView.swift
@@ -852,6 +852,21 @@ struct AboutView: View {
.clipShape(Capsule())
}
+ Link(destination: URL(string: "https://blog.fka.dev/textream/privacy.html")!) {
+ HStack(spacing: 5) {
+ Image(systemName: "hand.raised.fill")
+ .font(.system(size: 11, weight: .semibold))
+ Text("Privacy")
+ .font(.system(size: 12, weight: .medium))
+ }
+ .foregroundStyle(.primary)
+ .padding(.horizontal, 14)
+ .padding(.vertical, 7)
+ .background(Color.primary.opacity(0.08))
+ .clipShape(Capsule())
+ }
+
+ #if !APP_STORE
Link(destination: URL(string: "https://donate.stripe.com/aFa8wO4NF2S96jDfn4dMI09")!) {
HStack(spacing: 5) {
Image(systemName: "heart.fill")
@@ -866,6 +881,7 @@ struct AboutView: View {
.background(Color.pink.opacity(0.1))
.clipShape(Capsule())
}
+ #endif
}
Divider().padding(.horizontal, 20)
diff --git a/Textream/Textream/Fonts/OpenDyslexic-OFL.txt b/Textream/Textream/Fonts/OpenDyslexic-OFL.txt
new file mode 100644
index 0000000..bb86782
--- /dev/null
+++ b/Textream/Textream/Fonts/OpenDyslexic-OFL.txt
@@ -0,0 +1,94 @@
+Copyright (c) 2019-07-29, Abbie Gonzalez (https://abbiecod.es|support@abbiecod.es),
+with Reserved Font Name OpenDyslexic.
+Copyright (c) 12/2012 - 2019
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/Textream/Textream/PrivacyInfo.xcprivacy b/Textream/Textream/PrivacyInfo.xcprivacy
new file mode 100644
index 0000000..9c3364e
--- /dev/null
+++ b/Textream/Textream/PrivacyInfo.xcprivacy
@@ -0,0 +1,31 @@
+
+
+
+
+ NSPrivacyTracking
+
+ NSPrivacyTrackingDomains
+
+ NSPrivacyCollectedDataTypes
+
+ NSPrivacyAccessedAPITypes
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategoryUserDefaults
+ NSPrivacyAccessedAPITypeReasons
+
+ CA92.1
+
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategorySystemBootTime
+ NSPrivacyAccessedAPITypeReasons
+
+ 35F9.1
+
+
+
+
+
diff --git a/Textream/Textream/TextreamApp.swift b/Textream/Textream/TextreamApp.swift
index b8e17d2..1f12a9e 100644
--- a/Textream/Textream/TextreamApp.swift
+++ b/Textream/Textream/TextreamApp.swift
@@ -35,8 +35,11 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
TextreamService.shared.hideMainWindow()
}
- // Silent update check on launch
+ #if !APP_STORE
+ // Direct-download builds check GitHub for updates. App Store builds are
+ // updated exclusively through the App Store.
UpdateChecker.shared.checkForUpdates(silent: true)
+ #endif
// Start browser server if enabled
TextreamService.shared.updateBrowserServer()
@@ -135,10 +138,12 @@ struct TextreamApp: App {
Button("About Textream") {
NotificationCenter.default.post(name: .openAbout, object: nil)
}
+ #if !APP_STORE
Divider()
Button("Check for Updates…") {
UpdateChecker.shared.checkForUpdates()
}
+ #endif
}
CommandGroup(after: .appSettings) {
Button("Settings…") {
diff --git a/app-store/README.md b/app-store/README.md
new file mode 100644
index 0000000..8b81599
--- /dev/null
+++ b/app-store/README.md
@@ -0,0 +1,49 @@
+# Textream App Store submission drafts
+
+This directory contains working copy for an initial Mac App Store submission. Nothing here proves that an app record, build, page, screenshot, price, region, or submission is live.
+
+## Metadata
+
+The English (U.S.) draft is in `metadata/en-US/`:
+
+- `name.txt` — 8 characters; App Store limit 30.
+- `subtitle.txt` — 29 characters; App Store limit 30.
+- `description.txt` — long description; App Store limit 4,000 characters.
+- `keywords.txt` — 88 characters; App Store limit 100 bytes.
+- `promotional_text.txt` — 160 characters; App Store limit 170.
+- `support_url.txt`, `privacy_url.txt`, and `marketing_url.txt` — public web destinations.
+- `copyright.txt` — proposed rights-holder line.
+- `review_notes.txt` — draft testing instructions for App Review.
+
+The privacy and support URLs will be valid only after `docs/privacy.html` and `docs/support.html` are deployed to the canonical Textream site. Verify all three URLs in a signed-out browser before entering them in App Store Connect.
+
+## Build-dependent statements
+
+Before using this copy, verify the submitted archive itself:
+
+- App Store builds do not run or expose the GitHub update checker.
+- App Store builds do not expose an external donation or purchase link.
+- No analytics, advertising, tracking, crash-reporting, account, or developer backend was added.
+- Microphone, speech-recognition, and local-network purpose strings match actual behavior.
+- Remote and Director modes remain optional and local-network-only.
+- Review Notes steps work from a clean install with the permissions reset.
+
+If any point changes, update the description, review notes, privacy policy, and App Privacy answers together.
+
+## Account-holder decisions and attestations
+
+The account holder must review and personally confirm the following in App Store Connect:
+
+- final app name, subtitle, description, keywords, and SKU;
+- the exact copyright owner name and the right to publish all app content;
+- the App Privacy questionnaire in `app-privacy.md` against the uploaded binary;
+- export-compliance answers, including whether the build uses exempt encryption only;
+- age-rating questionnaire answers;
+- price, availability regions, and release method;
+- EU Digital Services Act trader status and any required public contact details;
+- App Review contact name, email address, and phone number;
+- all current developer agreements and tax or banking requirements;
+- the final screenshots and any accessibility or product claims;
+- the final **Submit for Review** action.
+
+Do not replace these attestations with assumptions from source code or an earlier build.
diff --git a/app-store/app-privacy.md b/app-store/app-privacy.md
new file mode 100644
index 0000000..ed3ce05
--- /dev/null
+++ b/app-store/app-privacy.md
@@ -0,0 +1,44 @@
+# App Privacy questionnaire draft
+
+This is a working draft for the App Store Connect questionnaire, not a completed legal attestation. The account holder must compare every answer with the exact binary being submitted and personally confirm it in App Store Connect.
+
+## Proposed top-level answers
+
+- **Does this app collect data from this app?** No.
+- **Is any data used to track users?** No.
+- **Privacy Policy URL:** https://blog.fka.dev/textream/privacy.html
+
+These proposed answers are based on the following build assumptions:
+
+- the App Store build has no analytics, advertising, crash-reporting, attribution, or tracking SDK;
+- the App Store build does not use the direct-download GitHub update checker;
+- the developer does not operate an account, synchronization, speech, storage, or telemetry service for Textream;
+- scripts, imported presentation notes, and preferences are processed locally unless the user explicitly enables a local-network feature;
+- Remote Connection and Director Mode communicate directly with devices the user connects on the same local network; the developer does not receive that traffic;
+- Apple’s Speech framework may process microphone audio on-device or through Apple, but Textream’s developer does not receive the audio or recognition result;
+- no later code, embedded framework, or SDK changes the statements above.
+
+## Why microphone and speech do not automatically mean “data collected”
+
+App Store privacy answers describe data collected by the developer or third parties integrated into the app. Permission to use microphone audio is still privacy-sensitive and must be disclosed clearly, but Apple-framework processing that the developer cannot access is not represented here as developer collection. Re-check Apple’s current App Privacy guidance when submitting.
+
+## Permissions and user-facing disclosures to verify
+
+- Microphone purpose text explains that voice-guided modes need audio input.
+- Speech Recognition purpose text explains that microphone audio may be sent to Apple for recognition.
+- Local Network purpose text explains Remote Connection and Director Mode.
+- The in-app About screen links to the published privacy policy.
+- The public privacy policy matches the behavior of the uploaded build.
+
+## Local-network privacy note
+
+Remote Connection can expose script text and reading state to a connected device. Director Mode can also accept script edits and control commands. These features are user-enabled and local, but their HTTP and WebSocket traffic is not end-to-end encrypted. The public privacy policy tells users to use a trusted network and disable the features afterward.
+
+## Re-check immediately before attesting
+
+1. Inspect the archived app for embedded SDKs and frameworks.
+2. Exercise every feature while monitoring outbound connections.
+3. Confirm the App Store build has no direct-update request, donation flow, account flow, analytics, or developer backend.
+4. Confirm the final privacy-policy page is publicly reachable without login.
+5. Re-read Apple’s current definitions of “collect” and “tracking.”
+6. Have the account holder submit the answers personally.
diff --git a/app-store/metadata/en-US/copyright.txt b/app-store/metadata/en-US/copyright.txt
new file mode 100644
index 0000000..bb8597c
--- /dev/null
+++ b/app-store/metadata/en-US/copyright.txt
@@ -0,0 +1 @@
+2026 Fatih Kadir Akin
diff --git a/app-store/metadata/en-US/description.txt b/app-store/metadata/en-US/description.txt
new file mode 100644
index 0000000..8c24f59
--- /dev/null
+++ b/app-store/metadata/en-US/description.txt
@@ -0,0 +1,30 @@
+Keep your eyes on the camera and your place in the script.
+
+Textream is a flexible teleprompter for presentations, streams, interviews, podcasts, and recorded videos. Paste a script, choose how you want to be guided, and place the teleprompter where it works best for you.
+
+THREE WAYS TO STAY ON SCRIPT
+
+• Word Tracking follows along as you speak using macOS speech recognition.
+• Classic mode scrolls at a steady, adjustable pace without using the microphone.
+• Voice-Activated mode scrolls while you speak and pauses when you stop.
+
+PUT THE SCRIPT WHERE YOU NEED IT
+
+• Pin a compact teleprompter below your MacBook notch.
+• Use a draggable, always-on-top floating window.
+• Read fullscreen on your Mac, an external display, or a Sidecar iPad.
+• Mirror the external-display output for a teleprompter rig.
+
+MAKE IT YOURS
+
+Choose from multiple typefaces, text sizes, highlight colors, overlay sizes, and glass effects. OpenDyslexic is included as a reading option. Save multi-page scripts as .textream files, or import presenter notes from a PowerPoint file.
+
+OPTIONAL LOCAL-NETWORK TOOLS
+
+Remote Connection displays your teleprompter on another device through a local-network browser. Director Mode lets a trusted person on that network edit and control the script from their browser. No companion app is required.
+
+PRIVATE BY DESIGN
+
+Textream has no account, ads, analytics, or developer-operated cloud service. Scripts and settings remain under your control. Word Tracking uses Apple’s speech-recognition framework; depending on your Mac, language, and system availability, macOS may process speech on-device or send microphone audio to Apple.
+
+No account required.
diff --git a/app-store/metadata/en-US/keywords.txt b/app-store/metadata/en-US/keywords.txt
new file mode 100644
index 0000000..165739e
--- /dev/null
+++ b/app-store/metadata/en-US/keywords.txt
@@ -0,0 +1 @@
+teleprompter,presenter,script,speech,streaming,podcast,notch,autoscroll,sidecar,prompter
diff --git a/app-store/metadata/en-US/marketing_url.txt b/app-store/metadata/en-US/marketing_url.txt
new file mode 100644
index 0000000..ed853f7
--- /dev/null
+++ b/app-store/metadata/en-US/marketing_url.txt
@@ -0,0 +1 @@
+https://blog.fka.dev/textream/
diff --git a/app-store/metadata/en-US/name.txt b/app-store/metadata/en-US/name.txt
new file mode 100644
index 0000000..6ba9b90
--- /dev/null
+++ b/app-store/metadata/en-US/name.txt
@@ -0,0 +1 @@
+Textream
diff --git a/app-store/metadata/en-US/privacy_url.txt b/app-store/metadata/en-US/privacy_url.txt
new file mode 100644
index 0000000..3ba110d
--- /dev/null
+++ b/app-store/metadata/en-US/privacy_url.txt
@@ -0,0 +1 @@
+https://blog.fka.dev/textream/privacy.html
diff --git a/app-store/metadata/en-US/promotional_text.txt b/app-store/metadata/en-US/promotional_text.txt
new file mode 100644
index 0000000..d524c90
--- /dev/null
+++ b/app-store/metadata/en-US/promotional_text.txt
@@ -0,0 +1 @@
+Keep your place without looking away. Textream follows your voice, scrolls at your pace, and puts your script in a pinned, floating, or fullscreen teleprompter.
diff --git a/app-store/metadata/en-US/review_notes.txt b/app-store/metadata/en-US/review_notes.txt
new file mode 100644
index 0000000..4c148fc
--- /dev/null
+++ b/app-store/metadata/en-US/review_notes.txt
@@ -0,0 +1,14 @@
+Textream requires no account, purchase, demo credentials, or external hardware.
+
+To test the core experience:
+1. Launch Textream and keep the sample script, or paste any text into the editor.
+2. Click the Play button in the lower-left corner.
+3. Grant Microphone and Speech Recognition access when macOS asks.
+4. Read the script aloud. Word Tracking highlights the current words in the teleprompter overlay.
+5. Stop the session from the overlay or the main Textream window.
+
+The app can also be tested without microphone access: open Textream Settings → Guidance, choose Classic, return to the editor, and click Play. Classic mode scrolls at a fixed speed.
+
+Remote Connection and Director Mode are optional local-network features. To test either feature, enable it in the corresponding Settings tab, then open the address displayed by Textream on a second device on the same network. No remote Textream service is involved.
+
+PowerPoint import expects a .pptx document containing presenter notes. No sample document or external service is required for the rest of the app.
diff --git a/app-store/metadata/en-US/subtitle.txt b/app-store/metadata/en-US/subtitle.txt
new file mode 100644
index 0000000..0a0149f
--- /dev/null
+++ b/app-store/metadata/en-US/subtitle.txt
@@ -0,0 +1 @@
+Teleprompter That Follows You
diff --git a/app-store/metadata/en-US/support_url.txt b/app-store/metadata/en-US/support_url.txt
new file mode 100644
index 0000000..fdc80a4
--- /dev/null
+++ b/app-store/metadata/en-US/support_url.txt
@@ -0,0 +1 @@
+https://blog.fka.dev/textream/support.html
diff --git a/docs/index.html b/docs/index.html
index f955c4d..6f73ff3 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -2990,11 +2990,11 @@ Accessibility first
How it keeps you on track
- Powered by macOS speech recognition. No cloud. No latency.
+ Powered by macOS speech recognition. No account required.
-
Real-Time Voice Tracking Highlights each word as you say it using on-device speech recognition. Fast, private, offline. Supports dozens of languages.
+
Real-Time Voice Tracking Highlights each word as you say it using macOS speech recognition. Processing depends on your Mac, selected language, and system availability.
@@ -3054,7 +3054,7 @@
How it keeps you on track
-
Completely Private All recognition on-device. No data leaves your Mac. No accounts, no tracking, no cloud.
+
Private by Design No account, ads, analytics, or Textream-operated cloud service. macOS may send microphone audio to Apple for speech processing.
@@ -3372,7 +3372,7 @@
Signed and notarized for macOS
+
+
+
+ T
+ Textream
+
+
+
+
+
+ Privacy policy · Updated August 10, 2026
+ Privacy, without fine print.
+ Textream does not require an account and its developer does not operate a service that receives your scripts. A few macOS and optional network features deserve a clear explanation.
+
+
+
+
+ Your scripts are yours
+ Textream keeps working text and preferences on your Mac. You choose where saved script files live.
+
+
+ No ads or analytics
+ The app has no advertising, behavioral tracking, analytics SDK, or Textream account.
+
+
+ You control the microphone
+ Voice-guided modes run only after you grant permission. You can revoke access in macOS Settings.
+
+
+
+
+
+ Information Textream collects
+
+
The Textream developer does not collect personal data through the app. Textream has no developer-operated account system, analytics service, advertising system, or cloud storage service.
+
This describes collection by Textream and its developer. Apple, GitHub, your network provider, or another service you choose to use may process connection or device information under their own policies.
+
+
+
+
+ Microphone and speech recognition
+
+
Word Tracking and Voice-Activated modes use microphone access when you start them. Word Tracking uses Apple’s speech-recognition framework to match spoken words to your script.
+
Speech recognition is not guaranteed to stay on-device. Depending on your Mac, language, macOS version, and service availability, macOS may process speech locally or send microphone audio to Apple for recognition. Textream’s developer does not receive that audio or the recognition result.
+
You can use Classic mode without microphone or speech-recognition access. You can also change permissions at any time in System Settings → Privacy & Security.
+
Apple describes its handling of data in the Apple Privacy Policy .
+
+
+
+
+ Scripts, files, and settings
+
+
Textream stores editor content and preferences locally on your Mac. When you save a .textream file, import PowerPoint notes, or open another document, the file is handled locally and remains in a location you control.
+
Textream does not upload those files to a Textream server. You can remove saved scripts using Finder. Removing the app does not necessarily remove preferences that macOS keeps for it.
+
+
+
+
+ Remote and Director modes
+
+
Remote Connection and Director Mode are off until you enable them. When enabled, Textream starts a server on your Mac so another device on the local network can view teleprompter state or control the script.
+
+ Connected devices may receive script text, reading position, and display state.
+ Director Mode lets a connected device send or edit script text.
+ These features use local HTTP and WebSocket connections that are not end-to-end encrypted.
+
+
Use these modes only on a network and with devices you trust. Turn them off when you are finished, and do not share the connection address or QR code publicly.
+
+
+
+
+ Other network connections
+
+
In a Mac App Store build, updates are delivered by Apple. A version installed directly from GitHub or Homebrew may contact GitHub to check whether a newer release exists. GitHub may receive standard connection information such as an IP address; see the GitHub Privacy Statement .
+
If you follow a link from Textream to a website, that site handles the resulting connection under its own policy.
+
+
+
+
+ Screen sharing
+
+
The “Hide from Screen Sharing” setting asks macOS to exclude Textream’s teleprompter overlay from screen captures. It does not control other apps, cameras, external capture hardware, or content outside Textream. Confirm your recording or meeting setup before relying on it.
+
+
+
+
+ Retention and deletion
+
+
Because the developer does not receive your scripts or maintain a Textream account, there is no Textream server copy to retain or delete. You control saved scripts on your Mac and can delete them whenever you choose.
+
+
+
+
+ Changes and contact
+
+
If Textream’s data practices change, this page will be updated along with its effective date.
+
For a privacy question or support request, visit Textream Support or open a GitHub issue . Do not include private scripts, credentials, or other sensitive information in a public issue.
+
+
+
+
+
+
+
diff --git a/docs/privacy.html b/docs/privacy.html
new file mode 100644
index 0000000..47400ff
--- /dev/null
+++ b/docs/privacy.html
@@ -0,0 +1,299 @@
+
+
+