cascade_cli 0.1.11
cascade_cli: ^0.1.11 copied to clipboard
Official Cascade CLI for cascadeci.com — login, logout, init, match, doctor. Sealed Flutter CI client; see README for usage and how to support the project.
Cascade CLI #
Official CLI for cascadeci.com
Sealed Flutter CI — ship releases with one commit tag.
Store credentials stay in GitHub secrets. Lanes stay in the Cascade dashboard.
Why Cascade? #
Most Flutter CI dumps Play / App Store credentials into Actions YAML or sprawling workflows. Cascade flips that:
| Without Cascade | With Cascade |
|---|---|
| Editable workflow owns every secret name | Sealed workflow — tampering is rejected |
| Store keys often live next to CI scripts | Credentials stay in GitHub secrets (opaque slots) |
| Intent buried in custom scripts | Intent in a commit tag + dashboard lanes |
| Guess whether a lane ran | Status + optional APK email from the control plane |
Cascade is free. The CLI is the thin client that logs you in, seals your project, and keeps CI honest.
Quick start #
# 1. Install
dart pub global activate cascade_cli
# 2. Sign up at https://cascadeci.com (email OTP), then:
cascade login
# 3. In your Flutter app root:
cascade init
cascade doctor
Then fill secrets, push them to GitHub with gh, enable lanes in the dashboard, commit the sealed files, and push.
# Fill cascade.secrets.env (gitignored), then:
gh auth login
set -a && source cascade.secrets.env && set +a
# run the gh secret set lines from cascade.secrets.md
git add cascade.project.yaml .github/workflows/cascade.yml \
cascade.secrets.env.example cascade.secrets.md
git commit -m "Add Cascade CI"
git push
Installation #
Requirements #
| Need | Notes |
|---|---|
| Dart SDK ≥ 3.5 or Flutter SDK | Runs the cascade binary |
| Account on cascadeci.com | Real email + OTP (no disposable inboxes) |
| Flutter project | Run cascade init at the app root (pubspec.yaml) |
| GitHub repo + Actions | Hosts the sealed workflow |
gh CLI |
Push opaque secret slots |
Activate #
dart pub global activate cascade_cli
Ensure pub’s global bin directory is on your PATH (Dart prints it after activate). Verify:
cascade --help
Upgrade anytime with the same activate command.
Command vs package: you install package
cascade_cli, then run the commandcascade.
Commands #
| Command | What it does |
|---|---|
cascade login |
Browser / device approval against cascadeci.com |
cascade logout |
Sign out / switch accounts (clears ~/.cascade/config.json) |
cascade init |
Link app, write seal + sealed workflow + secrets guide |
cascade match |
Auto fastlane match: private git certs repo + Apple API from cascade.secrets.env |
cascade doctor |
Local health check (login, files, readiness) |
cascade --help |
Usage |
Step-by-step #
1 · Create your Cascade account #
- Open cascadeci.com/register
- Choose Solo or Organization and complete email OTP
- You do not need to create an app in the dashboard first —
cascade initcreates or links it
2 · Login #
cascade login
To switch accounts:
cascade logout
cascade login
Approve the device in the browser. The CLI stores a session token at:
~/.cascade/config.json
Never commit that file. Re-run cascade login on a new machine or after the token expires (web sessions last 8 hours; CLI tokens are separate).
3 · Init (Flutter app root) #
cd /path/to/your_flutter_app
cascade init
What init writes
| File | Purpose | Commit? |
|---|---|---|
cascade.project.yaml |
Opaque project seal (CI auth) | Yes |
.github/workflows/cascade.yml |
Sealed thin workflow | Yes — do not hand-edit |
cascade.secrets.env.example |
Safe template | Yes |
cascade.secrets.md |
gh secret set push commands |
Yes |
cascade.secrets.env |
Your real values | No (gitignored) |
Flags
| Flag | When to use |
|---|---|
--name MyApp |
Display name for a new Cascade app |
--new |
Force a brand-new app (skip reuse by package / bundle) |
--pick |
Interactively choose when several apps match |
cascade init
cascade init --name Roomround
cascade init --pick
cascade init --new --name ExperimentalBuild
4 · Secrets (opaque slots) #
Store credentials live in GitHub Actions secrets, never in Cascade’s database.
Filling cascade.secrets.env alone is not enough — Actions cannot read your laptop.
- Edit
cascade.secrets.env(local only, gitignored) - Authenticate GitHub CLI once
- Source the file and run the
gh secret setcommands fromcascade.secrets.md
# 1) fill cascade.secrets.env — only keys for lanes you enable
# example:
# CASCADE_NOTIFY_EMAILS=you@example.com
gh auth login
set -a
source cascade.secrets.env
set +a
# 2) copy the Push block from cascade.secrets.md, e.g.:
# gh secret set c_… --body "$CASCADE_NOTIFY_EMAILS"
gh secret list
cascade doctor
Use only the opaque slots from your project guide. Do not invent secret names.
Do not commit cascade.secrets.env.
iOS (TestFlight / App Store)
Skip until you enable those lanes. You need both an App Store Connect API key (upload) and fastlane match (signing). Agencies do not need the client’s Apple ID password.
- Account Holder enables App Store Connect API (Request Access) and creates a Team key — or sends you Key ID, Issuer ID, and
.p8. - Install Fastlane and set up match once on a Mac:
brew install fastlane
gh auth login # once
# Fill APP_STORE_CONNECT_API_* in cascade.secrets.env first:
cascade match
# auto: private cascade-certs-* repo, Matchfile, MATCH_PASSWORD + MATCH_GIT_AUTH, match appstore
Details: cascadeci.com/docs#ios
5 · Enable lanes #
In the Cascade dashboard:
- Open your app
- Enable only the deliveries you need (email, Play tracks, TestFlight, production, …)
- Closed lanes are denied at job-plan time, even if a commit tag asks for them
6 · Doctor #
cascade doctor
Run after init, after changing secrets, or when CI looks wrong. Fix anything it reports before you push.
7 · Ship with a commit tag #
Push a commit (tag optional). Cascade reads the leading intent; the matching dashboard lane must be on.
| Commit intent | Typical outcome |
|---|---|
| (no tag) | Default: APK + email (when email lane is on) |
[test-android-internal] |
Play internal testing |
[test-android-closed] |
Play closed testing |
[test-android-open] |
Play open testing |
[test-ios] |
TestFlight |
[build-apk] |
APK only |
[build-ios] |
IPA only |
[release-android-partial] |
Production partial rollout |
[release-android-full] |
Production full rollout |
[release-ios] |
App Store |
Example:
git commit -m "[build-apk] internal smoke"
git push
Results show on the app page and in notify email (including APK download links when configured).
How it fits together #
You (CLI) cascadeci.com GitHub Actions
───────── ───────────── ──────────────
cascade login ─────────► device approve
cascade init ─────────► create / link app
─────────► write seal + sealed YAML
fill cascade.secrets.env ──source──► gh secret set (opaque)
enable lanes ─────────► dashboard toggles
git push ────────────────────────────────► sealed workflow runs
◄── job plan / status ──
──► email / APK link
- Sealed workflow — checksummed. Edits →
WORKFLOW_TAMPERED. - Project seal — never shown in the dashboard UI; lives in
cascade.project.yaml. - Lanes — product control on Cascade; CI asks the control plane what is allowed.
Tips & troubleshooting #
| Situation | What to do |
|---|---|
cascade not found |
Add pub global bin to PATH, re-open the terminal |
| Login opens wrong host | Delete ~/.cascade/config.json, run cascade login again (recent CLI ignores dead localhost) |
| Green on GitHub, empty dashboard | Actions must reach https://cascadeci.com (not localhost) |
| Lane denied | Enable that lane on the app page, then re-push / re-run |
| Secrets missing | Fill cascade.secrets.env → source it → gh secret set lines from cascade.secrets.md → cascade doctor |
fastlane: command not found |
brew install fastlane, new terminal, then cd ios && fastlane match init |
| App Store Connect “Request Access” greyed out | Only Account Holder can enable API once; they send Key ID / Issuer ID / .p8 — not their password |
| Workflow edited | Restore official YAML via re-init; do not patch by hand |
Full product onboarding: cascadeci.com/guide · cascadeci.com/docs
Support Cascade #
Cascade stays free — all Flutter delivery lanes, no paywalls. Running the control plane (API, email, artifact storage) and maintaining this package still costs real money.
If Cascade helps you ship, you can support the project:
- Support page: cascadeci.com/support
- Contact: cascadeci.com/contact — mention Support Cascade
- Email: cascadeciofficial@gmail.com
Thank you for keeping Cascade available for Flutter teams.
Links #
| Product | cascadeci.com |
| Guide | cascadeci.com/guide |
| Docs | cascadeci.com/docs |
| Support | cascadeci.com/support |
| Package | pub.dev/packages/cascade_cli |
| Issues | GitHub issues |
License #
MIT © Cascade