This repository uses four GitHub Actions workflows:
CI(.github/workflows/ci.yml): static checks/tests only, no release builds.Deploy(.github/workflows/deploy.yml): deploys Cloudflare Worker + Flutter web to Cloudflare Pages.iOS Archive(.github/workflows/ios-ipa.yml): manual-only workflow for building an unsigned iOS archive for an existing release tag.Release Artifacts(.github/workflows/release-artifacts.yml): on GitHubpublished/prereleasedreleases, builds Android/Linux/Windows/web and attaches non-web artifacts to the release page.
Add these in GitHub → Settings → Secrets and variables → Actions:
CLOUDFLARE_API_TOKENCLOUDFLARE_ACCOUNT_ID
Recommended Cloudflare token scopes:
Workers Scripts:EditWorkers KV/D1/Durable Objectsas needed by the workerPages:Edit- Account scope limited to your Cloudflare account only
Set this once (outside git):
cd worker
npx wrangler secret put GITHUB_TOKENGITHUB_TOKEN is consumed by the worker runtime, not GitHub Actions.
Create a GitHub Environment named production and configure:
- Required reviewers for deployment approvals
- Optional wait timer
- Restrict deployment branches to
mesh-utility
The deploy workflow already targets environment: production.
Protect branch mesh-utility:
- Require PR before merge
- Require status checks to pass:
Flutter Analyze & TestWorker Type Check
- Restrict force-push and deletion
deploy.yml triggers on:
- push to
mesh-utility - manual
workflow_dispatch
Deployment steps:
- Deploy worker (
worker/via Wrangler) - Build Flutter web (
tool/build_web_cloudflare.sh) - Deploy
build/webto Cloudflare Pages projectmesh-utility-trackeron branchmesh-utility
release-artifacts.yml triggers on:
release.publishedrelease.prereleased- manual
workflow_dispatchwithrelease_taginput (for re-running asset publish on an existing tag)
ios-ipa.yml is currently manual-only (workflow_dispatch) and requires a release_tag input.
TODO: move iOS (and future macOS re-enable) into release-artifacts.yml so all platform release builds are under one trigger.
Build matrix:
- Android (
flutter build apk --release) - Linux (
flutter build linux --release) - Windows (
flutter build windows --release) - Web (
flutter build web --release) for verification only
iOS manual archive workflow:
- iOS (
flutter build ipa --release --no-codesign) - Packages the resulting
.xcarchiveasmesh-utility-<tag>-ios-xcarchive.tar.gz - Uploads that tarball as both a workflow artifact and a GitHub release asset
- Can be manually dispatched with a
release_taginput to backfill an existing release
Uploaded to release page (web excluded):
mesh-utility-<tag>-android.apkmesh-utility-<tag>-linux-x64.tar.gzmesh-utility-<tag>-windows-x64.zipSHA256SUMS.txt
- Never commit secrets, tokens, private keys, or
.envvalues. - Keep examples only (
.env.example, docs with placeholders). - Use GitHub secret scanning and push protection.
- Rotate secrets immediately if leaked.
After deploy:
curl -I https://mesh-utility.org
curl -I https://mesh-utility-worker.aaffiliate796.workers.dev/healthFrom browser console on https://mesh-utility.org, verify no CORS errors for:
.../history.../scans