Skip to content

Readest 0.12.20

Latest

Choose a tag to compare

@chrox chrox released this 05 Nov 22:40
· 5 commits to main since this release
28aab23

Release Highlights

  • Vocabulary: You can now build a vocabulary list, mark words as Learning or Mastered for Word Lens hints, and sync with Anki
  • Statistics: Added a reading statistics dashboard so you can see your reading habits at a glance
  • Reading: Added Page Flip and paper curl page turns, a page preview while dragging the progress slider, a straight-line reading ruler, and keyboard-only text selection
  • Styling: You can now ignore publisher fonts, make white image backgrounds transparent, and adjust dialogue highlighting
  • Text-to-Speech: You can now preview voices, pick a default voice per language, and sync downloaded read-aloud audio across devices
  • Library: You can now import pasted text and Word or RTF files, share collections as bundles, search for covers in the app
  • Sync: Added Grimmory, Obsidian, and CrossPoint 2.0 highlight sync, a new view of where your reading data goes, and a switch for servers with self-signed certificates
  • Dictionary: You can now resize the dictionary popup, customize AI context lookups, edit word hints, and choose your lookup app on Android
  • PDF: Text is now sharper, especially on iOS and Android, with smoother pinch zoom, panning, and gapless horizontal scrolling
  • More: The KOReader plugin can sign in with a QR code, iPhone Duo gets book mode on its inner display, and stylus annotation and sync are more reliable

What's Changed

Click to expand
  • feat(library): show the full book or group title on hover by @chrox in #6785
  • fix(reader): keep the footer bar off the horizontal scrollbar when zoomed by @chrox in #6786
  • fix(sync): keep imported annotations through the next sync (#6762) by @chrox in #6787
  • fix(reader): release closed reader views from the cached book document, closes #6710 by @chrox in #6788
  • fix(tts): skip bare superscript note markers when reading aloud by @chrox in #6791
  • chore(agent): maintenance loops with a Reply Desk, lessons and acceptance rules by @chrox in #6796
  • fix(reader): let the battery percentage follow a custom footer text color by @chrox in #6798
  • fix(layout): clip nowrapped lines along the line only, keeping footnote icons whole by @chrox in #6801
  • fix(sync): push a highlight made right after a notes sync by @chrox in #6802
  • chore: declare tsx for the worktree scripts and clean up merged worktrees in the triage loop by @chrox in #6807
  • chore(deps): bump the github-actions group with 8 updates by @dependabot[bot] in #6812
  • fix(deps): resolve open Dependabot alerts by @chrox in #6813
  • fix(reader): highlight long and nested quoted dialogue by @chrox in #6814
  • fix(layout): keep the indent on paragraphs with a footnote icon by @chrox in #6828
  • fix(android): tighten the e-ink device identity whitelist by @k6G52m4Dz75W in #6833
  • fix(i18n): improve Turkish translations and add missing keys by @AlBPanda in #6830
  • fix(android): force light native chrome on e-ink devices by @k6G52m4Dz75W in #6799
  • fix(bookshelves): list filter values only from books still in the library by @jadhavgaurav in #6835
  • ci: guard the e-ink identity whitelist against Rust/Kotlin drift by @k6G52m4Dz75W in #6834
  • fix(reader): leave a footnote marker out of a double-click or long-press word by @chrox in #6808
  • fix(annotator): run quick actions on a selection made in the footnote popup by @chrox in #6809
  • fix(koplugin): give the Readest Library menu KOReader's UI for CoverBrowser by @chrox in #6845
  • fix(annotations): import ReadEra backups that split documents across docs_N.json by @chrox in #6846
  • fix(tts): hold the view still while a note is being typed during Read Aloud by @chrox in #6849
  • fix(tts): keep the sentence being read across the paragraph look-ahead by @chrox in #6860
  • fix(reader): open external links with their query string by @chrox in #6861
  • fix(reader): follow a link inside a table instead of zooming the table by @chrox in #6862
  • fix(reader): don't make a table that fits scroll because of a link at its edge by @chrox in #6882
  • fix(annotator): look up the next word in the footnote popup on desktop by @chrox in #6886
  • fix(md): render $ and $$ math in Markdown books by @chrox in #6887
  • fix(reader): break the page for page breaks in inline styles by @chrox in #6888
  • fix(reader): keep book colors that only start like #000 by @chrox in #6883
  • fix(reader): let a book's own hover style underline its links by @chrox in #6884
  • fix(reader): show the toolbar on a center tap in a scrolled comic by @chrox in #6885
  • fix(tts): keep a note's focus when a navigation ends during Read Aloud by @chrox in #6889
  • fix(desktop): drag the window from an unfocused title-bar search field by @chrox in #6893
  • fix(epub): bound native zip entry reads during import by @chrox in #6817
  • fix(api): validate DeepL and AI gateway request limits by @chrox in #6818
  • chore(agent): lessons from 2026-10-14 to 10-15 by @chrox in #6842
  • fix(reader): normalize section media types before sanitizing by @chrox in #6819
  • fix(library): park a finished book as unread when an updated build is re-keyed by @k6G52m4Dz75W in #6871
  • fix(reader): keep the chosen sidebar tab while Read Aloud plays by @chrox in #6847
  • fix(reader): sanitize book markup rendered in the app window by @chrox in #6815
  • fix(reader): don't fail opening a book whose section is still loading by @chrox in #6903
  • fix(kosync): send and read FB2 positions in crengine's FictionBook form by @chrox in #6905
  • feat(sync): per-server switch for self-signed certificates by @chrox in #6822
  • refactor(sync): share the note merge rule between Readest Cloud and file sync by @chrox in #6843
  • fix(sync): verify a redirect off a self-signed server's origin by @chrox in #6931
  • fix(tts): support Xiaomi MiMo chat-completions speech synthesis by @izengyx in #6863
  • fix(tts): accept a pasted speech endpoint as a custom TTS base URL by @chrox in #6906
  • fix(reader): drive the percent readout from the continuous reading fraction by @k6G52m4Dz75W in #6876
  • fix(nix): stabilize the dev shell and share Linux runtime dependencies by @Kasifrasi in #6851
  • fix(storage): check the quota after reserving the row and keep clients off files writes by @chrox in #6820
  • fix(translate): keep long sentences whole for Yandex and retry rate-limited chunks by @Columpio in #6919
  • fix(reader): limit pdf zoom in preview to MAX_ZOOM_LEVEL by @jelly-afk in #6904
  • fix(tts): prepare the next paragraphs' first sentence while one plays by @smist37 in #6910
  • fix(eink): master scrim switch for capture-blocking overlays by @k6G52m4Dz75W in #6922
  • fix(proxy): normalize hostnames and validate resolved addresses by @chrox in #6821
  • fix(opds): drop decoded-body headers from proxied error responses by @chrox in #6942
  • fix(opds): vary cached proxy feeds on the Authorization header by @chrox in #6946
  • fix(metadata): reject impossible publication dates by @kelvinalfaro in #6937
  • fix(reader): pinch a PDF spread without jumping sideways on release by @chrox in #6943
  • fix(reader): show the every-occurrence toggle's state on e-ink by @chrox in #6948
  • fix(hardcover): preserve legacy mappings when migration writes fail by @kelvinalfaro in #6938
  • fix(reader): keep word-final apostrophes inside single-quoted dialogue by @chrox in #6950
  • fix(reader): detect the language of Markdown and HTML books with none declared by @chrox in #6952
  • fix(reader): keep the bars hidden when the window gives focus back by @chrox in #6954
  • fix(tts): read PDF words across line breaks, and hyphenated words whole by @chrox in #6955
  • fix(sync): say when the device clock keeps changes from syncing by @chrox in #6956
  • fix(kosync): send and read MOBI positions in crengine's HTML form by @chrox in #6951
  • fix(translate): leave ruby readings out of the text sent to the translator by @chrox in #6953
  • fix(pdf): keep PDF text sharp at fractional display scales by @chrox in #6949
  • fix(reader): keep word-final apostrophes before a dash inside single-quoted dialogue by @chrox in #6957
  • fix(tts): read a PDF aloud in the language of its page by @Armone0 in #6944
  • fix(reader): dismiss the selection toolbar on a click beside the text by @chrox in #6961
  • fix(reader): keep the mouse Back button in the book when it's released off the page by @chrox in #6963
  • fix(pdf): don't select text while a drag pans the page by @chrox in #6962
  • fix(reader): add touch-accessible web fullscreen by @kelvinalfaro in #6964
  • fix(reader): use the correct form of 2 in Chinese footer numbers by @RaphaelFakhri in #6966
  • fix(reader): pinch a PDF spread with one finger on each page by @chrox in #6968
  • fix(reader): keep the tabular-nums utility effective below Chromium 119 by @k6G52m4Dz75W in #6970
  • fix(reader): give the remaining-info readout tabular-nums like its siblings by @k6G52m4Dz75W in #6971
  • fix(android): keep the reading position when the screen wakes by @chrox in #6972
  • fix(library): wrap the select-mode action bar instead of clipping it by @chrox in #6973
  • fix(library): keep the title bar draggable in select mode by @chrox in #6978
  • fix(reader): turn a fixed-layout page by a drag across the page, not the cell by @chrox in #6983
  • chore(deps): bump the github-actions group with 6 updates by @dependabot[bot] in #6981
  • fix(ios): play narration and TTS through the native player on iPad by @chrox in #6979
  • fix(reader): hide the bars when the pointer crosses their edge strip into the book by @chrox in #7005
  • feat(library): add .rbooks collection bundle export and import by @Armone0 in #6945
  • fix(reader): show selection toolbar after off-text mouse release by @kelvinalfaro in #6988
  • fix(import): name the files a mixed drag-drop skips by @k6G52m4Dz75W in #6991
  • fix(reader): dismiss footnote popup in Paragraph mode by @kelvinalfaro in #6996
  • fix(reader): keep Russian prepositions with quoted words by @kelvinalfaro in #6998
  • chore(deps): bump webpki chain for the emSign/eMudhra intermediate CA distrust by @k6G52m4Dz75W in #7002
  • fix(tts): play stored narration audio in place instead of copying it by @chrox in #7004
  • fix(deps): resolve open Dependabot alerts by @chrox in #7007
  • fix(import): map a ZIP with no book inside to "format not supported" by @kelvinalfaro in #6997
  • chore(deps): bump the dompurify override floor to 3.4.17 by @k6G52m4Dz75W in #7003
  • fix(android): play stored narration audio in place from the book file by @chrox in #7010
  • fix(handwriting): keep undo history and new strokes when a drawing syncs by @chrox in #7014
  • fix(pdf): keep a pan going past the page edge and turning at the end by @chrox in #7012
  • feat(stats): add reading statistics dashboard by @realdanvanth in #6986
  • fix(docker): bump node base image to 24.22.1 for the 2026-10 Node security releases by @k6G52m4Dz75W in #7016
  • fix(reader): keep the header with the pointer on the top edge of a maximized window by @chrox in #7017
  • fix(ios): play stored narration audio in place from the book file by @chrox in #7019
  • fix(koplugin): connect over IPv4 in forked sync workers on macOS by @chrox in #7021
  • Import pasted text into the library by @kelvinalfaro in #6992
  • feat(notion): colour highlight quotes and send notes as callouts by @chrox in #7029
  • fix(rsvp): keep Bengali vowel signs and conjuncts with the focus letter by @chrox in #7028
  • fix(handwriting): re-measure the page after a push page turn by @chrox in #7030
  • fix(deps): bump next to 16.4.2 for the open Dependabot alerts by @chrox in #7032
  • fix(annotator,notion): keep a highlight's colour on Annotate; Notion note template; working sync links by @chrox in #7031
  • fix(reader): fit cover image to page in paginated mode and preserve aspect ratio by @Armone0 in #7027
  • ci(android-e2e): retry the emulator system image install by @chrox in #7036
  • Add native Android paper curl and stabilize page turns by @sadikh94 in #7001
  • fix(audiobook): stream paired local audio through the media proxy on desktop (#6848) by @chrox in #7037
  • feat(ios): turn pages with the native paper curl by @chrox in #7046
  • fix(tts): resume a mid-sentence pause in place from media keys by @chrox in #7069
  • feat(tts): keep the chosen sleep timer for the rest of the app launch by @chrox in #7070
  • fix(sync): keep a position read just before closing the book by @chrox in #7071
  • fix(layout): keep a percentage-width image next to text at its size by @chrox in #7072
  • feat(library): accept docx and rtf imports via silent EPUB conversion by @k6G52m4Dz75W in #7050
  • fix(reader): jump to a typed page when the field loses focus by @chrox in #7080
  • fix(storage): delete a book file uploaded under its hash name by @chrox in #7063
  • feat(library): Manage Cache on desktop by @chrox in #7066
  • fix(build): turn off the Turbopack build cache that Next 16.4 enables by @chrox in #7082
  • fix(dictionaries): create the database folder before opening it by @chrox in #7076
  • fix(tts): step back into the previous page at its last sentence by @chrox in #7077
  • fix(library): sort a subgroup by its own name inside a parent group by @chrox in #7081
  • fix(annotator): keep a dragged selection handle on its line by @Armone0 in #7053
  • fix(tts): open the Workers Edge TTS socket over cloudflare:sockets by @smist37 in #7056
  • fix(library): open a .zip of images as a comic by @chrox in #7078
  • feat(reader): calibrate the page-number readout with real screen counts by @k6G52m4Dz75W in #7060
  • fix(reader): keep native curl pages when a turn redraws unchanged highlights by @chrox in #7112
  • feat(reader): preview the page under the progress slider while dragging by @chrox in #7110
  • fix(handwriting): keep the pen fine on wide desktop pages by @chrox in #7109
  • fix(reader): keep the screen awake after the window is refocused on Linux by @chrox in #7108
  • fix(novel): recognize 第N頁 and traditional chapter units in chapter titles by @chrox in #7107
  • fix(reader): keep a note's own styling in the footnote popup by @chrox in #7111
  • fix(reader): compare curl overlay markup in paint order and check new overlays by @chrox in #7114
  • fix(reader): keep native curl pages when progress sync starts by @chrox in #7115
  • fix(library): retry a synced cover whose download failed by @chrox in #7116
  • fix(reader): never open the media viewer for note-reference markers or chapter-length tables by @doublex640 in #7083
  • fix(build): make pnpm preview serve pages and rewrites again by @chrox in #7141
  • fix(reader): stamp sections loaded after a theme switch with the live theme by @chrox in #7121
  • fix(reader): show the page's own rendering in the image viewer by @doublex640 in #7096
  • fix(reader): give volume keys back when Use Volume Keys is turned off by @chrox in #7140
  • ci: pin the Playwright jobs to ubuntu-24.04 by @chrox in #7151
  • chore(deps): bump the github-actions group with 7 updates by @dependabot[bot] in #7149
  • feat(reader): Page Flip page-turn style on Android, iOS and desktop by @chrox in #7160
  • fix(crosspoint): link a reader's copy to an Audiobookshelf ebook (#7086) by @ts-eva in #7087
  • test(reader): unmount each image-gallery test's viewer by @chrox in #7163
  • fix(kosync): sync an Audiobookshelf ebook under its file's id (#7088) by @chrox in #7161
  • fix(hardcover): reuse journal entries already on Hardcover instead of duplicating them by @chrox in #7162
  • fix(hardcover): sign in through Readest's own Hardcover OAuth app by @chrox in #7165
  • fix(reader): stop translation DOM work after the hook unmounts by @chrox in #7167
  • feat(library): page count badge on covers as a per-bookshelf option (#6909) by @Armone0 in #7142
  • feat(ios): book mode on iPhone Duo's inner display by @wemcdonald in #7137
  • feat(tts): let custom TTS services set their audio format and voices by @sunnymodi21 in #7155
  • fix(annotations): save exports to storage on Android and clear the bottom inset by @chrox in #7169
  • fix(ios): keep the orientation lock when the scene is resizable by @wemcdonald in #7146
  • fix(tts): upload existing downloaded packs when sync is on, skip listening cache by @chrox in #7176
  • fix(nix): add missing build/runtime dependency by @dastarruer in #7170
  • fix(kosync): read xpointers with explicit [1] steps from newer crengine by @bercedev in #7172
  • test(kosync): check both xpointer forms against crengine at two DOM versions by @chrox in #7178
  • feat(reader): swipe past a zoomed PDF page's edge to turn, like Photos by @sunnymodi21 in #7175
  • fix(sync): stop opening a "Sync failed" dialog for file-sync errors by @chrox in #7183
  • fix(ui): stop the plan cards clipping on iOS 16, closes #7181 by @chrox in #7184
  • fix(tts): stop caching, packing and syncing the same sentence twice by @chrox in #7187
  • fix(desktop): reopen the in-app browser window at its last size and position by @NeilN1 in #7185
  • fix(tts): give up on a silent Edge connection after 30s on every transport by @chrox in #7188
  • feat(sync): sync downloaded read-aloud audio through Readest Cloud and every file-sync backend by @chrox in #7177
  • fix(android): keep the page-turn cover below the keyboard, closes #7171 by @chrox in #7191
  • feat(sync): record each book's synced read-aloud packs in its config by @chrox in #7190
  • feat(koplugin): sign in with a QR code; fix the logged-out label and global logout (#7186) by @chrox in #7192
  • fix(sync): list every page of a book's cloud files for synced data by @chrox in #7199
  • fix(reader): disable separate cover in scroll layouts by @kelvinalfaro in #7195
  • fix(reader): hide dismissed footer immediately by @kelvinalfaro in #7197
  • fix(reader): keep the screen awake while speed reading plays by @chrox in #7200
  • fix(reader): wrap long text in scroll mode by @kelvinalfaro in #7196
  • ci: run the web browser tests in their own job by @chrox in #7202
  • chore(agent): update agent memories by @chrox in #7203
  • fix(android): continue recorded narration while screen locked by @kelvinalfaro in #7194
  • feat(settings): search the font lists in Font settings by @chrox in #7204
  • fix(library): keep two FB2 documents that share a title and author (#7150) by @chrox in #7205
  • fix(tts): keep the page when Read Aloud reads text the book hides by @chrox in #7207
  • feat(reader): improve stylus annotations and finger navigation by @chrox in #7213
  • fix(koplugin): wait for Wi-Fi before pulling on wake by @chrox in #7215
  • feat(reader): choose tap or long press to open the image viewer per book by @chrox in #7208
  • fix(library): add stable colored placeholder covers by @chrox in #7222
  • fix(opds): allow trusted private catalogs at runtime by @chrox in #7225
  • fix(tts): start Storyteller narration at the current text by @chrox in #7223
  • fix(windows): make Explorer thumbnails opt-in by @chrox in #7220
  • fix(android): open linked images on touch hold by @chrox in #7221
  • fix(tts): publish downloaded audio records without a page turn by @chrox in #7224
  • fix(opds): match equivalent trusted IPv6 literals by @chrox in #7226
  • fix(reader): navigate paragraphs with volume buttons by @chrox in #7227
  • fix(reader): allow gapless horizontal PDF scrolling by @chrox in #7232
  • fix(tts): keep skipped utterances from aborting replacement speech by @chrox in #7233
  • fix(tts): show a custom TTS voice's listed name instead of its id by @onedge in #7229
  • test(novel): make failed image placeholders deterministic by @chrox in #7236
  • fix(sync): ignore stale duplicate reading positions by @chrox in #7231
  • fix(reader): highlight continued multi-paragraph dialogue by @chrox in #7238
  • test: use four workers for unit tests by @chrox in #7242
  • fix(tts): play local AAC narration natively on Linux by @chrox in #7240
  • fix(ios): capture readable shared pages when loading stalls by @chrox in #7241
  • feat(dictionary): customize context prompts and response limits by @chrox in #7244
  • fix(security): remediate Dependabot dependency alerts by @chrox in #7248
  • fix(library): preserve original filenames and use PDF filename titles by @chrox in #7237
  • fix(reader): release volume keys while reader controls are open by @chrox in #7254
  • fix(reader): highlight long punctuated single-quoted dialogue by @chrox in #7255
  • feat(reader): add dialogue highlighting weight options by @chrox in #7256
  • feat(kosync): support original filename checksums by @chrox in #7253
  • feat(library): add searchable history dropdown by @chrox in #7261
  • fix(account): require explicit confirmation before deleting account by @chrox in #7258
  • fix(ios): decode imported file URL basenames once by @chrox in #7263
  • test(reader): handle cancelled paginator previews in browser tests by @chrox in #7267
  • feat(ios): add fullscreen system dictionary setting by @chrox in #7269
  • fix(library): ignore leading English articles in title sorting by @chrox in #7271
  • feat(reader): make white image backgrounds transparent by @chrox in #7270
  • feat(reader): show background textures in footnote popups by @chrox in #7268
  • feat(android): choose the system dictionary lookup app (#4937) by @chrox in #7272
  • perf(web): run the web Worker near Supabase with Smart Placement by @chrox in #7273
  • perf(api): stop hot sync routes loading the TTS engine and DOMPurify by @chrox in #7274
  • feat(translator): add a Thinking setting to custom LLM translators, fix translator field sync by @chrox in #7275
  • fix(sync): sign bucket-root listings with a trailing slash by @gilgamesh-tkh in #7278
  • fix(dictionary): stream context dictionary responses by @chrox in #7285
  • fix(sync): support provider downloads and generic transfer history by @chrox in #7289
  • feat(reader): add a straight-line reading ruler by @chrox in #7288
  • feat(vocabulary): vocabulary builder and Learning/Mastered marks for Word Lens by @chrox in #7284
  • feat(metadata): search for book covers in app by @chrox in #7290
  • fix(koplugin): collect sync workers before KOReader exits by @chrox in #7293
  • fix(reader): keep the sidebar button top-left on tablets, tidy the transparent-image row by @chrox in #7294
  • chore(agent): update memories by @chrox in #7295
  • fix(bookorbit): let the web proxy run on Cloudflare Workers by @chrox in #7296
  • feat(reader): vim-style find to start and extend a selection from the keyboard by @you-gao in #7282
  • fix(library): refresh external sources without a Readest login by @chrox in #7297
  • fix(reader): use platform-specific spread defaults by @chrox in #7299
  • perf(reader): subscribe the vim command line to the store fields it uses by @chrox in #7301
  • feat(reader): ignore publisher font names by font category by @chrox in #7298
  • fix(reader): draw PDF text at the screen's full resolution on iOS and Android by @chrox in #7300
  • fix(reader): preserve publisher font lists and category fallbacks by @chrox in #7302
  • fix(bookdrop): keep received file names inside the inbox by @chrox in #7304
  • fix(auth): keep the sign-in callback URL out of logs by @chrox in #7305
  • fix(annotator): line the note card up with its popup box by @chrox in #7310
  • feat(annotator): draw a global annotation's copies as a dashed underline by @chrox in #7309
  • fix(send): allow PATCH through CORS so the apps can approve a sender by @chrox in #7312
  • fix(sync): sync a re-enabled or cleared custom TTS field to other devices by @BEMELON in #7307
  • feat(tts): read aloud with Speech Dispatcher voices on Linux by @chrox in #7314
  • feat(vocabulary): redesign the mobile header by @chrox in #7315
  • feat(crosspoint): sync CrossPoint 2.0 clippings with Readest highlights by @chrox in #7317
  • fix(annotator): clear a moved highlight's old anchors on the server too by @chrox in #7319
  • fix(sync): give HTML chapter files their own sync identity by @chrox in #7321
  • fix(reader): reach the last page when a book ends partway into a spread by @chrox in #7320
  • feat(tts): preview voices and pick a default voice per language by @chrox in #7322
  • feat(library): remove selected books from the device only by @chrox in #7324
  • fix(sync): stop idle notes pushes and keep what a push leaves out by @chrox in #7326
  • chore(deps): bump actions-rust-lang/setup-rust-toolchain from 2.0.0 to 2.0.1 in the github-actions group by @dependabot[bot] in #7331
  • fix(kosync): follow a percentage-only position on PDFs and push 1-based pages by @chrox in #7334
  • feat(vocabulary): sync with Anki on Android by @chrox in #7328
  • feat(reader): vim-style find selects text in PDFs too by @chrox in #7333
  • ci(codeql): use advanced setup and skip Rust analysis on PRs without Rust changes by @chrox in #7335
  • fix(reader): shrink default list indent under Override Book Layout by @chrox in #7338
  • chore(tts): shorten Readest Voice download windows to 16 sentences or 512 chars by @chrox in #7339
  • fix(wordlens): hint a word that ends where an inline element starts or ends by @chrox in #7340
  • feat(sync): add a Grimmory integration (#7337) by @chrox in #7341
  • fix(tts): preview voices at the player's speed by @chrox in #7345
  • fix(reader): keep native curl pages in step with the toolbars and panels by @chrox in #7343
  • feat(reader): move menu options to Settings and add Vocabulary to the view menu by @chrox in #7348
  • fix(sync): match books for Grimmory stats alone, and undo a failed connect by @chrox in #7347
  • fix(tts): play Media Overlay clips whose text target is an image by @chrox in #7352
  • feat(dictionary): resize the dictionary popup from a corner grip (#7344) by @chrox in #7354
  • feat(integrations): sync highlights into an Obsidian vault on desktop and Android by @chrox in #7349
  • fix(wordlens): hint Learning phrases of two or more words by @chrox in #7350
  • fix(auth): send password sign-in through a Worker on readest.com by @chrox in #7355
  • fix(dictionary): give the popup's resize grip a 32px hit area by @chrox in #7357
  • test(dictionary): drag the resize grip from a hit-tested point outside the popup by @chrox in #7359
  • feat(dictionary): edit a Learning word's hint in the dictionary popup by @chrox in #7356
  • fix(wordlens): match phrases on token edges, retry after a rejected match by @chrox in #7358
  • fix: reader search, e-ink paging, cache and koplugin delete from user reports by @chrox in #7360
  • fix(reader): apply Open Images to every book and to tables by @chrox in #7363
  • chore(agent): update agent memories by @chrox in #7365
  • feat(integrations): show where reading data flows and what is working by @chrox in #7366
  • fix(tts): stream staged narration audio so a long chapter can't kill the app on Android by @chrox in #7367
  • release: version 0.12.20 by @chrox in #7368

New Contributors

Full Changelog: v0.12.16...v0.12.20