Appearance
Pages ​
All pages live in app/pages/. Nuxt 4 file-based routing maps the directory structure directly to URL routes.
Route Namespace Overview ​
| Namespace | File pattern | Purpose |
|---|---|---|
| Auth | Root-level .vue files | Unauthenticated entry points |
| DAM | [workspace_id]/dam/ | Core asset management |
| Workspace settings | [workspace_id]/workspace-settings/ | Per-workspace admin |
| External / partner | [workspace_id]/external/ | Partner-facing upload and access flows |
| Shared assets | shared-assets/ and [brand_name]/shared-assets/ | Public asset collection views |
| Account / profile | profile.vue, [workspace_id]/feedback/ | Per-user profile and feedback |
| Dev / utility | styleguide.vue, test-error.vue | Internal tooling, not for production use |
Auth Pages ​
All use login-layout. Middleware is guest-check unless noted. Exception: generate-password.vue has no active middleware (it is commented out in source).
| Route | File | Description |
|---|---|---|
/ | index.vue | Login — email/password, Google, Microsoft, and passkey. Verifies the current domain via check-branding before rendering. Social sign-in options are suppressed on white-label custom domains. |
/forgot-password | forgot-password.vue | Password reset request — accepts an email address and sends a reset link. |
/reset-password | reset-password.vue | Password reset form — validates the token from the email link, then sets a new password. |
/generate-password | generate-password.vue | Invitation acceptance — sets a name and password for a newly invited user. Resolves invitation details from a token query param. Shows an expiry message if the link is stale. |
/password-setup | password-setup.vue | First-time password setup — used when an existing account requires an initial password. Token-based, redirects to login on success. |
/social-login | social-login.vue | OAuth and passkey callback handler — exchanges the access_token query param (OAuth) or a sessionStorage stash (passkey) for a session, then calls nextStep(). |
Account and Profile ​
| Route | File | Layout | Description |
|---|---|---|---|
/profile | profile.vue | profile-layout | Profile settings and notification preferences, presented as two tabs. Middleware: auth-check. |
/:workspace_id/feedback | [workspace_id]/feedback/index.vue | profile-layout | Feedback submission form. Middleware: auth-check, check-workspace, can-access, check-workspace-access, check-if-suspended. |
DAM Pages ​
All use collage-layout. Common middleware base: auth-check, check-workspace, can-access-dam-module, check-if-suspended. Some pages also include check-workspace-access (dashboard, upload, uploaded, trash, portals detail, sharing).
Setup ​
| Route | File | Layout | Description |
|---|---|---|---|
/:workspace_id/dam/add-instance | [workspace_id]/dam/add-instance.vue | login-layout | DAM instance creation wizard — shown when the workspace has no DAM instance yet. Middleware: auth-check, check-workspace, check-dam-instance. |
Dashboard and Search ​
| Route | File | Description |
|---|---|---|
/:workspace_id/dam/dashboard | [workspace_id]/dam/dashboard/index.vue | DAM home — quick action tiles (New Asset, New Folder, etc.) and recent collages and folders. Storage-full state disables the New Asset tile. |
/:workspace_id/dam/search | [workspace_id]/dam/search.vue | Full-text asset and folder search powered by Typesense, with type-ahead and filter support. |
Folders ​
| Route | File | Description |
|---|---|---|
/:workspace_id/dam/folders | [workspace_id]/dam/folders/index.vue | All folders flat list. Create button gated by canCreateFolders permission. |
/:workspace_id/dam/folders/:_id | [workspace_id]/dam/folders/[_id]/index.vue | Folder contents — nested assets and sub-folders with breadcrumbs, bulk action bar, and infinite scroll. Uses embedsHeader: true. |
Assets ​
| Route | File | Description |
|---|---|---|
/:workspace_id/dam/files/:_id | [workspace_id]/dam/files/[_id]/index.vue | Asset detail — metadata editing, version history, comments, and sharing panel. Double-click the title to rename inline. |
/:workspace_id/dam/upload | [workspace_id]/dam/upload.vue | Asset upload — wraps <AssetUpload mode="both" /> supporting both drag-drop and file browser. |
/:workspace_id/dam/uploaded | [workspace_id]/dam/uploaded.vue | Uncategorized assets — all assets not yet assigned to a folder, with bulk assign and bulk action support. Uses embedsHeader: true. |
/:workspace_id/dam/trash | [workspace_id]/dam/trash/index.vue | Soft-deleted assets — restore individually or empty trash. |
Collages ​
| Route | File | Description |
|---|---|---|
/:workspace_id/dam/collage | [workspace_id]/dam/collage/index.vue | All collages list with grid/list view toggle and create button. |
/:workspace_id/dam/collage/:id | [workspace_id]/dam/collage/[id]/index.vue | Collage detail — asset grid with bulk actions and back navigation to the collages list. Uses embedsHeader: true. |
Portals ​
| Route | File | Description |
|---|---|---|
/:workspace_id/dam/portals | [workspace_id]/dam/portals/index.vue | All portals list with create button. Uses embedsHeader: true. |
/:workspace_id/dam/portals/:id | [workspace_id]/dam/portals/[id].vue | Portal detail — branded asset collection with asset grid, bulk actions, and back navigation. |
Sharing ​
| Route | File | Description |
|---|---|---|
/:workspace_id/dam/sharing | [workspace_id]/dam/sharing/index.vue | Shares and embeds manager — toggle between Shares view and Embeds view. Supports bulk delete. |
Workspace Settings Pages ​
All use general-settings-layout. Standard middleware: auth-check, check-workspace, plus page-specific access guards.
| Route | File | Description |
|---|---|---|
/:workspace_id/workspace-settings | [workspace_id]/workspace-settings/index.vue | Workspace general settings — name, branding, domain, and other workspace-level configuration. Middleware includes can-access-general-settings. |
/:workspace_id/workspace-settings/custom-fields | [workspace_id]/workspace-settings/custom-fields/index.vue | Custom metadata field management — create, edit, and reorder fields. Middleware includes can-access-dam-module. |
/:workspace_id/workspace-settings/user/list | [workspace_id]/workspace-settings/user/list.vue | Workspace members — list, invite, and manage internal users and their roles. |
/:workspace_id/workspace-settings/external-user/list | [workspace_id]/workspace-settings/external-user/list.vue | Guest Upload Manager — list and manage external / guest users who have portal or upload access. Labeled "Guest Upload Manager" in the UI sidebar. |
/:workspace_id/workspace-settings/portals/users | [workspace_id]/workspace-settings/portals/users/index.vue | Portal users — all users granted access across portals. Middleware includes can-access-dam-settings. |
/:workspace_id/workspace-settings/dam/:instance_id/announcements/list | [workspace_id]/workspace-settings/dam/[instance_id]/announcements/list.vue | DAM instance announcements — create and manage in-product announcements for the instance. |
/:workspace_id/workspace-settings/dam/:instance_id/notifications | [workspace_id]/workspace-settings/dam/[instance_id]/notifications/index.vue | DAM instance notification settings — configure which events trigger notifications. |
External / Partner Pages ​
All use layout: false (no layout wrapper). These are partner-facing, lightly branded pages reached without a standard internal session.
| Route | File | Middleware | Description |
|---|---|---|---|
/:workspace_id/external/request-access | [workspace_id]/external/request-access.vue | external-guest-redirect | Access request form — external users enter their email to request portal access. Renders workspace branding. |
/:workspace_id/external/verify | [workspace_id]/external/verify.vue | external-otp-verify | OTP verification step for external users — validates the code sent after an access request. |
/:workspace_id/external/upload | [workspace_id]/external/upload.vue | check-external-access, external-upload-auth | External upload form — partners submit files to a portal upload request. |
/:workspace_id/external/request-submitted | [workspace_id]/external/request-submitted.vue | check-external-access, external-upload-auth | Confirmation screen shown after a partner successfully submits an access or upload request. |
Shared Assets Pages ​
Public asset collection views, no layout wrapper (layout: false). No authentication required.
| Route | File | Description |
|---|---|---|
/shared-assets/:type | shared-assets/[type].vue | Renders <SharedAssetsPage /> — a public shared asset collection, type-parameterised. |
/:brand_name/shared-assets/:type | [brand_name]/shared-assets/[type].vue | Same as above but namespaced under a brand slug for white-label deployments. |
Dev / Utility Pages ​
Not intended for production use. No definePageMeta — no layout or middleware applied.
| Route | File | Description |
|---|---|---|
/test-error | test-error.vue | Error trigger page — buttons to throw 404, 401, and 500 Nuxt errors for testing error.vue. |
Page Conventions ​
definePageMetaappears in<script setup>on every production page to declare layout and middleware.- All protected pages run
auth-checkmiddleware first; that middleware saves the current URL in a cookie so the login page can redirect back after sign-in. - DAM pages that show an asset grid pass
embedsHeader: trueindefinePageMetato signal the layout to render the embeds-aware header variant. - Route params are accessed via
useRoute(). Workspace ID is alwaysroute.params.workspace_id.