Release notes
Current version · v2026.05.26
Added
- Renamed the admin asset loader to make its admin-only access requirement explicit at every call site, with tests confirming it returns hidden assets and full file keys without filtering.
Added
- Moved the admin image grid into the shared portal-components package so every app uses one implementation.
Added
- Reorganized the delivery comment handlers — the route handlers now live in the shared portal-core package, and the comment permission check was split into separate endorse and resolve permissions.
What's new
Comments on delivered assets now support emoji reactions and can be resolved when handled.
- Reviewers can react to comments with emoji from the image viewer.
- Comments can be marked resolved (and unresolved) to keep the conversation focused on what's still open.
Added
- Added emoji reactions and resolve/unresolve to delivery review comments, with supporting database migrations and updates to the endorse, broadcast, and bulk-comment routes.
What's new
QA approve and reject decisions are now tracked per version of each delivered asset.
- When a new version of an image is uploaded, QA approvals and rejections now belong to that version instead of the asset as a whole, so a newer version must be reviewed separately.
Added
- Synced QA approve and reject state to the specific delivery asset version, so QA decisions are recorded per version instead of per asset.
- Added a restore-to-version test on alison-sheri to round out coverage.
What's new
Admins can now restore a delivered image to any of its previous versions, and multi-version assets show a v{N} badge in the gallery.
- A 'Restore' button in the image viewer reverts an asset to a previous version.
- Asset cards in the delivery gallery now show a v{N} badge in the corner when the asset has multiple versions.
- Pin comments now carry the version they were left on through every mutation response, so the viewer's version filter always reflects the right comments.
Added
- Added a restore-to-version admin route and an in-viewer Restore button that reverts an asset to a previous version.
- Added a v{N} corner badge on multi-version asset cards in the delivery gallery.
- Replicated the version/register test coverage to alison-sheri.
Fixed
- Fixed register-uploaded to create the v1 version row and set current_version_id on the asset.
- Fixed comment mutation responses so versionNumber is populated on create, update, delete, endorse, broadcast, and bulk.
- Fixed restore-to-version so it skips the r2_key mirror that previously caused a (delivery_id, r2_key) uniqueness collision.
What's new
Delivered images can now have multiple versions, with an in-viewer switcher and an admin flow to upload a new version.
- Admins can upload a new version of a delivered image directly from the image viewer.
- The viewer shows a version-count badge plus a switcher to flip between revisions, with full-resolution downloads signed per version.
- Pin comments can be filtered to the version they were left on.
- Reviewers and clients can request a new revision of an image from the viewer.
Added
- Added a version-aware schema for delivery assets, with a 0008_asset_versions migration, write paths that record each new version, and updated fixtures and tests.
- Added API endpoints for new-version upload (register + upload-url), revision request actions, and a versions list, alongside the per-version sign route.
- Added an in-viewer version switcher with a Select control, a version-count badge, an admin 'Upload new version' button, and a filter that scopes pin comments to the current version.
What's new
QA reviewers can now open the full delivery image viewer directly from the QA queue.
- The QA queue now opens the same image viewer used in the delivery gallery, with the comment and signing controls inline.
Added
- Wired the delivery image viewer into the QA queue, with the gallery, action handlers, and queue-row components extracted into @onehundred/portal-components for reuse.
- Drove lint warnings to zero with a centralized eslint config gated at --max-warnings 0, plus whitespace, code-style, typing, and logging cleanups.
Added
- Imported portal-components styles into the app's globals.css so shared components render with their full styling.
What's new
Alison Sheri now connects to the shared model roster.
- A 'Roster' entry now appears in the navigation, with a model list and detail pages.
- Preview and roster activate/download routes are mounted, gated by per-app configuration.
Added
- Mounted the model roster and preview routes on alison-sheri: a /roster page with a detail view, /api/preview, /api/roster/activate, /api/roster/download, the supporting roster-actor library, Shell+nav wiring, post-deploy seed docs, and preview-route gating tests.
- Pointed the Drizzle config at a canonical db/drizzle/ folder shared across portal apps.
Fixed
- Corrected the alison-sheri staging configuration to use the right app slug.
Fixed
- Stabilized workspace test suites so the CI test gate passes: mocked @/lib/r2 in the upscale/reject suites, aligned the comments broadcast, asset sign, admin upscale, and look routes with the test fixtures, and tightened shared test setup.
What's new
The app now has a light/dark/system theme switcher in the shared shell.
- A toggle in the app shell switches between light, dark, and a setting that follows the operating system.
Added
- Picked up the light/dark/system theme switcher from @onehundred/portal-shell, with a toggle exposed in the shared app shell.
Added
- Migrated the app shell, layout primitives, navigation defaults, image cards, deliveries table, and look preview grid into the new @onehundred/portal-shell and @onehundred/portal-components workspace packages, with apps now consuming them from the workspace.
What's new
Admin and QA pages now stream into place — the shell appears immediately and each section fills in as its data loads.
- The admin dashboard's deliveries list and platform stats now appear with skeletons while their data loads.
- The QA queue's signed-asset list now streams in independently of the surrounding shell.
Added
- Switched the admin dashboard and QA queue pages to Suspense-based section streaming with dedicated skeletons.
What's new
Alison Sheri's admin pages, delivery review UI, uploads page, and changelog have all been aligned onto the shared design system, matching what the demo and other portals use.
- Admin delivery detail pages now follow the same layout as the demo, with Looks and Images at the top and Uploads/Integrations below.
- The image overview supports a 'Per look' grouping mode, making it easier to scan deliveries that are organized around looks.
- The uploads page has been rebuilt on the shared shell and now auto-refreshes the file list after each completed upload.
- The changelog page has been redesigned to match demo's release-notes layout.
- Clicking 'Deliveries' in the sidebar now navigates without re-rendering the entire app shell.
Added
- Migrated apps/alison-sheri onto the shared @onehundred/portal-shell layout primitives, with a ShellClient split for client-side bits and matcher-excluded paths rendering cleanly.
- Aligned the admin delivery detail page and image gallery to demo's pattern, with a Looks/Images view toggle, multi-image look previews, Field/Card primitives, and reordered sections.
- Added a dedicated /home route inside the (shell) layout and refactored the uploads page onto the shared shell primitives.
- Aligned the /changelog page to demo's Tailwind-based design.
- Added 'Per look' grouping mode to the delivery image overview.
- Extracted shared library code (delivery, upload, auth, R2 helpers, look grouping) into the new @onehundred/portal-core workspace package.
- Set up a Vitest harness for route handlers covering deliveries, comments, approvals, uploads, hide/QA, admin management, asset hard-delete, upscale, and webhooks.
What's new
The Alison Sheri client got a top-to-bottom design refresh — admin pages, delivery review pages, the QA queue, and delivery charts now share the same look as the demo and the hub.
- Admin pages (deliveries table, action queue, image grid, looks grid, integrations form, upload forms, new-delivery form, admin users) have been migrated to the shared design system.
- Delivery review pages (gallery, image viewer, gallery toolbar, broadcast comment dialog, bulk comment composer, activity timeline) have been migrated to the shared design system.
- The QA queue page has been migrated to the shared design system.
- Delivery charts have been rebuilt on the new shared chart primitive.
Added
- Adopted the shared @onehundred/ui design system and Tailwind in the alison-sheri app, starting with the homepage, version badge, and deliveries table.
- Migrated admin pages — admin landing, action queue, image grid, looks grid, integrations form, upload form, zip upload form, new-delivery form, and admin users — to the shared design system.
- Migrated delivery review pages — gallery, image viewer, gallery toolbar, broadcast comment dialog, bulk comment composer, and activity timeline — to the shared design system.
- Migrated the QA queue page to the shared design system.
- Rebuilt the delivery charts on the shared Recharts-based chart primitive.
- Picked up additional shared UI primitives across the app (button, dialog, dropdown, label, sheet, tabs, alert dialog, breadcrumb, navigation menu, pagination, scroll area, toggle group).
What's new
Fixed how zip uploads handle a single wrapping folder — each subfolder inside it now becomes its own look.
- Zip uploads now strip a single wrapping root folder so each subfolder inside it becomes its own look, instead of all images getting bundled together.
Fixed
- Fixed zip upload so a single wrapping root folder is unwrapped — each subfolder inside it becomes its own look instead of all images being collapsed into one.
What's new
Two admin-side fixes — the integrations form now reflects saves right away, and rejecting an upscale is admin-only.
- The integrations form (Slack webhook URL, customer ID) now reflects saved values immediately after Save, with no hard-refresh needed.
- Rejecting an upscale is now an admin-only action — non-admin reviewers can still approve, but only admins can detach and reset an upscale.
Fixed
- Fixed the integrations form keeping stale state after Save — Slack webhook URL and customer ID now resync from the server when the page refreshes.
- Locked the upscale-reject endpoint to admins and added cleanup of the underlying R2 objects when an upscale is rejected; previously any signed-in user could reject and the file lingered in storage.
What's new
Two fixes to admin upload behavior — uploads, deletes, and deleted looks now behave the way you'd expect.
- The admin image grid refreshes immediately after an upload or delete, no manual page refresh needed.
- Deleting a look now also removes its underlying images, so they no longer reappear in the client gallery on the next load.
Fixed
- Fixed the admin image grid not refreshing after an asset upload or delete — newly uploaded assets and cascade-deleted look images now appear immediately without a browser refresh.
- Fixed deleted look images reappearing in the client gallery on the next page load — the look DELETE handler now also removes the underlying R2 objects, not just the database rows.
What's new
Bundled looks now appear right after a zip upload, without needing a browser refresh.
- After uploading a 'looks' zip, the looks grid updates immediately — no manual refresh needed.
Fixed
- Fixed the admin looks grid not refreshing after a zip upload finished — newly created looks now appear immediately without a browser refresh.
What's new
Reviewers can now comment on many images at once.
- Multi-select images on the delivery gallery and add a single comment to all of them in one go.
- An existing comment can also be broadcast to additional images from a picker, sharing one synced copy across the group.
Added
- Reviewers can multi-select images on the gallery and add a single comment to all selected images at once. An existing comment can also be broadcast to additional images via a picker, with all copies sharing one comment group.
What's new
A bigger magnifier on the delivery viewer, plus tidier comment behavior.
- The magnifier on the delivery image viewer is larger and zooms in further (now 300px wide at 4× zoom).
- Long usernames no longer push the date out of the comment box — role and 'internal' pills now wrap to a second line when needed.
- Deleting a top-level delivery comment now also removes the replies in that thread, in one action.
Added
- The delivery image magnifier is now larger and zooms in further (300px wide at 4× zoom).
Fixed
- Fixed a comment header layout where long usernames could push the date out of the comment box; role pills now wrap to a second line.
- Deleting a top-level delivery comment now also removes any replies in that thread, in one action.
What's new
The changelog page is now live, and admins can keep certain comments private to the team.
- A new /changelog page lists every release with a 'What's new' summary, the list of additions, and any fixes.
- A small version badge in the bottom-left corner links to the changelog.
- Admins can now mark a delivery comment as internal, so only other admins see it — clients and reviewers don't.
Added
- Added a /changelog page (with a 'What's new' intro) and a small version badge in the bottom-left corner.
- Admins can mark individual delivery comments as internal — visible only to admins, not to clients or reviewers.
Fixed
- Closed paths where internal comments could leak into events, endorsements, and replies.
What's new
Alison Sheri delivery now includes a full QA review flow, instant filters on the overview, and bundled looks via zip upload.
- Filters on the delivery overview now respond instantly.
- A QA review step: assets are pending until a reviewer approves them, and clients only see approved assets.
- An internal QA queue page where reviewers can work through pending assets.
- Admins can mark which team members can act as QA reviewers.
- Admins can permanently delete a delivered asset after a typed-filename confirmation.
- Bundled "looks" can now be uploaded as a zip and shown alongside the delivery.
Added
- Initial alison-sheri delivery app with a shared image-previews worker for thumbnails on the delivery overview.
- Filters on the delivery overview now respond instantly.
- QA workflow: is_qa flag and DeliveryUser.isQa, qa_status columns with backfill on delivery_assets, client visibility gated on approval, /qa/approve and /qa/reject routes with pending/approved/rejected events, an internal QA queue page for reviewers, an admin user-management UI for the is_qa toggle, and pills plus dimming for non-approved assets.
- Admin-only hard delete for delivered assets.
- /admin/users is now scoped to users with hub access for this app, with the hub app slug overridable per environment.
- Bundled "looks" can now be uploaded as a zip.
Fixed
- Fixed filtering behavior on the delivery overview.
- Editor, AD, and CD roles are now treated like viewer for the QA gate.
- Hardened the empty-slug case on the hub users API and prevented CDN caching of stale 404s.
- Typed-filename confirm on asset deletion, and the API is now idempotent on a 404.
- Fixed looks showing 0 images by rewriting the count subqueries as bare SQL.