Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 96 additions & 0 deletions ios/APP_REVIEW_INFORMATION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
# App Review Information — SourceBraid 1.0.1 (Build 10)

Copy the following text into App Store Connect’s **App Review Information**
Notes field. Replace every value in square brackets before submitting. Never
commit the review token or a link that grants access to the screen recording.

```text
SourceBraid — Weave the web into Markdown.

1. Physical-device screen recording
Screen recording: [private review link or App Store Connect attachment]

The recording starts by launching SourceBraid on a physical device. It shows:
- entering the supplied GitHub test repository settings and fine-grained token;
- tapping “Test connection” and receiving the successful connection message;
- opening Safari, sharing https://example.com/ to SourceBraid, confirming the
generated title, and saving it; and
- opening SourceBraid again and showing the saved capture in “Recently saved”.

No account-registration, in-app login, account-deletion, payment,
subscription, purchase, or sensitive-device-permission flow exists in the app.
SourceBraid does not provide a public or social user-generated-content service;
captures are written only to the repository selected by the user, so there are
no reporting or blocking controls.

2. Tested physical devices and operating systems
- [device model 1] — [exact iOS version]
- [device model 2] — [exact iOS version]
- [device model 3, if applicable] — [exact iPadOS version]

SourceBraid supports iPhone and iPad running iOS/iPadOS 17.0 or later.

3. Function and target audience
SourceBraid is for people who want to keep a private, portable Markdown
archive of web sources. From the iOS Share Sheet it saves a shared URL,
readable Safari page text, selected text, a PDF, or another file to the user’s
own GitHub repository. It preserves source URLs and capture metadata, so users
can retain research material outside a proprietary reading-list service.

4. Setup and access to the main features
The app has no SourceBraid account or in-app registration. A GitHub account and
a fine-grained personal access token with Contents: Read and write permission
for the dedicated review repository are required.

Enter these values in SourceBraid’s initial screen:
- Owner or organization: [REVIEW_GITHUB_OWNER]
- Repository: [REVIEW_REPOSITORY]
- Branch: main
- Root folder: web-clips
- GitHub token: [TIME-LIMITED_REVIEW_TOKEN]

Then tap “Test connection”. To test the main Share Extension flow, open
https://example.com/ in Safari, tap Share, choose SourceBraid, and tap Save.
The resulting Markdown capture and metadata are written to the configured
review repository under `web-clips/`.

The supplied token is limited to this review repository, has only Contents:
Read and write permission, and will be revoked after review. It is provided
only in App Store Connect, never in the app binary, source repository, or this
document.

5. External services and platforms
- GitHub REST Contents API (`api.github.com`): SourceBraid reads and writes
the user-selected repository using the user’s fine-grained GitHub token.
- Websites explicitly selected by the user: for a shared public URL,
SourceBraid may load the page in an isolated web view to create Markdown. If
loading fails, it saves a clearly identified link-only capture instead.
- GitHub Actions and Docling: optional PDF conversion. When a PDF is saved,
the configured repository’s GitHub Actions workflow can convert it to
Markdown. This feature runs only in the user’s repository.

SourceBraid operates no central content-storage, analytics, authentication,
payment, advertising, or AI service.

6. Regional availability
SourceBraid has the same feature set in every region. Availability of a source
website or GitHub itself may be affected by that external service or local
network conditions.

7. Regulated industries and third-party material
SourceBraid is not a regulated-industry service. It does not license, host, or
republish third-party content. Users choose the material they capture and store
it in their own GitHub repository. The review recording and supplied test URL
use only redistributable test material.
```

## Submission checklist

- Record the stated flow on a real, up-to-date iPhone or iPad; do not submit a
simulator recording.
- Fill in the exact tested device models and OS versions.
- Create a dedicated GitHub review repository and a short-lived, fine-grained
token limited to that repository’s Contents read/write permission.
- Paste the completed text and private recording reference into App Store
Connect’s App Review Information section before submitting build 10.
- Revoke the review token once Apple has completed its review.
2 changes: 1 addition & 1 deletion ios/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ The fine-grained GitHub token needs `Contents: Read and write` for the private S
## TestFlight

The project uses automatic distribution signing for Apple Developer team
`H76K2HQUFB`. The current App Store candidate is version `1.0.0` (build `9`) for
`H76K2HQUFB`. The current App Store candidate is version `1.0.1` (build `10`) for
both the app and Share Extension and contains the refreshed SourceBraid app
icon. Before every later upload, increment `CURRENT_PROJECT_VERSION` for both
targets.
Expand Down
16 changes: 8 additions & 8 deletions ios/SourceBraid.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -451,7 +451,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = SourceBraid/Resources/SourceBraid.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 9;
CURRENT_PROJECT_VERSION = 10;
DEVELOPMENT_TEAM = H76K2HQUFB;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = NO;
Expand All @@ -461,7 +461,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.0;
MARKETING_VERSION = 1.0.1;
PRODUCT_BUNDLE_IDENTIFIER = de.patrickschiller.sourcebraid;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
Expand All @@ -480,7 +480,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = SourceBraid/Resources/SourceBraid.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 9;
CURRENT_PROJECT_VERSION = 10;
DEVELOPMENT_TEAM = H76K2HQUFB;
GENERATE_INFOPLIST_FILE = NO;
INFOPLIST_FILE = SourceBraid/Resources/Info.plist;
Expand All @@ -489,7 +489,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.0;
MARKETING_VERSION = 1.0.1;
PRODUCT_BUNDLE_IDENTIFIER = de.patrickschiller.sourcebraid;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
Expand All @@ -507,15 +507,15 @@
APPLICATION_EXTENSION_API_ONLY = YES;
CODE_SIGN_ENTITLEMENTS = SourceBraidShare/SourceBraidShare.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 9;
CURRENT_PROJECT_VERSION = 10;
DEVELOPMENT_TEAM = H76K2HQUFB;
GENERATE_INFOPLIST_FILE = NO;
INFOPLIST_FILE = SourceBraidShare/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.0.0;
MARKETING_VERSION = 1.0.1;
PRODUCT_BUNDLE_IDENTIFIER = de.patrickschiller.sourcebraid.share;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
Expand All @@ -534,15 +534,15 @@
APPLICATION_EXTENSION_API_ONLY = YES;
CODE_SIGN_ENTITLEMENTS = SourceBraidShare/SourceBraidShare.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 9;
CURRENT_PROJECT_VERSION = 10;
DEVELOPMENT_TEAM = H76K2HQUFB;
GENERATE_INFOPLIST_FILE = NO;
INFOPLIST_FILE = SourceBraidShare/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.0.0;
MARKETING_VERSION = 1.0.1;
PRODUCT_BUNDLE_IDENTIFIER = de.patrickschiller.sourcebraid.share;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
Expand Down
4 changes: 2 additions & 2 deletions tests/test_ios_release.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ class IOSReleaseTests(unittest.TestCase):
def test_app_store_candidate_is_internally_consistent(self):
report = ios_release.validate_source(REPOSITORY_ROOT)

self.assertEqual(report.marketing_version, "1.0.0")
self.assertEqual(report.build_number, "6")
self.assertEqual(report.marketing_version, "1.0.1")
self.assertEqual(report.build_number, "10")
self.assertEqual(
report.icon_sha256,
"3adcbd818e547ae7da3f5df26111631aa86f39549d07480bbce959f760731b93",
Expand Down