···11+{
22+ "name": "Orbyt",
33+ "subtitle": "Video app for Bluesky",
44+ "description": "Orbyt is a video-first social app for the Bluesky network, built on the AT Protocol. Available for EU and Japan via AltStore PAL.",
55+ "iconURL": "https://getorbyt.com/altstore/orbyt-icon.png",
66+ "headerURL": "https://getorbyt.com/images/orbyt-logotype.png",
77+ "website": "https://getorbyt.com",
88+ "tintColor": "#9B59B6",
99+ "fediUsername": "orbyt",
1010+ "featuredApps": [
1111+ "com.getorbyt.app"
1212+ ],
1313+ "apps": [
1414+ {
1515+ "name": "Orbyt",
1616+ "bundleIdentifier": "com.getorbyt.app",
1717+ "marketplaceID": "6751679299",
1818+ "developerName": "Orbyt",
1919+ "subtitle": "Video app for Bluesky",
2020+ "localizedDescription": "Orbyt is a video-first social app for the Bluesky network.\n\n• Browse video feeds from Bluesky\n• Create and share short-form videos\n• Connect with the AT Protocol community\n• Built with React Native and Expo",
2121+ "iconURL": "https://getorbyt.com/altstore/orbyt-icon.png",
2222+ "tintColor": "#9B59B6",
2323+ "category": "social",
2424+ "screenshots": [],
2525+ "versions": [
2626+ {
2727+ "version": "1.1.2",
2828+ "buildVersion": "62",
2929+ "date": "2026-03-12",
3030+ "localizedDescription": "Latest release.",
3131+ "downloadURL": "https://downloads.getorbyt.com/manifest.json",
3232+ "size": 70307293,
3333+ "minOSVersion": "16.4"
3434+ }
3535+ ],
3636+ "appPermissions": {
3737+ "privacy": {
3838+ "NSCameraUsageDescription": "We need camera access to record videos for posts and take profile photos.",
3939+ "NSMicrophoneUsageDescription": "We need microphone access to record audio with your videos.",
4040+ "NSPhotoLibraryUsageDescription": "We need access to your photo library to select videos for posts and photos for your profile.",
4141+ "NSPhotoLibraryAddUsageDescription": "We need permission to save your videos to the camera roll."
4242+ }
4343+ }
4444+ }
4545+ ],
4646+ "news": []
4747+}
-65
scripts/altstore-r2.sh
···1212Usage:
1313 ./scripts/altstore-r2.sh setup <bucket> [adp_dir]
1414 ./scripts/altstore-r2.sh upload <bucket> [adp_dir]
1515- ./scripts/altstore-r2.sh release <bucket> <version> <build> <date> <size> [adp_dir]
1615 ./scripts/altstore-r2.sh set-source-url <manifest_url>
1716 ./scripts/altstore-r2.sh check <manifest_url>
1817···2019 setup Create the R2 bucket if needed, enable the public r2.dev URL,
2120 upload the ADP directory, and update public/altstore/source.json.
2221 upload Upload the ADP directory to an existing R2 bucket.
2323- release Upload ADP to R2 then call the admin API to publish a new version.
2424- Requires ADMIN_SECRET env var. After this, open the admin UI to confirm.
2522 set-source-url Update public/altstore/source.json to point at a manifest URL.
2623 check Fetch a manifest URL and print the HTTP status.
2724···3128 ALTSTORE_CUSTOM_MANIFEST_URL
3229 Preferred manifest URL after upload. Defaults to
3330 https://downloads.getorbyt.com/manifest.json.
3434- ADMIN_SECRET Required for the release command. Bearer token for the admin API.
3535- ADMIN_API_URL Override the admin API URL (default: https://getorbyt.com/api/admin/altstore/release).
3636- ALTSTORE_DESCRIPTION Override the changelog text for the release command.
3737- ALTSTORE_MIN_OS Override the minimum iOS version (default: 16.4).
3831EOF
3932}
4033···206199 echo "Next: deploy the site so https://getorbyt.com/altstore/source.json serves the updated metadata."
207200}
208201209209-publish_release() {
210210- local bucket="$1"
211211- local version="$2"
212212- local build="$3"
213213- local date="$4"
214214- local size="$5"
215215- local adp_dir="${6:-$DEFAULT_ADP_DIR}"
216216- local api_url="${ADMIN_API_URL:-https://getorbyt.com/api/admin/altstore/release}"
217217- local description="${ALTSTORE_DESCRIPTION:-}"
218218- local min_os="${ALTSTORE_MIN_OS:-16.4}"
219219-220220- [[ -n "${ADMIN_SECRET:-}" ]] || fail "ADMIN_SECRET env var is required for the release command"
221221-222222- echo "==> Uploading ADP to R2..."
223223- upload_adp "$bucket" "$adp_dir"
224224-225225- echo
226226- echo "==> Publishing release v${version} (build ${build}) to admin API..."
227227-228228- local payload
229229- payload="$(node --input-type=commonjs - <<NODE
230230-const body = {
231231- version: ${version@Q},
232232- buildVersion: ${build@Q},
233233- date: ${date@Q},
234234- size: ${size},
235235- downloadURL: "${DEFAULT_CUSTOM_MANIFEST_URL}",
236236- minOSVersion: ${min_os@Q},
237237-};
238238-if (${description@Q}) body.localizedDescription = ${description@Q};
239239-process.stdout.write(JSON.stringify(body));
240240-NODE
241241-)"
242242-243243- local http_code
244244- http_code="$(curl -sS -o /tmp/altstore_release_response.json -w '%{http_code}' \
245245- -X POST \
246246- -H "Content-Type: application/json" \
247247- -H "Authorization: Bearer ${ADMIN_SECRET}" \
248248- -d "$payload" \
249249- "$api_url")"
250250-251251- if [[ "$http_code" == "200" ]]; then
252252- echo "Release published successfully."
253253- echo
254254- echo "Next: open https://getorbyt.com/admin/altstore to confirm and verify the release."
255255- else
256256- echo "Admin API returned HTTP ${http_code}:"
257257- cat /tmp/altstore_release_response.json 2>/dev/null || true
258258- echo
259259- fail "Release publish failed (HTTP ${http_code})"
260260- fi
261261-}
262262-263202main() {
264203 local command="${1:-}"
265204···272211 [[ $# -ge 2 ]] || fail "upload requires a bucket name"
273212 ensure_adp_dir "${3:-$DEFAULT_ADP_DIR}"
274213 upload_adp "$2" "${3:-$DEFAULT_ADP_DIR}"
275275- ;;
276276- release)
277277- [[ $# -ge 6 ]] || fail "release requires: <bucket> <version> <build> <date> <size> [adp_dir]"
278278- publish_release "$2" "$3" "$4" "$5" "$6" "${7:-$DEFAULT_ADP_DIR}"
279214 ;;
280215 set-source-url)
281216 [[ $# -eq 2 ]] || fail "set-source-url requires a manifest URL"