---
name: mint-moments
description: Turn a folder of photos (or a handful of attached images) into a finished, scored vertical film with ReelMint's Mint Moments over MCP — pick the photos that belong together, choose the mood and length, upload, generate, wait, and hand back the link. Use when asked to make a film, reel, slideshow, memory video or highlight from photos, a folder, an album, a trip, a wedding, a match, a product shoot.
---

# mint-moments

`mint-moments <folder-or-images> [mood] [length]`

Examples:

```
mint-moments D:\Photos\Wedding2026
mint-moments ~/Pictures/Rome trip 60s
mint-moments ./match-day football 30s
mint-moments (with three images attached) "happy moments"
```

Produces ONE finished 9:16 film — every chosen photo brought to life as a
short clip, cut together, sharpened, scored with music that fits the mood
— and returns its link. The whole pipeline runs on ReelMint; this skill's
job is to choose well, upload cleanly, and never make the user babysit it.

Tools (ReelMint MCP server): `list_moment_categories`, `upload_photo`,
`quote_moment`, `create_moment`, `get_moment`, `list_moments`,
`redesign_moment`, `delete_moment`.

---

## 0. What "automated" means here

The user gives a folder and, at most, a mood and a length. Everything
else is yours: which photos, in what order, which category, how long, and
seeing it through to a link. Ask exactly ONE question only if the folder
is genuinely ambiguous (two unrelated events mixed together) — otherwise
decide, say what you decided in one line, and proceed. `create_moment`
spends credits: quote first and state the number, then create unless the
user said not to spend without asking.

## 1. Gather the candidates

- Accept `.jpg .jpeg .png .webp .heic .heif` (case-insensitive). Look one
  level into subfolders. Ignore anything under 40 KB (icons, thumbnails)
  and anything that is clearly not a photograph: screenshots, scans,
  documents, ID cards, receipts, memes, images with a lot of text.
- Read the EXIF/creation date where available (`exiftool`, or Python
  `PIL.Image.getexif()` tag 36867 `DateTimeOriginal`; fall back to the
  file's modified time). Sort candidates chronologically — the film
  plays in that order.
- Bursts: files taken within 3 seconds of each other with the same
  dimensions are one moment. Keep the middle one.

## 2. Choose the photos that belong in the film (max 15)

If there are 15 or fewer usable photos, use them all. Otherwise choose:

1. Spread across time — divide the span into 15 windows and take the
   strongest from each, so the film tells the day/trip in order.
2. Strongest = LOOK at it (use the Read tool on the file; it renders the
   image). Prefer: people and faces, clear subject, good light, some
   variety of framing (wide / medium / close). Drop: blurred, near-black,
   near-duplicates, backs of heads, photos of screens or paper.
3. Keep a mix of orientation; portrait photos suit the 9:16 film best,
   landscape ones are fine (the clip is framed around the subject).
4. Never include images that would fail a content screen: nothing
   suggestive, no weapons, no injuries, no visible brands or logos as the
   subject, no text-heavy frames.

Say which photos you picked and why in ONE short paragraph, not a table
of 15 rows.

## 3. Decide mood and length

- Category: call `list_moment_categories` once. If the user named a mood,
  map it to the closest id (e.g. "our trip" → `travel`, "the game" →
  `football` if the photos show a pitch, `basketball` if a court). If
  not, infer it from what you saw in the photos; "happy_moments" and
  "everyday_life" are the honest defaults for mixed albums.
- Length (`length_s`): unless the user said otherwise —

  | photos | length |
  | --- | --- |
  | 1–3 | 15 |
  | 4–6 | 30 |
  | 7–9 | 45 |
  | 10–12 | 60 |
  | 13–15 | 90 |

  Each photo becomes a 5-second clip; 120 s is for when the user asks
  for it (photos repeat with different camera moves).

## 4. Prepare and upload

Photos go over MCP as base64, so shrink them first — the film is
generated at 480p and upscaled, so anything above 1600 px on the long
edge is wasted bytes. Convert HEIC to JPEG. One way:

```python
from PIL import Image, ImageOps
im = ImageOps.exif_transpose(Image.open(src)).convert("RGB")
im.thumbnail((1600, 1600))
im.save(dst, "JPEG", quality=86, optimize=True)
```

(`pillow-heif` adds HEIC support: `pip install pillow-heif` then
`import pillow_heif; pillow_heif.register_heif_opener()`.)

Then, for each photo in film order, call `upload_photo` with
`{filename, media_type: "image/jpeg", data_base64}` and collect the
returned `post_id`s in that order. Upload sequentially; if one fails,
retry it once, then drop it and say so.

## 5. Quote, then make the film

1. `quote_moment {category, image_post_ids, length_s}` → say the credits
   and how many photos it uses in one line.
2. `create_moment {category, image_post_ids, length_s, title}` — title
   is short and human ("Rome, June 2026", "Sara & Omar's wedding").
3. Poll `get_moment {id}` every 60 seconds. Report only when the
   `stage_label` CHANGES (it is written for people: "Bringing your photos
   to life (4 of 12 clips)", "Composing the soundtrack"…), and stop
   polling after 45 minutes with a clear message. Typical films take
   10–25 minutes; do not tell the user what happens inside.
4. On `done`: give the film's page (`https://reel-mint.com/posts/<post_id>`)
   and the direct `master_url`, plus one line on what it is (mood,
   length, photos used). On `failed`: quote the `error` sentence as is,
   and offer `redesign_moment` (same photos, a fresh pass) — but never
   redesign automatically; it spends credits.

## 6. Afterwards

`list_moments` shows the user's films; `delete_moment` removes one (the
photos and the film stay in the Library). If the user wants a different
mood or length, that is a NEW `create_moment` with the same `post_id`s —
no re-upload needed; keep the ids in your notes for the session.
