highlights
Smarter search in borrow: Model search results are now ranked by relevance, and an extended search helps users find what they need faster.
More accurate availability: Availability in borrow is no longer capped by the pool's item count when an entitlement group is entitled to more items (#2292). It also respects the configured time zone and model maintenance periods, and matches the legacy calculation. In legacy, the booking calendar now considers all of a user's groups.
French in inventory: The new inventory is now available in French (fr-CH), and the UI follows the user's active or the default language.
Email log in admin: Administrators can search and filter sent SMTP emails and open a detail page for each email.
Permission hardening: Password resets in admin require write scope, and inventory managers can no longer delete pools.
Legacy stability: Legacy now detects and heals poisoned database transactions instead of silently responding with success. The global search loads contracts and other result tabs on demand (#2280), and creating more than 20 items at once works again (#2279).
admin
- feat: add smtp email search, filter, and show page
- fix: forbid pool deletion by inventory managers
- fix: require write scope for password reset
borrow
- feat: rank model search, add extended search
- fix: add help link to mobile user menu
- fix: apply model maintenance period in availability
- fix: calendar segment for change on end date
- fix: don't cap entitled quantity by item count (#2292)
- fix: lift additional items limit to 1000
- fix: use settings time zone for availability today
- perf: booking calendar via shared fns, changes once
database
- fix: disallow blank inventory_code
- fix: entitlement_groups_groups group_id fk on delete cascade
- fix: license, missing location at quantity_allocation
deploy
- chore: add osv-scanner & dependency updates 2026/10
- feat: wire lending into ansible deploy pipeline
- fix: remove stale role default shadowing lending port
- fix: restore lending route in main.conf for cider
- fix: restore lending trailing-slash rewrite rule
- fix: skip lending build when not published
inventory
- feat: add french (fr-ch) translation
- fix: allow future dates in calendar by default
- fix: checkbox field labels
- fix: date filter: seed calendar with pre-selected value
- fix: license quantity_allocations location/room mapping
- fix: locale sync script, complete locales
- fix: localize date format
- fix: make width of save-button fixed
- fix: reject blank inventory_code, not 500
- fix: software, unify data-response ('' instead of null)
- fix: sort pools per db query, not in frontend
- fix: use active or default language in ui
legacy
- fix: booking calendar ignores multiple user groups
- fix: create multiple items >20 (qs arraylimit) (#2279)
- fix: manage global search loads result tabs on demand (#2280)
- fix: middleware detects poisoned tx, avoids silent 200 (#946)
- fix: new-inventory button overlapping expanded search field
- fix: transactionhealing concern for tx poisoning (#946)
procure
- fix: build: remove stale classes, shared-clj build cache fix
zhdk-inventory
- chore: make publish_lending false explicit in zhdk
- feat: enable lending on dev and test