← Back

Release notes

Current version · v2026.05.26

v2026.05.262026-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.

v2026.05.25.22026-05-25

Added

  • Moved the admin image grid into the shared portal-components package so every app uses one implementation.

v2026.05.252026-05-25

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.

v2026.05.232026-05-23

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.

v2026.05.19.22026-05-19

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 studio100 to round out coverage.

v2026.05.192026-05-19

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 studio100.

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.

v2026.05.18.22026-05-18

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.

v2026.05.182026-05-18

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.

v2026.05.16.22026-05-16

Added

  • Imported portal-components styles into the app's globals.css so shared components render with their full styling.

v2026.05.162026-05-16

What's new

Studio 100 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 studio100: 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.

v2026.05.14.52026-05-14

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.

v2026.05.14.42026-05-14

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.

v2026.05.14.32026-05-14

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.

v2026.05.14.22026-05-14

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.

v2026.05.142026-05-14

What's new

Studio 100's admin pages, delivery review UI, uploads page, and changelog have all been aligned onto the shared design system.

  • 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.
  • The uploads page has been rebuilt on the shared shell and now auto-refreshes after each completed upload.
  • The changelog page has been redesigned to match demo's layout.
  • Clicking 'Deliveries' in the sidebar now navigates without re-rendering the entire app shell.

Added

  • Migrated apps/studio100 onto the shared @onehundred/portal-shell layout primitives, with a ShellClient split for client-side bits.
  • 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 into the new @onehundred/portal-core workspace package, including a port of look grouping into deliveries.ts.
  • Established broad test coverage for studio100: auth and R2 pure helpers, events default title, comments serializer, R2 client paths via aws-sdk-client-mock, testcontainers-backed integration tests for uploads, deliveries, and previews, plus shared route-handler tests for deliveries, comments, approvals, uploads, hide/QA, admin management, asset hard-delete, upscale, and webhooks.

v2026.05.032026-05-03

What's new

The Studio 100 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 studio100 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).

v2026.05.022026-05-02

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.

v2026.04.30.42026-04-30

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.

v2026.04.30.32026-04-30

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.

v2026.04.30.22026-04-30

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.

v2026.04.302026-04-30

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.

v2026.04.29.32026-04-29

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.

v2026.04.29.22026-04-29

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.

v2026.04.292026-04-29

What's new

Studio 100 is live, with a branded delivery experience, threaded comments, a reviewer ladder, QA approval, and an upscale workflow.

  • A branded delivery and admin experience with the real Studio 100 logo and an embedded chat widget.
  • A reviewer ladder with viewer, editor, AD, and CD roles, plus reference images you can attach to pinpoint comments.
  • A QA review step: assets go through pending, approved, or rejected, and clients only see approved assets.
  • An upscale workflow where admins attach an upscaled file to the original asset, and clients can compare them side-by-side and re-approve.
  • Filters on the delivery overview respond instantly, and bundled "looks" can now be uploaded as a zip.
  • Admins can permanently delete a delivered asset after a typed-filename confirmation.

Added

  • Initial studio100 platform on the shared gateway-client package, with a delivery page, an admin area, threaded comments, and pagination.
  • Schema and infra: schema generalized (s100_ prefix dropped, app_slug added), R2 deliveries namespaced under studio100/, authenticated file uploads with an atomic quota gate at upload-sign, snake_case admin SQL, simplified admin auth, and .vercel ignored in gitignore.
  • platform-events and slack-notifier packages are wired in, with Tawk.to chat embedded across the app and chat events sent to Slack.
  • Brand rollout — design tokens, branded landing/dashboard/admin/uploads/delivery surfaces, verified brand fonts with an orange accent, the real Studio 100 logo, a non-admin landing page with an Uploads CTA, and a /uploads page header.
  • Reviewer ladder with viewer, editor, AD, and CD roles, plus reference images attached to pinpoint comments.
  • Upscale workflow: data model for upscale attachments on delivery assets, the upscale CTA gated behind image approval, an admin upload that attaches an upscaled file to the original asset, upscale state surfaced on the asset list and gallery tile, side-by-side compare with re-approval, and a has-upscale filter plus upscale-date sort.
  • Filters with instant behavior on the delivery overview, plus a shared image-previews worker for thumbnails.
  • QA workflow: is_qa flag and DeliveryUser.isQa, qa_status columns with backfill, client visibility gated on approval, /qa/approve and /qa/reject routes with pending/approved/rejected events, an internal QA queue page, an admin toggle UI, pills and dimming for non-approved assets, /admin/users scoped to the current app's hub members, and an overridable hub app slug.
  • Admin-only hard delete for delivered assets.
  • Bundled "looks" can now be uploaded as a zip.

Fixed

  • Removed Clerk props, added the auth redirect, and fixed the related types.
  • Aligned headers across the admin and delivery surfaces and tightened spacing around the logo and below the divider.
  • Non-admins now land on / after first sign-in instead of /dashboard.
  • Closed orphan-upload paths and deduplicated the comment serializer.
  • 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.
v2026.05.26