Kindle Capability Test

1. User Agent

reading...

2. API Availability

API Present?
EventSource (SSE)
WebSocket
fetch
localStorage
sessionStorage
Touch events
Pointer events
CSS transitions

3. Echo Tests (same-origin)

Tests below hit /echo/ws, /echo/sse, /echo/poll on this same origin.

3a. WebSocket Echo

— not started —

3b. SSE Echo

— not started —

3c. Long-Poll Echo

— not started —

4. Key Events

Press any key, hardware page-turn button, or 5-way joystick:

waiting for keypress...
key keyCode code type

5. Secure Context & Crypto

These determine whether crypto.randomUUID() works. x-reader calls it during init — a failure here causes a blank page.

Check Result
isSecureContext
window.crypto present
crypto.getRandomValues
crypto.randomUUID present
crypto.randomUUID() call result

6. x-reader JS Prerequisites

x-reader bundles to an ES2017 IIFE. These JS features must work.

Feature Present?
Promise
Symbol
Proxy
URL constructor
async / await
Arrow functions
Nullish coalescing (??)
Optional chaining (?.)
class syntax
WeakMap
WeakSet
queueMicrotask (Svelte scheduler)
TextEncoder

7. defer Script Loading

x-reader's IIFE uses <script defer> so it runs after the DOM is parsed. If defer is broken the app never mounts (blank page, no error).

Check Result
defer script executed waiting…
DOM ready when defer runs waiting…

8. Cross-Origin Image Rendering (CORP / hotlink)

Cross-origin images are hotlinked from source CDNs (web-reader relies on this). OK = rendered, FAIL = blocked (CORP / hotlink protection / unsupported format).

Source Image Result Notes
Control (data URI) Loading… baseline test — embedded PNG
GitHub Loading… avatars.githubusercontent.com
Wikimedia Loading… upload.wikimedia.org
Vietnamese news Loading… webp — FAIL here is likely format, not CORP
Facebook — user photos are CORP: same-origin; paste a fresh signed URL

Test any image URL:

Source Image Result Notes

9. Pagination Prerequisites

web-reader wants a true book-style paginator (CSS multi-column layout, one page turn = one column). These checks are automated — no on-device eyeballing needed, just read the table.

Check Result
column-width in style (unprefixed)
-webkit-column-width in style
Multi-column actually splits content (functional)
transform in style (unprefixed)
-webkit-transform in style
Transform actually moves the layout box (functional)
Programmatic scrollLeft works on overflow:hidden
document.fonts API present
document.fonts.ready is a thenable

10. Live Pagination Demo

Real book-style page turn on real text. Use Prev/Next to page. Use "Switch mode" to flip between the two page-turn candidates (transform: translateX() vs scrollLeft) and watch the e-ink screen for flicker/ghosting differences — that judgment call needs your eyes, not a script. Use A− / A+ to confirm reflow: page count and position should recompute, not just visually break.

— not initialized —