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
20 changes: 20 additions & 0 deletions appstores/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# appstores

One directory per store pairux.com ships to. Each holds the whole build for that
store: source, signing instructions, the art the listing needs, and the copy
that goes in the store's own fields.

| Directory | Store | State |
| ---------- | ------------------------------ | -------------------------- |
| `firetv/` | Amazon Appstore (Fire TV) | built, submitted to Amazon |
| `android/` | Google Play | not built |
| `ios/` | Apple App Store (iPhone, iPad) | not built |
| `appletv/` | Apple App Store (tvOS) | not built |
| `roku/` | Roku Channel Store | not built |

The web app at https://pairux.com is the product; these are shells and native
builds that put it in front of people who look for apps in a store.

**Signing keys never live here.** Each build's key is in its own team vault
(`profullstack/<name>-<store>--signing`) and the build scripts read it from the
environment. Losing a key means that store's users can never update in place.
20 changes: 20 additions & 0 deletions appstores/android/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Google Play (pairux.com)

Not built yet.

**What it takes:** an Android app (the Fire TV shell in `../firetv` is already a
plain Android app and is the obvious starting point — same WebView, same
`tv.js`, minus the leanback intent filter and plus a phone layout), a Play
Console developer account, an upload key, and a Play App Signing enrolment.

**Before the first upload**

- Play requires an **App Bundle** (`.aab`), not an APK, and a `targetSdk` that
meets Play's current floor. The Fire TV build targets 34 for Fire OS; Play
moves its floor every August, so check it rather than assuming.
- `applicationId` must differ from nothing else on Play, and once published it
can never change.
- Play wants a privacy policy URL, a Data safety form, and content rating
answers — the same facts as the Amazon listing, asked differently.
- The listing copy and art in `../firetv/store` mostly carries over; Play's
screenshot sizes and the 1024x500 feature graphic do not.
15 changes: 15 additions & 0 deletions appstores/appletv/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Apple App Store, tvOS (pairux.com)

Not built yet.

**What it takes:** a separate tvOS target (tvOS has **no WKWebView** — this is
the one platform where the web app cannot simply be wrapped, and the screens
have to be built natively in SwiftUI or UIKit against the same API the web app
uses), plus the same Apple Developer membership and signing as `../ios`.

**Before the first upload**

- tvOS apps are driven by the Siri Remote: focus engine first, no pointer, no
keyboard beyond the on-screen one.
- The top shelf image and the layered app icon are required and are unlike any
other store's art.
File renamed without changes.
4 changes: 2 additions & 2 deletions firetv/README.md → appstores/firetv/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ sed -n 's/^PX_TV_KEYSTORE_B64=//p' keys/release.env | tr -d '"' | base64 -d > ke

docker run --rm -e OWNER=$(id -u):$(id -g) -e GRADLE_USER_HOME=/gh \
-v ~/scratch/gradle-home:/gh -v ~/scratch/android-sdk:/sdk -v "$PWD/keys:/keys:ro" \
-v "$PWD/firetv:/w" -w /w gradle:8.7-jdk17 sh build.sh
-v "$PWD/appstores/firetv:/w" -w /w gradle:8.7-jdk17 sh build.sh
# -> firetv/dist/pairux.com-firetv.apk (lint + signed release)
```

Expand All @@ -38,7 +38,7 @@ again or installed copies cannot update.

```sh
docker run --rm --device /dev/kvm -e OWNER=$(id -u):$(id -g) -v ~/scratch/android-sdk:/sdk \
-v "$PWD/firetv:/w" -w /w gradle:8.7-jdk17 bash emulator-test.sh
-v "$PWD/appstores/firetv:/w" -w /w gradle:8.7-jdk17 bash emulator-test.sh
```

Boots API 30 Android TV (the base of Fire OS 8), installs the APK, drives it with key
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/bin/sh
# Renders the launcher icons, TV banner and Amazon Appstore art.
# icon.svg and logo-light.svg are PairUX's own artwork, copied from apps/web/public.
# Runs inside alpine: docker run --rm -v "$PWD/firetv:/w" -w /w alpine:3.20 sh store/render.sh
# Runs inside alpine: docker run --rm -v "$PWD/appstores/firetv:/w" -w /w alpine:3.20 sh store/render.sh
set -eu
apk add --no-cache rsvg-convert imagemagick font-dejavu >/dev/null
R=app/src/main/res
Expand Down
File renamed without changes
File renamed without changes
16 changes: 16 additions & 0 deletions appstores/ios/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Apple App Store (pairux.com)

Not built yet.

**What it takes:** an Xcode project (a WKWebView shell is the equivalent of the
Fire TV build), an Apple Developer Program membership, a signing certificate and
provisioning profile, and a Mac or a hosted macOS runner to build and notarise.

**Before the first upload**

- Apple rejects apps that are only a website in a shell unless they offer
something a browser tab does not: offline, notifications, Handoff, widgets,
share extensions. Guideline 4.2 is the one that catches these.
- An app that takes an account needs **Sign in with Apple** when it offers any
other third-party sign-in, and a working account-deletion path inside the app.
- App Privacy answers are per data type and are published on the listing.
14 changes: 14 additions & 0 deletions appstores/roku/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Roku Channel Store (pairux.com)

Not built yet.

**What it takes:** a SceneGraph/BrightScript channel, a developer account at
developer.roku.com, and — the part that catches people — a **physical Roku in
developer mode**: the store only accepts a `.pkg` signed on a device, and a
plain zip is refused with "Package file has an invalid header".

**Before the first upload**

- Roku reviews against its own channel guidelines, and asks for test credentials
that work from a cold start.
- The listing needs its own poster art sizes, unrelated to the other stores'.
Loading