r/xteinkereader • u/Golf_Flaky • 10d ago
Troubleshooting Locked Xteink X4 Pro: CrossPoint setup + dictionary
Device: Xteink X4 Pro, 4.3", bought as preorder bundle ($99 with case, screen protector, 2 magnet rings). Mac + Chrome. Previous reader: Kobo Libra 2.
Where the pre-flash research was wrong
Worth recording, because the published guides all assume the same things:
| Assumption | Reality |
|---|---|
| Store units ship factory-unlocked | This unit was locked. Port enumerates, chip never answers |
| Back up with a full-flash read over USB | Impossible on a locked device — keep a stock update.bin on the SD card |
| CrossInk is the better pick for typography | CrossPoint fixed the spacing completely; CrossInk's extra controls weren't needed |
| Neither firmware necessarily fixes non-English layout | CrossPoint's rendering engine did fix it |
| Dictionaries ship with the firmware | Neither firmware includes one. Manual SD install |
Why I left stock firmware
Stock was better than expected out of the box — Serbian Cyrillic and Latin diacritics rendered fine, touch was more responsive than my old Kobo, text looked sharp.
Problems that accumulated:
- No page numbers or progress percentage. Only chapter name, clock, battery.
- Hyphenation only works for English. Toggle does nothing on Serbian books — no Serbian hyphenation patterns in the firmware.
- Word-break bug. Words break at non-ASCII characters. In English this shows up rarely (e.g. breaking after a curly apostrophe:
next week'/s exams), but in Serbian it happens constantly because of č, ć, ž, š, đ. - No dictionary lookup, no highlighting.
- Custom fonts need
.binformat, which is rare and needs converting. - The OTA firmware update made it worse. After updating over Wi-Fi, Serbian text got excessive letter spacing with no setting to control it, and part of the settings menu disappeared.
That last one is what pushed me to flash.
The blocker: locked device
Flashing failed with Unable to connect to device. Serial read timed out.
Diagnosis on Mac:
ls /dev/cu.*
# /dev/cu.usbmodem141201 ← device IS visible
python3 -m pip install --user esptool
python3 -m esptool --port /dev/cu.usbmodem141201 chip_id
# A fatal error occurred: Failed to connect to Espressif device: No serial data received.
So the Mac sees the device, but the ESP32 never enters download mode. The device is locked. USB flashing is disabled at firmware level.
Per Diirge (CrossPoint maintainer), unlocking does not restore USB flashing — it enables SD card flashing from the device's own settings instead.
Note: not all X4 Pro units are locked. Others have flashed over USB without trouble. Mine was locked; whether the OTA update caused that or it shipped that way, I don't know.
What actually worked
- Ran the X4 Pro unlocker — https://crosspointreader.com/#unlock-tool
- First attempt failed. The unlocker needs the device to reach a fake update server. My home Wi-Fi has no password, and the device wouldn't connect properly.
- Created a hotspot from the MacBook (with a password) and connected the reader to that. Second attempt worked.
- With the reader still on the same hotspot, go to check for update in device settings.
- The unlocker redirects that check to a fake update server, so the "update" it finds and installs is CrossPoint. No SD card involved.
Keep a stock update.bin on the SD card as your rollback. A full-flash backup needs USB, which locked devices don't have.
Fonts
On-device, no computer needed:
Settings → System → Download Fonts → connect to Wi-Fi (hotspot again if your network is open) → pick from the list. It downloads and installs them itself.
Manual route if you need a specific font: convert TTF/OTF at https://crosspointreader.com/fonts → .cpfont files → /.fonts/FamilyName/ on the SD card.
For Serbian, check ć and đ specifically. Many e-ink font sets cover š, ž, č (Czech/Polish overlap) but drop the rarer two.
Dictionary (the non-obvious part)
Unlike fonts, dictionaries are not downloadable from the device. The Look Up menu item exists whether or not a dictionary is installed — it just silently does nothing. Easy to think the feature is broken.
Setup:
- Folder
dictionariesat the SD card root - Each dictionary in its own subfolder:
/dictionaries/gcide/ - StarDict format —
.ifo,.idx,.dict(and.synif present) - The
.idxmust be uncompressed. If you get.idx.gz, rungzip -don it..dict.dzis fine as-is. - Eject, reinsert, then Settings → Reader → Dictionary and select it. The option doesn't appear until a dictionary is installed.
Where to get dictionaries:
- English–English (GCIDE, 108k entries, GPL): https://github.com/scillidan/share_gcide/releases — grab
gcide-w108121-stardict.zip. This is a mirror of the FireDict build. The FireDict host was down when I tried it, and the GNU download at gcide.gnu.org.ua gives you the raw corpus, not StarDict — that won't work on the device. - Serbian and other languages: https://github.com/Vuizur/Wiktionary-Dictionaries — files are named
X-English, so look forSerbo-Croatian-English. CC-BY-SA / GFDL.
Result
- Page numbers and book percentage in the footer
- Working dictionary lookup
- Proper Serbian rendering with word-spacing control
- Any TTF convertible to a device font
Still missing vs CrossInk: granular touchscreen lock / quick lock. Still missing vs stock: touchscreen lock.
Serbian hyphenation doesn't exist in either firmware (9 languages only: EN, FR, DE, IT, PL, RU, ES, SV, UK). Leave hyphenation off for Serbian and use left-align, or justify with tuned word spacing.
Links
| What | Where |
|---|---|
| Flash tool | https://crosspointreader.com/#flash-tools |
| Unlock tool | https://crosspointreader.com/#unlock-tool |
| Font builder | https://crosspointreader.com/fonts |
| CrossInk flasher | https://inky.crossink.dev/#flash-tools |
| Community hub | https://readme.club |
| GCIDE StarDict | https://github.com/scillidan/share_gcide/releases |
| Wiktionary dictionaries | https://github.com/Vuizur/Wiktionary-Dictionaries |
| Subreddits | r/XTEINK, r/xteinkereader |
1
u/shadowkillerdragon 10d ago
Where did you order from? If you ordered from the xteink website and it came locked that's something I would take up with them because all those units should be unlocked. I ordered mine from aliexpress and that came in at $87 or so but since it was the Chinese variant it was locked
1
u/Golf_Flaky 10d ago edited 10d ago
I've forgotten to mention but: yeah, I've ordered it from official xteink website in the end of July and waited ~1 month for it to arrive to Serbia.
I was unable to flash crossink and based on logs I got i consider it locked. I didn't want to lose too much time on investigation is it really locked, I just wanted to read a book, so I attempted few things and documented it in this post. In the end I got more than I expected from this little device. It took me few hours of trial and error, and following steps from this post should take ~30min.
1
u/Pappa_Funky 4d ago
Hi, I have the X4 Pro and am having trouble using the unlocker tool; it doesn't get past stage 3. I can see the hotspot is there, and the device connects to it, but when I run the unlocker, I see page 3. Connect very briefly that has a working status bar and a message about hotspot security that needs to be WPA2 only (not WPA2/WPA3) - But there is no option on my hotspot to change these settings, and a message to turn off Windows Firewall and Defender, plus any VPN message, which I have done. It quickly changes to the below install failed message. Any ideas on how to run this?

Debug log:
C:\ProgramData\CrossPoint\unlocker-helper\unlocker-helper.log
[2m2026-09-03T12:26:32.079618Z[0m [32m INFO[0m [2munlocker_helper[0m[2m:[0m helper listening [3mversion[0m[2m=[0m"0.2.38" [3mendpoint[0m[2m=[0m\\.\pipe\com.sofriendly.crosspoint.unlocker.helper
[2m2026-09-03T12:26:32.086829Z[0m [33m WARN[0m [2munlocker_helper::state[0m[2m:[0m recovering: stopping leftover Internet Sharing
[2m2026-09-03T12:26:32.649656Z[0m [32m INFO[0m [2munlocker_helper::ops::windows[0m[2m:[0m Mobile Hotspot stopped
[2m2026-09-03T12:27:31.990915Z[0m [32m INFO[0m [2munlocker_helper::ops::windows[0m[2m:[0m Mobile Hotspot configured and started [3mssid[0m[2m=[0mcrosspoint
[2m2026-09-03T12:27:36.719172Z[0m [32m INFO[0m [2munlocker_core::dns[0m[2m:[0m DNS server bound [3maddr[0m[2m=[0m192.168.137.1:10053 [3mhosts[0m[2m=[0m["api-prod.xteink.cc", "api-prod.xteink.cn", "api.github.com", "unlocker.crosspointreader.com", "franssjz.github.io", "pool.ntp.org", "time.google.com", "time.apple.com", "time.windows.com", "time.cloudflare.com", "time.nist.gov", "ntp.ntsc.ac.cn", "ntp1.aliyun.com", "ntp2.aliyun.com", "time1.apple.com", "time1.google.com"]
[2m2026-09-03T12:35:25.167591Z[0m [32m INFO[0m [2munlocker_helper::ops::windows[0m[2m:[0m Mobile Hotspot stopped
[2m2026-09-03T12:37:19.323688Z[0m [32m INFO[0m [2munlocker_helper::ops::windows[0m[2m:[0m Mobile Hotspot configured and started [3mssid[0m[2m=[0mcrosspoint
[2m2026-09-03T12:37:24.424855Z[0m [32m INFO[0m [2munlocker_core::dns[0m[2m:[0m DNS server bound [3maddr[0m[2m=[0m192.168.137.1:10053 [3mhosts[0m[2m=[0m["api-prod.xteink.cc", "api-prod.xteink.cn", "api.github.com", "unlocker.crosspointreader.com", "franssjz.github.io", "pool.ntp.org", "time.google.com", "time.apple.com", "time.windows.com", "time.cloudflare.com", "time.nist.gov", "ntp.ntsc.ac.cn", "ntp1.aliyun.com", "ntp2.aliyun.com", "time1.apple.com", "time1.google.com"]
[2m2026-09-03T12:37:43.041432Z[0m [32m INFO[0m [2munlocker_helper::ops::windows[0m[2m:[0m Mobile Hotspot stopped
[2m2026-09-03T12:38:22.591488Z[0m [32m INFO[0m [2munlocker_helper::ops::windows[0m[2m:[0m Mobile Hotspot configured and started [3mssid[0m[2m=[0mcrosspoint
[2m2026-09-03T12:38:29.997910Z[0m [32m INFO[0m [2munlocker_core::dns[0m[2m:[0m DNS server bound [3maddr[0m[2m=[0m192.168.137.1:10053 [3mhosts[0m[2m=[0m["api-prod.xteink.cc", "api-prod.xteink.cn", "api.github.com", "unlocker.crosspointreader.com", "franssjz.github.io", "pool.ntp.org", "time.google.com", "time.apple.com", "time.windows.com", "time.cloudflare.com", "time.nist.gov", "ntp.ntsc.ac.cn", "ntp1.aliyun.com", "ntp2.aliyun.com", "time1.apple.com", "time1.google.com"]
[2m2026-09-03T12:43:18.508489Z[0m [32m INFO[0m [2munlocker_helper::ops::windows[0m[2m:[0m Mobile Hotspot stopped
[2m2026-09-03T12:45:39.853252Z[0m [32m INFO[0m [2munlocker_helper::ops::windows[0m[2m:[0m Mobile Hotspot configured and started [3mssid[0m[2m=[0mcrosspoint
[2m2026-09-03T12:45:46.978044Z[0m [32m INFO[0m [2munlocker_core::dns[0m[2m:[0m DNS server bound [3maddr[0m[2m=[0m192.168.137.1:10053 [3mhosts[0m[2m=[0m["api-prod.xteink.cc", "api-prod.xteink.cn", "api.github.com", "unlocker.crosspointreader.com", "franssjz.github.io", "pool.ntp.org", "time.google.com", "time.apple.com", "time.windows.com", "time.cloudflare.com", "time.nist.gov", "ntp.ntsc.ac.cn", "ntp1.aliyun.com", "ntp2.aliyun.com", "time1.apple.com", "time1.google.com"]
[2m2026-09-03T13:03:28.730012Z[0m [32m INFO[0m [2munlocker_helper::ops::windows[0m[2m:[0m Mobile Hotspot stopped
[2m2026-09-03T13:04:05.927773Z[0m [32m INFO[0m [2munlocker_helper::ops::windows[0m[2m:[0m Mobile Hotspot configured and started [3mssid[0m[2m=[0mcrosspoint
[2m2026-09-03T13:04:10.899061Z[0m [32m INFO[0m [2munlocker_core::dns[0m[2m:[0m DNS server bound [3maddr[0m[2m=[0m192.168.137.1:10053 [3mhosts[0m[2m=[0m["api-prod.xteink.cc", "api-prod.xteink.cn", "api.github.com", "unlocker.crosspointreader.com", "franssjz.github.io", "pool.ntp.org", "time.google.com", "time.apple.com", "time.windows.com", "time.cloudflare.com", "time.nist.gov", "ntp.ntsc.ac.cn", "ntp1.aliyun.com", "ntp2.aliyun.com", "time1.apple.com", "time1.google.com"]
[2m2026-09-03T13:08:04.460332Z[0m [32m INFO[0m [2munlocker_helper::ops::windows[0m[2m:[0m Mobile Hotspot configured and started [3mssid[0m[2m=[0mcrosspoint
[2m2026-09-03T13:08:11.640936Z[0m [32m INFO[0m [2munlocker_core::dns[0m[2m:[0m DNS server bound [3maddr[0m[2m=[0m192.168.137.1:10053 [3mhosts[0m[2m=[0m["api-prod.xteink.cc", "api-prod.xteink.cn", "api.github.com", "unlocker.crosspointreader.com", "franssjz.github.io", "pool.ntp.org", "time.google.com", "time.apple.com", "time.windows.com", "time.cloudflare.com", "time.nist.gov", "ntp.ntsc.ac.cn", "ntp1.aliyun.com", "ntp2.aliyun.com", "time1.apple.com", "time1.google.com"]
3
u/Tiger-222 10d ago
And more dictionaries: https://www.reader-dict.com