film-screen-capture
Skill2 starsChanged 50 days agoApache-2.0View on GitHub
Stage 4b of the AI film pipeline — capture a real web page or app screen with a headless browser so it can appear on a laptop/phone/monitor inside a generated shot (product trailers, "he opens his laptop and sees the site" beats). Produces the screenshot, a device-composited still, and the reference lines for the shot prompt. Use whenever a shot must show a specific, real UI.
In this repository74 other files it gives its agents.
- card-gameSkill
- pixel-art-spriteSkill
- rhythm-gameSkill
- side-scrollerSkill
- visual-novelSkill
- boss-modelSkill
- character-modelSkill
- environment-sceneSkill
- vfx-effectSkill
- weapon-propSkill
- worldview-3d-asset-production-routeSkill
- film-action-combatSkill
- film-character-sheetSkill
- film-dialogue-voiceoverSkill
- film-directionSkill
- film-end-creditsSkill
- film-generate-reviewSkill
- film-locationSkill
- film-pipelineSkill
- film-prop-sheetSkill
- film-scriptSkill
- film-shot-promptSkill
- film-storySkill
- film-style-librarySkill
- anime-action-sceneSkill
- cinematic-filmSkill
- game-cutscene-generatorSkill
- product-demoSkill
- social-media-videoSkill
- worldview-gameplay-experience-studySkill
- worldview-gameplay-video-analysisSkill
- boss-battleSkill
- hero-skill-systemSkill
- horror-chaseSkill
- narrative-choiceSkill
- platformer-levelSkill
- puzzle-mechanicSkill
- roguelike-generatorSkill
- worldview-game-asymmetric-information-cooperationSkill
- worldview-game-barricade-delay-and-route-choiceSkill
- worldview-game-character-handoff-and-shared-evidenceSkill
- worldview-game-chase-route-architectureSkill
- worldview-game-death-loop-persistent-cluesSkill
- worldview-game-driving-horror-divided-attentionSkill
- worldview-game-evidence-based-entity-identificationSkill
- worldview-game-horror-experience-rhythmSkill
- worldview-game-horror-mundane-routine-corruptionSkill
- worldview-game-horror-procedural-duty-and-incidentSkill
- worldview-game-horror-returning-place-escalationSkill
- worldview-game-horror-role-and-identity-pressureSkill
- worldview-game-key-item-backtrackingSkill
- worldview-game-limited-save-riskSkill
- worldview-game-lure-hide-escapeSkill
- worldview-game-observation-gated-stalkerSkill
- worldview-game-perception-distortion-and-trustSkill
- worldview-game-relief-resource-with-hidden-costSkill
- worldview-game-restore-power-under-pressureSkill
- worldview-game-roaming-stalker-pressureSkill
- worldview-game-safe-room-pressure-resetSkill
- worldview-game-scarce-inventory-triageSkill
- The first 60 shown.
The file
We split this skill into the rules it gives an agent
5 rules. About 0 are common, 2 are distinctive, and 3 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈2
Distinctive · estimate
This author's own choices. Worth a look.
3
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 17
Write assets/screens/INDEX.md: one line per screen — name, what UI state it shows, the exact visible headline text, what story beat it can …
- Very specific: line 18
Add each to asset-map.json as kind: "screen".
- Distinctive: line 21
Only when a needed public page is missing, capture it yourself:
- Distinctive: line 62
Before locking any composited screen, check three things against the original capture: language, logo, headline text.
- Very specific: line 94
if the shot includes an interaction ("he clicks Get started"), provide the *after* state as last_frame and describe the click as a beat
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Screen Capture (stage 4b)
Why
A video model asked to show "the Neta homepage on his laptop" will invent a plausible homepage. For a product film that is a failure: the viewer must recognise the real product, and any investor or user who knows it will spot a fake instantly. The page is therefore a prop with a non-negotiable texture — the real screenshot — and it is captured or supplied, not described.
Source of screenshots — user-supplied first
This skill is about making the film, not about browser automation. The default is that the user hands over screenshots (logged-in pages, private boards, dialogs) and we treat them as a screen asset library:
- Copy every supplied image to
films/<slug>/assets/screens/<short-name>.png(convert webp → png withpython3 -c 'from PIL import Image; Image.open(a).save(b)'orffmpeg -i a.webp b.png). - Write
assets/screens/INDEX.md: one line per screen — name, what UI state it shows, the exact visible headline text, what story beat it can serve. The script author reads this index; a screen not in it does not exist for the film. - Add each to
asset-map.jsonaskind: "screen". - Text on the screens may be changed for the story; the layout is what must survive. Say so in the prompt ("same layout and visual language as the reference; headline reads: …").
Only when a needed public page is missing, capture it yourself:
Verified in this Space: agent-browser opens a public URL headless, waits for network idle, and saves a clean 1920×1080 PNG (test: https://neta.art → title "Neta Studio — AI World Builder & Game Generator").
Capture
SK=<abs path of film-pipeline>/scripts
$SK/capture.sh https://neta.art films/<slug>/assets/screens/home.png --viewport 1920x1080
# options: --full (whole page) · --scroll 800 · --wait-text "Get started" · --dark · --session <name>Writes home.png + home.json (url, title, size). For a phone, use --viewport 390x844. For a page that needs login, follow the agent-browser skill's auth flow first with the same --session, then capture.
Capture every state the shot needs: landing, after a click, after typing. Each state is its own file; a "he types and the world appears" beat needs two or three captures and becomes a first_frame/last_frame pair or a sequence of shots.
Make it usable as a reference
Raw screenshots are flat UI on a white field — the video model treats them like a poster. Composite the capture onto the device once, with gpt-image-2, so the reference already contains perspective, bezel and reflections:
cohub generate "Photoreal 3/4 view of a modern laptop on a wooden desk, warm side light, the screen showing EXACTLY the web page from the reference image — same layout, same text, same colours, pixel-accurate, sharp and legible, slight screen glow on the keyboard. No other UI, no extra windows." \
--model gpt-image-2 --image films/<slug>/assets/screens/home.png \
--param size=2048x1152 --param quality=high --async --jsonBatch 4, pick the one where the text is legible and unchanged. Reject any candidate where headings are paraphrased, logos redrawn, or layout reflowed. Lock both files:
"screen-home": {"kind":"screen","file":"assets/screens/home.png","url":"…","desc":"neta.art landing: hero 'Give your world its first heartbeat', prompt bar, green valley art"},
"screen-home-laptop": {"kind":"prop","file":"assets/screens/home-laptop.png","url":"…","desc":"same page on a laptop, 3/4 desk view"}The capture is sacred
The capture is passed as an image reference to the compositing step. It is never re-described in words and regenerated. Three failures happened when it was:
- The UI came back in the wrong language (a Chinese interface for an English film).
- The product's logo was redrawn or dropped.
- Layout and copy were paraphrased into a generic dashboard.
Before locking any composited screen, check three things against the original capture: language, logo, headline text. Any mismatch is a reject, not a note.
Scene-matched mockup
A laptop mockup on a generic wooden desk in daylight, dropped into a midnight dorm scene, gives the video model two rooms and two times of day to reconcile. It will pick one at random.
Composite the capture into a mockup that uses the scene's own location plate as a second reference, at the scene's time of day, with the scene's practical lights:
cohub generate "The open laptop from the scene sits on the shared table of this exact dorm room at night, warm desk lamps, string lights; its screen shows EXACTLY the web page from the first reference — same layout, same text, same logo, legible. 3/4 view over the table. No people." \
--model gpt-image-2 \
--image films/<slug>/assets/screens/home.png \
--image films/<slug>/assets/locations/dorm.png \
--param size=2048x1152 --param quality=high --async --jsonOne scene-matched mockup per (screen state × location). Name them so the shot prompt can pick the right one: screen-home-dorm-night.png, screen-share-classroom-day.png.
State order follows the story
A character who has just received a link sees the landing page first, not the workspace. A character who has been working for an hour sees the workspace, not the landing page. The sequence of UI states in the film is the sequence a real first-time user would see. Write the state list in story order in assets/screens/INDEX.md and have the script reference states by name; a shot that shows a later state before its predecessor is a continuity error.
Reference lines for the shot prompt
@screen-home-laptop — the laptop and its screen; the screen content is the real page and must match the reference EXACTLY: same headline text, same layout, same colours, legible. 100% matches the reference.Constraints to add in the shot prompt:
- "the screen shows the reference page throughout; text stays legible and unchanged; no invented UI, no extra windows, no cursor jitter"
- hold the screen ≥2 s in a size where the headline is readable (MS or CU on the screen, 35–50 mm, slight angle to avoid moiré)
- if the shot includes an interaction ("he clicks Get started"), provide the after state as
last_frameand describe the click as a beat
Limits (say them to the user)
- The video model repaints the screen every frame; small UI text may still soften. Keep the readable element to one headline and the logo, and cut to a true screen-recording insert in the edit if pixel accuracy is mandatory.
- Pages behind login need credentials via the agent-browser auth vault; never paste secrets into prompts.
- Animated hero sections:
--wait-texton a stable element, then capture.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

