Curating the platform style library
The platform style library is the catalog of style presets every venue with the AI Photo Studio sees by default. There are currently 33 presets — 17 food styles, 16 beverage styles — imported from the original Restaurant Photo Studio app on Base44 and rehosted on our R2 bucket. This page is for super-admins curating that catalog.
What it does
The library is the default-on experience for new venues. When a venue activates the AI Photo Studio service, the entire active platform library is immediately visible in their Studio tab — no per-venue setup. A venue can author its own custom styles on top, but the platform set is what every venue starts with.
The page at /admin/super/photo-presets lets you list, create, edit, hide, and delete platform-scope presets. Venue-scope presets are invisible here — those are managed inside each venue’s admin (and the venue-side editor is a backlog item; today they CRUD via the API only).
Page anatomy
Three categories tab across the top: Food, Beverage, General. The General tab is reserved for category-neutral styles (e.g. “Natural daylight” applies to anything); the Base44 import didn’t include any general styles so it ships empty. Operators see all three category tabs in their Studio.
Below the tabs, a grid of preset cards. Each card shows: name, subtitle, the full prompt text (truncated to ~3 lines), sort order, and three actions — Hide/Show, Edit, Delete.
The + New preset button in the top-right opens the same editor modal the Edit button opens. Name, subtitle, category, prompt text, preview image URL, and sort order. Lower sort order = appears first in the venue’s list.
What makes a good preset
The prompt is the only knob that determines output quality. The 33 imported prompts from Base44 are battle-tested; new prompts should follow their structure:
- Open with a single sentence describing the visual style (“Professional restaurant photography. Soft diffused top-down studio light…”).
- Specify the lighting (direction, hardness, color temperature) and the surface/background.
- Specify the camera angle and depth of field.
- End with a preservation clause: “Use the exact same dish as the input image. Do not add any other dishes.”
Without the preservation clause, the AI provider sometimes hallucinates a different dish that matches the style better than the photo does — operators end up with a beautiful plate of something they don’t actually serve, which is unusable for menus.
The preview image URL should point at a real photo in roughly the style the prompt produces. It’s what the operator sees in their style picker before generating, and it sets the expectation. Stock photos from Unsplash work; ideally we host them on our R2 (platform/ai-photo-studio/previews/{slug}.jpg) so we don’t depend on external sources — the migration action at npx convex run aiPhotoMigrations:migratePresetImagesToR2 handles this automatically for any preset whose URL points elsewhere.
How to use it
To add a preset, click + New preset. Fill in the name (this is what operators see), a short subtitle (one-liner under the name), pick a category, paste the prompt text. For preview image, the easiest path is to first generate a representative photo through Photo Studio itself, download it, upload to our R2 manually, then paste the resulting URL. Then run migratePresetImagesToR2 if you want it normalized under the canonical key.
To edit a preset, click Edit on its card. Same modal. Changes apply to all venues immediately (the venue’s Studio picks them up via Convex’s reactive query).
To hide a preset without deleting it (e.g. seasonal styles), click Hide. The card stays in the super-admin grid (greyed with a “Hidden” tag) but disappears from every venue’s Studio. Click Show to bring it back.
To delete a preset, click Delete, confirm. The preset is removed from every venue’s Studio immediately. Any favorite that pointed at it is also removed (cascade). Existing generations that used that preset keep working — the styleName is denormalized into each generation row, so the gallery still shows “Generated with Studio Plate” even if “Studio Plate” no longer exists in the catalog.
The rule
Platform presets are the default-on experience for every venue. Edit them carefully — a bad prompt rolled out at the platform level affects every restaurant on the system.
When to keep a preset platform-only vs let venues author their own
Platform presets are good for:
- Generic style families that work for most cuisines (“Studio Plate”, “Warm Trattoria”, “Overhead Flat”)
- Beverage styles that apply across wine, beer, cocktails (“Cocktail Luxe”, “Wine Cellar”)
Venue custom presets (when that UI ships) are good for:
- A venue’s specific visual identity (the venue uses very particular plating photography)
- One-off seasonal looks
- Styles tied to a specific surface a venue actually uses (“Our white-painted wood bar”)
If a venue is asking the platform team to add a preset just for them, that’s a signal to ship the venue-side editor sooner rather than later — the BACKLOG entry for “Photo Studio — venue-side preset editor” is the right item to pull forward.
How the import worked
The 33 presets were imported from the Base44 Restaurant Photo Studio app via its MCP, then their preview images were copied from Base44 / Unsplash to our R2 bucket at platform/ai-photo-studio/presets/{slug}.{ext}. The seeder (convex/seedAiPhotoPresets.ts) holds the canonical name + prompt + category + sort order list; the migration action holds the URL-rehost logic. Re-running the seeder is safe — it preserves any preview URL already pointing at our R2 (so you don’t accidentally revert a localized URL by re-seeding).