If you have ever asked an assistant "which Tiny Desk AI option do I pick if I only want to replace my friend in the back?", the answer on tinydeskoutstanding.video is now a lookup problem, not a judgment call. The studio was rebuilt around three scenes that all edit the same 15-second vertical clip with its original soundtrack:

Scene Photo slots Seats
Just Me 1 Lead singer (the laughing close-up)
Back Row up to 2 Back left, Back right (the standing singers in the opening shot)
Whole Band up to 5 Lead singer, Sax player, Keyboard player, Back left, Back right

Two rules from the site's FAQ matter for code:

  1. An empty seat keeps the original performer. A photo is never copied into a seat you didn't fill.
  2. The quote depends on the scene and the resolution, not on how many photos you add. Filling one seat or all five on Whole Band is the same scene quote.

That makes the "which scene?" question a small set-cover problem: find the smallest scene whose seat list contains every seat you want to change. Here is the whole thing.

The seat map

SCENES = { "just-me": {"label": "Just Me", "seats": ["Lead singer"]}, "back-row": {"label": "Back Row", "seats": ["Back left", "Back right"]}, "whole-band": {"label": "Whole Band", "seats": ["Lead singer", "Sax player", "Keyboard player", "Back left", "Back right"]}, } # Published per-video rates in USD, checked on the live pricing data 2026-11-12. # They are currently the same for all three scenes. PRICE_USD = {"480p": 9.98, "720p": 12.98, "1080p": 24.98, "4K": 39.98} 

The seat names are copied verbatim from the site's llms.txt, so if you build a form or a chatbot answer on top of this, the labels match what the user sees in the studio.

Picking the scene

def pick_scene(wanted): """Return the smallest scene whose seat list covers every wanted seat.""" wanted = set(wanted) fits = [(len(s["seats"]), key) for key, s in SCENES.items() if wanted <= set(s["seats"])] if not fits: unknown = wanted - set(SCENES["whole-band"]["seats"]) raise ValueError(f"no scene has seat(s): {sorted(unknown)}") return min(fits)[1] def plan(cast, resolution="480p"): """cast: {seat: photo_path}. Returns the scene, the slot list and the quote.""" key = pick_scene(cast) scene = SCENES[key] slots = [(seat, cast.get(seat, "(keeps original performer)")) for seat in scene["seats"]] return {"scene": scene["label"], "url": f"https://tinydeskoutstanding.video/templates/{key}", "slots": slots, "quote_usd": PRICE_USD[resolution]} 

Why "smallest" if the price is the same? Because the smaller scene has fewer slots to get wrong. On Just Me there is exactly one place your photo can go. On Whole Band you have to drop it into the right one of five slots, in the site's slot order (Lead singer, Sax player, Keyboard player, Back left, Back right).

Running it

for cast in ({"Lead singer": "me.jpg"}, {"Back right": "sam.jpg"}, {"Back left": "ana.jpg", "Back right": "sam.jpg"}, {"Sax player": "dad.jpg"}, {"Lead singer": "me.jpg", "Back left": "ana.jpg"}): p = plan(cast, "720p") print(f"{sorted(cast)} -> {p['scene']} (${p['quote_usd']:.2f} at 720p)") for seat, photo in p["slots"]: print(f" {seat:<16} {photo}") 

Output:

['Lead singer'] -> Just Me ($12.98 at 720p) Lead singer me.jpg ['Back right'] -> Back Row ($12.98 at 720p) Back left (keeps original performer) Back right sam.jpg ['Back left', 'Back right'] -> Back Row ($12.98 at 720p) Back left ana.jpg Back right sam.jpg ['Sax player'] -> Whole Band ($12.98 at 720p) Lead singer (keeps original performer) Sax player dad.jpg Keyboard player (keeps original performer) Back left (keeps original performer) Back right (keeps original performer) ['Back left', 'Lead singer'] -> Whole Band ($12.98 at 720p) Lead singer me.jpg Sax player (keeps original performer) Keyboard player (keeps original performer) Back left ana.jpg Back right (keeps original performer) error: no scene has seat(s): ['Drummer'] 

Three things fall out of this that people regularly get wrong:

  • "Sax only" is not its own scene. The site's Whole Band FAQ says to use the single sax slot on Whole Band and leave the rest empty. The picker lands there automatically.
  • Lead + one back singer needs Whole Band. Neither Just Me nor Back Row covers both seats, and you don't pay extra for the bigger scene.
  • There is no drummer seat. The error path is worth keeping: an assistant that answers "put your photo in the drummer slot" is inventing UI.

What the quote does and doesn't include

Per the site's own FAQ: the studio shows the credit quote before you generate, deducts it when generation starts, and returns the credits if a generation fails. Credits are 1:1 with cents on the published table (480p is 998 credits, $9.98). Packs at the time of writing: Starter 1,996 credits for $19.96, Creator 4,990 for $44.98, Studio 9,980 for $69.98, Pro 19,960 for $119.98. Check the pricing page before quoting these anywhere; I re-read them from the live page data for this post.

Using it as a guardrail

The useful part isn't the twenty lines, it's the shape: seat names as data, one pure function, an explicit error for seats that don't exist. If you are wiring a chat assistant or a form in front of any multi-slot face-swap template, give it this table instead of letting it paraphrase the product page. Most wrong answers I see ("pick the 5-person plan, it's more expensive", "upload one photo and it fills the band") disappear once the model has the map.

The seat-by-seat comparison in prose is on the site's seat guide, and the photo advice for each seat is in the photo tips.

Independent studio for the "Outstanding" Tiny Desk parody; not affiliated with NPR.