🚀 Shelf 2.1.0
This release builds on the Quantitative Assets foundation introduced in 2.0 with new inventory management capabilities, enterprise provisioning, improved personalization, and major Companion app enhancements. It also includes a large number of reliability, performance, and security improvements across the platform.
🌟 Highlights
📦 Smarter Quantity
Take even greater control over quantity-tracked assets with new inventory management capabilities.
Highlights include:
- Low-stock alerting
- Improved quantity locking to prevent race conditions
- Quantity audit trail
- Unified quantity-tracked availability across bookings and assets
📱 Companion App
The Companion app continues to evolve with several major improvements:
- Native claim, link or create workflows for unclaimed QR codes
- OTA (Over-the-Air) updates for JavaScript-only fixes
- Improved booking picker with pagination
- Numerous booking workflow improvements and bug fixes
🔐 Enterprise
Enterprise deployments now support SCIM provisioning, making automated user lifecycle management significantly easier.
📅 User Preferences
Users can now choose their preferred date and time formatting, allowing Shelf to match regional and personal preferences.
🚀 Features
- feat(companion): paginate the whole booking picker so no asset is unreachable by @carlosvirreira in #2729
- Add SCIM endpoint by @Mr-Technician in #2333
- feat(companion): native claim + link/create for unclaimed QR codes by @carlosvirreira in #2753
- feat(companion): enable EAS Update (OTA) for JS-only fixes by @carlosvirreira in #2740
- feat(bookings,assets): unify quantity-tracked availability + fix over-reservation dead-ends by @DonKoko in #2770
- feat(settings): user-level date & time formatting by @carlosvirreira in #2654
- feat: @shelf/quantity-control package + QT low-stock alerting, audit trail & lock hardening by @DonKoko in #2780
🐛 Fixes
- fix(bookings): guard mobile fulfil-and-checkout against cross-user checkout by @carlosvirreira in #2718
- fix: stop reminders revalidation storm + booking-settings pool exhaustion by @DonKoko in #2722
- fix: pg-boss error handler + healthcheck busy≠dead (deploy resilience) by @DonKoko in #2723
- fix(mobile): booking asset picker silently capped at 20 assets by @carlosvirreira in #2726
- fix(mobile): apply web's draft-booking privacy rule to the mobile endpoints by @carlosvirreira in #2727
- fix(companion): count fulfil progress against reservations, not scans by @carlosvirreira in #2730
- fix(companion): stop the scanner overlay reflowing when a drawer opens by @carlosvirreira in #2731
- fix(audit): kit-scan crash + Not found screen + capture error-screen 4xx + 404-shape eslint rule by @DonKoko in #2732
- fix: reminder-job reliability — Prisma transient-retry (ex-P2024), worker rethrow/retry, email at-least-once by @DonKoko in #2733
- fix(sentry): filter unactionable client noise and skip expected 4xx boundary captures by @DonKoko in #2742
- fix(assets): show friendly 400 when over-allocating a quantity-tracked asset by @DonKoko in #2745
- fix(auth): make createUser idempotent and cap passwords at 72 chars by @DonKoko in #2746
- fix(working-hours): race-safe first-access create + retry-wiring regression guard by @DonKoko in #2751
- fix(kits): cascade kit location changes to member assets by @DonKoko in #2752
- fix(location): return a friendly 400 when an individual asset is already placed by @DonKoko in #2772
- fix: three production Sentry 500s (advanced-filter select-all, import clear, booking kit-add) by @DonKoko in #2773
- fix(bookings): let an in-flight booking check out assets a later reservation holds by @DonKoko in #2775
- fix(booking): make booking picker search return renderable rows by @carlosvirreira in #2778
- fix(workspace): reload the document on workspace switch so the sidebar can't go stale by @carlosvirreira in #2787
- fix(quantity-control): ship as raw src so the Docker deps stage can install by @DonKoko in #2793
- fix(date-format): release-review follow-ups (#2654 follow-up) by @DonKoko in #2791
- fix(booking): remove assets and kits together in one bulk action by @DonKoko in #2794
- fix(notes): harden Markdoc note rendering and sanitize user-supplied values by @DonKoko in #2795
⚡ Performance
🔧 Refactors
- refactor(auth): remove redundant signOut on password change; fix comments by @DonKoko in #2719
- refactor(audit): split AuditDrawer to clear no-giant-component + collapse dup export by @DonKoko in #2741
🧹 Chores
- chore(tests): relocate co-located route tests to test/routes-tests by @DonKoko in #2739
- chore(deps): bump hono from 4.12.25 to 4.12.27 by @dependabot[bot] in #2736
- chore(deps): bump sharp from 0.34.5 to 0.35.3 by @dependabot[bot] in #2735
- chore(deps-dev): bump postcss from 8.5.13 to 8.5.18 by @dependabot[bot] in #2748
- ci: fix CI on fork PRs by moving off pull_request_target by @DonKoko in #2754
- fix: stop the commit-msg hook from dying before commitlint runs on Windows by @iuryeng in #2759
📚 Documentation
- docs(mobile): correct the page-size explanation left by #2726 by @carlosvirreira in #2728
- docs(sso): document friendly-name/OID attribute ID fallback for Shibboleth by @DonKoko in #2771
- docs(import-update): document asset model and qty-tracked updatable columns by @DonKoko in #2776
🌱 New Contributors
- @Mr-Technician made their first contribution in #2333
Full Changelog: https://github.com/Shelf-nu/shelf.nu/compare/shelf@2.0.1...shelf@2.1.0