Instant updates with publish-action
Without doing anything, your new releases reach FlatPark within half a day: FlatPark checks every app’s releases twice a day. If you release on GitHub, the publish-action turns that into minutes: your release workflow tells FlatPark the moment a release goes live, and the update is checked and published right away.
It needs no token and no secret, and there is nothing else to maintain.
Setting it up
Your app has to be listed on FlatPark already, with your GitHub repository as its source. Then add a job to a workflow that runs when you publish a release:
# .github/workflows/release.yml
on:
release:
types: [published]
jobs:
flatpak:
runs-on: ubuntu-latest
# A FlatPark hiccup should never fail your release.
continue-on-error: true
steps:
- uses: flatpark/publish-action@v1
with:
app-id: com.example.MyApp
Use your app’s id on FlatPark; it is on your app’s page.
If a workflow creates your releases
GitHub doesn’t start new workflow runs for events caused by the default
GITHUB_TOKEN. If your release is created by a workflow (tauri-action,
softprops/action-gh-release and the like), the on: release workflow above
never runs, and nothing reports it. Add the job to the workflow that creates
the release instead, after it is published, and pass the tag:
jobs:
release:
# … builds and publishes the GitHub release …
flatpak:
needs: release
runs-on: ubuntu-latest
continue-on-error: true
steps:
- uses: flatpark/publish-action@v1
with:
app-id: com.example.MyApp
tag: ${{ github.ref_name }}
The release must be published, not a draft, when the job runs, and its Linux file uploaded. A release whose Linux file arrives later is picked up by the twice-daily check.
What happens after a release
- The action sends your app id, the tag and your repository name to FlatPark.
- FlatPark checks that the app is listed, that your repository is its registered source, and that the tag is a published release.
- It finds the new Linux file, pins its checksum and size, and unpacks it the way an install would.
- If that works, the update is merged and published without waiting for a
person, usually within minutes.
flatpak updatedelivers it to users.
If the new file doesn’t unpack the way the package expects (a renamed binary, a different archive layout), the update stops there. The previous version stays available and FlatPark fixes the package by hand.
Why it needs no secret
Nothing in the request is trusted as sent. FlatPark verifies all of it against public facts: its own catalog, and the release on GitHub. So nobody can use the action to publish a release for a repository they don’t control, and your workflow never holds a FlatPark credential.
For agents
| Input | Required | Default | Meaning |
|---|---|---|---|
app-id |
yes | The app’s Flatpak id on FlatPark | |
tag |
no | The triggering release’s tag, else GITHUB_REF_NAME |
The release to publish |
endpoint |
no | https://hooks.flatpark.org/release |
The webhook |
- The webhook is a Cloudflare Worker (
workers/release-hook/). It validates{app_id, tag, repository}against the publishedcatalog.json(the app’ssourceUrl, fromsource_urlinflatpark.yml, must be that GitHub repository) and the GitHub release, then sends arepository_dispatch(app-release) to this repository with its own token. Errors: 404 for an unknown app id, 400 for a tag that isn’t a release, 403 for a repository that isn’t the app’s source, 422 for an app without a GitHub source, 429 when rate-limited. release-dispatch.ymlrecomputes that one app’s pins, unpacks the new payload withcheck-apply-extra.sh, opensauto/release-<app-id>, and merges it when the diff stays within the app’s manifest and metainfo, the same terms as the twice-dailyupdate-check.yml. The repository variableAUTO_MERGE_PINS=falsestops both from merging.- Several releases on one day give several small PRs, each published on its own. The twice-daily sweep supersedes any per-app PR still open.
- Which apps use it: PRs from
auto/release-*branches. - Packaging for an adopter: set
source_urlto the GitHub repository the releases come from, or the webhook refuses the pings.