Repository navigation
Releases
v2.5.0
OpenCI v2.5.0 brings the proposed merge and its test build into the same pull request. CI checks the change against the current base branch, and a passing distribution workflow can post a QR code so reviewers can open the build on their phones.
日本語のリリース記事 · English release post
Pull request checks
- PR jobs run GitHub’s test merge commit. The executor verifies both parents and records the exact checkout SHA in the build log. GitHub Checks and the dashboard explain how to recover from a conflict or a stale checkout. Push jobs run the original pushed commit. PR checkout · Failure messages · Current base validation
- Equivalent webhook deliveries reuse one job. Closing or merging a PR cancels its remaining queued and running jobs, including workflows that leave
cancelPreviousRunsat its default. Duplicate events · PR closure
Test builds and previews
- Pass the tester URL returned by a Firebase App Distribution IPA or APK upload to
openCI.pullRequest.postQrCode. Each workflow updates its own PR comment with the link, a QR code, and the app version and build number when available. Testers still need Firebase access. Workflow SDK 0.2.9 - The OpenCI website and web dashboard workflows now create one-hour Firebase Hosting previews on matching PRs and publish the live site on matching
developpushes. The repository also addsopenCI.firebaseHosting.deploy()anddeployPreview()for workflow authors. These helpers are in the source tag and will require an SDK release after 0.2.9 for pub.dev users. Site workflows · SDK changes - The macOS dashboard is available through its signed Sparkle feed for macOS 26 and later. The app has its own version, 2.0.0. The mobile dashboard workflows now target TestFlight and Google Play internal testing. macOS update feed · Mobile workflows
CLI, dashboard and upgrade notes
- Install
openci_cli_pluswithdart install openci_cli_plusand change scripts fromgenuinecitoopenci. The CLI reads existing profiles and settings. OpenCI CLI 0.8.0 · CLI guide - The dashboard adds English localization, current monthly CI usage and access to Stripe invoice history. Cloud runtime is billed at ¥1 per minute, tax included, with rounding applied once per team at month-end. Usage and billing · Pricing
- New QR images use the
openci/pr-qrbranch. Keep an existinggenuineci/pr-qrbranch if older comments still link to its images. SDK changelog - This tag removes the Stacked PR app and its CI workflow, the experimental Go CLI scaffold, and the SDK’s
GoCIandOpenCI.gohelpers. Go workflows using the SDK from source can invoke their tools throughopenCI.run(...). Stacked PR · Go CLI · Go helpers
v2.4.0
OpenCI v2.4.0 — November 8, 2026
This release adds changed-path workflow selection, opt-in cancellation of older PR runs, per-workflow Flutter versions, and ordered merging of stacked PRs. It focuses on the November 2–8 updates and includes changes since v2.3.0, published on October 23.
Highlights
Run the workflows a change needs
- Add
pathstoCITrigger.push()andCITrigger.pullRequest()to select workflows by repository-relative glob patterns. PRs use their full diff; pushes use before/after revisions. Excluded workflows report completed/skipped GitHub Checks without allocating a build job or VM. - Run applicable workflows when a complete changed-file list is unavailable. Include shared dependencies and workflow definitions in path rules.
- Publish queued GitHub Checks before execution starts. Prefer the oldest queued jobs when capacity becomes available, wake dispatch after capacity release, and coalesce retries while capacity is full.
Workflow SDK — openci_workflow 0.2.3
- Enable
OpenCI.init(cancelPreviousRuns: true)to cancel older opted-in queued/running jobs for the same PR and workflow when a new commit's job is scheduled. The default is false; push jobs, same-SHA reruns, completed jobs, and path-skipped workflows retain their existing behavior. - Select an exact Flutter release through
OpenCI.init(flutterVersion: '3.47.8'). CI uses FVM before resolving dependencies; omitting the option uses the image default. Local execution keeps its current SDK. - Add
OpenCI.dart.checkFormat()to check Dart formatting without rewriting files. - Expose team-wide build sequence numbers with
OpenCI.runNumberand generated typedSecretreferences through.keyand.value. - The SDK is published as openci_workflow 0.2.3.
Stacked PRs
- Add Merge stack to merge ancestors through a selected PR, each into the default branch, in dependency order. Wait for updated CI, required reviews, and GitHub merge conditions after each restack. Cancel merge stops the remaining work.
- Recover parent/child relationships after GitHub's automatic base changes. Serialize updates within a stack while allowing independent stacks to run concurrently.
- Identify tracked stacks disconnected from the default branch and stop stack merging until their unresolved base is repaired.
- Reduce repeated work from self-generated notifications and combine contended retries and independent GitHub reads.
Execution, platform, and maintenance
- Move teams, GitHub connections, logs, secrets, billing, planning, and dispatch to Firebase Functions and SQL Connect, with Orchard build execution in Cloud Run Jobs. Remove the legacy servers, planner, worker, and associated storage.
- Support independent Firebase projects for self-hosted deployments. Manage Orchard infrastructure, Mac workers, and macOS images with Terraform, Ansible, and Packer.
- Default build VMs to 4 vCPUs, support per-worker VM memory allocations, and batch executor log ingestion.
- Require verified email before adding team members and reject external-fork PR execution.
- Add localized website routes, generated social images, and Starlight documentation. Introduce the initial Go
go-genuineCLI scaffold; it is not a replacement for the existing Dart CLI.
Upgrade notes and limitations
- SDK 0.2.0 breaking change: replace
whenChanged:withpaths:and.whenChangedwith.paths. See the SDK changelog. - After regenerating older string-based secret getters, use
.valuewhere a secret value is required..keyreturns the original environment variable name. - Direct SDK log forwarding through
LOKI_URLhas been removed. Commands still stream stdout/stderr; the executor captures and persists CI logs. - Existing legacy server/worker and Compose deployments require the FSC deployment changes; updating an old container image alone is insufficient. Review the deployment instructions and self-hosting guide.
- Deploy the connector and planner support before enabling PR auto cancellation.
flutterVersionrequires a literal release and is not inferred from.fvmrc. - PR closure: planner-side cancellation on close/merge is included, but this tag's webhook receiver does not yet subscribe to
pull_request.closed. The receiver follow-up #3810 is outside this release; do not rely on close-event cancellation with the unmodified tagged receiver. - The separate PR-build deduplication follow-up #3809 is outside this release.
Release verification
- Release code:
709fa2acondevelop. - On this commit, Stacked PR CI passed. The other six configured Checks completed as skipped under changed-path selection; they were not rerun for the release tag.
- The English and Japanese release articles passed website formatting, Astro checks, a production build, and all 83 existing site tests. Both localized social images were reviewed.
- No backend/fleet deployment or full end-to-end acceptance run is performed as part of this publication.
Pull request changelog — 94 GitHub-generated entries
What's Changed
- docs(website): add v2.3.0 release article and OGP banner by @mafreud in #3590
- feat(website): add Cloud pricing section by @mafreud in #3591
- chore: release openci_shared 2.0.0 and CLI 0.6.0 by @mafreud in #3589
- feat(website): add English and Japanese locale routes by @mafreud in #3593
- Migrate the OpenCI website from Jaspr to Astro by @mafreud in #3594
- Generate localized blog OGP images with astro-og-canvas by @mafreud in #3596
- feat(secrets): generate typed Secret references by @mafreud in #3602
- feat(openci_server): add scoped workflow tokens (G-1531) by @mafreud in #3605
- revert(openci_server): defer workflow authentication by @mafreud in #3606
- feat(openci_server): add run number storage (G-1533) by @mafreud in #3613
- feat(openci_server): allocate team run numbers atomically (G-1534) by @mafreud in #3614
- feat(openci_server): assign and return run numbers when creating runs (G-1535) by @mafreud in #3615
- feat(build_job_worker): pass assigned run numbers to workflows (G-1536) by @mafreud in #3616
- feat(openci_workflow): expose openCI.runNumber (G-1537) by @mafreud in #3617
- chore(openci_workflow): release run numbers in 0.1.6 (G-1538) by @mafreud in #3621
- feat(website): migrate docs to Starlight by @mafreud in #3622
- feat(cli): bootstrap Go-based go-genuine CLI (G-1540) by @mafreud in #3624
- feat(cli): resolve personal settings paths with XDG (G-1542) by @mafreud in #3632
- feat(planner): match whenChanged paths (G-1257) by @mafreud in #3649
- feat(shared): add webhook planning result models (G-1549) by @mafreud in #3650
- refactor(planner): use structured webhook plans (G-1550) by @mafreud in #3651
- chore(dataconnect): add SQL Connect configuration (G-1564) by @mafreud in #3660
- feat(dataconnect): add member-scoped team query (G-1565) by @mafreud in #3662
- feat(dataconnect): add Secret Manager reference schema (G-1566) by @mafreud in #3665
- feat(dataconnect): add billing account schema (G-1570) by @mafreud in #3672
- feat(dataconnect): validate billing period creation (G-1571) by @mafreud in #3674
- feat(dataconnect): complete remaining schema definitions (G-1572) by @mafreud in #3676
- feat(dataconnect): add billing customer operations (G-1573) by @mafreud in #3678
- feat(dataconnect): add Checkout lifecycle and Stripe state operations (G-1574) by @mafreud in #3680
- feat(dataconnect): add CI admissions and execution measurement (G-1575) by @mafreud in #3682
- feat(dataconnect): add team create and rename mutations (G-1581) by @mafreud in #3690
- refactor(dataconnect): remove legacy team installation IDs (G-1582) by @mafreud in #3692
- feat(dashboard): generate SQL Connect team Flutter SDK (G-1583) by @mafreud in #3694
- feat(dashboard): load team lists through SQL Connect by @mafreud in #3696
- feat(dataconnect): add build log and step schema (G-1585) by @mafreud in #3701
- feat(dataconnect): add build log querie...
v2.3.0
OpenCI v2.3.0 — October 23, 2026
This release brings Web-based GitHub connections, paid Cloud billing with CI usage accounting, and expanded mobile delivery workflows. It includes changes since v2.2.0, published on October 9.
Highlights
Dashboard and GitHub connections
- Connect GitHub.com from the Web dashboard, authorize with GitHub, choose an accessible installation, and explicitly confirm the connection for your team.
- Verify installation access on the server and load repositories and branches through the saved connection. Add installation guidance and retry handling when no accessible installation is available.
- Replace manual GitHub installation-ID and URL editing with the verified connection flow.
Cloud billing and worker execution
- Add team-owned Stripe Checkout and Customer Portal flows, verified webhook processing, and Web subscription management for Light and Pro.
- Meter CI execution time across billing periods, reserve allowance when claiming work, and recover expired worker attempts. Block new starts when paid access or allowance is unavailable while allowing admitted jobs to finish.
- Add the seven-day money-back guarantee, refund contact, guarded team deletion, and operator-managed complimentary Pro access.
- Introduce the Go billing service and an opt-in Cloud billing Docker Compose overlay. Self-hosted remains outside Cloud billing.
Workflow SDK — openci_workflow 0.1.4
- Build signed Flutter IPAs with certificate import and provisioning-profile setup.
- Upload IPAs, APKs, and AABs to Firebase App Distribution; send IPAs to TestFlight and AABs to Google Play Console.
- Create Shorebird iOS, Android APK, and Android App Bundle releases with flavor, Dart-define, and dry-run options.
- Add Dart defines to Android builds and return the exported IPA path from
buildIpa(). - Add
OpenCI.go.format(),OpenCI.go.vet(), andOpenCI.go.test()with optional working directories. The build machine must already have Go installed.
CLI, website, and maintenance
- Sync generated workspace paths and secret definitions after successful secret registration. Available in CLI 0.6.0, published on October 23 alongside openci_shared 2.0.0.
- Improve website dependency resolution for Dart 3.12 and migrate shared data models to Freezed.
- Organize the Go server packages and add Go checks to the repository CI.
Upgrade notes
- Existing teams using legacy GitHub installation settings need to reconnect through Connect GitHub in the Web dashboard. An active, verified connection is required for the new flow.
- Cloud billing configuration is opt-in. Apply the required database migrations and configure both services before enabling it; see the Cloud deployment instructions.
- The initial billing release offers paid subscriptions with a money-back guarantee. Initial free trials and detailed consumed/remaining-minute UI are deferred, even though trial groundwork appears in the merged PR history below.
- Workflow tests that used
OpenCI.forTesting()should use the publicOpenCIconstructor with an injectedcommandRunner. See the SDK changelog. - When updating to
openci_shared2.0.0, removegithubBaseUrlconstructor arguments and property reads fromTeamandBuildJobPlan. The server owns repository URL configuration; see the package migration guide.
Release verification
- Release commit:
73d09d52ondevelop. - All seven configured CI checks passed on this commit: OpenCI Workflow, Website, OpenCI Shared, the legacy Go server, Build Job Worker, Build Job Planner, and OpenCI Server.
- Native/Self-hosted acceptance and manual refund verification were not rerun for this publication. The repository's Dashboard IPA workflows remain paused.
Pull request changelog — 197 GitHub-generated entries
What's Changed
- docs(website): add v2.2.0 release article and OGP banner by @mafreud in #3134
- feat(workflow): import iOS signing certificates by @mafreud in #3130
- feat(workflow): apply iOS provisioning profiles by @mafreud in #3131
- feat(workflow): build signed Flutter IPAs by @mafreud in #3133
- feat(ios): add Ad Hoc and TestFlight IPA workflows by @mafreud in #3135
- feat(workflow): support Dart defines in Android builds by @mafreud in #3137
- feat(workflow): upload signed IPAs to Firebase App Distribution by @mafreud in #3139
- feat(cli): sync workspace after registering secrets by @mafreud in #3140
- feat(fad): add Go CLI scaffold with urfave/cli by @mafreud in #3142
- feat(fad): add upload command and required flags by @mafreud in #3143
- chore: remove the legacy Firebase App Distribution CLI by @mafreud in #3144
- feat(openci_workflow): upload APKs to Firebase App Distribution (G-1310) by @mafreud in #3150
- feat(openci_workflow): upload AABs to Firebase App Distribution (G-1311) by @mafreud in #3151
- feat(openci_workflow): upload IPAs to TestFlight (G-1312) by @mafreud in #3152
- feat(openci_workflow): deploy AABs to Google Play Console (G-1313) by @mafreud in #3153
- feat(openci_workflow): add Shorebird iOS releases by @mafreud in #3154
- feat(openci_workflow): add Shorebird AAB releases by @mafreud in #3155
- feat(openci_workflow): add Shorebird APK releases by @mafreud in #3156
- chore(openci_workflow): publish 0.1.3 by @mafreud in #3164
- fix(website): support Dart 3.12 dependency resolution by @mafreud in #3169
- fix(dashboard): remove manual installation ID editing (G-1330) by @mafreud in #3177
- fix(dashboard): remove manual GitHub URL setup (G-1331) by @mafreud in #3178
- fix(server): remove installation IDs from team updates (G-1334) by @mafreud in #3183
- fix(server): remove GitHub URL from team updates (G-1335) by @mafreud in #3185
- test(dashboard): cover team name saves without GitHub fields by @mafreud in #3186
- refactor(team): remove githubBaseUrl from Team (G-1337) by @mafreud in #3190
- fix(server): derive repository URLs from GITHUB_API_BASE_URL (G-1338) by @mafreud in #3191
- feat(dashboard): add Connect GitHub button (G-1341) by @mafreud in #3195
- feat(server): authorize GitHub connection requests (G-1342) by @mafreud in #3197
- feat(server): add GitHub connection request storage (G-1344) by @mafreud in #3200
- feat(server): create expiring GitHub connection requests (G-1345) by @mafreud in #3202
- feat(server): build GitHub authorization URLs (G-1346) by @mafreud in #3205
- feat(server): return GitHub connection authorization URLs (G-1347) by @mafreud in #3206
- feat(shared): add GitHub connection start API client (G-1348) by @mafreud in #3208
- feat(dashboard): open GitHub authorization from connection button (G-1349) by @mafreud in #3210
- feat(server): consume GitHub connection requests once (G-1350) by @mafreud in #3212
- feat(server): validate GitHub authorization callbacks (G-1351) by @mafreud in #3214
- feat(server): exchange GitHub authorization codes (G-1352) by @mafreud in #3217
- feat(server): exchange codes in GitHub callbacks (G-1353) by @mafreud in #3247
- feat(server): fetch authenticated GitHub users (G-1362) by @mafreud in #3249
- feat(server): identify GitHub users in authorization callbacks (G-1363) by @mafreud in #3250
- feat(server): list GitHub installations accessible to users (G-1364) by @mafreud in #3251
- feat(server): verify GitHub installation connection authority (G-1365) by @mafreud in #3252
- refactor: use parameter annotations for test overrides (G-1383) by @mafreud in #3254
- feat(server): add GitHub connection session storage (G-1366) by @mafreud in #3255
- feat(server): create encrypted GitHub connection sessions (G-1366) by @mafreud in #3256
- feat(server): read authorized...
v2.2.0
What's Changed
- feat(openci_cli): clarify team switching messages and docs by @mafreud in #3022
- chore: integrate website into the root Pub workspace by @mafreud in #3024
- feat(website): add v2.1.0 release article and OGP cards by @mafreud in #3025
- feat(website): migrate blog to Jaspr Content by @mafreud in #3026
- feat(openci_workflow): add whenChanged to CITrigger by @mafreud in #3040
- feat(planner): parse whenChanged in workflow triggers by @mafreud in #3041
- feat(server): expose webhook changed files (G-1248) by @mafreud in #3042
- feat(cli): publish the Dart CLI with its hosted console dependency by @mafreud in #3052
- feat(cli): add the CLI status command and release 0.0.3 by @mafreud in #3055
- feat(cli): show team name in status and release v0.1.0 by @mafreud in #3058
- feat(cli): add interactive updates and release v0.2.0 by @mafreud in #3059
- feat(cli): add the CLI team listing command by @mafreud in #3062
- fix(cli): prevent team selection failure during cleanup (G-1272) by @mafreud in #3065
- fix(cli): support reserved directory names in sync paths (G-1273) by @mafreud in #3068
- feat(website): add OpenCI Docs with code theme switching by @mafreud in #3066
- fix(cli): generate paths for single-package projects (G-1274) by @mafreud in #3070
- Release CLI 0.3.2 by @mafreud in #3071
- feat(cli): complete all commands and known argument values by @mafreud in #3072
- feat(cli): release sync generation changes in 0.4.0 (G-1276) by @mafreud in #3075
- feat(workflow): add typed test time zones and tag exclusions (G-1278, G-1279) by @mafreud in #3079
- feat(cli): add setup asc-keys placeholder (G-1284) by @mafreud in #3088
- feat(cli): bootstrap pinned asc for key setup (G-1285) by @mafreud in #3089
- revert(cli): remove ASC key setup by @mafreud in #3090
- feat(cli): add setup asc-keys command scaffold (G-1284) by @mafreud in #3091
- feat(cli): check cached asc on Apple Silicon Macs (G-1282) by @mafreud in #3093
- feat(cli): install missing asc on Apple Silicon Macs (G-1283) by @mafreud in #3094
- feat(cli): verify cached asc version (G-1285) by @mafreud in #3095
- feat(cli): prompt for Apple ID email during ASC setup (G-1289) by @mafreud in #3097
- feat(cli): launch interactive asc login (G-1291, G-1292) by @mafreud in #3102
- feat(cli): verify asc authentication after login (G-1293) by @mafreud in #3103
- feat(cli): show App Store Connect provider after authentication by @mafreud in #3104
- feat(cli): issue ASC API keys (G-1286) by @mafreud in #3105
- feat(cli): save ASC API keys to OpenCI (G-1287) by @mafreud in #3107
- feat(cli): support ASC provider names and record 0.5.1 release by @mafreud in #3110
- feat(cli): add delete secret command and release 0.5.2 by @mafreud in #3112
- feat(cli): prepare iOS signing keys during ASC setup (G-1304) by @mafreud in #3121
- feat(cli): add standalone iOS certificate key setup (0.5.4) by @mafreud in #3122
- feat(workflow): define buildIpa API (G-1305) by @mafreud in #3124
- feat(workflow): initialize iOS signing keychain by @mafreud in #3125
- feat(workflow): prepare iOS signing credentials by @mafreud in #3127
- feat(workflow): fetch iOS signing files by @mafreud in #3129
Full Changelog: v2.1.0...v2.2.0
v2.1.0
What's Changed
- Publish standalone OpenCI workflow SDK by @mafreud in #2955
- feat(workflow): make Flutter analysis fatal flags configurable by @mafreud in #2957
- ci: add openci_workflow checks by @mafreud in #2960
- feat: add fatal info flag to static analysis command by @mafreud in #2962
- feat: enable suppressAnalytics option in static analysis by @mafreud in #2963
- ci: use Flutter helpers for workflow checks by @mafreud in #2965
- chore: remove unnecessary gitattributes by @mafreud in #2976
- fix(openci_cli): generate nested workspace directory paths by @mafreud in #2984
- feat: update secrets and add build APK functionality by @mafreud in #2985
- feat: add buildAab functionality to FlutterCI and update tests by @mafreud in #2991
- [openci_workflow] feat: add support for building Android APKs and app bundles with optional flavors by @mafreud in #2997
- [openci] feat: add support for building Android APK and AAB workflows by @mafreud in #2999
- [openci_cli] Add switch team command structure by @mafreud in #3013
- [openci_cli] Fetch teams using the active authenticated profile by @mafreud in #3015
- feat(website): add the OpenCI Jaspr landing page and blog by @mafreud in #3017
- [openci_cli] Build the interactive team picker by @mafreud in #3018
- feat(openci_cli): persist selected team safely by @mafreud in #3021
Full Changelog: v2.0.0...v2.1.0
v2.0.0
OpenCI v2.0.0 updates workflow authoring, Cloud/self-hosted connections, and local development.
Highlights
- Standardize component names as
openci_cli(theopencicommand),openci_server, andopenci_workflow. Dart workflow definitions live inopenci/and use theOpenCI/CITriggerAPIs. - Save and select named Dashboard connections with a Firebase client configuration and API URL, and return to the built-in Cloud connection. Sign-in now navigates immediately to the Dashboard.
- Add Firebase Auth Emulator support for local CLI, server, and Dashboard development, including a seeded development user and explicit test-team membership.
- Read the development seed key from
.envand stop the local Docker Compose stack whenopenci dev startexits or receives Ctrl+C. - Require authenticated team membership before opening build streams, remove automatic test-team enrollment, and preserve Orchard controller state across container recreation.
Upgrade notes
- Migrate legacy workflow definitions to Dart files under
openci/, update imports toopenci_workflow, and update renamed identifiers andOPENCI_*environment variables. See the CLI guide. - When upgrading to v2.0.0, run
openci loginagain to set up CLI credentials. - The Orchard volume now mounts at
/data. If an existing deployment used the previous/root/.orchardmount, stop the controller and copy its actual/datacontents intoorchard_databefore recreating it. The mount change alone does not migrate existing state. See #2954. - Automatic iOS device enrollment is disabled; GET and POST
/devices/mobile-configreturn410 Gone.
Validation and remaining coverage
All five CI checks passed for release commit cfce5333cf53a9b6efb57821b8329f6b48138aab. Cloud CI success/failure reporting, real Firebase login, connection switching, token/data isolation, browser restart persistence, and the focused API access checks were verified.
Self-hosted CI execution and end-to-end CD in both deployments remain unverified for this release. Native Dashboard applications and other browsers were not exercised in the release acceptance run. The release owner approved publication with these validation gaps; see #2946.