Skip to content

feat: support module_version for add-to-app releases#121

Open
eseidel wants to merge 1 commit intoshorebird/devfrom
feat/aar-release-version
Open

feat: support module_version for add-to-app releases#121
eseidel wants to merge 1 commit intoshorebird/devfrom
feat/aar-release-version

Conversation

@eseidel
Copy link
Copy Markdown

@eseidel eseidel commented Apr 2, 2026

Summary

  • Flutter tool: Read SHOREBIRD_MODULE_VERSION env var in compileShorebirdYaml() and write module_version into the compiled shorebird.yaml (same pattern as SHOREBIRD_PUBLIC_KEY)
  • Engine: No changes to release_version handling — host app version passes through unchanged
  • Updater: Parse module_version from shorebird.yaml, add to UpdateConfig and PatchCheckRequest as a separate optional field sent alongside release_version

Context

Part of shorebirdtech/shorebird#793

release_version always stays the host app's version. module_version is a separate field used for patch lookup in add-to-app releases where the module's identity is independent of the host app.

Companion PRs:

Test plan

  • Existing Flutter tools tests pass
  • Existing engine tests pass
  • Verify module_version appears in compiled yaml when env var is set
  • Verify compiled yaml unchanged when env var is absent

@eseidel
Copy link
Copy Markdown
Author

eseidel commented Apr 2, 2026

Design discussion: module_version vs release_version in the protocol

The current approach in this PR works by having the engine substitute module_version (from shorebird.yaml) into the release_version field that gets passed to the updater. This means:

  • Pro: No updater (Rust) changes needed — the updater already receives release_version as a string and doesn't care where it came from.
  • Pro: No server/database changes needed — release version is just an opaque string.

However, this means the host app's actual version is thrown away. The server has no way to distinguish a module version (git hash) from an app version, and can't report which host app versions are running a given module.

Alternative: plumb module_version as a separate field

Instead of overriding release_version, the engine could pass both values to the updater:

  • release_version — always the host app's version (from PackageInfo)
  • module_version — from shorebird.yaml, nullable

The updater would then send both in the PatchCheckRequest. The server would look up patches by module_version when present, falling back to release_version. The host app version could be stored for analytics.

This requires touching more code:

  • Updater (Rust): Add module_version to AppConfig, PatchCheckRequest, and the check logic
  • Server: Update patch lookup to prefer module_version over release_version
  • Protocol: Add module_version field to PatchCheckRequest
  • Engine (C++): Pass module_version as a separate field rather than overriding release_version

But avoids future problems:

  • No polluted release_version data (git hashes mixed with semver app versions)
  • Host app version still available for analytics/debugging
  • No protocol migration needed later if we want both values
  • Cleaner semantics — each field means exactly one thing

Recommendation

The current PR is a valid MVP, but we're leaning toward plumbing module_version as a separate field through the full stack (updater → server → protocol) to keep the data clean. This PR's engine + Flutter tool changes would still be needed either way — the difference is whether the engine overrides release_version (current approach) or passes module_version alongside it.

Leaving this here for discussion before we decide which path to take.

Comment thread packages/flutter_tools/lib/src/shorebird/shorebird_yaml.dart
@eseidel eseidel marked this pull request as ready for review April 2, 2026 22:25
@eseidel eseidel requested a review from bdero April 2, 2026 22:25
@eseidel eseidel changed the title feat: read release_version from shorebird.yaml for add-to-app feat: support module_version for add-to-app releases Apr 2, 2026
@eseidel eseidel force-pushed the add-build-trace branch 2 times, most recently from c92ab93 to b348f63 Compare April 17, 2026 18:24
Base automatically changed from add-build-trace to shorebird/dev April 20, 2026 16:17
@bdero bdero force-pushed the shorebird/dev branch 2 times, most recently from 8e0003b to fbecf6f Compare April 30, 2026 22:10
@eseidel eseidel force-pushed the feat/aar-release-version branch from 57f5ed5 to b0de23a Compare May 1, 2026 17:51
Adds SHOREBIRD_MODULE_VERSION env var support to compileShorebirdYaml.
When set, the value is written into the compiled shorebird.yaml as
module_version, which the updater then sends to the server (alongside
release_version) for add-to-app patch lookup.

The shorebird CLI passes this env var through when running
`flutter build aar` or `flutter build ios-framework` for module
releases (see shorebirdtech/shorebird#3674).
@eseidel eseidel force-pushed the feat/aar-release-version branch from b0de23a to e4ce42c Compare May 1, 2026 17:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants