You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Paragraph-level e-reader sync, both directions — v0.5.0 synced positions between the web reader and KOReader/Readest at chapter granularity; v0.6.0 makes it paragraph-exact. Device→web: the web reader resolves the e-reader's native position (a crengine xpointer like /body/DocFragment[12]/body/div[2]/p[35]/text().260) through the chapter's DOM and jumps to the exact paragraph — this also fixes books where renderer percentage scales diverge so badly (footnote- or image-heavy) that the old chapter fallback looked like the jump did nothing. Web→device: the reader now computes a crengine-style xpointer for every position it saves, and KOReader/Readest pull it and open at the exact paragraph. Positions degrade gracefully (paragraph → in-chapter percentage → chapter start) when a book resists exact resolution. Verified in both directions against a real Kobo running KOReader, and Readest. As far as we know, no other kosync server does cross-renderer position translation at all.
Setup notes
Nothing new to configure — paragraph-level sync works through the existing /kosync endpoint for books whose digests already match.
Internal
Migration 050 adds a deleted_at tombstone to highlights: deletes are now soft and idempotent, and highlight creation accepts a client-supplied UUID (idempotent re-create revives a tombstoned row). API behavior is unchanged for existing clients; this is groundwork for the upcoming local-first app's two-way highlight sync.
The reader now talks to books and sync through BookSource/SyncBackend abstractions (Readium-style locators) instead of calling the BeePub API directly — zero behavior change, groundwork for local books and third-party OPDS/kosync sources on iOS.