Repository navigation
Android GitHub sign-in still fails on the v1.0.3 APK: the relay serving /v/1.0.2 predates the #3253 fix by 5 days #3294
Description
Summary
A second independent reporter here. I installed the freshly published v1.0.3 APK on a clean device and GitHub sign-in still fails with the exact same red message. This is the same symptom reported in #3246 and reproduced by @tecgic today.
The new APK is a genuine new build (I verified the dex contents, see below), so this is not a case of "you installed the old file". The reason it cannot help is server-side, and the evidence is unambiguous: the relay process currently serving /v/1.0.2 started 5.24 days before the fix in #3253 was merged, so it physically cannot contain that fix.
Environment
| Device | Samsung Galaxy S25 |
| OS | Android 16, One UI 8.5 |
| Sign-in method | GitHub only (my desktop app, web session and VPS host are all already linked through GitHub, so I cannot exercise the email-code path) |
| Error shown | 中继返回了无效的账号响应 (account_malformed_response) |
Note the OS differs from the earlier reports in #3246 (Android 15), so this is not an Android-version-specific regression.
What was installed
Asset OpenBitFun-1.0.0-beta.apk from release v1.0.3, uploaded 2026-10-08T01:41:00Z:
size 4624246
sha256 9e1bb7016a2e53ebde9fa4d6f1bfe6064d054f78320871be68a962dfdc0833a5
This is byte-for-byte the same size as the v1.0.2 asset (02d4dfe10933d6120479c38aef09a9a686f34a9b3a6d29da0228b38e06198648), which is what makes it easy to doubt. It is nevertheless a different binary. Comparing the two downloaded APKs locally:
| File | v1.0.2 asset | v1.0.3 asset |
|---|---|---|
classes.dex |
4 429 308 B | 4 434 800 B (+5 492) |
AndroidManifest.xml |
identical | identical |
resources.arsc |
identical | identical |
And these strings exist only in the v1.0.3 build:
#account host visibility foreground=
%account authorization callback wakeup
authorization poll attempt=
openbitfun-auth-diagnostics.log
So yes, the client-side half of #3253 / #3262 is genuinely present. Confirming @tecgic's observation: because AndroidManifest.xml and resources.arsc are byte-identical between the two assets, versionName never changed and the user still sees 1.0.0 Beta. There is no way for a user to tell the two builds apart from the file name or the About screen. That is worth fixing on its own: a commit short sha in the asset name, or a build number displayed in-app, would have saved this whole exchange.
The APK still targets the old relay path
Both builds hardcode the same base URL:
v1.0.2 asset -> https://remote.openbitfun.com/v/1.0.2
v1.0.3 asset -> https://remote.openbitfun.com/v/1.0.2
So even a perfect client build lands on the v1.0.2 path, which is exactly the path served by the stale process.
Relay measurements (2026-10-08T07:05Z)
GET /v/1.0.2/api/info
{"name":"OpenBitFun Relay Server","version":"1.0.1","protocol_version":3,
"capabilities":["device_alias_v1","device_metadata_v1","device_client_build_v1","device_kind_cli_v1"]}
GET /v/1.0.2/health
{"status":"healthy","version":"1.0.1","uptime_seconds":1211368,...}
GET /v/1.0.3/api/info -> HTTP 410 (nginx)
GET /v/1.0.3/health -> HTTP 410 (nginx)
uptime_seconds: 1211368 at 2026-10-08T07:05Z places the process start at 2026-09-24T06:35:50Z.
#3253 was merged on 2026-09-29T12:26:23Z.
The running process predates the fix by 5.24 days. This is not a mis-tagged image or a skipped backport: the process was already up when the code was written. @tecgic reached the same conclusion from capabilities and uptime; the version: "1.0.1" field is consistent with this because relay-service read CARGO_PKG_VERSION 1.0.1 on main until the 1.0.2 bump on 2026-09-25.
I also confirmed the fix is not present in the older tags, which is what makes the deploy the deciding factor:
| tag | replay_completed_poll |
POLL_REPLAY_SECS |
|---|---|---|
| v1.0.1 | absent | absent |
| v1.0.2 | absent | absent |
| v1.0.3 | present | present |
Why no APK can fix this
The client still has no recovery path for the consumed status, as @tecgic noted when re-reading AccountStore.kt on main. AuthorizationPoll.awaitAccessToken only branches on authorized, expired and denied. The 900 second replay cache added by #3253 lives entirely on the relay. Only a relay redeploy closes this, and it requires no app change at all.
Request
- Restart / rebuild the relay from a commit that includes fix(mobile): make account sign-in recovery reliable #3253, and serve it on a path the released APK actually uses. Since the published APK targets
/v/1.0.2, either redeploy that path with the new build, or publish/v/1.0.3(currently 410) and ship an APK pointing at it. The first option fixes already-installed APKs with zero client action. - Optionally, consider handling
consumedclient-side so a lost poll response is recoverable without depending on the relay cache window.
Reference: the original analysis is in #3246 (now closed), and the relay-side fix is #3253.
Activity
wgqqqqq commentedon Oct 8, 2026
Thanks for the detailed investigation! #3299 fixes an Android issue that can cause the same error. I’ve updated the APK in the v1.0.3 release to include this fix. Could you download it again and let us know whether it resolves the problem?