CinePrompt Skill
Build CinePrompt prompts and share links directly — no browser needed.
How It Works
- User describes a shot in natural language
- You translate it into a CinePrompt state JSON object
- The
create-share-link.js script inserts it into Supabase and returns a /p/ share link
- User gets the link + prompt text to copy into any AI video tool
Authentication
Requires a CinePrompt API key (Pro subscribers only). Set via:
--api-key cp_xxx flag
CINEPROMPT_API_KEY=cp_xxx env var
Internal/owner use: set CINEPROMPT_SERVICE_KEY env var for direct insert (bypasses Pro check).
Creating a Share Link
echo '<STATE_JSON>' | node <skill>/scripts/create-share-link.js --api-key cp_xxx
Output is JSON: {"url":"https://cineprompt.io/p/abc123","shortCode":"abc123","promptText":"...","mode":"single"}
You can also pass the prompt text explicitly if you've crafted it by hand:
echo '{"state":<STATE_JSON>,"prompt":"Your custom prompt text"}' | node <skill>/scripts/create-share-link.js --api-key cp_xxx
State JSON Structure
{
"mode": "single",
"complexity": "complex",
"subjectType": "character|object|vehicle|creature|landscape|abstract",
"fields": { ... },
"shots": [],
"characters": []
}
Required Top-Level Fields
mode: Always "single" for now (multishot/fm support later)
complexity: "simple" or "complex" — complex unlocks format, camera body, lens, film stock, color science
subjectType: Which subject panel to show
fields: Object mapping field names to values (strings or arrays)
Field Reference
All valid field names and values are in <skill>/field-values.json. Key fields:
Style:
media_type (array): ["cinematic"], ["cinematic","documentary"], etc.
documentary_style: only when documentary is in media_type
genre: only when cinematic is in media_type (array OK)
commercial_type: only when commercial is in media_type
tone (array): ["peaceful"], ["dramatic","moody"]
format: (complex only) "35mm Film", "16mm Film", "DSLR / Mirrorless", etc.
Subject — depends on subjectType:
- landscape:
land_season, land_scale
- character:
char_label, age_range, build, hair_style, hair_color, subject_description, wardrobe, expression, body_language, framing
- creature:
creature_category, creature_label, creature_size, creature_body, creature_skin, creature_description
- object:
obj_description, obj_material, obj_condition, obj_scale
- vehicle:
veh_type, veh_description, veh_era, veh_condition
- abstract:
abs_description, abs_quality, abs_movement
Actions:
movement_type (array): ["walking"], ["running","turning"]
pacing: "in real-time", "in slow motion", "time-lapse", etc.
action_primary: free text describing the primary action
Environment:
setting: "exterior", "interior", "interior to exterior", "exterior to interior"
location_type: "open field, meadow", "urban street", "forest", etc.
custom_location: free text location description
location: free text additional location details
env_time: "golden hour, warm late afternoon light", "night", "dawn", etc.
weather: "clear sky", "overcast", "rain", "fog", etc.
props: free text
env_fg, env_mg, env_bg: foreground/midground/background free text
Cinematography:
shot_type: "establishing shot", "close-up", "wide shot", "medium", etc.
movement: "pull out", "push in", "dolly", "tracking", "static", "orbit", etc.
camera_body: (complex) "ARRI Alexa 65", "RED V-Raptor", "Sony Venice 2", etc.
focal_length: "24mm lens", "35mm lens", "50mm lens", "85mm lens", etc.
lens_brand: (complex) "Cooke S4/i", "ARRI Master Prime", etc.
lens_filter: (complex) "Black Pro-Mist", "Glimmerglass", etc.
dof: "deep focus", "shallow depth of field, bokeh", "tilt shift miniature", etc.
lighting_style: "soft light", "hard light", "high contrast", "silhouette", "backlight", etc.
lighting_type: "daylight", "moonlight", "candlelight", "neon", etc.
key_light, fill_light: (complex) free text
Palette:
color_science: (complex) "ARRI LogC3 flat log footage, ungraded", etc.
film_stock: (complex) "Kodak Portra 400 film colors", "Kodak Vision3 500T film colors", etc.
color_grade: "warm tones", "cool tones", "teal and orange", "desaturated", "black and white", etc.
palette_colors: free text (primary/secondary colors)
skin_tones: free text
Sound:
sfx_environment (array): ["birds singing, nature ambience"], ["city traffic"], ["wind"]
sfx_interior (array): ["room tone"], ["clock ticking"]
sfx_mechanical (array): ["engine"], ["machinery"]
sfx_dramatic (array): ["bass rumble"], ["heartbeat"]
ambient: free text custom ambient/SFX
music_genre: "orchestral score", "electronic score", "jazz score", etc.
music_mood: "tense, building", "melancholic, sparse", etc.
music: free text custom music description
Translation Guide
When a user describes a shot, map their words to CinePrompt fields:
| User says |
CinePrompt field(s) |
| "golden hour" |
env_time: "golden hour, warm late afternoon light" |
| "pulling back" / "pulling out" |
movement: "pull out" |
| "birds chirping" |
sfx_environment: ["birds singing, nature ambience"] |
| "empty land" / "open field" |
subjectType: "landscape", location_type: "open field, meadow" |
| "cinematic documentary" |
media_type: ["cinematic", "documentary"] |
| "establishing shot" |
shot_type: "establishing shot" |
| "bokeh" / "blurry background" |
dof: "shallow depth of field, bokeh" |
| "everything in focus" |
dof: "deep focus" |
| "handheld feel" |
movement: "handheld" |
| "slow motion" |
pacing: "in slow motion" |
| "warm look" |
color_grade: "warm tones" |
| "shot on film" |
format: "35mm Film" (complex) |
Picking the Right Complexity
- Simple: Use for most shots. Covers style, subject, actions, environment, basic cinematography, palette, sound.
- Complex: Use when the user specifies camera body, lens brand, film stock, color science, lens filters, or custom lighting rigs. These fields only appear in complex mode.
Example
User: "A weathered fisherman standing on a dock at dawn, fog rolling in, handheld close-up, desaturated"
{
"mode": "single",
"complexity": "simple",
"subjectType": "character",
"fields": {
"media_type": ["cinematic"],
"tone": ["moody"],
"char_label": "A weathered fisherman",
"subject_description": "Deep wrinkles, sun-damaged skin, salt-crusted hands",
"expression": "stoic, gazing out to sea",
"pacing": "in real-time",
"setting": "exterior",
"location_type": "dock, pier",
"env_time": "dawn, first light",
"weather": "fog",
"shot_type": "close-up",
"movement": "handheld",
"dof": "shallow depth of field, bokeh",
"lighting_style": "soft light",
"lighting_type": "daylight",
"color_grade": "desaturated",
"sfx_environment": ["waves crashing, water ambience"]
},
"shots": [],
"characters": []
}
Then pipe it to the script and send the user the resulting URL.
Batch Workflow
For multi-shot sequences, create each shot as a separate share link. Present them as a numbered list with URLs. The user can then open each, tweak, and copy prompts into their video tool of choice.
Notes
- The script auto-generates prompt text matching CinePrompt's frontend logic (section ordering, merge rules, sentence assembly)
- You can override with
--prompt if you want to hand-craft the text
- Share links restore the full form state including complexity tab and subject type
- Valid field values: check
<skill>/field-values.json for exact button values
- Array fields (media_type, tone, sfx_*, movement_type) accept multiple values
- Free text fields (custom_location, subject_description, action_primary, etc.) accept any string
1---2name: cineprompt3description: Build CinePrompt video prompts and share links without a browser. Converts natural language shot descriptions into structured CinePrompt state, generates prompt text, and creates shareable links (cineprompt.io/p/...). Use when asked to create video prompts, build CinePrompt links, describe shots for AI video generation, or batch-create prompts for a sequence of shots.4---56# CinePrompt Skill78Build CinePrompt prompts and share links directly — no browser needed.910## How It Works11121. User describes a shot in natural language132. You translate it into a CinePrompt state JSON object143. The `create-share-link.js` script inserts it into Supabase and returns a `/p/` share link154. User gets the link + prompt text to copy into any AI video tool1617## Authentication1819Requires a CinePrompt API key (Pro subscribers only). Set via:20- `--api-key cp_xxx` flag21- `CINEPROMPT_API_KEY=cp_xxx` env var2223Internal/owner use: set `CINEPROMPT_SERVICE_KEY` env var for direct insert (bypasses Pro check).2425## Creating a Share Link2627```bash28echo '<STATE_JSON>' | node <skill>/scripts/create-share-link.js --api-key cp_xxx29```3031Output is JSON: `{"url":"https://cineprompt.io/p/abc123","shortCode":"abc123","promptText":"...","mode":"single"}`3233You can also pass the prompt text explicitly if you've crafted it by hand:3435```bash36echo '{"state":<STATE_JSON>,"prompt":"Your custom prompt text"}' | node <skill>/scripts/create-share-link.js --api-key cp_xxx37```3839## State JSON Structure4041```json42{43 "mode": "single",44 "complexity": "complex",45 "subjectType": "character|object|vehicle|creature|landscape|abstract",46 "fields": { ... },47 "shots": [],48 "characters": []49}50```5152### Required Top-Level Fields5354- `mode`: Always `"single"` for now (multishot/fm support later)55- `complexity`: `"simple"` or `"complex"` — complex unlocks format, camera body, lens, film stock, color science56- `subjectType`: Which subject panel to show57- `fields`: Object mapping field names to values (strings or arrays)5859### Field Reference6061All valid field names and values are in `<skill>/field-values.json`. Key fields:6263**Style:**64- `media_type` (array): `["cinematic"]`, `["cinematic","documentary"]`, etc.65- `documentary_style`: only when documentary is in media_type66- `genre`: only when cinematic is in media_type (array OK)67- `commercial_type`: only when commercial is in media_type68- `tone` (array): `["peaceful"]`, `["dramatic","moody"]`69- `format`: (complex only) `"35mm Film"`, `"16mm Film"`, `"DSLR / Mirrorless"`, etc.7071**Subject — depends on subjectType:**72- landscape: `land_season`, `land_scale`73- character: `char_label`, `age_range`, `build`, `hair_style`, `hair_color`, `subject_description`, `wardrobe`, `expression`, `body_language`, `framing`74- creature: `creature_category`, `creature_label`, `creature_size`, `creature_body`, `creature_skin`, `creature_description`75- object: `obj_description`, `obj_material`, `obj_condition`, `obj_scale`76- vehicle: `veh_type`, `veh_description`, `veh_era`, `veh_condition`77- abstract: `abs_description`, `abs_quality`, `abs_movement`7879**Actions:**80- `movement_type` (array): `["walking"]`, `["running","turning"]`81- `pacing`: `"in real-time"`, `"in slow motion"`, `"time-lapse"`, etc.82- `action_primary`: free text describing the primary action8384**Environment:**85- `setting`: `"exterior"`, `"interior"`, `"interior to exterior"`, `"exterior to interior"`86- `location_type`: `"open field, meadow"`, `"urban street"`, `"forest"`, etc.87- `custom_location`: free text location description88- `location`: free text additional location details89- `env_time`: `"golden hour, warm late afternoon light"`, `"night"`, `"dawn"`, etc.90- `weather`: `"clear sky"`, `"overcast"`, `"rain"`, `"fog"`, etc.91- `props`: free text92- `env_fg`, `env_mg`, `env_bg`: foreground/midground/background free text9394**Cinematography:**95- `shot_type`: `"establishing shot"`, `"close-up"`, `"wide shot"`, `"medium"`, etc.96- `movement`: `"pull out"`, `"push in"`, `"dolly"`, `"tracking"`, `"static"`, `"orbit"`, etc.97- `camera_body`: (complex) `"ARRI Alexa 65"`, `"RED V-Raptor"`, `"Sony Venice 2"`, etc.98- `focal_length`: `"24mm lens"`, `"35mm lens"`, `"50mm lens"`, `"85mm lens"`, etc.99- `lens_brand`: (complex) `"Cooke S4/i"`, `"ARRI Master Prime"`, etc.100- `lens_filter`: (complex) `"Black Pro-Mist"`, `"Glimmerglass"`, etc.101- `dof`: `"deep focus"`, `"shallow depth of field, bokeh"`, `"tilt shift miniature"`, etc.102- `lighting_style`: `"soft light"`, `"hard light"`, `"high contrast"`, `"silhouette"`, `"backlight"`, etc.103- `lighting_type`: `"daylight"`, `"moonlight"`, `"candlelight"`, `"neon"`, etc.104- `key_light`, `fill_light`: (complex) free text105106**Palette:**107- `color_science`: (complex) `"ARRI LogC3 flat log footage, ungraded"`, etc.108- `film_stock`: (complex) `"Kodak Portra 400 film colors"`, `"Kodak Vision3 500T film colors"`, etc.109- `color_grade`: `"warm tones"`, `"cool tones"`, `"teal and orange"`, `"desaturated"`, `"black and white"`, etc.110- `palette_colors`: free text (primary/secondary colors)111- `skin_tones`: free text112113**Sound:**114- `sfx_environment` (array): `["birds singing, nature ambience"]`, `["city traffic"]`, `["wind"]`115- `sfx_interior` (array): `["room tone"]`, `["clock ticking"]`116- `sfx_mechanical` (array): `["engine"]`, `["machinery"]`117- `sfx_dramatic` (array): `["bass rumble"]`, `["heartbeat"]`118- `ambient`: free text custom ambient/SFX119- `music_genre`: `"orchestral score"`, `"electronic score"`, `"jazz score"`, etc.120- `music_mood`: `"tense, building"`, `"melancholic, sparse"`, etc.121- `music`: free text custom music description122123## Translation Guide124125When a user describes a shot, map their words to CinePrompt fields:126127| User says | CinePrompt field(s) |128|-----------|---------------------|129| "golden hour" | `env_time: "golden hour, warm late afternoon light"` |130| "pulling back" / "pulling out" | `movement: "pull out"` |131| "birds chirping" | `sfx_environment: ["birds singing, nature ambience"]` |132| "empty land" / "open field" | `subjectType: "landscape"`, `location_type: "open field, meadow"` |133| "cinematic documentary" | `media_type: ["cinematic", "documentary"]` |134| "establishing shot" | `shot_type: "establishing shot"` |135| "bokeh" / "blurry background" | `dof: "shallow depth of field, bokeh"` |136| "everything in focus" | `dof: "deep focus"` |137| "handheld feel" | `movement: "handheld"` |138| "slow motion" | `pacing: "in slow motion"` |139| "warm look" | `color_grade: "warm tones"` |140| "shot on film" | `format: "35mm Film"` (complex) |141142## Picking the Right Complexity143144- **Simple**: Use for most shots. Covers style, subject, actions, environment, basic cinematography, palette, sound.145- **Complex**: Use when the user specifies camera body, lens brand, film stock, color science, lens filters, or custom lighting rigs. These fields only appear in complex mode.146147## Example148149User: "A weathered fisherman standing on a dock at dawn, fog rolling in, handheld close-up, desaturated"150151```json152{153 "mode": "single",154 "complexity": "simple",155 "subjectType": "character",156 "fields": {157 "media_type": ["cinematic"],158 "tone": ["moody"],159 "char_label": "A weathered fisherman",160 "subject_description": "Deep wrinkles, sun-damaged skin, salt-crusted hands",161 "expression": "stoic, gazing out to sea",162 "pacing": "in real-time",163 "setting": "exterior",164 "location_type": "dock, pier",165 "env_time": "dawn, first light",166 "weather": "fog",167 "shot_type": "close-up",168 "movement": "handheld",169 "dof": "shallow depth of field, bokeh",170 "lighting_style": "soft light",171 "lighting_type": "daylight",172 "color_grade": "desaturated",173 "sfx_environment": ["waves crashing, water ambience"]174 },175 "shots": [],176 "characters": []177}178```179180Then pipe it to the script and send the user the resulting URL.181182## Batch Workflow183184For multi-shot sequences, create each shot as a separate share link. Present them as a numbered list with URLs. The user can then open each, tweak, and copy prompts into their video tool of choice.185186## Notes187188- The script auto-generates prompt text matching CinePrompt's frontend logic (section ordering, merge rules, sentence assembly)189- You can override with `--prompt` if you want to hand-craft the text190- Share links restore the full form state including complexity tab and subject type191- Valid field values: check `<skill>/field-values.json` for exact button values192- Array fields (media_type, tone, sfx_*, movement_type) accept multiple values193- Free text fields (custom_location, subject_description, action_primary, etc.) accept any string