Back to changelog
by Théo Daguier
Changelog — April 21, 2026
Major release day with 30 merged PRs: analytics dashboard, keyboard shortcuts, onboarding flow, security headers, accessibility fixes, Biome migration, DataLoader optimization, and comprehensive test coverage expansion.
#feature#bugfix#refactor#perf#security#accessibility#testing#chore
Release
v1.31.7✨ New Features
- Analytics Dashboard — Full analytics page with tabbed navigation and 8 KPI cards covering production, business, retouch, client, technical, and team metrics.
#PR-440 - Analytics GraphQL Resolvers — Backend resolvers for all analytics categories: production, business, retouch, clients, technical, and team performance.
#PR-441 - Keyboard Shortcuts System — Global keyboard shortcuts with a discoverable help dialog, enabling power-user navigation across the app.
#PR-463 - Onboarding Welcome Screen — New-user welcome screen with a getting-started checklist and contextual tooltips to guide first-time users through key features.
#PR-461 - Loading Skeletons — Skeleton loading states added to analytics, settings, products, and dashboard pages for improved perceived performance.
#PR-453 - Error Boundaries — React error boundaries wrapped around major dashboard route segments to prevent full-page crashes.
#PR-452 - Improved Table UX — Empty state CTAs, filter URL persistence, and sessions pagination for a smoother data-browsing experience.
#PR-457
🐛 Bug Fixes
- Analytics Charts Not Rendering — Fixed broken analytics charts and restored proper shadcn Tabs component rendering.
#PR-443 - Shadcn ChartContainer Migration — Migrated all analytics charts to use the shadcn ChartContainer for consistent rendering.
#PR-444 - Extended Analytics Resolvers — Wired up all extended analytics resolvers and fixed a chart casing bug causing data mismatches.
#PR-459 - Auth Disconnect Loop — Resolved an authentication disconnect loop affecting multi-organization users.
#PR-442 - Impersonation Exit & Banner — Fixed impersonation exit flow and redesigned the banner for clarity. Added a floating exit button.
#PR-439#PR-445 - Missing i18n Translations — Audited and filled all missing internationalization translations across the web app.
#PR-462 - GraphQL Error Handling — Improved GraphQL error handling with user-friendly toast messages instead of raw error dumps.
#PR-456 - Mobile Responsiveness — Full responsiveness audit with fixes for layout breaks on smaller screens.
#PR-447 - Accessibility (WCAG 2.1 AA) — Accessibility audit fixes including ARIA labels, focus management, contrast, and keyboard navigation.
#PR-451 - Security Headers — Added CSP, HSTS, and X-Frame-Options headers to harden the web application.
#PR-460 - Client User Permissions — Hidden download selection button and download actions from client-facing users.
#PR-434#PR-436 - Unauthorized Screen — Replaced the unauthorized screen with a redirect to
/sign-infor a smoother auth flow.#PR-435 - Organization Sheets — Removed tags column from org sheets and added a dedicated settings section.
#PR-437#PR-438 - Mobile TypeScript Errors — Resolved TypeScript errors in the mobile app that were blocking the CI typecheck step.
#PR-454 - Test Mock Alignment — Fixed
useDownloadAuthorizationtest mock to match the current type signature.#PR-446
♻️ Refactoring & Technical Improvements
- Biome Migration — Completed migration from ESLint/Prettier to Biome across the entire codebase, removing legacy config files and fixing formatting inconsistencies.
#PR-450
🚀 Performance
- DataLoader Batching — Added DataLoader batching for asset counts and billing queries, reducing N+1 database hits.
#PR-449
🧪 Testing
- Playwright E2E Smoke Tests — End-to-end smoke tests covering critical user flows (sign-in, navigation, core actions).
#PR-455 - GraphQL Schema Validation Tests — Automated tests validating the GraphQL schema against expected types and resolvers.
#PR-458 - Extended Unit Test Coverage — New unit tests for comment resolvers, validators, and server actions.
#PR-448
📝 Other Changes
- Issue #345 Closed — Resolved web unit test failure for
useDownloadAuthorizationhook mismatch.