Distribute a signed mobile build (.ipa/.apk) to testers: upload to your S3, generate install manifests + QR, push 'build ready' to the Fjord app. Self-hosted TestFlight.
  • JavaScript 80.3%
  • Shell 15.1%
  • Makefile 4.6%
Find a file
Stephen Way 3ba40438cd
Some checks are pending
test / unit (push) Waiting to run
Repoint references from rasterstate to fjord org
Org migration: the action family now lives under fjord/. Repoints internal repo references (uses:, CI badges, docs, migration guides) at fjord/ and sets the action author to fjord. The old rasterstate copies are left in place.
2026-06-03 16:16:54 -07:00
.forgejo/workflows Initial release: fjord-distribute-action 2026-06-01 19:21:01 -07:00
src Initial release: fjord-distribute-action 2026-06-01 19:21:01 -07:00
tests Initial release: fjord-distribute-action 2026-06-01 19:21:01 -07:00
.gitignore Initial release: fjord-distribute-action 2026-06-01 19:21:01 -07:00
action.yml Repoint references from rasterstate to fjord org 2026-06-03 16:16:54 -07:00
CHANGELOG.md Initial release: fjord-distribute-action 2026-06-01 19:21:01 -07:00
LICENSE Initial release: fjord-distribute-action 2026-06-01 19:21:01 -07:00
Makefile Initial release: fjord-distribute-action 2026-06-01 19:21:01 -07:00
README.md Repoint references from rasterstate to fjord org 2026-06-03 16:16:54 -07:00

Fjord Distribute

Self-hosted TestFlight. Take a signed .ipa/.apk, upload it to your own S3, generate the install manifest (iOS itms-services plist / Android install page), presign the download links, and push "build ready, tap to install" to the Fjord app. No third-party distribution service, no github.com.

Part of the Fjord Actions bundle. Pairs with apple-codesign-action (sign first) and fjord-notify-action (the relay it pushes to).

Usage

jobs:
  beta:
    runs-on: macos        # for iOS signing; android can run on linux
    env:
      RASTER_ARTIFACTS_S3_BUCKET:            ${{ vars.RASTER_ARTIFACTS_S3_BUCKET }}
      RASTER_ARTIFACTS_S3_ENDPOINT:          ${{ vars.RASTER_ARTIFACTS_S3_ENDPOINT }}
      RASTER_ARTIFACTS_S3_REGION:            ${{ vars.RASTER_ARTIFACTS_S3_REGION }}
      RASTER_ARTIFACTS_S3_ACCESS_KEY_ID:     ${{ secrets.ARTIFACTS_S3_KEY_ID }}
      RASTER_ARTIFACTS_S3_SECRET_ACCESS_KEY: ${{ secrets.ARTIFACTS_S3_SECRET }}
    steps:
      - uses: actions/checkout@v6
      - run: ./build-and-sign.sh          # produces build/MyApp.ipa

      - uses: https://rasterhub.com/fjord/fjord-distribute-action@v1
        with:
          path: build/MyApp.ipa
          bundle-id: com.acme.app
          version: ${{ github.ref_name }}
          channel: beta
        env:
          FJORD_RELAY_URL: ${{ vars.FJORD_RELAY_URL }}
          FJORD_RELAY_TOKEN: ${{ secrets.FJORD_RELAY_TOKEN }}

Testers get a push in the Fjord app, tap Install, and the build lands on the device. The install/download links are presigned (default 7 days), so the bucket stays private.

Inputs

Input Default Description
path (required) The signed .ipa or .apk.
platform auto ios / android (inferred from the extension).
bundle-id iOS bundle identifier (required for .ipa).
title repo name App title shown to testers.
version GITHUB_REF_NAME Version/build label.
channel internal Distribution channel (part of the storage path).
scope GITHUB_REPOSITORY Storage key prefix.
expires-days 7 Lifetime of the presigned links.
qr true Render a scannable QR (needs qrencode on the runner).
notify true Push "build ready" to the Fjord relay.
relay-url / relay-token FJORD_RELAY_* env Relay endpoint + token.

Outputs

Output Description
install-url itms-services:// link (iOS) or the apk URL (Android).
download-url Presigned direct download.
manifest-url Presigned plist (iOS) / install page (Android).
version The version label used.

How it works

  • Uploads to your artifacts S3 (RASTER_ARTIFACTS_S3_*, the same backend the cache/artifact actions use) under <scope>/<channel>/<version>/, via a presigned PUT, so no extra credentials handling and the bucket stays private.
  • iOS: generates an itms-services plist pointing at the presigned .ipa URL, uploads it, and returns itms-services://?action=download-manifest&url=.... iOS requires the plist and ipa to be HTTPS; presigned S3 URLs are.
  • Android: uploads a small install page and returns the presigned apk URL.
  • Bundled SigV4 presigner (no AWS SDK) works against any S3-compatible endpoint, virtual-hosted or path-style.

There is no GitHub Actions equivalent: GitHub has no app-distribution target.

License

MIT, see LICENSE.