From brief to store.In one flow.
Six steps. One platform. From photo on a memory card to scheduled publish in Shopify. No Dropbox handoffs, no WhatsApp approvals, no Excel status columns.
Source.Photo, upload, supplier. Everything lands in the account.
Drop zone for RAW photo, studio archive or supplier asset. Sharp checks EXIF, dimensions, DPI, colour profile and creates rendition previews. SHA-256 dedup detects duplicates account-wide before they become a second file in the library.
- 01Upload via drag-and-drop, supplier email or Shopify pull
- 02Auto-tag into system folders (Uploads, AI-generated, Media Tools)
- 03Perceptual hash column planned; byte-level dedup is active today
Briefing.Variant, image role and release slot are defined.
The asset gets a context. Which product, which variant, which image role (Hero, PDP-Front, Detail, Lifestyle). The link runs through product_assets with position and isPrimary, optionally tied to variantId. Multiple variants share an asset if the shot allows it.
- 01Per product, per variant, or both in parallel
- 02Asset type as label for grouping in the library
- 03Custom fields from the Shopify metafield mirror are available
AI Studio.Generation with your own key. No markup, no lock-in.
BYOK via Runware, OpenRouter, OpenAI. Keys are stored libsodium-encrypted per account, decrypted exclusively in the worker process. AI Studio for single images, AI Recipes for batch runs across N products. maxAttempts=1 protects your provider bill.
- 01Reference image from library or mood board
- 02Background removal across six models, output PNG with alpha
- 03Suggestions for text and categories go to review, never directly into the catalogue
Approvals.Multi-stage workflows with audit trail.
Configurable approval flows per account. Stages with any or all rules, defined approvers, comment on rejection. An asset moves none → pending → in_review → approved or rejected → published. While a flow is running, the asset is locked for downstream steps.
- 01Stages freely definable per brand
- 02Append-only audit log on every mutation, partitioned monthly
- 03Kanban board shows the bottleneck per stage and per approver
Rights.License, scope and expiry date recorded.
Rights records are attached to the asset, separate table, linked with each product assignment. Source (photographer, stock, AI, in-house), license PDF in blob storage, contract reference, licensor, amount paid in ISO currency, issued on, expires on. The rights-expiry job notifies at 30, 14, 7 and 1 days.
- 01License PDF permanently on the asset, not in an inbox
- 02Scope as free text: web, print, social, DE, AT, CH
- 03Reminder buckets deduplicated in expiryWarningsSent
Publish.Automatically to Shopify at launch date.
Releases are separate objects with a launch date. 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. Readiness rollup shows which child product is still blocked.
- 01Bulk ops and webhooks via Shopify GraphQL Admin API
- 02Scheduled publish at night, the team sleeps
- 03Unpublish and channel rollback as a separate job path
One process.Instead of six scattered tools.
- 01Dropbox folder with _FINAL_v3.psd
- 02Notion doc with brief, status last week
- 03Midjourney in the browser, results via AirDrop
- 04WhatsApp approval, no timestamp
- 05Stock contract in Lea's inbox, and she's on holiday
- 06Manual bulk edits in Shopify on launch morning
- 01Library with dedup, origin and tool chain per asset
- 02Briefing as product, variant and release context
- 03BYOK AI in one place, cost per generation
- 04Approval flow with timestamp and audit trail
- 05License PDF on the asset, reminder before expiry
- 06Scheduled publish at night — lock semantics prevent double-send