No tool sprawl.One backbone.

Media, AI Studio, Approvals, Releases, and Rights in one system. Shopify-native, variant-aware, audit-ready. From asset to drop, one backbone.

Six modules. One connected process.

01 · Catalog

Media Management

Central asset library. One canonical row in the assets table, whether upload, AI generation, Shopify import, or media tools derivative. Parallel state machines for processing (Sharp checks EXIF, dimensions, DPI, ICC) and approval. SHA-256 dedup per account, system-generated folders per origin.

  • ·SHA-256 dedup at byte level
  • ·System folders per origin
  • ·altText, copyright, creator editable
  • ·Signed URLs for private assets
02 · Generation

AI Studio + Recipes

BYOK via Runware, OpenRouter, OpenAI. Keys encrypted with libsodium, decrypted only in the worker process. AI Studio for interactive one-off generations, Recipes as reusable templates across N products. Suggestions for text and category enter a review, never go directly into the catalog.

  • ·Runware for image and background removal
  • ·OpenRouter for text and ai-ask
  • ·maxAttempts=1 protects your bill
  • ·Mood board items as reference images
03 · Sync

Shopify Catalog Sync

Two-way sync via the Shopify GraphQL Admin API. Pull fetches products, variants, metafields, and metaobjects in phases. Webhooks HMAC-verified and idempotent via X-Shopify-Webhook-Id. Shopify-sourced rows are read-only; the escape hatch is locallyEditedAt.

  • ·Phased sync: metafields, products, metaobjects
  • ·Bulk ops and webhooks
  • ·Metafield mirror as custom fields
  • ·Snapshots before risky edits
04 · Compliance

Rights & Licenses

Dedicated table, linked to every asset. Source (photographer, stock, AI, in-house), license PDF in blob storage, licensor, contract reference, scope, amount paid, issued on, expires on. The rights-expiry job mails 30, 14, 7, and 1 day before expiry, deduplicated per bucket.

  • ·License PDF permanently attached to asset
  • ·Scope: web, print, social, DE, AT, CH
  • ·Expiry buckets 30 / 14 / 7 / 1
  • ·Joins on all product assignments
05 · Workflow

Asset Approvals

Configurable flows per account with any number of stages. Each stage carries an any or all rule and a list of approver user IDs. State machine: none → pending → in_review → approved or rejected → published. Kanban board shows the bottleneck per stage.

  • ·Freely definable stages
  • ·Any or all rule per stage
  • ·Comment on reject
  • ·Approval state locks downstream
06 · Versioned

Releases & Drops

Releases as first-class objects with a launch date. Products and assets linked, readiness rollup shows blockers. The product-release-schedule-tick job checks due releases; the product-release-publish job writes product data and images back to Shopify. Lock semantics prevent double-publish.

  • ·Scheduled publish overnight
  • ·Readiness rollup per child
  • ·Lock semantics in releases
  • ·Unpublish and channel rollback as jobs

Eight additional building blocks. In the same place.

Brand

Brand Book

Brand DNA per account: palette, typography, tone, forbidden words, pose guidelines, mood board, logo.

Brand

Mood Boards

Printable via /identity/print, publicly shareable with optional password. Items serve as reference images for AI Studio.

AI

AI Chat in Catalog

ai-ask via OpenRouter, default anthropic/claude-3.5-sonnet.

Versioned

Micro-Releases · Logs

A variant correction, a photo refresh. Same publish path, with logs, without overhead.

Ops

Team Roles

company_users with role owner, admin, member. Invites via email, soft-deactivate via deactivated_at.

Media

Watermarking

Overlay a watermark asset with position, scaling, opacity, and margin. Sharp pipeline.

AI

Custom AI Models

BYOK. Per-generation cost_usd echoed from the provider, totalCostUsd at the run, no token markup.

Media

Collage Builder

Compose multiple library images into one new asset. Output usable as AI reference.

Architecture

One DB.One worker. Few dependencies.

Bun and ElysiaJS on the backend, Vue 3 with SSR and prerender on the frontend. Postgres with Drizzle ORM, Graphile Worker as a Postgres-backed queue, no Redis. S3-compatible storage via Contabo, CDN via Bunny, email via Lettermint, all EU-hosted.

  • 01Adapter pattern for sources and channels. Woo, Shopware as future adapters, no refactor
  • 02Append-only, monthly partitioned audit log. Old partitions detachable for cold storage
  • 03C2PA columns reserved on assets for EU AI Act content labelling
  • 04SSR plus prerender on the marketing side. Sub-2s TTFB on DACH connections