feat: add Formulus–Synkronus version handshake (major-version check and x-formulus-version header)#358
Merged
najuna-brian merged 11 commits intodevfrom Mar 1, 2026
Merged
feat: add Formulus–Synkronus version handshake (major-version check and x-formulus-version header)#358najuna-brian merged 11 commits intodevfrom
najuna-brian merged 11 commits intodevfrom
Conversation
…ormulus-version header)
- Add syncNativeVersion.js script to keep Android build.gradle versionName in sync with package.json.version - Integrate version sync into prebuild process - Ensures version shown in Android app settings matches version sent to server in handshake header
najuna-brian
approved these changes
Mar 1, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
This PR implements a version handshake mechanism between the Formulus React Native app and the Synkronus Go backend server. Every request from Formulus now carries its version, and Synkronus validates compatibility before processing anything. Incompatible versions are rejected immediately with a clear, user-friendly error.
Breaking Change
This PR introduces a breaking change by design. Any client not sending the
x-formulus-versionheader receives HTTP 426 immediately. This is intentional, it establishes the version protocol from day one of the first release. Old Formulus builds without this header will be rejected.How It Works
Every Formulus request includes a version header:
Synkronus middleware intercepts every request and validates it:
Every response (success or error) includes:
This lets the client display exactly which server version it's talking to in error messages.
Version Compatibility Rules
Known Limitation is iOS Version Sync
syncNativeVersion.jscurrently only syncs to Android'sbuild.gradle. iOS version fields inproject.pbxprojare not updated automatically. If building for iOS, manually ensureMARKETING_VERSIONin Xcode matchespackage.json. iOS automation is tracked as a future enhancement.