Device / environment
- Device: Xteink X4 / locked batch
- Current firmware on device:
CrossInk-ESP32-1.2.9.4-tiny
- Firmware repo requested by device:
chintanvajariya/CrossInk-Carousel
- Flashing method available: OTA only via CrossPoint/Xteink Unlocker
- Browser/WebSerial flashing is not available on this locked batch
- Tested on both macOS and Windows
- Tested with multiple target firmware files, including CrossInk variants and CrossPoint firmware
Problem
The unlocker hotspot starts successfully, and the device connects to it.
The device also successfully sends a GitHub release API request to the unlocker, so DNS/hotspot interception seems to be working.
However, after the unlocker serves the release manifest, the device shows update failed.
The device never requests the actual firmware file:
GET /firmware/firmware.bin
So the OTA process appears to stop at the manifest parsing/validation stage, before firmware download begins.
Minimal reproduction
Restart the unlocker.
Select one firmware only, for example CrossInk no_emoji or CrossPoint official firmware.
Connect the Xteink X4 to the unlocker hotspot.
Tap update on the device.
Wait until the device shows update failed.
Save the unlocker helper log immediately.
Search the log for:
GET /firmware/firmware.bin
Observed unlocker log behavior
The unlocker receives the release API request:
GET /repos/chintanvajariya/CrossInk-Carousel/releases/latest
Host: api.github.com
UA: CrossInk-ESP32-1.2.9.4-tiny
The unlocker responds with a manifest containing:
download_url=http://unlocker.crosspointreader.com/firmware/firmware.bin
tag=99.9.9
is_crossink=false
is_inx=false
But the device never sends:
GET /firmware/firmware.bin
Instead, the device immediately reports update failed.
Expected behavior
After receiving the release manifest, the device should request:
GET /firmware/firmware.bin
Then the unlocker should serve the selected firmware binary.
Suspected cause
It looks like the unlocker does not classify chintanvajariya/CrossInk-Carousel as CrossInk-compatible.
The helper log shows:
is_crossink=false
is_inx=false
Because of that, the unlocker may be returning a generic release asset / manifest instead of the CrossInk-style variant assets expected by this firmware.
Since the current firmware is:
CrossInk-ESP32-1.2.9.4-tiny
it may be looking for a matching CrossInk variant asset, such as a tiny, no_emoji, or xlarge firmware asset. If the manifest does not contain the expected CrossInk-style asset names or metadata, the firmware may reject the update and never request /firmware/firmware.bin.
Request
Could the unlocker treat CrossInk-Carousel as CrossInk-compatible when building the fake GitHub release manifest?
For example, instead of only matching the official CrossInk repo name, it could also recognize:
repo == "CrossInk-Carousel"
as CrossInk-compatible, so the generated manifest uses CrossInk-style variant assets.
The key symptom is:
Unlocker receives GitHub release API request
Unlocker serves manifest
Log shows is_crossink=false
Device never requests /firmware/firmware.bin
Device shows update failed
I can provide the full unlocker-helper.log if needed.
Device / environment
CrossInk-ESP32-1.2.9.4-tinychintanvajariya/CrossInk-CarouselProblem
The unlocker hotspot starts successfully, and the device connects to it.
The device also successfully sends a GitHub release API request to the unlocker, so DNS/hotspot interception seems to be working.
However, after the unlocker serves the release manifest, the device shows
update failed.The device never requests the actual firmware file: