{"id":2648,"date":"2026-04-17T08:37:48","date_gmt":"2026-04-17T08:37:48","guid":{"rendered":"https:\/\/primetoolhub.com\/?page_id=2648"},"modified":"2026-07-13T14:35:33","modified_gmt":"2026-07-13T14:35:33","slug":"ai-cinematic-prompt-generator","status":"publish","type":"page","link":"https:\/\/schoolict.net\/tools\/ai-cinematic-prompt-generator\/","title":{"rendered":"AI Cinematic Prompt Generator | Ultra-Detailed Prompts for Midjourney, Grok, Runway &amp; More"},"content":{"rendered":"<div class=\"pth-hero-section\">\n<div class=\"pth-hero-content\">\n<h2>Free AI Cinematic Prompt Generator | Ultra-Detailed Prompts for Midjourney, Grok, Runway &#038; More<\/h2>\n<p>Build ultra-detailed cinematic prompts in seconds with the Free AI Cinematic Prompt Generator. Multi-language input, global character vault, 20+ AI targets, advanced cinematography controls, and export-ready prompts for Midjourney, Grok, Runway, and more. 100% offline after load.<\/p>\n<div id=\"pth-toc-placeholder\"><\/div>\n<\/p>\n<\/div>\n<div class=\"pth-hero-image\">\n\t<img data-no-lazy=\"1\"\n         src=\"https:\/\/schoolict.net\/tools\/wp-content\/uploads\/2026\/04\/AI-cinematic-prompt-generator-800x447.jpeg\"\n         width=\"800\"\n         height=\"447\"\n         alt=\"AI cinematic prompt generator\"\n         fetchpriority=\"high\"\n         loading=\"eager\"\n         decoding=\"async\"\n         style=\"width:100%; height:auto; display:block;\">\n  <\/div>\n<\/div>\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Table of Contents<\/h2><nav><ul><li><a href=\"#\ud83d\udd34-building-a-scene-the-way-a-dp-would\">\ud83d\udd34\u00a0Building a scene the way a DP would<\/a><\/li><li><a href=\"#\ud83d\udfe1-the-shot-list-is-where-this-earns-its-keep\">\ud83d\udfe1\u00a0The shot list is where this earns its keep<\/a><\/li><li><a href=\"#\ud83d\udfe2-negatives-weights-and-where-this-stops\">\ud83d\udfe2\u00a0Negatives, weights, and where this stops<\/a><\/li><\/ul><\/nav><\/div>\n\n\n<!-- LSCACHE_DISABLE -->\r\n<div id=\"pth-cine-studio-wrapper\">\r\n<style>\r\n#pth-cine-studio-wrapper{font-family:'Inter',system-ui,-apple-system,sans-serif;max-width:1180px;margin:0 auto;box-sizing:border-box;background:#f8fafc;padding:20px;border-radius:18px;color:#0f172a}\r\n#pth-cine-studio-wrapper.pth-cine-full{max-width:1700px}\r\n#pth-cine-studio-wrapper *{box-sizing:border-box}\r\n#pth-cine-studio-wrapper .pth-cine-top{background:#fff;border:1px solid #e2e8f0;border-radius:14px;padding:18px 22px;margin-bottom:16px;box-shadow:0 4px 10px rgba(0,0,0,.04)}\r\n#pth-cine-studio-wrapper .pth-cine-title{font-size:1.5rem;font-weight:800;color:#0f172a;margin:0;display:flex;align-items:center;gap:10px}\r\n#pth-cine-studio-wrapper .pth-cine-sub{font-size:.9rem;color:#475569;font-weight:500;margin-top:4px}\r\n#pth-cine-studio-wrapper .pth-cine-bar{display:flex;flex-wrap:wrap;gap:9px;align-items:center;margin-top:14px}\r\n#pth-cine-studio-wrapper .pth-cine-btn{background:#2563eb;color:#fff;border:none;border-radius:8px;padding:10px 16px;font-weight:700;font-size:.88rem;cursor:pointer;transition:.2s;font-family:inherit}\r\n#pth-cine-studio-wrapper .pth-cine-btn:hover{background:#1d4ed8}\r\n#pth-cine-studio-wrapper .pth-cine-btn.pth-cine-ghost{background:#f1f5f9;color:#334155;border:1px solid #cbd5e1}\r\n#pth-cine-studio-wrapper .pth-cine-btn.pth-cine-ghost:hover{background:#e2e8f0}\r\n#pth-cine-studio-wrapper .pth-cine-btn.pth-cine-green{background:#047857}\r\n#pth-cine-studio-wrapper .pth-cine-btn.pth-cine-green:hover{background:#065f46}\r\n#pth-cine-studio-wrapper .pth-cine-tabs{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:16px}\r\n#pth-cine-studio-wrapper .pth-cine-tab{background:#fff;border:1px solid #cbd5e1;color:#334155;font-weight:700;font-size:.88rem;padding:10px 15px;border-radius:10px;cursor:pointer;transition:.2s;font-family:inherit}\r\n#pth-cine-studio-wrapper .pth-cine-tab:hover{border-color:#2563eb;color:#2563eb}\r\n#pth-cine-studio-wrapper .pth-cine-tab.pth-cine-on{background:#2563eb;border-color:#2563eb;color:#fff}\r\n#pth-cine-studio-wrapper .pth-cine-panel{display:none}\r\n#pth-cine-studio-wrapper .pth-cine-panel.pth-cine-show{display:block}\r\n#pth-cine-studio-wrapper .pth-cine-card{background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:18px;margin-bottom:16px;box-shadow:0 4px 6px -1px rgba(0,0,0,.02)}\r\n#pth-cine-studio-wrapper .pth-cine-h{font-size:1rem;font-weight:800;color:#1e293b;margin:0 0 14px;padding-bottom:11px;border-bottom:2px solid #e2e8f0;display:flex;align-items:center;gap:8px;justify-content:space-between;flex-wrap:wrap}\r\n#pth-cine-studio-wrapper .pth-cine-h span.pth-cine-hl{display:flex;align-items:center;gap:8px}\r\n#pth-cine-studio-wrapper label{font-size:.8rem;font-weight:700;color:#334155;display:block;margin-bottom:5px}\r\n#pth-cine-studio-wrapper input[type=text],#pth-cine-studio-wrapper textarea,#pth-cine-studio-wrapper select{width:100%;padding:9px 11px;border:1px solid #cbd5e1;border-radius:8px;font-size:.88rem;font-family:inherit;color:#0f172a;background:#fff;outline:none;transition:.2s}\r\n#pth-cine-studio-wrapper input:focus,#pth-cine-studio-wrapper textarea:focus,#pth-cine-studio-wrapper select:focus{border-color:#2563eb;box-shadow:0 0 0 3px rgba(37,99,235,.12)}\r\n#pth-cine-studio-wrapper textarea{min-height:72px;resize:vertical;line-height:1.55}\r\n#pth-cine-studio-wrapper .pth-cine-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px}\r\n#pth-cine-studio-wrapper .pth-cine-out{background:#0f172a;color:#e2e8f0;border-radius:10px;padding:14px 16px;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:.85rem;line-height:1.65;white-space:pre-wrap;word-break:break-word;min-height:70px}\r\n#pth-cine-studio-wrapper .pth-cine-outhead{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;gap:10px;flex-wrap:wrap}\r\n#pth-cine-studio-wrapper .pth-cine-outhead b{font-size:.8rem;color:#334155;text-transform:uppercase;letter-spacing:.5px;font-weight:800}\r\n#pth-cine-studio-wrapper .pth-cine-mini{background:#f1f5f9;color:#334155;border:1px solid #cbd5e1;border-radius:7px;padding:6px 12px;font-weight:700;font-size:.78rem;cursor:pointer;font-family:inherit}\r\n#pth-cine-studio-wrapper .pth-cine-mini:hover{background:#e2e8f0}\r\n#pth-cine-studio-wrapper .pth-cine-mini.pth-cine-danger{color:#b91c1c;border-color:#fecaca;background:#fef2f2}\r\n#pth-cine-studio-wrapper .pth-cine-block{margin-bottom:16px}\r\n#pth-cine-studio-wrapper .pth-cine-shot{border:1px solid #e2e8f0;border-radius:10px;padding:13px 15px;background:#f8fafc;margin-bottom:10px}\r\n#pth-cine-studio-wrapper .pth-cine-shothead{display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:8px}\r\n#pth-cine-studio-wrapper .pth-cine-shothead b{color:#0f172a;font-size:.9rem}\r\n#pth-cine-studio-wrapper .pth-cine-chip{display:inline-block;font-size:.72rem;font-weight:800;padding:2px 9px;border-radius:20px;background:#eff6ff;color:#1d4ed8;margin-left:7px}\r\n#pth-cine-studio-wrapper .pth-cine-negs{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:13px}\r\n#pth-cine-studio-wrapper .pth-cine-negbox{border:1px solid #e2e8f0;border-radius:10px;padding:13px;background:#f8fafc}\r\n#pth-cine-studio-wrapper .pth-cine-negbox h4{margin:0 0 9px;font-size:.82rem;color:#334155;font-weight:800;text-transform:uppercase;letter-spacing:.4px}\r\n#pth-cine-studio-wrapper .pth-cine-chk{display:flex;align-items:center;gap:7px;font-size:.83rem;color:#334155;font-weight:600;margin-bottom:6px;cursor:pointer}\r\n#pth-cine-studio-wrapper .pth-cine-metrics{display:flex;flex-wrap:wrap;gap:11px;margin-top:12px}\r\n#pth-cine-studio-wrapper .pth-cine-metric{flex:1;min-width:110px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:12px;text-align:center}\r\n#pth-cine-studio-wrapper .pth-cine-metric b{display:block;font-size:1.4rem;color:#2563eb;font-weight:800}\r\n#pth-cine-studio-wrapper .pth-cine-metric span{font-size:.72rem;color:#475569;font-weight:700;text-transform:uppercase;letter-spacing:.4px}\r\n#pth-cine-studio-wrapper table.pth-cine-tbl{width:100%;border-collapse:collapse;font-size:.85rem}\r\n#pth-cine-studio-wrapper table.pth-cine-tbl th{background:#f1f5f9;color:#1e293b;font-weight:800;text-align:left;padding:10px 12px;border-bottom:2px solid #e2e8f0;position:sticky;top:0}\r\n#pth-cine-studio-wrapper table.pth-cine-tbl td{padding:10px 12px;border-bottom:1px solid #e2e8f0;color:#334155;line-height:1.55}\r\n#pth-cine-studio-wrapper table.pth-cine-tbl tr:hover td{background:#f8fafc}\r\n#pth-cine-studio-wrapper .pth-cine-tblwrap{max-height:520px;overflow:auto;border:1px solid #e2e8f0;border-radius:10px}\r\n#pth-cine-studio-wrapper .pth-cine-hint{font-size:.82rem;color:#475569;margin-top:9px;line-height:1.55}\r\n#pth-cine-studio-wrapper .pth-cine-note{background:#eff6ff;border:1px solid #bfdbfe;color:#1e3a8a;font-size:.83rem;font-weight:600;padding:11px 14px;border-radius:8px;margin-top:12px;line-height:1.55}\r\n#pth-cine-studio-wrapper .pth-cine-xlink{color:#1d4ed8;font-weight:700;text-decoration:none}\r\n#pth-cine-studio-wrapper .pth-cine-xlink:hover{text-decoration:underline}\r\n#pth-cine-studio-wrapper .pth-cine-toast{position:fixed;bottom:22px;right:22px;background:#0f172a;color:#fff;font-weight:700;font-size:.86rem;padding:12px 20px;border-radius:9px;box-shadow:0 10px 30px rgba(0,0,0,.3);z-index:99999;opacity:0;transform:translateY(10px);transition:.3s;pointer-events:none}\r\n#pth-cine-studio-wrapper .pth-cine-toast.pth-cine-tshow{opacity:1;transform:translateY(0)}\r\n@media(max-width:768px){#pth-cine-studio-wrapper{padding:14px}}\r\n<\/style>\r\n\r\n<div class=\"pth-cine-top\">\r\n  <h2 class=\"pth-cine-title\">\ud83c\udfac Cinematic Prompt Studio Pro<\/h2>\r\n  <div class=\"pth-cine-sub\">Build film-grade prompts for image and video AI: a scene builder with real cinematography controls, a multi-shot sequence planner, per-platform formatting, a negative-prompt lab, and a cinematography reference. 100% offline \u2014 no API key needed.<\/div>\r\n  <div class=\"pth-cine-bar\">\r\n    <button class=\"pth-cine-btn\" id=\"pth-cine-gen\">\ud83c\udfac Generate<\/button>\r\n    <button class=\"pth-cine-btn pth-cine-ghost\" id=\"pth-cine-sample\">\ud83d\udca1 Load Sample<\/button>\r\n    <button class=\"pth-cine-btn pth-cine-ghost\" id=\"pth-cine-full\">\u26f6 Full Width<\/button>\r\n    <button class=\"pth-cine-btn pth-cine-ghost\" id=\"pth-cine-clear\">\ud83d\uddd1\ufe0f Clear<\/button>\r\n  <\/div>\r\n<\/div>\r\n\r\n<div class=\"pth-cine-tabs\" role=\"tablist\">\r\n  <button class=\"pth-cine-tab pth-cine-on\" data-tab=\"scene\">\ud83c\udfac Scene Builder<\/button>\r\n  <button class=\"pth-cine-tab\" data-tab=\"shots\">\ud83c\udfa5 Shot List<\/button>\r\n  <button class=\"pth-cine-tab\" data-tab=\"platform\">\ud83c\udfaf Platform Formatter<\/button>\r\n  <button class=\"pth-cine-tab\" data-tab=\"neg\">\ud83d\udeab Negative &amp; Weight Lab<\/button>\r\n  <button class=\"pth-cine-tab\" data-tab=\"ref\">\ud83d\udcd6 Cinematography Reference<\/button>\r\n<\/div>\r\n\r\n<!-- TAB 1 -->\r\n<div class=\"pth-cine-panel pth-cine-show\" id=\"pth-cine-panel-scene\">\r\n  <div class=\"pth-cine-card\">\r\n    <div class=\"pth-cine-h\"><span class=\"pth-cine-hl\">\ud83c\udf0d Subject &amp; World<\/span><\/div>\r\n    <div class=\"pth-cine-block\">\r\n      <label for=\"pth-cine-subject\">Subject \/ character<\/label>\r\n      <input type=\"text\" id=\"pth-cine-subject\" placeholder=\"a weathered lighthouse keeper in a wool coat\">\r\n    <\/div>\r\n    <div class=\"pth-cine-block\">\r\n      <label for=\"pth-cine-setting\">Setting \/ world<\/label>\r\n      <input type=\"text\" id=\"pth-cine-setting\" placeholder=\"a storm-battered cliff at the edge of the North Sea\">\r\n    <\/div>\r\n    <div class=\"pth-cine-block\">\r\n      <label for=\"pth-cine-action\">Action \/ story beat<\/label>\r\n      <textarea id=\"pth-cine-action\" placeholder=\"he lifts a lantern against the wind, searching the black water for a signal\"><\/textarea>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"pth-cine-card\">\r\n    <div class=\"pth-cine-h\"><span class=\"pth-cine-hl\">\ud83c\udfa5 Camera &amp; Look<\/span><\/div>\r\n    <div class=\"pth-cine-grid\">\r\n      <div><label for=\"pth-cine-shot\">Shot type<\/label><select id=\"pth-cine-shot\"><\/select><\/div>\r\n      <div><label for=\"pth-cine-move\">Camera movement<\/label><select id=\"pth-cine-move\"><\/select><\/div>\r\n      <div><label for=\"pth-cine-lens\">Lens<\/label><select id=\"pth-cine-lens\"><\/select><\/div>\r\n      <div><label for=\"pth-cine-light\">Lighting<\/label><select id=\"pth-cine-light\"><\/select><\/div>\r\n      <div><label for=\"pth-cine-mood\">Mood<\/label><select id=\"pth-cine-mood\"><\/select><\/div>\r\n      <div><label for=\"pth-cine-grade\">Color grade<\/label><select id=\"pth-cine-grade\"><\/select><\/div>\r\n      <div><label for=\"pth-cine-stock\">Film stock \/ sensor<\/label><select id=\"pth-cine-stock\"><\/select><\/div>\r\n      <div><label for=\"pth-cine-aspect\">Aspect ratio<\/label><select id=\"pth-cine-aspect\"><\/select><\/div>\r\n    <\/div>\r\n    <div class=\"pth-cine-block\" style=\"margin-top:14px\">\r\n      <label for=\"pth-cine-extra\">Extra detail (optional)<\/label>\r\n      <input type=\"text\" id=\"pth-cine-extra\" placeholder=\"rain streaks on the lens, salt spray, distant foghorn\">\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"pth-cine-card\">\r\n    <div class=\"pth-cine-h\"><span class=\"pth-cine-hl\">\ud83d\udcdc Generated Prompts<\/span><\/div>\r\n    <div class=\"pth-cine-block\">\r\n      <div class=\"pth-cine-outhead\"><b>\ud83d\uddbc\ufe0f Image prompt<\/b><button class=\"pth-cine-mini\" data-copy=\"pth-cine-imgout\">\ud83d\udccb Copy<\/button><\/div>\r\n      <div class=\"pth-cine-out\" id=\"pth-cine-imgout\">Press Generate to build your prompt.<\/div>\r\n    <\/div>\r\n    <div class=\"pth-cine-block\">\r\n      <div class=\"pth-cine-outhead\"><b>\ud83c\udf9e\ufe0f Video motion prompt<\/b><button class=\"pth-cine-mini\" data-copy=\"pth-cine-vidout\">\ud83d\udccb Copy<\/button><\/div>\r\n      <div class=\"pth-cine-out\" id=\"pth-cine-vidout\">Press Generate to build your prompt.<\/div>\r\n    <\/div>\r\n    <div class=\"pth-cine-block\">\r\n      <div class=\"pth-cine-outhead\"><b>\ud83d\udd0a Sound design cues<\/b><button class=\"pth-cine-mini\" data-copy=\"pth-cine-sndout\">\ud83d\udccb Copy<\/button><\/div>\r\n      <div class=\"pth-cine-out\" id=\"pth-cine-sndout\">Press Generate to build your prompt.<\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- TAB 2 -->\r\n<div class=\"pth-cine-panel\" id=\"pth-cine-panel-shots\">\r\n  <div class=\"pth-cine-card\">\r\n    <div class=\"pth-cine-h\"><span class=\"pth-cine-hl\">\ud83c\udfa5 Build a Shot Sequence<\/span><\/div>\r\n    <div class=\"pth-cine-hint\" style=\"margin-top:0\">Each shot reuses the subject, world and look from the Scene Builder, so your character and setting stay consistent across the sequence. Add the shots you need, then generate the whole list at once.<\/div>\r\n    <div class=\"pth-cine-grid\" style=\"margin-top:14px\">\r\n      <div><label for=\"pth-cine-sshot\">Shot type<\/label><select id=\"pth-cine-sshot\"><\/select><\/div>\r\n      <div><label for=\"pth-cine-smove\">Camera movement<\/label><select id=\"pth-cine-smove\"><\/select><\/div>\r\n      <div style=\"grid-column:1\/-1\"><label for=\"pth-cine-sbeat\">What happens in this shot<\/label><input type=\"text\" id=\"pth-cine-sbeat\" placeholder=\"the lantern flares as a wave breaks over the rocks\"><\/div>\r\n    <\/div>\r\n    <div class=\"pth-cine-bar\">\r\n      <button class=\"pth-cine-btn pth-cine-green\" id=\"pth-cine-addshot\">\u2795 Add shot<\/button>\r\n      <button class=\"pth-cine-btn pth-cine-ghost\" id=\"pth-cine-preset\">\ud83c\udf9e\ufe0f Load 4-shot preset<\/button>\r\n      <button class=\"pth-cine-btn pth-cine-ghost\" id=\"pth-cine-copyshots\">\ud83d\udccb Copy full list<\/button>\r\n      <button class=\"pth-cine-btn pth-cine-ghost\" id=\"pth-cine-clearshots\">\ud83d\uddd1\ufe0f Clear shots<\/button>\r\n    <\/div>\r\n  <\/div>\r\n  <div class=\"pth-cine-card\">\r\n    <div class=\"pth-cine-h\"><span class=\"pth-cine-hl\">\ud83d\udccb Sequence<\/span><\/div>\r\n    <div id=\"pth-cine-shotlist\"><\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- TAB 3 -->\r\n<div class=\"pth-cine-panel\" id=\"pth-cine-panel-platform\">\r\n  <div class=\"pth-cine-card\">\r\n    <div class=\"pth-cine-h\"><span class=\"pth-cine-hl\">\ud83c\udfaf Same Scene, Every Platform<\/span><\/div>\r\n    <div class=\"pth-cine-hint\" style=\"margin-top:0\">Each generator expects a different shape of prompt. Midjourney wants comma-separated tags and flags; Stable Diffusion wants a positive and a separate negative; the video models want plain descriptive sentences. Press Generate on the Scene tab first.<\/div>\r\n    <div id=\"pth-cine-platforms\" style=\"margin-top:14px\"><\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- TAB 4 -->\r\n<div class=\"pth-cine-panel\" id=\"pth-cine-panel-neg\">\r\n  <div class=\"pth-cine-card\">\r\n    <div class=\"pth-cine-h\"><span class=\"pth-cine-hl\">\ud83d\udeab Negative Prompt Library<\/span><\/div>\r\n    <div class=\"pth-cine-hint\" style=\"margin-top:0\">Tick the problems you actually see in your output. Adding every negative you can think of is counter-productive \u2014 it dilutes the prompt and can distort the image.<\/div>\r\n    <div class=\"pth-cine-negs\" id=\"pth-cine-neglist\" style=\"margin-top:14px\"><\/div>\r\n    <div class=\"pth-cine-block\" style=\"margin-top:14px\">\r\n      <div class=\"pth-cine-outhead\"><b>Negative prompt<\/b><button class=\"pth-cine-mini\" data-copy=\"pth-cine-negout\">\ud83d\udccb Copy<\/button><\/div>\r\n      <div class=\"pth-cine-out\" id=\"pth-cine-negout\">Tick a few boxes above.<\/div>\r\n    <\/div>\r\n  <\/div>\r\n  <div class=\"pth-cine-card\">\r\n    <div class=\"pth-cine-h\"><span class=\"pth-cine-hl\">\u2696\ufe0f Token Weight Helper<\/span><\/div>\r\n    <div class=\"pth-cine-grid\">\r\n      <div style=\"flex:2\"><label for=\"pth-cine-wterm\">Term to weight<\/label><input type=\"text\" id=\"pth-cine-wterm\" value=\"volumetric fog\"><\/div>\r\n      <div><label for=\"pth-cine-wval\">Weight<\/label><select id=\"pth-cine-wval\">\r\n        <option value=\"0.6\">0.6 \u2014 much weaker<\/option>\r\n        <option value=\"0.8\">0.8 \u2014 weaker<\/option>\r\n        <option value=\"1.2\" selected>1.2 \u2014 stronger<\/option>\r\n        <option value=\"1.4\">1.4 \u2014 much stronger<\/option>\r\n        <option value=\"1.6\">1.6 \u2014 dominant<\/option>\r\n      <\/select><\/div>\r\n    <\/div>\r\n    <div class=\"pth-cine-block\" style=\"margin-top:12px\">\r\n      <div class=\"pth-cine-outhead\"><b>Weighted syntax<\/b><button class=\"pth-cine-mini\" data-copy=\"pth-cine-wout\">\ud83d\udccb Copy<\/button><\/div>\r\n      <div class=\"pth-cine-out\" id=\"pth-cine-wout\">(volumetric fog:1.2)<\/div>\r\n    <\/div>\r\n    <div class=\"pth-cine-hint\">Weights above roughly 1.5 tend to over-cook a term and warp the rest of the image. Stay between 0.8 and 1.4 unless you are deliberately pushing.<\/div>\r\n  <\/div>\r\n  <div class=\"pth-cine-card\">\r\n    <div class=\"pth-cine-h\"><span class=\"pth-cine-hl\">\ud83d\udd22 Prompt Length Check<\/span><\/div>\r\n    <div class=\"pth-cine-metrics\" id=\"pth-cine-tokens\"><\/div>\r\n    <div class=\"pth-cine-hint\">A rough guide: most image models pay far more attention to the first 40 to 60 words. Anything past that is not ignored, but it carries much less weight.<\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- TAB 5 -->\r\n<div class=\"pth-cine-panel\" id=\"pth-cine-panel-ref\">\r\n  <div class=\"pth-cine-card\">\r\n    <div class=\"pth-cine-h\"><span class=\"pth-cine-hl\">\ud83d\udcd6 Cinematography Reference<\/span><\/div>\r\n    <div class=\"pth-cine-grid\">\r\n      <div style=\"flex:3\"><input type=\"text\" id=\"pth-cine-refsearch\" placeholder=\"Search a term...\"><\/div>\r\n      <div><select id=\"pth-cine-refcat\">\r\n        <option value=\"all\">All categories<\/option>\r\n        <option value=\"Shot\">Shot types<\/option>\r\n        <option value=\"Movement\">Camera movement<\/option>\r\n        <option value=\"Lens\">Lenses<\/option>\r\n        <option value=\"Lighting\">Lighting<\/option>\r\n        <option value=\"Grade\">Color grades<\/option>\r\n        <option value=\"Stock\">Film stocks<\/option>\r\n      <\/select><\/div>\r\n    <\/div>\r\n    <div class=\"pth-cine-tblwrap\" style=\"margin-top:14px\">\r\n      <table class=\"pth-cine-tbl\">\r\n        <thead><tr><th>Term<\/th><th>Category<\/th><th>What it does to your shot<\/th><\/tr><\/thead>\r\n        <tbody id=\"pth-cine-refbody\"><\/tbody>\r\n      <\/table>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<div class=\"pth-cine-toast\" id=\"pth-cine-toast\"><\/div>\r\n<\/div>\r\n\r\n<script data-no-optimize=\"1\" data-no-minify=\"1\" data-cfasync=\"false\">\r\nwindow.pthCineStudioApp = (function () {\r\n    'use strict';\r\n    var root = null;\r\n    var shots = [];\r\n    var scene = null;\r\n\r\n    var SHOTS = [\r\n        { n: 'Extreme wide shot', d: 'Places a tiny subject in a vast environment. Use it to make someone look isolated or overwhelmed.' },\r\n        { n: 'Wide establishing shot', d: 'Shows the whole location and where everything sits. Almost every sequence opens with one.' },\r\n        { n: 'Full shot', d: 'Head to toe, with room around them. Good for body language and movement.' },\r\n        { n: 'Medium shot', d: 'Waist up. The workhorse of dialogue \u2014 you read the face and the gestures together.' },\r\n        { n: 'Medium close-up', d: 'Chest up. Intimate enough for emotion, wide enough to keep some context.' },\r\n        { n: 'Close-up', d: 'The face fills the frame. Everything is about what they are feeling right now.' },\r\n        { n: 'Extreme close-up', d: 'An eye, a hand, an object. Forces the viewer to notice one detail.' },\r\n        { n: 'Over-the-shoulder shot', d: 'Frames one person past another shoulder. Builds a sense of conversation and power balance.' },\r\n        { n: 'Point-of-view shot', d: 'The camera becomes the character eyes. Instantly subjective.' },\r\n        { n: 'Two-shot', d: 'Two subjects in one frame. The gap between them tells the story.' },\r\n        { n: 'Dutch angle', d: 'The horizon is tilted. Signals unease, disorientation or menace.' },\r\n        { n: 'Low angle', d: 'Camera below eye line, looking up. Makes the subject dominant and imposing.' },\r\n        { n: 'High angle', d: 'Camera above, looking down. Makes the subject look small or vulnerable.' },\r\n        { n: 'Aerial \/ drone shot', d: 'Looking down from height. Scale, geography, and a sense of leaving or arriving.' }\r\n    ];\r\n    var MOVES = [\r\n        { n: 'static locked-off camera', d: 'No movement. The stillness lets the performance carry the shot.' },\r\n        { n: 'slow push in', d: 'The camera creeps toward the subject. Quietly builds tension or realisation.' },\r\n        { n: 'slow pull out', d: 'The camera retreats, revealing context. Often an ending beat.' },\r\n        { n: 'pan left to right', d: 'The camera pivots horizontally on the spot. Follows action or reveals space.' },\r\n        { n: 'tilt up', d: 'The camera pivots vertically. Reveals height, scale, or a face after a detail.' },\r\n        { n: 'tracking shot alongside the subject', d: 'The camera travels with them. Puts the viewer in step with the character.' },\r\n        { n: 'handheld camera', d: 'Slight unsteadiness. Reads as urgent, documentary, real.' },\r\n        { n: 'steadicam glide', d: 'Smooth motion through space. Elegant, controlled, cinematic.' },\r\n        { n: 'crane rise', d: 'The camera lifts up and away. Grand, revealing, often triumphant.' },\r\n        { n: 'orbit around the subject', d: 'A circle around them. Emphasis and drama, used sparingly.' }\r\n    ];\r\n    var LENSES = [\r\n        { n: '14mm ultra-wide lens', d: 'Exaggerated perspective and curved edges. Dramatic, slightly unnatural.' },\r\n        { n: '24mm wide lens', d: 'Wide with less distortion. Good for landscapes and interiors.' },\r\n        { n: '35mm lens', d: 'Close to natural vision with a little context. A documentary favourite.' },\r\n        { n: '50mm lens', d: 'Roughly what the eye sees. Neutral, honest, unshowy.' },\r\n        { n: '85mm portrait lens', d: 'Flattering compression with a soft background. The classic portrait choice.' },\r\n        { n: '135mm telephoto lens', d: 'Strong compression, backgrounds fall away. Isolates the subject.' },\r\n        { n: '200mm telephoto lens', d: 'Heavy compression, layers stack up. Feels observed from a distance.' },\r\n        { n: 'macro lens', d: 'Extreme close focus on tiny detail. Texture becomes the subject.' }\r\n    ];\r\n    var LIGHTS = [\r\n        { n: 'golden hour light', d: 'Warm, low, long shadows. Nostalgic and flattering.' },\r\n        { n: 'blue hour twilight', d: 'Cool, soft, just after sunset. Melancholy and calm.' },\r\n        { n: 'high-key lighting', d: 'Bright and shadowless. Clean, optimistic, commercial.' },\r\n        { n: 'low-key lighting', d: 'Mostly dark with pools of light. Noir, tension, secrecy.' },\r\n        { n: 'Rembrandt lighting', d: 'A small triangle of light on the shadowed cheek. Classic and painterly.' },\r\n        { n: 'chiaroscuro', d: 'Violent contrast between light and dark. Theatrical drama.' },\r\n        { n: 'rim light from behind', d: 'A bright outline separating subject from background. Heroic, striking.' },\r\n        { n: 'practical lights in frame', d: 'Lamps, screens, neon visible in shot. Grounded and believable.' },\r\n        { n: 'neon lighting', d: 'Saturated coloured sources. Urban, modern, slightly unreal.' },\r\n        { n: 'overcast soft light', d: 'Flat, even, no harsh shadows. Understated and natural.' },\r\n        { n: 'harsh midday sun', d: 'Hard shadows, blown highlights. Unforgiving and exposed.' },\r\n        { n: 'candlelight', d: 'Warm, flickering, close. Intimate and old-world.' },\r\n        { n: 'volumetric god rays', d: 'Visible beams through dust or mist. Awe and atmosphere.' }\r\n    ];\r\n    var MOODS = ['serene', 'tense', 'melancholic', 'triumphant', 'eerie', 'whimsical', 'gritty', 'romantic', 'epic', 'dreamlike'];\r\n    var GRADES = [\r\n        { n: 'teal and orange grade', d: 'Warm skin against cool shadows. The modern blockbuster look.' },\r\n        { n: 'bleach bypass', d: 'Desaturated with crushed contrast. Harsh, war-film grit.' },\r\n        { n: 'warm vintage grade', d: 'Amber, faded blacks. Memory and nostalgia.' },\r\n        { n: 'cool desaturated grade', d: 'Muted, blue-leaning. Clinical, bleak, restrained.' },\r\n        { n: 'high-contrast monochrome', d: 'Black and white with deep blacks. Timeless and graphic.' },\r\n        { n: 'pastel grade', d: 'Soft, light, gently colourful. Whimsical and storybook.' },\r\n        { n: 'Technicolor', d: 'Rich saturated primaries. Classic Hollywood spectacle.' },\r\n        { n: 'film noir grade', d: 'Deep shadows, hard key, smoke. Suspicion and moral fog.' }\r\n    ];\r\n    var STOCKS = [\r\n        { n: 'Kodak Portra 400', d: 'Gentle contrast, beautiful skin tones. Soft and human.' },\r\n        { n: 'Kodak Vision3 500T', d: 'Tungsten-balanced motion picture stock. The look of night interiors.' },\r\n        { n: 'CineStill 800T', d: 'Halated red glow around highlights. Neon nights.' },\r\n        { n: 'Fuji Eterna', d: 'Muted, low-contrast palette. Understated and filmic.' },\r\n        { n: 'Ilford HP5 black and white', d: 'Grainy, punchy monochrome. Reportage and grit.' },\r\n        { n: 'ARRI Alexa digital', d: 'Clean, wide dynamic range. The modern professional baseline.' },\r\n        { n: '16mm film grain', d: 'Visible grain and softness. Handmade, intimate, indie.' },\r\n        { n: '35mm anamorphic', d: 'Oval bokeh and horizontal flares. Unmistakably cinema.' }\r\n    ];\r\n    var ASPECTS = ['16:9', '2.39:1 anamorphic', '2.35:1', '4:3', '1:1', '9:16 vertical', '21:9'];\r\n\r\n    var NEGATIVES = [\r\n        { g: 'Anatomy', items: ['deformed hands', 'extra fingers', 'extra limbs', 'mutated face', 'disfigured', 'asymmetrical eyes'] },\r\n        { g: 'Quality', items: ['blurry', 'low quality', 'jpeg artifacts', 'pixelated', 'oversaturated', 'harsh noise'] },\r\n        { g: 'Artifacts', items: ['watermark', 'signature', 'text overlay', 'logo', 'cropped subject', 'frame border'] },\r\n        { g: 'Style drift', items: ['cartoon', 'anime', '3d render', 'plastic skin', 'video game cgi', 'illustration'] },\r\n        { g: 'Composition', items: ['cluttered background', 'duplicate subject', 'out of frame', 'tilted horizon'] }\r\n    ];\r\n\r\n    var SAMPLE = {\r\n        subject: 'a weathered lighthouse keeper in a salt-stained wool coat',\r\n        setting: 'a storm-battered cliff at the edge of the North Sea',\r\n        action: 'he lifts a lantern against the wind, searching the black water for a signal',\r\n        shot: 2, move: 1, lens: 4, light: 3, mood: 1, grade: 3, stock: 1, aspect: 1,\r\n        extra: 'rain streaking the lens, salt spray in the air'\r\n    };\r\n\r\n    function byId(id) { return document.getElementById(id); }\r\n    function el(t, c, x) { var e = document.createElement(t); if (c) { e.className = c; } if (x !== undefined) { e.textContent = x; } return e; }\r\n    function toast(m) {\r\n        var t = byId('pth-cine-toast'); if (!t) { return; }\r\n        t.textContent = m; t.className = 'pth-cine-toast pth-cine-tshow';\r\n        window.setTimeout(function () { t.className = 'pth-cine-toast'; }, 2000);\r\n    }\r\n    function trim(s) { return (s || '').replace(\/^\\s+|\\s+$\/g, ''); }\r\n    function article(word) {\r\n        var c = (word || '').charAt(0).toLowerCase();\r\n        var digitVowel = \/^(8|11|18)\/.test(word || '');\r\n        return (c === 'a' || c === 'e' || c === 'i' || c === 'o' || c === 'u' || digitVowel) ? 'an' : 'a';\r\n    }\r\n    function cap(s) { s = trim(s); return s ? s.charAt(0).toUpperCase() + s.slice(1) : ''; }\r\n    function fillSel(id, arr, isObj, sel) {\r\n        var s = byId(id);\r\n        if (!s) { return; }\r\n        s.innerHTML = '';\r\n        var i;\r\n        for (i = 0; i < arr.length; i++) {\r\n            var o = document.createElement('option');\r\n            o.value = String(i);\r\n            o.textContent = isObj ? arr[i].n : arr[i];\r\n            if (sel === i) { o.selected = true; }\r\n            s.appendChild(o);\r\n        }\r\n    }\r\n    function val(id) { return byId(id) ? byId(id).value : ''; }\r\n    function idx(id) { return byId(id) ? parseInt(byId(id).value, 10) || 0 : 0; }\r\n\r\n    function joinParts(arr) {\r\n        var out = [], i;\r\n        for (i = 0; i < arr.length; i++) { if (trim(arr[i])) { out.push(trim(arr[i])); } }\r\n        return out.join(', ');\r\n    }\r\n\r\n    function readScene() {\r\n        return {\r\n            subject: trim(val('pth-cine-subject')),\r\n            setting: trim(val('pth-cine-setting')),\r\n            action: trim(val('pth-cine-action')),\r\n            shot: SHOTS[idx('pth-cine-shot')],\r\n            move: MOVES[idx('pth-cine-move')],\r\n            lens: LENSES[idx('pth-cine-lens')],\r\n            light: LIGHTS[idx('pth-cine-light')],\r\n            mood: MOODS[idx('pth-cine-mood')],\r\n            grade: GRADES[idx('pth-cine-grade')],\r\n            stock: STOCKS[idx('pth-cine-stock')],\r\n            aspect: ASPECTS[idx('pth-cine-aspect')],\r\n            extra: trim(val('pth-cine-extra'))\r\n        };\r\n    }\r\n\r\n    function imagePrompt(s) {\r\n        return joinParts([\r\n            s.shot.n.toLowerCase() + ' of ' + (s.subject || 'a lone figure'),\r\n            s.action,\r\n            s.setting ? 'in ' + s.setting : '',\r\n            s.lens.n, s.light.n, s.mood + ' mood', s.grade.n, s.stock.n,\r\n            s.extra,\r\n            'cinematic composition, sharp focus, highly detailed'\r\n        ]);\r\n    }\r\n    function videoPrompt(s) {\r\n        var sent = s.shot.n + ' of ' + (s.subject || 'a lone figure')\r\n            + (s.action ? ' as ' + s.action : '')\r\n            + (s.setting ? ', set in ' + s.setting : '') + '. ';\r\n        sent += 'The camera holds a ' + s.move.n + '. ';\r\n        sent += 'Shot on ' + article(s.lens.n) + ' ' + s.lens.n + ' with ' + s.light.n + ', ' + article(s.mood) + ' ' + s.mood + ' atmosphere, ' + s.grade.n + ', ' + s.stock.n + '. ';\r\n        if (s.extra) { sent += cap(s.extra) + '. '; }\r\n        sent += 'Natural physics, consistent lighting, no morphing.';\r\n        return sent;\r\n    }\r\n    function soundPrompt(s) {\r\n        var cues = [];\r\n        var text = (s.setting + ' ' + s.action + ' ' + s.extra).toLowerCase();\r\n        if (text.indexOf('sea') !== -1 || text.indexOf('water') !== -1 || text.indexOf('wave') !== -1 || text.indexOf('rain') !== -1) { cues.push('waves breaking, wind gusts, rain on stone'); }\r\n        if (text.indexOf('city') !== -1 || text.indexOf('street') !== -1 || text.indexOf('neon') !== -1) { cues.push('distant traffic hum, footsteps on wet pavement, neon buzz'); }\r\n        if (text.indexOf('forest') !== -1 || text.indexOf('wood') !== -1) { cues.push('leaves shifting, birdsong, branch creak'); }\r\n        if (text.indexOf('night') !== -1 || s.mood === 'eerie') { cues.push('low sub-bass drone, sparse distant sounds'); }\r\n        if (!cues.length) { cues.push('room tone, subtle movement of clothing, distant ambience'); }\r\n        cues.push(s.mood + ' underscore, sparse and restrained');\r\n        cues.push('no dialogue, no music sting on the cut');\r\n        return cues.join('. ') + '.';\r\n    }\r\n\r\n    function generate() {\r\n        scene = readScene();\r\n        if (!scene.subject && !scene.setting && !scene.action) {\r\n            toast('Describe a subject, setting or action first');\r\n            return;\r\n        }\r\n        byId('pth-cine-imgout').textContent = imagePrompt(scene);\r\n        byId('pth-cine-vidout').textContent = videoPrompt(scene);\r\n        byId('pth-cine-sndout').textContent = soundPrompt(scene);\r\n        renderPlatforms();\r\n        renderTokens();\r\n        renderShots();\r\n        toast('Prompts generated');\r\n    }\r\n\r\n    \/* ---- TAB 3 ---- *\/\r\n    function currentNegatives() {\r\n        var boxes = root.querySelectorAll('.pth-cine-negchk'), out = [], i;\r\n        for (i = 0; i < boxes.length; i++) { if (boxes[i].checked) { out.push(boxes[i].getAttribute('data-neg')); } }\r\n        return out;\r\n    }\r\n    function renderPlatforms() {\r\n        var box = byId('pth-cine-platforms');\r\n        if (!box) { return; }\r\n        box.innerHTML = '';\r\n        if (!scene) {\r\n            box.appendChild(el('div', 'pth-cine-hint', 'Press Generate on the Scene Builder tab first.'));\r\n            return;\r\n        }\r\n        var img = imagePrompt(scene);\r\n        var vid = videoPrompt(scene);\r\n        var negs = currentNegatives();\r\n        var negStr = negs.length ? negs.join(', ') : 'blurry, low quality, watermark, deformed hands';\r\n        var mjAspect = scene.aspect.split(' ')[0];\r\n\r\n        var list = [\r\n            { name: 'Midjourney', body: img + ' --ar ' + mjAspect + ' --style raw --no ' + negStr, note: 'Comma-separated tags plus flags. --no takes the negatives.' },\r\n            { name: 'Stable Diffusion \/ Flux', body: 'POSITIVE:\\n' + img + '\\n\\nNEGATIVE:\\n' + negStr, note: 'Positive and negative go in separate fields, never in one string.' },\r\n            { name: 'Sora \/ Veo', body: vid, note: 'Plain descriptive sentences. These models read prose, not tag lists.' },\r\n            { name: 'Runway \/ Kling', body: vid + ' Duration 5 seconds, single continuous take.', note: 'Keep the motion simple and state the take length.' }\r\n        ];\r\n        var i;\r\n        for (i = 0; i < list.length; i++) {\r\n            (function (p, n) {\r\n                var b = el('div', 'pth-cine-block');\r\n                var head = el('div', 'pth-cine-outhead');\r\n                head.appendChild(el('b', null, p.name));\r\n                var btn = el('button', 'pth-cine-mini', '\ud83d\udccb Copy');\r\n                btn.setAttribute('data-copy', 'pth-cine-plat-' + n);\r\n                head.appendChild(btn);\r\n                var out = el('div', 'pth-cine-out', p.body);\r\n                out.id = 'pth-cine-plat-' + n;\r\n                b.appendChild(head); b.appendChild(out);\r\n                b.appendChild(el('div', 'pth-cine-hint', p.note));\r\n                box.appendChild(b);\r\n            })(list[i], i);\r\n        }\r\n        bindCopy();\r\n    }\r\n\r\n    \/* ---- TAB 2 ---- *\/\r\n    function shotPrompt(sh) {\r\n        if (!scene) { return ''; }\r\n        return joinParts([\r\n            sh.shot.n.toLowerCase() + ' of ' + (scene.subject || 'the subject'),\r\n            sh.beat || scene.action,\r\n            scene.setting ? 'in ' + scene.setting : '',\r\n            'camera: ' + sh.move.n,\r\n            scene.lens.n, scene.light.n, scene.mood + ' mood', scene.grade.n, scene.stock.n,\r\n            'cinematic, consistent character and wardrobe'\r\n        ]);\r\n    }\r\n    function renderShots() {\r\n        var box = byId('pth-cine-shotlist');\r\n        if (!box) { return; }\r\n        box.innerHTML = '';\r\n        if (!shots.length) {\r\n            box.appendChild(el('div', 'pth-cine-hint', 'No shots yet. Add one above, or load the 4-shot preset for a classic coverage pattern.'));\r\n            return;\r\n        }\r\n        if (!scene) {\r\n            box.appendChild(el('div', 'pth-cine-hint', 'Press Generate on the Scene Builder tab so the shots inherit your subject and look.'));\r\n            return;\r\n        }\r\n        var i;\r\n        for (i = 0; i < shots.length; i++) {\r\n            (function (sh, n) {\r\n                var d = el('div', 'pth-cine-shot');\r\n                var head = el('div', 'pth-cine-shothead');\r\n                var left = el('div');\r\n                var b = el('b', null, 'Shot ' + (n + 1) + ' \u2014 ' + sh.shot.n);\r\n                left.appendChild(b);\r\n                var chip = el('span', 'pth-cine-chip', sh.move.n);\r\n                left.appendChild(chip);\r\n                var right = el('div');\r\n                var cp = el('button', 'pth-cine-mini', '\ud83d\udccb Copy');\r\n                cp.setAttribute('data-copy', 'pth-cine-shot-' + n);\r\n                var rm = el('button', 'pth-cine-mini pth-cine-danger', 'Remove');\r\n                rm.style.marginLeft = '7px';\r\n                rm.addEventListener('click', function () { shots.splice(n, 1); renderShots(); toast('Shot removed'); });\r\n                right.appendChild(cp); right.appendChild(rm);\r\n                head.appendChild(left); head.appendChild(right);\r\n                var out = el('div', 'pth-cine-out', shotPrompt(sh));\r\n                out.id = 'pth-cine-shot-' + n;\r\n                d.appendChild(head); d.appendChild(out);\r\n                box.appendChild(d);\r\n            })(shots[i], i);\r\n        }\r\n        bindCopy();\r\n    }\r\n    function allShotsText() {\r\n        var out = [], i;\r\n        for (i = 0; i < shots.length; i++) {\r\n            out.push('SHOT ' + (i + 1) + ' \u2014 ' + shots[i].shot.n + ' (' + shots[i].move.n + ')\\n' + shotPrompt(shots[i]));\r\n        }\r\n        return out.join('\\n\\n');\r\n    }\r\n\r\n    \/* ---- TAB 4 ---- *\/\r\n    function renderNegatives() {\r\n        var box = byId('pth-cine-neglist');\r\n        if (!box) { return; }\r\n        box.innerHTML = '';\r\n        var i, j;\r\n        for (i = 0; i < NEGATIVES.length; i++) {\r\n            var g = el('div', 'pth-cine-negbox');\r\n            g.appendChild(el('h4', null, NEGATIVES[i].g));\r\n            for (j = 0; j < NEGATIVES[i].items.length; j++) {\r\n                (function (term) {\r\n                    var lab = el('label', 'pth-cine-chk');\r\n                    var cb = document.createElement('input');\r\n                    cb.type = 'checkbox';\r\n                    cb.className = 'pth-cine-negchk';\r\n                    cb.setAttribute('data-neg', term);\r\n                    cb.addEventListener('change', function () { renderNegOut(); renderPlatforms(); });\r\n                    lab.appendChild(cb);\r\n                    lab.appendChild(document.createTextNode(term));\r\n                    g.appendChild(lab);\r\n                })(NEGATIVES[i].items[j]);\r\n            }\r\n            box.appendChild(g);\r\n        }\r\n    }\r\n    function renderNegOut() {\r\n        var negs = currentNegatives();\r\n        byId('pth-cine-negout').textContent = negs.length ? negs.join(', ') : 'Tick a few boxes above.';\r\n    }\r\n    function renderWeight() {\r\n        var t = trim(val('pth-cine-wterm')) || 'term';\r\n        byId('pth-cine-wout').textContent = '(' + t + ':' + val('pth-cine-wval') + ')';\r\n    }\r\n    function renderTokens() {\r\n        var box = byId('pth-cine-tokens');\r\n        if (!box) { return; }\r\n        box.innerHTML = '';\r\n        var text = scene ? imagePrompt(scene) : '';\r\n        var words = text ? text.split(\/\\s+\/).length : 0;\r\n        var chars = text.length;\r\n        var commas = text ? text.split(',').length : 0;\r\n        function metric(v, l) {\r\n            var m = el('div', 'pth-cine-metric');\r\n            m.appendChild(el('b', null, String(v)));\r\n            m.appendChild(el('span', null, l));\r\n            return m;\r\n        }\r\n        box.appendChild(metric(words, 'words'));\r\n        box.appendChild(metric(chars, 'characters'));\r\n        box.appendChild(metric(commas, 'tags'));\r\n    }\r\n\r\n    \/* ---- TAB 5 ---- *\/\r\n    function refRows() {\r\n        var rows = [], i;\r\n        for (i = 0; i < SHOTS.length; i++) { rows.push({ n: SHOTS[i].n, c: 'Shot', d: SHOTS[i].d }); }\r\n        for (i = 0; i < MOVES.length; i++) { rows.push({ n: MOVES[i].n, c: 'Movement', d: MOVES[i].d }); }\r\n        for (i = 0; i < LENSES.length; i++) { rows.push({ n: LENSES[i].n, c: 'Lens', d: LENSES[i].d }); }\r\n        for (i = 0; i < LIGHTS.length; i++) { rows.push({ n: LIGHTS[i].n, c: 'Lighting', d: LIGHTS[i].d }); }\r\n        for (i = 0; i < GRADES.length; i++) { rows.push({ n: GRADES[i].n, c: 'Grade', d: GRADES[i].d }); }\r\n        for (i = 0; i < STOCKS.length; i++) { rows.push({ n: STOCKS[i].n, c: 'Stock', d: STOCKS[i].d }); }\r\n        return rows;\r\n    }\r\n    function renderRef() {\r\n        var body = byId('pth-cine-refbody');\r\n        if (!body) { return; }\r\n        var q = (val('pth-cine-refsearch') || '').toLowerCase();\r\n        var cat = val('pth-cine-refcat');\r\n        var rows = refRows(), i, shown = 0;\r\n        body.innerHTML = '';\r\n        for (i = 0; i < rows.length; i++) {\r\n            var r = rows[i];\r\n            if (cat !== 'all' && r.c !== cat) { continue; }\r\n            if (q && r.n.toLowerCase().indexOf(q) === -1 && r.d.toLowerCase().indexOf(q) === -1) { continue; }\r\n            var tr = el('tr');\r\n            var c1 = el('td');\r\n            c1.appendChild(el('strong', null, r.n));\r\n            var c2 = el('td');\r\n            c2.appendChild(el('span', 'pth-cine-chip', r.c));\r\n            var c3 = el('td', null, r.d);\r\n            tr.appendChild(c1); tr.appendChild(c2); tr.appendChild(c3);\r\n            body.appendChild(tr); shown++;\r\n        }\r\n        if (!shown) {\r\n            var tr2 = el('tr');\r\n            var td = el('td', null, 'Nothing matches that search.');\r\n            td.setAttribute('colspan', '3');\r\n            td.style.textAlign = 'center'; td.style.color = '#475569';\r\n            tr2.appendChild(td); body.appendChild(tr2);\r\n        }\r\n    }\r\n\r\n    \/* ---- COPY ---- *\/\r\n    function copyText(text) {\r\n        var ta = document.createElement('textarea');\r\n        ta.value = text;\r\n        ta.style.position = 'fixed';\r\n        ta.style.left = '-9999px';\r\n        document.body.appendChild(ta);\r\n        ta.select();\r\n        var ok = false;\r\n        try { ok = document.execCommand('copy'); } catch (e) { ok = false; }\r\n        document.body.removeChild(ta);\r\n        toast(ok ? 'Copied' : 'Copy failed \u2014 select the text manually');\r\n    }\r\n    function bindCopy() {\r\n        var btns = root.querySelectorAll('[data-copy]'), i;\r\n        for (i = 0; i < btns.length; i++) {\r\n            if (btns[i].getAttribute('data-bound') === '1') { continue; }\r\n            btns[i].setAttribute('data-bound', '1');\r\n            btns[i].addEventListener('click', function () {\r\n                var t = byId(this.getAttribute('data-copy'));\r\n                if (t) { copyText(t.textContent); }\r\n            });\r\n        }\r\n    }\r\n\r\n    \/* ---- TABS ---- *\/\r\n    function switchTab(name) {\r\n        var tabs = root.querySelectorAll('.pth-cine-tab'), i;\r\n        for (i = 0; i < tabs.length; i++) {\r\n            tabs[i].className = (tabs[i].getAttribute('data-tab') === name) ? 'pth-cine-tab pth-cine-on' : 'pth-cine-tab';\r\n        }\r\n        var pans = root.querySelectorAll('.pth-cine-panel');\r\n        for (i = 0; i < pans.length; i++) { pans[i].className = 'pth-cine-panel'; }\r\n        var p = byId('pth-cine-panel-' + name);\r\n        if (p) { p.className = 'pth-cine-panel pth-cine-show'; }\r\n    }\r\n\r\n    function loadSample() {\r\n        byId('pth-cine-subject').value = SAMPLE.subject;\r\n        byId('pth-cine-setting').value = SAMPLE.setting;\r\n        byId('pth-cine-action').value = SAMPLE.action;\r\n        byId('pth-cine-extra').value = SAMPLE.extra;\r\n        byId('pth-cine-shot').value = String(SAMPLE.shot);\r\n        byId('pth-cine-move').value = String(SAMPLE.move);\r\n        byId('pth-cine-lens').value = String(SAMPLE.lens);\r\n        byId('pth-cine-light').value = String(SAMPLE.light);\r\n        byId('pth-cine-mood').value = String(SAMPLE.mood);\r\n        byId('pth-cine-grade').value = String(SAMPLE.grade);\r\n        byId('pth-cine-stock').value = String(SAMPLE.stock);\r\n        byId('pth-cine-aspect').value = String(SAMPLE.aspect);\r\n        generate();\r\n    }\r\n\r\n    function init() {\r\n        root = document.getElementById('pth-cine-studio-wrapper');\r\n        if (!root || root.getAttribute('data-pth-init') === '1') { return; }\r\n        root.setAttribute('data-pth-init', '1');\r\n\r\n        fillSel('pth-cine-shot', SHOTS, true, 1);\r\n        fillSel('pth-cine-move', MOVES, true, 1);\r\n        fillSel('pth-cine-lens', LENSES, true, 4);\r\n        fillSel('pth-cine-light', LIGHTS, true, 0);\r\n        fillSel('pth-cine-mood', MOODS, false, 1);\r\n        fillSel('pth-cine-grade', GRADES, true, 0);\r\n        fillSel('pth-cine-stock', STOCKS, true, 5);\r\n        fillSel('pth-cine-aspect', ASPECTS, false, 1);\r\n        fillSel('pth-cine-sshot', SHOTS, true, 5);\r\n        fillSel('pth-cine-smove', MOVES, true, 0);\r\n\r\n        renderNegatives();\r\n        renderNegOut();\r\n        renderWeight();\r\n        renderRef();\r\n        renderShots();\r\n        renderPlatforms();\r\n        renderTokens();\r\n\r\n        var tabs = root.querySelectorAll('.pth-cine-tab'), i;\r\n        for (i = 0; i < tabs.length; i++) {\r\n            tabs[i].addEventListener('click', function () { switchTab(this.getAttribute('data-tab')); });\r\n        }\r\n\r\n        byId('pth-cine-gen').addEventListener('click', generate);\r\n        byId('pth-cine-sample').addEventListener('click', loadSample);\r\n        byId('pth-cine-full').addEventListener('click', function () {\r\n            if (root.className.indexOf('pth-cine-full') !== -1) { root.className = root.className.replace(' pth-cine-full', '').replace('pth-cine-full', ''); }\r\n            else { root.className = root.className + ' pth-cine-full'; }\r\n        });\r\n        byId('pth-cine-clear').addEventListener('click', function () {\r\n            var ids = ['pth-cine-subject', 'pth-cine-setting', 'pth-cine-action', 'pth-cine-extra'], k;\r\n            for (k = 0; k < ids.length; k++) { byId(ids[k]).value = ''; }\r\n            byId('pth-cine-imgout').textContent = 'Press Generate to build your prompt.';\r\n            byId('pth-cine-vidout').textContent = 'Press Generate to build your prompt.';\r\n            byId('pth-cine-sndout').textContent = 'Press Generate to build your prompt.';\r\n            scene = null; shots = [];\r\n            renderShots(); renderPlatforms(); renderTokens();\r\n            toast('Cleared');\r\n        });\r\n\r\n        byId('pth-cine-addshot').addEventListener('click', function () {\r\n            shots.push({\r\n                shot: SHOTS[idx('pth-cine-sshot')],\r\n                move: MOVES[idx('pth-cine-smove')],\r\n                beat: trim(val('pth-cine-sbeat'))\r\n            });\r\n            byId('pth-cine-sbeat').value = '';\r\n            renderShots();\r\n            toast('Shot added');\r\n        });\r\n        byId('pth-cine-preset').addEventListener('click', function () {\r\n            shots = [\r\n                { shot: SHOTS[1], move: MOVES[0], beat: 'the location is revealed, the subject small against it' },\r\n                { shot: SHOTS[3], move: MOVES[5], beat: 'the subject moves into the action' },\r\n                { shot: SHOTS[5], move: MOVES[1], beat: 'the decisive moment lands on the face' },\r\n                { shot: SHOTS[6], move: MOVES[0], beat: 'a single telling detail in the hands' }\r\n            ];\r\n            renderShots();\r\n            toast('4-shot coverage loaded');\r\n        });\r\n        byId('pth-cine-copyshots').addEventListener('click', function () {\r\n            if (!shots.length || !scene) { toast('Add shots and press Generate first'); return; }\r\n            copyText(allShotsText());\r\n        });\r\n        byId('pth-cine-clearshots').addEventListener('click', function () { shots = []; renderShots(); toast('Shots cleared'); });\r\n\r\n        byId('pth-cine-wterm').addEventListener('input', renderWeight);\r\n        byId('pth-cine-wval').addEventListener('change', renderWeight);\r\n        byId('pth-cine-refsearch').addEventListener('input', renderRef);\r\n        byId('pth-cine-refcat').addEventListener('change', renderRef);\r\n\r\n        bindCopy();\r\n    }\r\n    return { init: init };\r\n})();\r\n\r\n\/* 4-layer bootstrap (LiteSpeed-safe) *\/\r\n(function () {\r\n    function boot() { if (window.pthCineStudioApp && document.getElementById('pth-cine-studio-wrapper')) { window.pthCineStudioApp.init(); } }\r\n    if (document.readyState === 'complete' || document.readyState === 'interactive') { window.setTimeout(boot, 1); }\r\n    document.addEventListener('DOMContentLoaded', boot);\r\n    window.addEventListener('load', boot);\r\n    window.setTimeout(boot, 900);\r\n})();\r\n<\/script>\n\n\n\n<style>\n.pth-feature-wrap { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-bottom: 30px; }\n.pth-feat-box { border: 1px solid #e2e8f0; background: #ffffff; padding: 24px; border-radius: 12px; box-shadow: 0 4px 6px -1px rgba(0,0,0,0.02); transition: all 0.3s ease; }\n.pth-feat-box:hover { border-color: #bfdbfe; transform: translateY(-3px); box-shadow: 0 10px 15px -3px rgba(0,0,0,0.05); }\n.pth-feat-title { font-size: 1.1rem; font-weight: 800; color: #0f172a; margin-bottom: 10px; display: flex; align-items: center; gap: 10px; }\n.pth-feat-text { font-size: 0.9rem; color: #475569; line-height: 1.6; margin: 0; }\n.pth-steps-wrap { border: 1px solid #e2e8f0; background: #ffffff; padding: 40px 30px; border-radius: 16px; text-align: center; box-shadow: 0 4px 6px -1px rgba(0,0,0,0.02); margin-bottom: 40px; }\n.pth-steps-title { font-size: 1.2rem; font-weight: 800; color: #1e293b; text-transform: uppercase; margin-bottom: 35px; letter-spacing: 1px; }\n.pth-steps-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 30px; }\n.pth-step-item { display: flex; flex-direction: column; align-items: center; }\n.pth-step-num { width: 45px; height: 45px; background: #3b82f6; color: #ffffff; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 800; font-size: 1.2rem; margin-bottom: 15px; box-shadow: 0 4px 10px rgba(59,130,246,0.3); }\n.pth-step-name { font-weight: 800; color: #0f172a; margin-bottom: 8px; font-size: 1.05rem; }\n.pth-step-desc { font-size: 0.9rem; color: #64748b; line-height: 1.5; margin: 0; }\n<\/style>\n<div class=\"pth-feature-wrap\">\n    <div class=\"pth-feat-box\">\n        <div class=\"pth-feat-title\">\ud83e\udde0 Algorithmic Detection<\/div>\n        <p class=\"pth-feat-text\">The <strong>AI Cinematic Prompt Generator<\/strong> processes your native text arrays through strict regular expressions, automatically detecting stored characters without contacting remote databases.<\/p>\n    <\/div>\n    <div class=\"pth-feat-box\">\n        <div class=\"pth-feat-title\">\ud83d\udee1\ufe0f Secure Local Storage<\/div>\n        <p class=\"pth-feat-text\">This <strong>AI Cinematic Prompt Generator<\/strong> engine securely caches your character structures directly inside your browser&#8217;s local memory allocation, ensuring absolute privacy.<\/p>\n    <\/div>\n    <div class=\"pth-feat-box\">\n        <div class=\"pth-feat-title\">\u2699\ufe0f Logic Concatenation<\/div>\n        <p class=\"pth-feat-text\">Client-side mathematical concatenation merges environmental data, camera angles, and character objects into highly optimized strings for visual models.<\/p>\n    <\/div>\n<\/div>\n<div class=\"pth-steps-wrap\">\n    <div class=\"pth-steps-title\">How to Use the AI Cinematic Prompt Generator<\/div>\n    <div class=\"pth-steps-grid\">\n        <div class=\"pth-step-item\">\n            <div class=\"pth-step-num\">1<\/div>\n            <div class=\"pth-step-name\">Define Data Models<\/div>\n            <p class=\"pth-step-desc\">Initialize the <strong>AI Cinematic Prompt Generator<\/strong> vault by saving character names, ages, and clothing attributes into the local array.<\/p>\n        <\/div>\n        <div class=\"pth-step-item\">\n            <div class=\"pth-step-num\">2<\/div>\n            <div class=\"pth-step-name\">Input Raw Strings<\/div>\n            <p class=\"pth-step-desc\">Type your action sequence. The script parses the Document Object Model (DOM) and maps the input against your saved entities.<\/p>\n        <\/div>\n        <div class=\"pth-step-item\">\n            <div class=\"pth-step-num\">3<\/div>\n            <div class=\"pth-step-name\">Compile Architectures<\/div>\n            <p class=\"pth-step-desc\">Execute the logic compiler to output structured command sequences formatted perfectly for image and video synthesis algorithms.<\/p>\n        <\/div>\n    <\/div>\n<\/div>\n\n\n<div id=\"start-seo-article\"><\/div>\n\n\n<p class=\"wp-block-paragraph\">Last updated: July 2026<\/p>\n\n\n\n<h2 id=\"\ud83d\udd34-building-a-scene-the-way-a-dp-would\" class=\"wp-block-heading\">\ud83d\udd34&nbsp;<strong>Building a scene the way a DP would<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Start with three plain-English fields: who or what the subject is, where they are, and what is happening. Then set the look. The Camera and Look panel is not decoration \u2014 each dropdown changes the meaning of the frame. A low angle makes your subject dominant; an 85mm lens softens the background and isolates them; low-key lighting hides half the face; a bleach-bypass grade drains the warmth out of the whole thing. Pick deliberately and the model has something concrete to aim at.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Press Generate and you get three outputs at once. The image prompt is a comma-separated tag string for a still generator. The video motion prompt is written as prose, because video models read sentences rather than tags, and it names the camera move explicitly. The sound design cues are a starting point for whoever scores or mixes the shot. Input: a lighthouse keeper, a storm cliff, a full shot on an 85mm with low-key lighting. Output: a prompt that reads like a shot description rather than a wish list.<\/p>\n\n\n\n<h2 id=\"\ud83d\udfe1-the-shot-list-is-where-this-earns-its-keep\" class=\"wp-block-heading\">\ud83d\udfe1&nbsp;<strong>The shot list is where this earns its keep<\/strong><\/h2>\n\n\n<figure class=\"pth-article-figure pth-img-left\" style=\"float:left; width:700px; max-width:100%; margin:4px 28px 16px 0; clear:left;\"><img decoding=\"async\" src=\"https:\/\/schoolict.net\/tools\/wp-content\/uploads\/2026\/07\/The-shot-list-is-where-this-earns-its-keep-800x447.jpeg\" alt=\"The shot list is where this earns its keep\" width=\"700\" height=\"394\" loading=\"lazy\" data-no-lazy=\"1\" class=\"pth-article-img\" style=\"width:100%;height:auto;display:block;border-radius:10px;border:1px solid #e2e8f0;\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The single hardest problem in AI film-making is consistency. Generate four shots with four separately written prompts and you get four different people wearing four different coats. The Shot List tab solves this structurally: every shot you add inherits the exact subject, setting, lens, lighting, grade and film stock from your scene, and only the shot size, camera move and story beat change. That is precisely how coverage works on a real set \u2014 one look, many angles.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Press Load 4-shot preset and you get the classic coverage pattern: an establishing wide, a medium as the subject moves in, a close-up on the decisive moment, and an extreme close-up on a telling detail. Copy the full list and you have a shooting order you can feed to your generator one shot at a time. The Platform Formatter tab then reshapes the same scene for each destination \u2014 Midjourney gets its tag string with the aspect and negative flags attached, Stable Diffusion gets a separate positive and negative field, and the video models get plain prose. Same scene, four correct syntaxes, no manual rewriting.<\/p>\n\n\n\n<h2 id=\"\ud83d\udfe2-negatives-weights-and-where-this-stops\" class=\"wp-block-heading\">\ud83d\udfe2&nbsp;<strong>Negatives, weights, and where this stops<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The Negative and Weight Lab is deliberately restrained. Tick only the problems you are actually seeing \u2014 a wall of negatives dilutes the prompt and can distort the image more than the flaw you were trying to remove. The weight helper writes the bracket syntax for you, and the guidance holds: past about 1.5 a term starts warping everything around it. The length check exists because most image models weight the first forty to sixty words far more heavily than anything after, so a shorter, sharper prompt usually beats a longer one.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud83d\udd35 <strong>This writes prompts; it does not generate images.<\/strong> It is a prompt engineering studio, not a model. Take the output to Midjourney, Stable Diffusion, Sora, Veo, Runway or Kling and run it there.<\/li>\n\n\n\n<li>\ud83d\udfe0 <strong>No prompt guarantees consistency.<\/strong> Inheriting the scene makes character drift far less likely across a sequence, but diffusion models are probabilistic. Reusing a seed and a reference image is still the strongest lever, and that lives in your generator, not here.<\/li>\n\n\n\n<li>\ud83d\udfe3 <strong>Syntax moves.<\/strong> Flags and weighting conventions change between model versions. The formatter targets current common syntax; always check your generator&#8217;s own docs if a flag is rejected.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Once you have output, the rest of the pipeline is here too. Retouch or upscale the still in the <a href=\"https:\/\/schoolict.net\/tools\/free-advanced-image-studio-pro\/\" target=\"_blank\" rel=\"noreferrer noopener\">Advanced Image Studio<\/a>, cut the generated clips together in the <a href=\"https:\/\/schoolict.net\/tools\/turbo-video-editor\/\" target=\"_blank\" rel=\"noreferrer noopener\">Turbo Video Editor<\/a>, and build the sound bed from those cues in the <a href=\"https:\/\/schoolict.net\/tools\/free-all-in-one-audio-editor-converter\/\" target=\"_blank\" rel=\"noreferrer noopener\">Audio Editor<\/a>. If you would rather run a model locally instead of in the cloud, the <a href=\"https:\/\/schoolict.net\/tools\/browser-ai-models-directory\/\" target=\"_blank\" rel=\"noreferrer noopener\">Browser AI Models Directory<\/a> lists what will actually fit on your machine. And if you want to understand why any of these words move the image at all, that is the subject of the companion guide on <a href=\"https:\/\/schoolict.net\/tools\/how-ai-image-video-prompts-work\/\" target=\"_blank\" rel=\"noreferrer noopener\">how AI image and video prompts really work<\/a> <\/p>\n\n\n\n<style>\n.pth-faq-section{margin:50px auto 40px;font-family:inherit;max-width:1480px;padding:0 20px;box-sizing:border-box}\n.pth-faq-header{font-size:1.8rem;font-weight:800;color:#0f172a;margin-bottom:25px;border-bottom:2px solid #e2e8f0;padding-bottom:10px;display:flex;align-items:center;gap:10px}\n.pth-faq-grid{display:grid;grid-template-columns:1fr;gap:20px}\n@media(min-width:768px){.pth-faq-grid{grid-template-columns:repeat(2,1fr)}}\n@media(min-width:1024px){.pth-faq-grid{grid-template-columns:repeat(3,1fr)}}\n.pth-faq-card{background:#f8fafc;padding:24px;border-radius:12px;border:1px solid #e2e8f0;transition:transform .2s ease;break-inside:avoid}\n.pth-faq-card:hover{transform:translateY(-3px);box-shadow:0 4px 12px rgba(0,0,0,.05)}\n.pth-faq-q{color:#0f172a;font-size:1rem;font-weight:700;margin:0 0 12px;line-height:1.4}\n.pth-faq-a{margin:0;font-size:.95rem;color:#1e293b;line-height:1.6;font-weight:500}\n<\/style>\n<div class=\"pth-faq-section\">\n  <div class=\"pth-faq-header\">\u2753 Frequently Asked Questions<\/div>\n  <div class=\"pth-faq-grid\">\n    <div class=\"pth-faq-card\"><p class=\"pth-faq-q\">Does this tool generate the images?<\/p><p class=\"pth-faq-a\">No. It builds the prompt. You take that prompt to Midjourney, Stable Diffusion, Sora, Veo, Runway or Kling and generate there. No API key is needed here because nothing is sent anywhere.<\/p><\/div>\n    <div class=\"pth-faq-card\"><p class=\"pth-faq-q\">How do I keep the same character across shots?<\/p><p class=\"pth-faq-a\">Use the Shot List tab. Every shot inherits your subject, wardrobe, setting and look, so only the framing changes. Combine it with a fixed seed in your generator for the strongest consistency.<\/p><\/div>\n    <div class=\"pth-faq-card\"><p class=\"pth-faq-q\">Why are the image and video prompts written differently?<\/p><p class=\"pth-faq-a\">Image models respond well to comma-separated tags. Video models read descriptive prose and need the camera movement stated as an action. Feeding a tag list to a video model wastes it.<\/p><\/div>\n    <div class=\"pth-faq-card\"><p class=\"pth-faq-q\">How many negatives should I use?<\/p><p class=\"pth-faq-a\">Only the ones fixing a problem you can actually see. A long negative list dilutes your positive prompt and often degrades the image more than the original flaw did.<\/p><\/div>\n    <div class=\"pth-faq-card\"><p class=\"pth-faq-q\">What does the weight number in brackets do?<\/p><p class=\"pth-faq-a\">It tells the model to pay more or less attention to that term. Between 0.8 and 1.4 is the useful band; above roughly 1.5 the term starts distorting everything around it.<\/p><\/div>\n    <div class=\"pth-faq-card\"><p class=\"pth-faq-q\">Does prompt length matter?<\/p><p class=\"pth-faq-a\">Yes. Most image models weight the opening forty to sixty words far more heavily. Put your subject and the most important look choices first, not buried at the end.<\/p><\/div>\n    <div class=\"pth-faq-card\"><p class=\"pth-faq-q\">Do I need to know cinematography to use it?<\/p><p class=\"pth-faq-a\">No. The Reference tab explains what every shot type, lens, light and grade actually does to a frame, so you can choose on purpose rather than guessing.<\/p><\/div>\n    <div class=\"pth-faq-card\"><p class=\"pth-faq-q\">Is anything I type sent to a server?<\/p><p class=\"pth-faq-a\">No. The whole studio runs in your browser tab, so unreleased concepts and client scripts stay on your machine. It keeps working with your connection switched off.<\/p><\/div>\n  <\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Free AI Cinematic Prompt Generator | Ultra-Detailed Prompts for Midjourney, Grok, Runway &#038; More Build ultra-detailed cinematic prompts in seconds with the Free AI Cinematic Prompt Generator. Multi-language input, global character vault, 20+ AI targets, advanced cinematography controls, and export-ready prompts for Midjourney, Grok, Runway, and more. 100% offline after load. \ud83e\udde0 Algorithmic Detection The &#8230; <a title=\"AI Cinematic Prompt Generator | Ultra-Detailed Prompts for Midjourney, Grok, Runway &amp; More\" class=\"read-more\" href=\"https:\/\/schoolict.net\/tools\/ai-cinematic-prompt-generator\/\" aria-label=\"Read more about AI Cinematic Prompt Generator | Ultra-Detailed Prompts for Midjourney, Grok, Runway &amp; More\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":2661,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2648","page","type-page","status-publish","has-post-thumbnail"],"_links":{"self":[{"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/pages\/2648","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/comments?post=2648"}],"version-history":[{"count":0,"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/pages\/2648\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/media\/2661"}],"wp:attachment":[{"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/media?parent=2648"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}