Releases: internetarchive/openlibrary
Release list
deploy-2026-09-23-at-19-23
What's Changed
- Lint z-index in Lit component styles, warn on primitive tokens by @lokesh in #13628
- Build affiliate stores as one ordered list by @cdrini in #13641
- Drop ol-web1 from the deploy/restart server lists by @cdrini in #13662
- Round of design polish for web components by @lokesh in #13557
- refactor: replace the My Book Notes modal with ol-dialog by @MohitSAGAR11 in #13671
- fix(models): only save known user preference keys by @jabrailkhalil in #13598
- perf(nginx): reuse connections to haproxy by @mekarpeles in #13680
- refactor: Move the remaining jQuery UI confirmations onto ol-dialog by @lokesh in #13675
- feat(nginx): write the verify_human challenge log for the fail2ban jail by @mekarpeles in #13674
- Acquisitions in search.json: one OPDS2 field via the work-search scheme (#12844) by @openlibrary-bot in #13395
- Replace Wikipedia citation dialog with popover by @iamshravanijadhav in #13678
- refactor: replace the share modal with an ol-popover menu by @sh011 in #13677
- Add two new national library MARC sources by @hornc in #13697
- Bring the book page's controls onto the shared button system by @lokesh in #13640
- Search all three affiliate stores by title and author when there is no ISBN by @cdrini in #13661
- Prevent NPE in observations
DELETEhandler by @jimchamp in #13705 - Stop dropping author/subtitle/description from table_of_contents on read by @cdrini in #13692
- Remove
store_indexbackfill script by @jimchamp in #13700 - Exclude 0:Email, 1:FTP, 2:Telnet, 3:Dial-up as External links, and non- http strings from MARC 856 links by @hornc in #13696
- Surface Search Inside: filterable and in modal by @lokesh in #13429
- Auto-promote high-volume crawlers and API partners out of the
otherbucket by @mekarpeles in #13673 - Serve the coverstore from FastAPI by @cdrini in #13633
- Restrict the coverstore's internal routes to internal IPs by @cdrini in #13715
- fix(deploy): the
nginx -tgate was blind; test in a fresh container by @openlibrary-bot in #13702
New Contributors
- @MohitSAGAR11 made their first contribution in #13671
- @jabrailkhalil made their first contribution in #13598
- @iamshravanijadhav made their first contribution in #13678
- @sh011 made their first contribution in #13677
Full Changelog: deploy-2026-09-17-at-17-57...deploy-2026-09-23-at-19-23
deploy-2026-09-17-at-17-57
What's Changed
- Migrate JS build from webpack to Vite by @RayBB in #13331
- use rolldown options by @RayBB in #13592
- ol-shelf-actions by @lokesh in #13399
- refactor: convert footer templates to Jinja by @RsbhThakur in #13546
- Unify Vite builds behind scripts/vite/build.mjs by @RayBB in #13593
- fix(agentic): restore
id-token: write— pr_autoresponder.yml is an invalid workflow file by @lokesh in #13604 - refactor: convert ReadingGoalProgress partial to Jinja (#13567) by @Nehant14 in #13573
- feat(mockservices): support stateful lending lifecycle and availability variants by @Sadashii in #13548
- Convert CarouselCard partial to Jinja (#13570) by @Nehant14 in #13578
- Convert BookPageLists partial to Jinja by @gauranshahuja in #13576
- Unify header nav by @lokesh in #13508
- docs: Add Principles section to Design System Style Guide by @lokesh in #13599
- Convert LazyCarousel partial to Jinja by @gauranshahuja in #13590
- build(test): migrate JS unit tests from Jest to Vitest by @Nehant14 in #13596
- Migrate /api/unlink endpoint to FastAPI by @Sanket17052006 in #13589
- fix(agentic): drop Bash(gh api:*) from issue enrichment (#13160) by @mekarpeles in #13621
- Generalise DNB national bibliotek control number as identifiers for BnF and BNP by @hornc in #13622
- feat: Consolidate sidebar buy options into unified Buy button dropdown by @Sadashii in #13113
- Search result bookcover image space reservation by @lbartron in #13129
- Rename the Find in a library button to Nearby Libraries by @lokesh in #13639
- Shift 3 prod gunicorn workers from web to fast_web by @cdrini in #13638
- Migrate /status/add endpoint to FastAPI by @Sanket17052006 in #13626
- feat(fastapi): migrate remaining /status endpoints from web.py to FastAPI by @RsbhThakur in #13627
- Convert fulltext search suggestion templates to Jinja by @Srijan229 in #13616
- Show translator on the editions table by @Voyagerroc-Lab in #13649
- Make it possible to copy lists into local environment with copydocs by @cdrini in #13361
- refactor: convert body layout templates to Jinja by @RsbhThakur in #13595
- fix: part 4 #12432 — batch mybooks book lookups by @CipherZ3r0 in #13597
- fix: part 5 #12432 — batch mybooks notes lookups by @CipherZ3r0 in #13609
- refactor: pass request prefs explicitly (#13537) by @ElenaGe216 in #13608
- refactor: pass request params as args to is_spam and Recaptcha (#13538) by @csy20 in #13611
- Show prices and condition details in the Buy popover by @lokesh in #13643
- fix: Closing popover on books page causes the body scrollY to jitter temporarily to 0 by @lokesh in #13632
- Style the Buy button like the other sidebar buttons by @lokesh in #13642
- Set real browser floor (Safari 15.4); drop core-js by @lokesh in #13634
- Replace lodash with native JS by @lokesh in #13635
- Restore affiliate price lookup, disabling only the Amazon price fetch by @cdrini in #13637
New Contributors
- @lbartron made their first contribution in #13129
- @Srijan229 made their first contribution in #13616
- @Voyagerroc-Lab made their first contribution in #13649
- @ElenaGe216 made their first contribution in #13608
- @csy20 made their first contribution in #13611
Full Changelog: deploy-2026-09-09-at-18-43...deploy-2026-09-17-at-17-57
deploy-2026-09-09-at-18-43
What's Changed
- Add docker troubleshooting entry for npm ENOTEMPTY caused by macOS Docker VMM (beta) by @RayBB in #13530
- Fix template scan in worktrees without submodule metadata by @TheJhyeFactor in #13533
- Skip fetching a PR's head if its pinned commit is already available locally by @cdrini in #13532
- refactor: route site layout through Jinja (first step) (#13524) by @RsbhThakur in #13529
- fix(fastapi): set encrypted s3 auth cookie on login by @Sadashii in #13550
- refactor: pass request params as args to Author.get_books (#13539) by @LiamMagnier in #13540
- Add node exporter metrics to our prod cluster by @cdrini in #13551
- BookWorm: stop discarding acquisition/borrow links by @mekarpeles in #13561
- refactor: convert related subjects partial to Jinja by @hariomCodes in #13554
- refactor: convert SubjectPublishingHistory partial to Jinja (#13543) by @BinarySpecter in #13556
- Convert MyBooksDropperLists partial to Jinja by @gauranshahuja in #13563
- perf: batch edition lookups with get_many in openlibrary/plugins/opelibrary/api.py by @CipherZ3r0 in #13574
- chore(deps): update actions/deploy-pages action to v5 by @renovate[bot] in #13581
- chore(deps): update actions/cache action to v6 by @renovate[bot] in #13579
- Convert SearchFacets partial to Jinja by @gauranshahuja in #13577
- Add "Needs: Lead" label to PRs that have no discernible lead by @jimchamp in #13513
- perf: batch work lookups in bulk tagging by @CipherZ3r0 in #13583
- fix(agentic): run PR auto-responder on fork PRs via pull_request_target by @openlibrary-bot in #13262
- perf: batch readinglog work lookups by @CipherZ3r0 in #13584
- BookWorm feed harvest: cron runner + feed registration (#12844) by @mekarpeles in #13565
- deploy.sh: gate on
nginx -tafter olsystem deploy, add partial-deploy option by @mekarpeles in #13535 - Updates to
store_indexbackfill script by @jimchamp in #13521
New Contributors
- @TheJhyeFactor made their first contribution in #13533
- @LiamMagnier made their first contribution in #13540
- @hariomCodes made their first contribution in #13554
- @BinarySpecter made their first contribution in #13556
- @gauranshahuja made their first contribution in #13563
Full Changelog: deploy-2026-09-03-at-22-34...deploy-2026-09-09-at-18-43
deploy-2026-09-03-at-22-34
Highlights
- FastAPI now fronts testing.openlibrary.org — prod next
- Acquisitions harvester live: Gutenberg, BWB, Lenny feeds import with buy/open-access links
- Rating no longer bumps books off your shelf
- New site-wide drawer menu
6 new contributors 🎉
What's Changed
- e2e: cover logged-in state; fix rating-button contrast and login-page JS error by @lokesh in #13366
- Take author name sort out of beta by @cdrini in #13487
- Back up /opt/openlibrary to openlibrary_previous before deploy swap by @cdrini in #13486
- Restore the Preview button for preview-only books outside the book page by @lokesh in #13491
- feat: add audiences field to /type/work schema by @shoaib-inamdar in #13431
- fix: make /account/otp failures visible (real status codes + logging) by @mekarpeles in #13493
- Fix tar-index cache never hitting due to float shard key by @cdrini in #13506
- fix(css): style 'Add to List' button to match reading-log btn on orphaned editions and author pages #13421 by @Archita-kale in #13500
- Percent encode whitespace in
mailtohrefs by @jimchamp in #13197 - fix(ci): auto-assign reviewer on fork PRs via pull_request_target by @openlibrary-bot in #13210
- Update order of on-call personnel by @jimchamp in #13414
- feat: add ITAN Global Publishing catalog import script by @rattnak in #13413
- Update Spanish translation by @dcapillae in #13369
- Remove unused lending/borrow/waitinglist methods by @cdrini in #13396
- Log dev mockservices logins in as the seeded admin account by @RayBB in #13365
- Rating a book no longer moves it off Currently Reading or Stopped Reading by @lokesh in #13490
- Add script for backfilling
store_indexIDs by @jimchamp in #13483 - Only open the search modal on drop, not dragover, when dragging in text by @cdrini in #13496
- Report per-item success/failure when drag-and-drop moving works/editions by @cdrini in #13494
- fix(vue): resolve remaining component lint warnings (#13477) by @shenhui-ui in #13479
- Remove solr aggregate
textfield by @cdrini in #13401 - fix(eslint): promote 5 clean Vue lint rules to error (#13510) by @Nehant14 in #13512
- Remove stray pytest debug output by @josemmiranda04 in #13484
- Move generic_carousel() from templates to Python handlers by @Sanket17052006 in #13466
- ci: add zizmor ignore for auto_assign_reviewer trigger by @RayBB in #13509
- refactor: convert interstitial.html to Jinja2 (closes #13430) by @Priya-kumbhar in #13498
- Fix deployment name detection at startup by @kocaemre in #13515
- Feed Registry & Acquisitions — v1 (acquisitions in OL + bookworm service) (#12844) by @mekarpeles in #13241
- Make FastAPI the primary entry point on the testing deployment by @RayBB in #13516
- Fix HTML entities in search page title by @RayBB in #13446
- Show who started the last testing deploy on the /status page by @RayBB in #13472
- FastAPI: Move book lending preparation into Python by @lucaspmgomess in #13495
- ol-carousel: UX upgrades by @lokesh in #13478
- feat(core): read-only Matomo client + offline mock (groundwork for #11956) by @mekarpeles in #13252
- fix(docker): bump mockservices python base image to 3.14 by @Sadashii in #13527
- fix: validate profile website URLs by @w3lld1 in #13525
- Stop search result titles growing a scrollbar under Literata (font) by @lokesh in #13469
- Add OlDrawer component for hamburger menu by @lokesh in #12326
New Contributors
- @Archita-kale made their first contribution in #13500
- @shenhui-ui made their first contribution in #13479
- @Nehant14 made their first contribution in #13512
- @Priya-kumbhar made their first contribution in #13498
- @kocaemre made their first contribution in #13515
- @w3lld1 made their first contribution in #13525
Full Changelog: deploy-2026-08-27-at-20-40...deploy-2026-09-03-at-22-34
deploy-2026-08-27-at-20-40
What's Changed
- Delete 9 macros verified unused (no references in code, database, or production) by @RayBB in #13356
- ol-button: move to shadow DOM by @lokesh in #13350
- Delete 21 templates verified unused (no references in code, database, or production) by @RayBB in #13358
- Add FastAPI testing-environment status API (maintainer-gated) by @RayBB in #13278
- Add watch:components script to watch all Vue components in dev by @RayBB in #13368
- Fix docker compose up erroring from volume-population race conditions by @cdrini in #13362
- Seed dev environment with full /languages/* records from prod by @cdrini in #13354
- Add static-analysis test for unused templates and macros by @RayBB in #13360
- Make author works.json endpoint async end-to-end by @RayBB in #13373
- Unify the site's colors on one warm palette and remove the old color names by @lokesh in #13338
- Enhance FastAPI app metadata for better OpenAPI documentation by @RayBB in #13374
- Rebuild the /status Testing Environment panel as a live UI by @lokesh in #13311
- Remove deprecated web.py endpoints migrated to FastAPI by @Sanket17052006 in #13371
- fix: add FastAPI route alias for .json note POSTs to match legacy web… by @Sanket17052006 in #13382
- chore: remove remaining deprecated web.py endpoints migrated to FastAPI by @Sanket17052006 in #13383
- Remove script used to purge S3 keys by @jimchamp in #13372
- Fix search facets fallback when partial loading fails by @seanxuu in #13380
- Add unified icon system by @lokesh in #12955
- Continue Reading Phase 1: Merge 'Active Loans' with 'Loan History' on 'My Books' page by @Sadashii in #13281
- Add a parallel FastAPI /borrow endpoint alongside the legacy web.py one by @cdrini in #13389
- Fix on-call notification workflow by @jimchamp in #13375
- Fix: Move safe imports to top-level for PLC0415 compliance by @RayBB in #13393
- Cache httpx AsyncClient per event loop to avoid cross-loop reuse crashes by @cdrini in #13410
- Auto-regenerate solr_types.py via pre-commit instead of failing a unit test by @cdrini in #13417
- Use uvicorn --factory for fast_web — save ~100MB of RAM by @RayBB in #13404
- Fix pytest issues when running locally inside docker container of worktree by @cdrini in #13418
- refactor: fully remove swagger/openapi page by @Sanket17052006 in #13402
- Status panel: undelete PRs and auto-remove closed ones by @RayBB in #13376
- Remove unused template globals from helpers.py all (#13422) by @shariqueahmad108-ship-it in #13426
- Remove unused @public template-global registration (url_quote, get_borrow_status) (#13422) by @shariqueahmad108-ship-it in #13427
- pre-commit: Add zizmor security linter for GitHub Actions by @cclauss in #13411
- Remove unused i18n template globals by @lucaspmgomess in #13434
- Document the GitHub wiki's local clone in the AI coding guide by @RayBB in #13432
- Delete 68 legacy image files no longer referenced anywhere by @lokesh in #13329
- Update dependency concurrently to v10 by @renovate[bot] in #13441
- Reading-focused design for curated collections pages by @lokesh in #13259
- Remove unused template-global registrations in setup_template_globals by @SAY-5 in #13444
- Remove unused template globals by @lucaspmgomess in #13443
- Report graphite stats for every fail2ban jail, not just nginx-429 by @cdrini in #13440
- Wire facet droppers to context-aware counts (frontend for #12978) by @Armansiddiqui9 in #13064
- Renovate: automate GitHub Actions SHA pin updates by @RayBB in #13439
- Add FastAPI fallback proxy to web.py for local development and testing by @RayBB in #13423
- Fix: Replace deprecated asyncio.iscoroutinefunction with inspect by @asarakhatun17-lgtm in #13457
- fix(eslint): ignore the gitignored docs/wiki clone by @vaibhav8a in #13458
- fix(tests): stop stylelint CLI output leaking into jest runs by @vaibhav8a in #13459
- Run make lint through uvx and correct the AGENTS.md pre-commit note by @fahadhewad in #13461
- fix(components): replace deprecated >>> combinators with :deep() by @vaibhav8a in #13463
- fix(components): increase Vite chunk warning limit for Lit build by @CipherZ3r0 in #13470
- Update docs for FastAPI fallback proxy port swap (#13423) by @RayBB in #13471
- Hoist list availability lookups into Python handler by @lucaspmgomess in #13465
- Fix list grid view alignment by @CipherZ3r0 in #13385
- Move author search out of template rendering to author.GET (python handler) by @CipherZ3r0 in #13467
- Move blocking I/O from templates into Python handlers by @RayBB in #13387
- Move featured subjects fetching from templates to Python handlers by @CipherZ3r0 in #13468
- Fix Vue prop lint warnings by @josemmiranda04 in #13473
- Fix: Render Search Inside above Read button for open-access books (#13308) by @Sadashii in #13314
New Contributors
- @seanxuu made their first contribution in #13380
- @shariqueahmad108-ship-it made their first contribution in #13426
- @lucaspmgomess made their first contribution in #13434
- @SAY-5 made their first contribution in #13444
- @asarakhatun17-lgtm made their first contribution in #13457
- @vaibhav8a made their first contribution in #13458
- @fahadhewad made their first contribution in #13461
- @CipherZ3r0 made their first contribution in #13470
- @josemmiranda04 made their first contribution in #13473
Full Changelog: deploy-2026-08-18-at-16-12...deploy-2026-08-27-at-20-40
deploy-2026-08-18-at-16-12
TL;DR
Open Library — Aug 18, 2026
Browsing is faster. Subject pages load results immediately while filters catch up in the background.
Book carousels are smoother, with better mobile scrolling and improved accessibility.
Search is healthier. Monitoring graphs that were broken since our Solr upgrade are restored, giving the team visibility into search performance again.
Views are now shareable. Users can bookmark or share URLs that preserve their list vs. grid preference.
What's Changed
- Update astral-sh/setup-uv action to v8.3.2 by @renovate[bot] in #13304
- Document local-dev API and copydocs gotchas by @RayBB in #13307
- feat(vendors): make Amazon affiliate metadata fetch async by @RayBB in #13305
- Explain why undoing an author merge fails instead of returning a 500 (#5664) by @RayBB in #13306
- feat(a11y): wire @axe-core/playwright into the e2e suite by @lokesh in #13251
- fix: parse Solr 10 request logs (restores Solr Graphite metrics) by @mekarpeles in #13212
purge_s3_keys.pyscript updates by @jimchamp in #13302- feat(amazon): require Creators API, remove PA-API fallback from affiliate server by @openlibrary-bot in #13315
- Update Spanish translation by @dcapillae in #13320
- Only auto-run npm ci on LOCAL_DEV to speed up testing deploys by @cdrini in #13321
- fix(manifest): add explicit share_target enctype by @RayBB in #13323
- fix: popovers render underneath header by @lokesh in #13324
- feat(css): migrate CSS build from webpack to Vite by @RayBB in #13326
- Rebuild ol-carousel on native scroll snapping by @lokesh in #13220
- Mount ol-vendor volume in fast_web like other containers to avoid initialization errors by @cdrini in #13340
- Format solr haproxy config to use spaces consistently by @cdrini in #13348
- Accept Notated music monographs on import by @hornc in #13345
- ol-button: href links, ghost variant, icon/circle shapes, floating elevation by @lokesh in #13347
- Remove web.py endpoints served by FastAPI on production by @Sanket17052006 in #13317
- Remove dead bookadded flash message code by @RayBB in #13336
- Make expensive facet requests on subject page partials and async by @cdrini in #13334
- Sync layout URL param when toggling list/grid view by @Varadraj75 in #13337
- Switch from big OR clauses to solr terms queries for better performance by @cdrini in #12874
- fix: don't rewrite local-params fq (e.g. {!terms}) into editions query by @cdrini in #13353
- Regression: Fix lists/series edition-awareness by copying contextvars through async bridge by @cdrini in #12966
- Make local dev environment use ~650MB less memory by @cdrini in #13341
- chore: add removed endpoints to deprecated paths by @Sanket17052006 in #13363
- Remove stats and stats-header feature flags by @Sanket17052006 in #13364
- Make debug feature flag optional with LOCAL_DEV by @Sanket17052006 in #13293
New Contributors
- @Varadraj75 made their first contribution in #13337
Full Changelog: deploy-2026-08-11-at-17-16...deploy-2026-08-18-at-16-12
deploy-2026-08-11-at-17-16
What's Changed
- fix: keep catalog export links in a row below floated columns (author page) by @lokesh in #13219
- Fix #13202: render markdown links whose URL contains parentheses by @nancypatel12 in #13236
- Adding primitive support for likes #12768 by @shreya8040 in #12932
- fix(agentic): pin claude-code-action to last working SHA (enrichment + autoresponder silently no-op since 07-18) by @openlibrary-bot in #13229
- fix typos in test case name by @hornc in #13243
- Move the search results toolbar onto web components by @lokesh in #13228
- fix: track Book Preview and Search Inside events in Matomo by @Sadashii in #13254
- refactor: replace raw z-index values with semantic tokens by @Armansiddiqui9 in #13247
- Add SubjectSearch macro so the /subjects search field has an accessible label by @lokesh in #13250
- Fix login issues for recent registrants who have requested print disability access by @jimchamp in #13260
- Replace dev feature flag with LOCAL_DEV by @Sanket17052006 in #13123
- [pre-commit.ci] pre-commit autoupdate by @pre-commit-ci[bot] in #13249
- Update vendor/infogami digest to 7cb5b9e by @RayBB in #13266
- feat(a11y): add jest-axe CI gate for Lit component ARIA patterns by @mekarpeles in #13006
- Fix newly-enabled Ruff lint errors and sqlfluff PG01 by @RayBB in #13267
- fix(env): resolve get_ol_env() name collision causing 500 by @RayBB in #13268
- fix(js): resolve console errors on book, work, author, and search pages by @lokesh in #13257
- feat: add Bookdash import scraper by @rattnak in #13237
- Disable price fetching in AffiliateLinksPartial by @cdrini in #13271
- feat(pagination): add size property with small and medium variants by @lokesh in #13238
- Replace undo feature flag with explicit is_super_librarian() check by @Sanket17052006 in #13269
- Color tokens: warm neutral ramps, semantic layer, deprecated aliases by @lokesh in #13102
- Signal-ranked Notable Authors for subject pages by @Armansiddiqui9 in #13142
- Don't save empty identifiers by @hornc in #13149
- chore: remove lokesh from weekly status report leads by @lokesh in #13294
- fix(pre-commit): stop stylelint failing when every staged file is ignored by @lokesh in #13253
- Manually send data-ol-link-track to matomo by @cdrini in #13300
- feat(search): add GET /search/facets.json — context-aware facet values API by @mekarpeles in #12980
New Contributors
- @nancypatel12 made their first contribution in #13236
Full Changelog: deploy-2026-07-30-at-18-39...deploy-2026-08-11-at-17-16
deploy-2026-07-30-at-18-39
What's Changed
- fix(docker): guard PIP_INDEX_URL test against set -u nounset by @mekarpeles in #13200
- Web component segmented control by @lokesh in #12931
- Add genre reference property to /type/tag schema by @Chisomnwa in #13201
- i18n: keep messages.pot location comments on one line to prevent merge conflicts by @lokesh in #12903
- Persist comments when books are deleted by @jimchamp in #13223
- chore(ci): remove dead issue_refinement workflow (disabled, superseded by issue_enrichment) by @openlibrary-bot in #13216
- fix(ci): stop the daily digest labeling bot comments 'Needs: Response' by @openlibrary-bot in #13217
- fix(ci): make new_pr_labeler's canonical-repo guard actually guard by @openlibrary-bot in #13215
- fix: dropper AttributeError when redirect stub has no title by @TechGenius-Karan in #13188
- fix(templates): don't build edition_key="/books/None" when no edition is set by @openlibrary-bot in #13231
- feat: add statsd and matomo tracking for signup and activation funnel by @Sadashii in #13190
Full Changelog: deploy-2026-07-23-at-21-45...deploy-2026-07-30-at-18-39
deploy-2026-07-23-at-21-45
What's Changed
- Remove redundant recentchanges_v2 feature flag by @Sanket17052006 in #13094
- fix(search-modal): count NoResults per settled query, not per keystroke by @lokesh in #13114
- fix(a11y): add title attributes to iframes (WCAG 2.4.1 H64) by @mekarpeles in #13012
- fix(a11y): mark decorative star rating symbols aria-hidden (WCAG 1.4.3) by @mekarpeles in #13028
- fix(a11y): fix color contrast in OlToggle sublabel and nav-bar work-menu (WCAG 1.4.3) by @mekarpeles in #13027
- fix(a11y): add role=group to OlSelectPopover host (aria-prohibited-attr WCAG 4.1.2) by @mekarpeles in #13037
- fix(a11y): add aria-label to generic-dropper arrow button (link-name WCAG 2.4.4) by @mekarpeles in #13029
- fix(a11y): use --link-blue for secondary login button (contrast WCAG 1.4.3) by @mekarpeles in #13030
- feat: add progress bar to OlToast and improve alignment of OlToast and OlBanner by @Sadashii in #13082
- feat(agentic): Richy issue enrichment via claude-code-action by @mekarpeles in #13075
- feat(agentic): add workflow_dispatch for manually testing Richy by @openlibrary-bot in #13117
- feat(search-modal): add ResultsShown analytics event by @lokesh in #13115
- fix(a11y): add aria-label to ReadButton dropdown summary (WCAG 4.1.2) by @lokesh in #13116
- fix(agentic): correct stale label names, add checklist-resolution discipline by @openlibrary-bot in #13118
- Update environment of cron service by @jimchamp in #13111
- Remove redundant superfast feature flag by @Sanket17052006 in #13100
- Remove redundant lists feature flag by @Sanket17052006 in #13087
- Replace history_v2 feature flag with is_librarian_or_higher() check by @Sanket17052006 in #13121
- Remove leftover recentchanges_v2 feature flag from openlibrary.yml by @gaurav0107 in #13122
- Migrate hide banner to FastAPI by @Shikhar-395 in #13096
- feat: preview tracking before data for #12881 by @Sadashii in #13099
- fix(add_book): use _data.pop to strip infobase metadata from matched author by @TechGenius-Karan in #13032
- Copy cover_i key from Solr. Fixes #11563 by @tfmorris in #11696
- Warm nexus cache before parallel docker pull in deploy by @cdrini in #12976
- Fix null ASINs being saved during promise item import by @cdrini in #12834
- Fix 3,063 lists with subjects failing to index into solr by @cdrini in #12873
- Fix ratings microdata appearing thrice on book page, causing SEO errors by @cdrini in #12975
- Move expiry date info inside ReturnForm and update My Loans table layout by @Sadashii in #12912
- Add issue labeling exclusion for GitHub bot accounts by @jimchamp in #13139
- Update S3 key removal script by @jimchamp in #13127
- Fix: Added want to read button on trending page by @dvvrtmshra in #13120
- chore(search): remove dead search-mode localStorage plumbing by @lokesh in #13124
- Fix SIM103 lint error in issue_comment_bot.py by @lokesh in #13143
- Fix author date precision matching by @MakenRosa in #13128
- Add environment favicons and logo badges for localhost & testing by @lokesh in #13125
- Fix issue labeling logic by @jimchamp in #13145
- Remove unnecessary feature and test by @hornc in #13147
- fix(agentic): allow non-write actors to trigger issue enrichment by @mekarpeles in #13154
- fix(agentic): exclude openlibrary-bot from issue enrichment by @mekarpeles in #13166
- feat(agentic): PR auto-responder via claude-code-action by @mekarpeles in #13164
- feat(ci): add weekly on-call Slack notification workflow by @jimchamp in #13168
- feat(agentic): scaffold Code Review Action trigger (NOP) by @mekarpeles in #13167
- feat(dev): add mockservices — mocks IA/third-party services for local dev (replaces /internal/fake/* stubs) by @mekarpeles in #13045
- switch bookworm to use amz creators API by @mekarpeles in #13173
- Add usefulness score to solr + UI by @cdrini in #11724
- feat: show alternatives banner on unavailable book pages by @Sadashii in #12910
- fix(ci): pass Slack channel as a secret, not a with: input by @mekarpeles in #13175
- fix: resolve download record bar overflowing containers globally by @RsbhThakur in #13091
- Migrate qrcode endpoint to FastAPI by @Shikhar-395 in #13140
- Fix: Add FastAPI validation bounds and test suites for patron check-ins and yearly goals endpoints (#13150) by @RsbhThakur in #13156
- Migrate api/link endpoint to FastAPI by @Sanket17052006 in #13144
- fix(docker): route staging's runtime pip fallback through internal PyPI mirror by @mekarpeles in #13178
- feat: Make Preview / Search Inside more visible on books page by @Sadashii in #13112
- fix(docker): source build_env.sh from /olsystem + wire PIP_INDEX_URL as a build arg by @mekarpeles in #13180
- Update monitoring UA list by @cdrini in #13181
- Comment out broken Unique Visitors chart (#12823) by @Sadashii in #12831
- Add genres and subgenres fields to work type definition and schema by @Chisomnwa in #13151
- fix: resolve volumes multiget endpoint failing with .json extension by @RsbhThakur in #13093
- fix(add_book): fix walrus operator precedence bug in author dedup (#13015) by @addy790 in #13021
- feat(api): allow /api/unlink caller to specify op type (dark vs mismatch) by @mekarpeles in #13183
- chore(docker): parameterize hardcoded dev ports for parallel worktrees by @mekarpeles in #13185
- refactor: convert Follow.html macro to template with safe attribute interpolation by @TechGenius-Karan in #12985
- feat(identifiers): add ITAN Book ID identifier (itan_technologies) by @mekarpeles in #12947
- Fix: crash on /books/add check page that prevents selecting matches o… by @dvvrtmshra in #13085
- fix: safe attribute construction for data-ol-link-track in 4 templates by @mekarpeles in #13187
- Redirect DAISY pages to Archive item pages by @nathanpixodeo in #13049
- Use docker compose extra_hosts to work around ol-home0 issues by @cdrini in #13198
New Contributors
- @gaurav0107 made their first contribution in #13122
- @TechGenius-Karan made their first contribution in #13032
- @dvvrtmshra made their first contribution in #13120
- @MakenRosa made their first contribution in #13128
- @addy790 made their first contribution in #13021
- @nathanpixodeo made their first contribution in #13049
Full Changelog: https://github.c...
deploy-2026-07-02-at-19-32
What's Changed
- chore(tests): replace deprecated BeautifulSoup findAll with find_all by @RayBB in #13046
- Fix json encode potential XSS when in script tags by @cdrini in #13050
- fix(search-modal): drop "all" from See-all button when every hit is shown by @lokesh in #13048
- feat(proxy): route outbound requests through single authenticated http_proxy by @mekarpeles in #12724
- fix(proxy): restore 5 items dropped by bad rebase in #12724 by @openlibrary-bot in #13063
- fix: account for button height in read-more truncation threshold by @RsbhThakur in #13059
- feat(i18n): dispatch to openlibrary-i18n when messages.pot changes by @mekarpeles in #13069
- Migrate account anonymize endpoint to FastAPI by @Sanket17052006 in #13000
- chore(deps): update actions/checkout action to v7 by @renovate[bot] in #13054
- Migrate work editions and author works by @Shikhar-395 in #12965
- Migrate monthly logins to FastAPI by @Shikhar-395 in #13041
- fix: remove redundant merge-authors feature flag by @Sanket17052006 in #13040
- Standardize support to MediaWiki Grade A and drop older browser polyfills/etc by @lokesh in #12685
- Browse menu: redesign as a popover with featured destinations by @lokesh in #12917
- Migrate stats feature flags to pydantic-settings by @Sanket17052006 in #12984
- Fix
KeyErrorinpromise_batch_imports.pyscript by @jimchamp in #12835 - Remove redundant publishers feature flag by @Sanket17052006 in #13084
- Auto-run npm ci when JS dependencies change by @RayBB in #13080
- Add Lit web component by @lokesh in #13077
- test(e2e): add minimal Playwright smoke suite for core OL pages by @lokesh in #13072
- Write select participation scores to statsd by @jimchamp in #13073
- feat(search): author suggestion row above /search results by @lokesh in #13047
- fix(solr): replace hanging temp-Solr migration with fast-fail error message by @mekarpeles in #13002
- feat(api): add /type/tag to /api/new allowed types by @mekarpeles in #13088
- immediately 429 attacks, preempt ModSecurity by @mekarpeles in #13098
- Update xauthn
issue_keykey name by @jimchamp in #13086 - Remove redirect from account verification (to: preserve intent) by @mekarpeles in #13095
- fix(markdown): stop WYSIWYG hard breaks rendering as literal "
" by @lokesh in #13076
New Contributors
- @openlibrary-bot made their first contribution in #13063
- @RsbhThakur made their first contribution in #13059
Full Changelog: deploy-2026-06-25-at-19-06...deploy-2026-07-02-at-19-32