---
name: "growingupvideo"
description: "Turn 2-24 photos of one person, a couple, or a pet into an AI video that morphs through the years. Trigger phrases: growing up video, aging video, photos to video, birthday video from photos, time-lapse of my kid."
metadata: { "includeInPrompt": true }
tagline: "Make a growing-up video from photos: hand over the photos, the skill crops and uploads them, and returns a link to finish and pay."
catalog_auth: "api_key (growingupvideo)"
catalog_hosts: ["growingupvideo.com", "videomorph-bucket83908e77-zq6mhuhx0rjs.s3-accelerate.amazonaws.com"]
---

# GrowingUpVideo

## Purpose
GrowingUpVideo (https://growingupvideo.com) turns photos of the same person, couple, or pet at different ages into a short AI video that morphs smoothly from one photo to the next. People use it for birthdays, graduations, weddings, bar/bat mitzvahs, anniversaries, and pet memorials.

Use this skill when the user wants a video that shows someone growing up or changing over the years from their photos. Do not use it for slideshows, single-photo animation, or editing an existing video.

## Tooling
`bin/growingup.py` is a Python CLI that talks to the GrowingUpVideo API with the user's key. Run it with `python3`.

**Install Pillow first (`pip install Pillow`).** Without it the script uploads whatever it is given: nothing is cropped, the 600px floor is not checked, the 35% crop guard below does not run, and only `.jpg`/`.jpeg` files are accepted at all. Every protection in this skill that concerns the photos themselves depends on it.

```
python3 bin/growingup.py create [--subject person|couple|pet] [--ratio 16:9|9:16|1:1]   -> job_id
python3 bin/growingup.py preview <job_id> <photo>...  [--ratio R] [--out DIR]           -> cropped files, nothing sent
python3 bin/growingup.py upload  <job_id> <photo>...  [--no-crop] [--out DIR]
python3 bin/growingup.py sort    <job_id>                                               # needs a credit; skips itself without one
python3 bin/growingup.py status  <job_id>
python3 bin/growingup.py link    <job_id>                                               -> order-page URL
python3 bin/growingup.py credits
```

The key cannot pay, start a render, redo a clip, or edit a job. Those need the website, which is deliberate: the user always approves the spend themselves.

### The flow
1. Collect the photos from the user (chat attachments, or files already in the workspace). Run the checks in Operating Rules.
2. **Choose the aspect ratio from the photos, not from habit.** Look at them first. Mostly portrait (phone photos) -> `9:16`. Mostly landscape -> `16:9`. Square or mixed -> `1:1`. Always pass `--ratio`: omitting it picks `16:9`, the destructive choice for the phone photos most people bring. This matters more than any other choice you make: see Cropping below.
3. `create` with the subject type and that ratio.
4. `preview` the photos. **Open the resulting files and look at them.** If a head, a face, or most of a body is cut off, run `create` again with a different ratio and preview again. Show the previews to the user and ask before continuing.
5. `upload` the photos.
6. `sort`. **The age-sort needs a credit, so a first-time user cannot run it yet, and that is normal.** `sort` checks for you: with no credit it prints `SKIPPED` and the order-page link, because the website runs the sort itself right after payment. Skipping costs the user nothing. With a credit it starts, and you poll `status` every few seconds until `sort_status` is `SORTED`. Give up after about two minutes and hand over the link anyway; the user can order the photos by hand. `FAILED` is survivable the same way. A `409` means a sort is already running, so keep polling instead of calling `sort` again. Read the order back to the user.
7. `link`, and open that URL in your browser or hand it to the user. They pick the package, pay, and press Generate there. State the price before they pay.
8. The video renders in 5-10 minutes. The user downloads the MP4 from the job page and finds it later under "My Videos". To change a transition they did not like, send them to the Redos page on the website.

### Cropping
The photos are cropped to the job's aspect ratio before upload, taking the largest box that fits. Horizontally it is centred. Vertically it sits high: a third of what has to go comes off the top and two thirds off the bottom, so a head survives and the feet are given up instead. That is the trade a person makes when they drag the box on the website, and nobody is here to drag it.

A wrong ratio silently destroys the photo. A 1200x1600 portrait cropped to 16:9 comes out 1200x675: **58% of the height is gone**, so a full-body photo becomes a head-and-shoulders crop, which is the single most common cause of a bad result.

**`preview` and `upload` refuse a crop that discards more than 35% of a photo**, name the files, and tell you which ratio fits the set best. This is a hard check, not a warning: there is no crop-review screen on the website before payment for a job created this way, so nothing downstream would catch it. Pass `--allow-heavy-crop` to accept the crop anyway, on both `preview` and `upload`, since the flag is per command and is not remembered.

**If the user chose the ratio on purpose, ask before switching it.** Some legitimate requests trip the guard: landscape photos cropped to `1:1` for an Instagram feed post lose about 44%. The suggested ratio is a suggestion, not a correction, so put it to the user rather than silently overriding what they asked for.

That check only catches the gross case. Framing can still be wrong inside the 35%, so always `preview`, open the files, and show them to the user before you `upload`. `--no-crop` uploads the original framing instead, which is right when the photos already match the job's ratio; note it skips the 35% check too, since nothing is being cropped.

## Auth
- Provider id: `growingupvideo`. Type: API key. Header: `Authorization: Bearer guv_...`.
- The script reads it from the `GROWINGUPVIDEO_API_KEY` environment variable. **Export the stored credential into that variable before running any command**, or the first one exits telling you the key is missing.
- The user creates the key at **https://growingupvideo.com/connect-muse** while signed in to their GrowingUpVideo account, and pastes it into your secure credential flow. Never ask for it in chat, and never ask for their password.
- If a call returns 401, the key was revoked or mistyped. Send the user back to `/connect-muse` for a new one. Each account may hold 5 keys at a time.
- Allowed hosts: `growingupvideo.com` (API), `videomorph-bucket83908e77-zq6mhuhx0rjs.s3-accelerate.amazonaws.com` (photo upload). The key is sent only to the first; the upload links carry their own signature and expire in an hour.
- Status check: `python3 bin/growingup.py credits`. It prints the balance when the key is good.
- Full API reference, if you need to call the endpoints directly: https://growingupvideo.com/muse-api/

## Operating Rules
1. Photo count: at least 2, at most 24. A 5-photo "First Taste" run is the cheapest way to try it, but upload **at most 5 photos** in that case: the connector cannot trim a job afterwards, and the website will stop and make the user do it.
2. File types: JPEG or PNG. Convert HEIC or WebP first. Without Pillow the script takes JPEG only.
3. Resolution: after cropping, every photo must be at least 600 px on its shorter side. The script refuses smaller ones and names the file.
4. One subject: the same person in every photo (or the same two people, or the same pet). Different people in the set produce a bad video.
5. Spread across ages. Roughly even gaps (for example baby, toddler, school age, teen, adult) morph better than five photos from the same year.
6. Prefer full-body or scene shots with a clear, well-lit face looking roughly at the camera. Tight face crops, sunglasses, masks, hard profiles, and blurry photos hurt the result. Do not include photos with several people in the frame unless it is a couple video.
7. Pricing (USD, one-time per video, no subscription): First Taste $4.90 for up to 5 photos (once per account); Standard $9.90 / $13.90 / $17.90 / $21.90 / $25.90 for up to 8 / 12 / 16 / 20 / 24 photos; Premium (higher face fidelity) $19.90 / $28.90 / $37.90 / $46.90 / $55.90 for up to 8 / 12 / 16 / 20 / 24 photos. Premium is not offered for couple videos. Always show the user the price before they pay, and never pay without their explicit approval.
8. The user pays on the website. Do not enter card details yourself unless the user has approved that purchase through your payment flow.
9. Privacy: uploaded photos and finished videos are deleted from the service 30 days after they are created. Photos are processed by third-party AI providers, listed in the privacy policy. Face comparison runs on couple videos only, to keep both people correctly positioned across a transition; no facial template is stored and it is not used to identify anyone. Privacy policy: https://growingupvideo.com/legal/privacy/ . Terms: https://growingupvideo.com/legal/terms/
10. If a photo is rejected by the content filter, or anything is unclear, stop and ask the user rather than guessing.
11. To update this skill, the user pastes the install prompt from https://growingupvideo.com/muse/ again.

## Files
- SKILL.md
- bin/growingup.py

## Maturity
Beta (v1, 2026-09-22). API integration for create, upload, sort and status. Payment and rendering stay on the website.
