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.
Build CinePrompt prompts and share links directly — no browser needed.
create-share-link.js script inserts it into Supabase and returns a /p/ share linkRequires a CinePrompt API key (Pro subscribers only). Set via:
--api-key cp_xxx flagCINEPROMPT_API_KEY=cp_xxx env varInternal/owner use: set CINEPROMPT_SERVICE_KEY env var for direct insert (bypasses Pro check).
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
{
"mode": "single",
"complexity": "complex",
"subjectType": "character|object|vehicle|creature|landscape|abstract",
"fields": { ... },
"shots": [],
"characters": []
}
mode: Always "single" for now (multishot/fm support later)complexity: "simple" or "complex" — complex unlocks format, camera body, lens, film stock, color sciencesubjectType: Which subject panel to showfields: Object mapping field names to values (strings or arrays)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_typegenre: only when cinematic is in media_type (array OK)commercial_type: only when commercial is in media_typetone (array): ["peaceful"], ["dramatic","moody"]format: (complex only) "35mm Film", "16mm Film", "DSLR / Mirrorless", etc.Subject — depends on subjectType:
land_season, land_scalechar_label, age_range, build, hair_style, hair_color, subject_description, wardrobe, expression, body_language, framingcreature_category, creature_label, creature_size, creature_body, creature_skin, creature_descriptionobj_description, obj_material, obj_condition, obj_scaleveh_type, veh_description, veh_era, veh_conditionabs_description, abs_quality, abs_movementActions:
movement_type (array): ["walking"], ["running","turning"]pacing: "in real-time", "in slow motion", "time-lapse", etc.action_primary: free text describing the primary actionEnvironment:
setting: "exterior", "interior", "interior to exterior", "exterior to interior"location_type: "open field, meadow", "urban street", "forest", etc.custom_location: free text location descriptionlocation: free text additional location detailsenv_time: "golden hour, warm late afternoon light", "night", "dawn", etc.weather: "clear sky", "overcast", "rain", "fog", etc.props: free textenv_fg, env_mg, env_bg: foreground/midground/background free textCinematography:
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 textPalette:
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 textSound:
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/SFXmusic_genre: "orchestral score", "electronic score", "jazz score", etc.music_mood: "tense, building", "melancholic, sparse", etc.music: free text custom music descriptionWhen 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) |
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.
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.
--prompt if you want to hand-craft the text<skill>/field-values.json for exact button values