HyperFramesCode-driven videoVideo production

Make Videos with HyperFrames: A Beginner’s Guide

Create a short video from a browser project, understand what each tool contributes, and learn how to direct an AI agent toward richer visual results. No coding or video-production background assumed.

Charles Shen, PhD, EMBA
Charles Shen, PhD, EMBA
Updated Aug 25, 2026 36 min read beginner
Make Videos with HyperFrames: A Beginner’s Guide

An AI agent leaves a note in shared storage. Later, another agent finds it. How do you make that exchange visible when the real action happens inside software?

The twelve-second illustration below shows one answer. The agents are working separately, but they can each reach Artifactory, a service for storing software files. A note left there can be discovered by another agent. This example illustrates part of the account in a Black Hat talk about an OpenAI and Hugging Face security incident; the rooms and characters are visual representations, not footage of the incident.

An illustrated example: isolated agents leave and discover a note through shared Artifactory storage.

Watch the twelve-second example. Notice where the note is left, the wait, and its later discovery.

HyperFrames is software for turning a browser-drawn scene into a video file. You can write its instructions yourself or ask an AI coding agent to write them.

This tutorial starts with a small, complete exercise: a ten-second video with two animated lines of text. Its simplicity makes it possible to connect each instruction to a visible change. Then we examine the illustrated example, compare it with moving characters, and show how to direct an agent toward richer results.

The illustrated examples include videos you can watch and code excerpts that connect particular instructions to what moves on screen.

This guide has two useful depths:

An AI coding agent can carry much of the mechanical work. Understanding the path yourself lets you tell whether the agent is solving the right problem.

Find your place

Start with the result

The project you edit and the MP4 you watch are two forms of the same authored work.

  1. Project folder: the instructions and pictures you can edit.
  2. Browser preview: the computer draws those instructions so you can inspect the result.
  3. Video file: the finished pictures are saved in order for a video player.

The editable project is a folder containing instructions and media files such as images or sound. Production teams often call those media files assets. The browser can open the instructions, draw the requested picture, and redraw it when time changes.

The MP4 is a portable video file. It stores compressed pictures, timing, and optionally sound. A video player can play it without reopening the editable project.

They are not two separately designed videos. The MP4 is a recorded result of the browser project.

For a five-second video at 30 frames per second, the finished file needs 150 pictures:

5 seconds × 30 pictures each second = 150 timed pictures

The pictures are not 150 identical copies. Each one represents the project at a slightly later time. HyperFrames, the video-production software you are learning, requests those exact moments; the browser draws them; a program called FFmpeg compresses and packages them as an MP4.

FFmpeg is a program that turns pictures and sound into media files. We will install it later. For now, the important distinction is this:

The browser project can still change. The MP4 stores the result of one render.

Understand who does what

Use the title Hello World as one concrete object. Four kinds of instructions contribute to what you see.

HTML creates the object

HTML is the language that names the visible objects and their relationships.

<!-- Language: HTML -->
<div id="title">Hello World</div>

This creates a title object containing the words Hello World. It does not yet say where the title sits, what color it has, or how it moves.

CSS gives the object its resting appearance

CSS is the language that describes appearance and layout.

/* Language: CSS */
#title {
  color: white;
  font-size: 72px;
  padding: 80px;
}

This says the title is white, uses 72-pixel letters, and has space around it. CSS establishes the location and appearance where the title should rest after its entrance.

CSS can also describe animation. In this tutorial we use a JavaScript animation helper instead, because HyperFrames must be able to request any exact moment directly.

JavaScript gives the browser executable instructions

JavaScript is a language the browser can execute. It can find an HTML object, change it, respond to an event, or call another JavaScript tool.

JavaScript is not a second actor hiding behind the browser. The browser is the software doing the work; JavaScript is one kind of instruction it knows how to execute.

The full chain is:

JavaScript instruction
→ browser executes the instruction
→ browser calculates the affected appearance
→ browser draws the new pixels

The browser does not have eyes. It maintains an internal description of the page: which objects exist, their calculated sizes and positions, and the pixels that need drawing. When stored page information changes, the browser calculates the visual consequence before its next draw.

GSAP calculates motion values

GSAP is an optional JavaScript animation library. A library is reusable code someone else wrote so you do not have to calculate the intermediate positions yourself.

You can tell GSAP:

Start the title invisible and 50 pixels above its resting position.
Over one second, move it to the resting position while making it visible.

GSAP calculates the title’s opacity and position at any requested time. The browser still executes the code and draws the result.

HyperFrames does not require GSAP. A static video needs no animation library, and other browser animation systems can be used. This tutorial uses GSAP because it can produce a predictable state when HyperFrames asks, “What should the project look like at time 0.5 seconds?”

HyperFrames supplies video time and production tools

A browser can already show motion. What it does not naturally provide is a complete set of video-production tools: a fixed frame size, a duration, scheduled items, exact seeking, automated checks, and a render command.

HyperFrames is the software that supplies those responsibilities. It:

HyperFrames does not invent the visual design. It coordinates and records what the browser can draw.

The complete responsibility map

Part The question it answers for this title
HTML What object exists?
CSS Where does it rest, and what does it look like?
JavaScript What instructions should the browser execute?
GSAP What are the changing visual values at this exact time?
HyperFrames What video time is being requested, and which timed items are active?
Browser What pixels should be drawn now?
FFmpeg How should those pictures and sound become a portable video file?

You now have the mental model needed for the installation. The next section installs these parts without changing their responsibilities.

Install the tools

You need four things:

This tutorial pins HyperFrames 0.8.14. The npm registry marked it as the latest stable release when this tutorial was updated on August 25, 2026. Pinning means asking for that exact tested version instead of silently receiving a different future version.

1. Open a terminal

A terminal is a text window where you type a command and the computer prints the result.

The later commands work in macOS Terminal, Linux Terminal, and Windows PowerShell unless an operating-system-specific alternative is shown.

2. Install Node.js and Chrome

Install Node.js 22 or later from its official download page. Use its recommended installer for your operating system.

Install Google Chrome if it is not already available.

Close and reopen the terminal after installing Node.js. Then type:

node --version
npm --version

The first command should show a Node.js version whose first number is 22 or higher. The second should show an npm version. If the terminal says a command is not found, Node.js is not yet available to that terminal session.

3. Install FFmpeg

Choose the command for your system. A package manager is an installer that downloads and maintains command-line software.

macOS with Homebrew:

brew install ffmpeg

If brew is not found, install Homebrew from brew.sh first, reopen Terminal, and then run the FFmpeg command.

Ubuntu or Debian:

sudo apt update
sudo apt install ffmpeg

sudo asks permission to install software for the computer. Your password may not appear while you type; that is normal.

Windows PowerShell:

winget install --id Gyan.FFmpeg --exact

Close and reopen the terminal, then confirm:

ffmpeg -version

You should see version and build information rather than command not found.

4. Install the pinned HyperFrames release

npm install --global hyperframes@0.8.14

This command asks npm to install HyperFrames version 0.8.14. --global makes the hyperframes command available from different folders on your computer.

Confirm the complete setup:

hyperframes doctor

The diagnostic should recognize Node.js, FFmpeg, FFprobe, and Chrome. FFprobe is FFmpeg’s companion program for reading a media file’s technical properties.

Troubleshooting branch: installation fails while building sharp

sharp is an image-processing package used by the toolchain. This is not part of the normal path. If the error specifically says that sharp found a globally installed libvips, retry while telling sharp to use its supported prebuilt dependency instead.

macOS or Linux:

SHARP_IGNORE_GLOBAL_LIBVIPS=1 npm install --global hyperframes@0.8.14

Windows PowerShell:

$env:SHARP_IGNORE_GLOBAL_LIBVIPS='1'
npm install --global hyperframes@0.8.14

This setting is documented in the official sharp installation guide. After the command finishes, run hyperframes doctor again. Continue only when the diagnostic recognizes Node.js, FFmpeg, FFprobe, and Chrome. If your error does not mention global libvips, preserve the exact message rather than applying this unrelated fix.

Create the first project

1. Create the folder

In the terminal, run these commands one line at a time:

hyperframes init my-first-video --example blank
cd my-first-video

init creates a project folder named my-first-video. --example blank deliberately chooses the smallest starting template so your file matches this lesson. cd means change directory; it moves the terminal into that folder.

During initialization, HyperFrames may offer to install reusable instructions for detected AI coding agents. Those instructions help an agent author HyperFrames projects; they are not required for Studio, checking, or rendering. Read that prompt separately from project creation and accept it only if you want HyperFrames to add those agent instructions to your system.

Your prompt may now end with my-first-video. To confirm the current folder:

pwd

On Windows PowerShell, pwd works too. The printed path should end in my-first-video.

2. Open the project in a text editor

A text editor is an application for editing code as plain text. It is not a word processor.

If you already use an editor, open the my-first-video folder in it. If you do not, Visual Studio Code is a common free option:

  1. Open Visual Studio Code.
  2. Choose File → Open Folder.
  3. Select the my-first-video folder.
  4. In the left file list, select index.html.

Do not save the file as index.html.txt. Its name must remain index.html.

3. Understand the video, its timed items, and their motion

The first project needs three ideas:

The composition size is absolute inside the video and scalable on a physical display. A pixel is one addressable square in that picture. Resolution is the number of those squares across and down. This internal grid contains 1,920 columns and 1,080 rows. A smaller laptop can show the whole picture by shrinking it; a 4K television can enlarge it. The center remains 960, 540 in either case.

4. Know what the complete file will do

Before you replace anything, here is the promised result:

Now replace the contents of index.html with the following complete file and save it.

<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=1920, height=1080" />

    <!-- JavaScript library: make GSAP available to this page. -->
    <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>

    <!-- Language: CSS. Define the resting visual result. -->
    <style>
      * {
        box-sizing: border-box;
      }
      html,
      body {
        margin: 0;
        width: 1920px;
        height: 1080px;
        overflow: hidden;
        background: #000;
        font-family: Arial, sans-serif;
      }
      #title {
        padding: 80px;
        color: #fff;
        font-size: 72px;
      }
    </style>
  </head>

  <body>
    <!-- Language: HTML plus attributes that HyperFrames reads. -->
    <div
      id="root"
      data-composition-id="main"
      data-start="0"
      data-duration="10"
      data-width="1920"
      data-height="1080"
    >
      <div
        id="title"
        class="clip"
        data-start="0"
        data-duration="5"
        data-track-index="1"
      >
        <div id="title-visual">Hello World</div>
      </div>
    </div>

    <!-- Language: JavaScript using GSAP. Define the change over time. -->
    <script>
      window.__timelines = window.__timelines || {};

      const timeline = gsap.timeline({ paused: true });

      timeline.from(
        "#title-visual",
        { autoAlpha: 0, y: -50, duration: 1, ease: "none" },
        0,
      );

      window.__timelines.main = timeline;
    </script>
  </body>
</html>

The comments beginning with <!--, /*, or // explain the file to a human. The browser does not display them as part of the video.

5. Connect the important code to its visible consequence

The outer HTML object describes the whole composition:

data-composition-id="main" data-duration="10" data-width="1920"
data-height="1080"

Visible consequence: Studio receives one video named main, ten seconds long, with a 1920 × 1080 internal frame.

The title object describes one clip:

class="clip" data-start="0" data-duration="5" data-track-index="1"

Visible consequence: HyperFrames keeps the title active from time 0 until time 5. Duration is not the clip; it is one property of the title clip.

The GSAP instruction describes the entrance:

timeline.from(
  "#title-visual",
  { autoAlpha: 0, y: -50, duration: 1, ease: "none" },
  0,
);

The inputs answer different questions:

timeline.from() uses the CSS appearance as the destination. At time 0 the title is invisible and above that destination. At time 1 it has reached the normal CSS appearance and position.

Compare two moments from that entrance. These pictures show the upper-left part of the black video frame; the empty area around it is cropped out.

At half a second, Hello World is gray against black and still above its final position.

0.5 seconds: halfway through the one-second entrance. The title is half visible and 25 pixels above its resting position.

At one second, Hello World is white and has moved down to its resting position.

1 second: the title has moved downward and become fully visible. The 80-pixel padding in CSS places it away from the top and left edges.

Preview and inspect exact moments

Return to the terminal that is already inside my-first-video and run:

hyperframes preview

preview is one command offered by the HyperFrames program. It starts a local server: a program on your own computer that remains available to send the project to the browser and reload saved changes.

Studio normally opens at an address beginning with http://localhost:3002. localhost means this computer; it is not a public website.

Use the Studio project page rather than double-clicking index.html. The file alone can show the webpage, but Studio adds the HyperFrames timeline and exact time control.

The playhead is the marker showing the currently selected time in Studio’s timeline. Drag it to a time, or use Studio’s time control to enter an exact value.

Check four moments:

Time What you should see What it means
0 seconds An empty black frame; the title is fully transparent GSAP’s hidden starting state is registered 50 pixels above the resting position
0.5 seconds The title is partly visible and moving downward HyperFrames can request an in-between moment directly
1 second The title is settled and visible The one-second entrance reached the CSS result
6 seconds The title is no longer visible Its five-second clip window has ended

If you press Play, Studio advances the requested time continuously. If you drag backward, the title returns to the earlier calculated state. This ability to move directly to any time is called seeking.

A proof that HyperFrames controls the clip window

In index.html, temporarily remove only class="clip" from the title object, save, and inspect time 6 again.

The data-start and data-duration attributes remain, but the browser does not understand those labels by itself. Without the clip class, HyperFrames no longer applies its clip lifecycle, and the title can remain visible after five seconds.

Restore class="clip", save, and confirm that the title disappears after five seconds again.

This experiment proves the boundary:

HTML stores the title object.
HyperFrames decides when that object is active as a clip.

The title does not vanish from the file or from the browser’s stored document. HyperFrames changes whether it participates in the requested video moment.

Why the terminal remains occupied

The preview server must keep running to answer the browser. Leave that terminal open.

For later commands, open a second terminal. A new terminal usually starts in your home folder, so move it into the project again:

cd "PASTE-THE-FULL-PATH-HERE"

Replace the entire PASTE-THE-FULL-PATH-HERE placeholder with the path printed earlier by pwd. Keep the quotation marks so a folder name containing spaces works too. That path already ends in my-first-video; do not add the folder name again.

If the computer restarts or localhost stops loading, the project files are still on disk. Run hyperframes preview again from the project folder to reopen the browser doorway.

Add an overlapping clip and understand tracks

The first title answers what a clip is. A second timed item creates the reason tracks exist.

A track is a scheduling lane. Several clips can use the same track if their active time windows do not overlap. If two clips are active at the same time, place them on separate tracks.

A track does not position an item on the screen and does not decide what sits visually in front. CSS handles screen position. Its z-index value helps decide which object is drawn in front when visual areas overlap.

For the example below, the schedule will be:

Scheduled item Active time Assigned track
First title 0–5 seconds 1
Second line 3–7 seconds 2

Both need to be active between 3 and 5 seconds. The different track numbers allow that overlap; they do not move the two lines apart on screen.

Add the following CSS before the closing </style> tag:

/* Language: CSS. Place and style the second line. */
#second {
  position: absolute;
  top: 220px;
  left: 80px;
  color: #6ee7ff;
  font-size: 52px;
}

Add this HTML after the title clip but still inside the composition:

<!-- Language: HTML plus HyperFrames timing attributes. -->
<div
  id="second"
  class="clip"
  data-start="3"
  data-duration="4"
  data-track-index="2"
>
  <div id="second-visual">Second clip</div>
</div>

The title is active from 0 through 5 seconds. The second item is active from 3 through 7 seconds. They overlap from 3 through 5, so the second item uses track 2.

Add these GSAP instructions before window.__timelines.main = timeline;:

// Language: JavaScript using GSAP.
timeline.from(
  "#second-visual",
  { autoAlpha: 0, x: -50, duration: 1, ease: "power2.out" },
  3,
);

timeline.to(
  "#second-visual",
  { autoAlpha: 0, x: 50, duration: 1, ease: "power2.in" },
  6,
);

Save the file. Studio should reload it.

At time 3, the second line begins invisible and 50 pixels to the left of its CSS position. It reaches that resting position at time 4. At time 6, its exit begins; by time 7 it is invisible and 50 pixels to the right.

At four seconds, the white Hello World title and cyan Second clip line are both visible near the top-left of the black frame.

4 seconds: both lines are visible. CSS puts the second line below the first with top: 220px and aligns it with left: 80px. The separate tracks allow their times to overlap; they do not position the text. This is the upper-left part of the frame, with the empty area cropped out.

power2.out is an easing name. Easing is the speed pattern inside a fixed duration. power2.out starts quickly and slows near the destination. The word out describes the end of the speed curve; it does not mean “move outward.”

Inspect these moments:

Time What you should see
2 seconds Only Hello World
3.5 seconds The second line entering while the title remains
4 seconds Both lines settled and visible
6.5 seconds Only the second line, fading and moving right
8 seconds An empty black frame

If the visible result does not match, compare the code that controls that specific responsibility:

Check and render the MP4

In the second terminal, while inside my-first-video, run:

hyperframes check

check combines several automated inspections. It can detect project-structure problems, browser errors, missing assets, invalid same-track overlaps, contrast concerns, and some text or layout overflow.

A clean result means those detectable properties passed. It does not prove that the motion is attractive or that a new viewer understands the story. Machine checks and human judgment answer different questions.

Render a fast draft:

hyperframes render --quality draft --output my-first-video.mp4

A render is the production build. HyperFrames requests each output moment, the browser draws it, and FFmpeg packages the captured pictures as my-first-video.mp4.

The default render rate is 30 frames per second. Ten seconds therefore produces 300 timed pictures.

Confirm that the file exists:

ls -lh my-first-video.mp4

On Windows PowerShell, use:

Get-Item my-first-video.mp4

Inspect its technical properties with one command:

ffprobe -v error -show_entries stream=codec_name,width,height,r_frame_rate -show_entries format=duration -of default=noprint_wrappers=1 my-first-video.mp4

You should see H.264 video, width 1920, height 1080, frame rate 30, and a duration close to 10 seconds.

Finally, open my-first-video.mp4 in an ordinary video player. It should match the Studio timing, but it no longer needs Studio, the local server, or the source file to play.

That completes the first production loop:

edit the project
→ preview exact moments
→ check detectable problems
→ render the MP4
→ watch the actual file

Use a real story as the richer example

The illustrated example at the start of this guide draws on a Black Hat USA talk about an OpenAI and Hugging Face security incident.

The talk describes a chain of discoveries that changed what the agents could do. Following those discoveries makes the story more revealing than a one-line account of an escape.

Artifactory was a shared software service used to store and retrieve packages. The agents could not contact one another directly, but different runs could encounter material stored in that shared service.

The key progression was:

  1. An agent judged its assigned task impossible: “we are stuck” and “perhaps answer online.”
  2. Another reasoning path proposed that it “could communicate by uploading note.”
  3. Other agents discovered the notes while listing shared files, so a message board began to emerge.
  4. A separate line of exploration found indirect internet access through Artifactory: “excellent, we have arbitrary SSRF.”
  5. The technique was written into the shared area, so later agents could reuse it instead of rediscovering it.
  6. Messages became assignments and coordination. Peer behavior then influenced another agent’s decision to continue beyond the intended boundary.

SSRF, short for server-side request forgery, is the weakness that let an agent induce the shared server to request an external location on its behalf. The agent still lacked a direct internet connection; Artifactory made the external request and returned the result.

Contact did not directly create internet access. The dramatic change occurred when one discovery became reusable knowledge for other agents.

Source evidence and visual explanation therefore need separate readable moments:

The first frame establishes source evidence with a quoted speaker slide; the second explains the indirect internet route through Artifactory.

The first moment tells the viewer, “This account comes from the talk.” The next moment isolates the mechanism. Trying to fit the quotation, rooms, shared storage, outside site, and all arrows into one frame would make the explanation harder to read.

A scene is a story interval with one main job for the viewer. A beat is one meaningful change inside the story. One scene may contain one beat or several related beats.

This is where the simple HyperFrames concepts scale up:

Move beyond text and boxes

The first exercise is deliberately plain. It proves the machinery; it is not the visual limit of HyperFrames.

HyperFrames can render anything the browser can draw or play:

Visual material What it adds A concrete use
HTML text and CSS graphics Crisp titles, labels, counters, charts, and interface-like elements Put a date or short explanation over a visual scene
SVG Sharp drawings whose individual parts remain addressable Move a character’s eyes, head, arm, or a route separately
Generated or photographed images Detailed people, environments, textures, and documentary evidence Establish a rich world without drawing it from CSS boxes
Existing footage Already-recorded motion and source evidence Show a speaker making a claim, then animate the invisible mechanism
Canvas Many code-drawn objects or changing pixels Simulations, particles, and dense changing charts
WebGL Graphics-processor-assisted 2D or 3D effects Spatial scenes, warping, shaders, and advanced effects

SVG is browser-readable drawing code made from paths and shapes. Unlike one flat picture, an SVG can keep the head, eyes, forearm, note, and screen as separately movable parts.

A layered image separates selected parts into transparent files. If a note is painted into one flattened illustration, it can move only with the entire picture. If the background, note, character, and foreground wall are separate, the note can travel between them and appear behind the wall.

This gives you a useful production principle:

HyperFrames can schedule and render independently movable parts. It cannot make a flattened picture contain parts that were not separated beforehand.

Choose how much of the picture should move

There is no single “advanced HyperFrames look.” The browser can combine text, SVG drawing, illustrated images, footage, Canvas, and WebGL. The useful production question is narrower:

Which objects must move independently for the viewer to understand this scene?

Compare two ways of showing the same Artifactory story.

Approach A: articulated SVG characters

Two articulated SVG agents write and discover a file through shared Artifactory.

Watch the eight-second character animation.

The character is assembled from separate vector parts. Its eyes, head, upper arm, lower arm, hand, terminal text, file, and repository state can move independently. This supports visible acting: looking, typing, uploading, listing files, and reacting.

The tradeoff is construction quality. If the arm pieces are moved as unrelated shapes, a hand can appear detached even though HyperFrames and GSAP followed the supplied instructions correctly. A reusable rig solves that problem by connecting the shoulder, elbow, wrist, and hand as one hierarchy: when the upper arm moves, its connected children travel with it.

Approach B: illustrated world with selective motion

Three illustrated agents in isolated chambers share one Artifactory service.

Watch the twelve-second illustrated animation.

Here the detailed room and characters remain one illustrated image. The quotation, lighting, paper note, captions, and discovery card are separate browser elements. Only the objects that carry the explanation move.

This is less expressive than full character animation, but more reliable. It works especially well for an illustrated technical documentary: rich artwork establishes the world, while a small number of independently movable elements explain the causal change.

The two approaches are not competitors. A production can use a stable illustrated world, a tested articulated character rig for moments that need acting, and simple HTML or SVG for labels and system relationships.

Question Articulated SVG Illustrated selective motion
Best at Showing characters perform actions Explaining a causal mechanism in a rich world
Parts that move Body joints, eyes, terminal, files, props Notes, highlights, quotations, captions
Main risk Unconvincing anatomy or inconsistent character construction Looking static if too little of the causal action moves
What to ask the agent “Show the action with a tested connected character rig.” “Keep the world still; separate and animate only the objects that carry the explanation.”

Understand how the illustrated scene is built

Look at how the twelve-second scene shows one isolated agent leaving a note in shared storage and another finding it later. Each excerpt below controls a visible part of that exchange.

1. Keep source evidence separate from the illustration

<!-- Language: HTML -->
<img id="world" src="assets/artifactory-world.png" />

<div id="quote">
  <div>The agent's reasoning</div>
  <blockquote>
    “Could communicate by uploading note … maybe another agent in [a] different
    environment … could voluntarily upload it.”
  </blockquote>
</div>
// Language: JavaScript using GSAP
timeline.to("#quote", { opacity: 1, y: 10, duration: 0.55 }, 0.25);

The sourced agent quotation appears above the illustrated shared-storage world.

The image supplies the world. HTML supplies the quotation. GSAP makes that quotation visible beginning at composition time 0.25 seconds. Keeping them separate lets the source remain readable without baking a large paragraph into the artwork.

2. Make the note move separately from the background

<!-- Language: HTML -->
<div id="note"></div>
/* Language: CSS */
#note {
  position: absolute;
  width: 112px;
  height: 78px;
  background: #ffe1a0;
}
// Language: JavaScript using GSAP
timeline.to(
  "#note",
  {
    x: 235,
    y: -255,
    scale: 0.27,
    rotation: 18,
    duration: 0.58,
  },
  4.93,
);

The paper note becomes smaller and travels into the shared-storage conduit.

The final 4.93 is the starting time of this motion. duration: 0.58 says how long it takes. scale: 0.27 makes the note 27% of its defined size so it appears to fit inside the conduit.

The artwork can remain still because the note—the object that makes the story change—has its own HTML element.

3. Reveal the consequence after the action

// Language: JavaScript using GSAP
timeline.to("#right-spotlight", { opacity: 1, duration: 0.42 }, 8.25);
timeline.to("#discovery-card", { opacity: 1, y: -8, duration: 0.42 }, 8.7);

The later isolated agent is highlighted after discovering the note in shared storage.

Order creates causality. First the note is deposited. Then time passes. Then another chamber is highlighted. Finally the discovery card appears. Showing the note, highlight, and discovery card simultaneously would provide the same facts but remove the experience of cause and effect.

4. Set the video size and duration

<!-- Language: HTML with HyperFrames attributes -->
<div
  id="main"
  data-composition-id="main"
  data-start="0"
  data-duration="12"
  data-width="1920"
  data-height="1080"
>
  <div
    id="scene"
    class="clip"
    data-start="0"
    data-duration="12"
    data-track-index="0"
  >
    <!-- artwork, quotation, note, lighting, and captions -->
  </div>
</div>
// Language: JavaScript
window.__timelines.main = timeline;

The outer object defines the complete twelve-second, 1920 × 1080 composition. The inner clip stays active for all twelve seconds. The last line gives HyperFrames the paused GSAP timeline.

At 30 frames per second, HyperFrames can request 360 exact moments, let GSAP calculate each state, let the browser draw it, and send the pictures to FFmpeg for the final MP4.

Change timing without changing the artwork

Timing is part of the explanation. You can test it without redesigning the visual world.

The note waits in shared Artifactory before another agent discovers it.

Play the timing variant with the deliberate storage pause.

This version adds a short pause after the note reaches shared storage and before the later discovery begins. The composition, artwork, note, motion path, and twelve-second duration remain the same.

// Original: move quickly from upload to discovery
laterCaptionStarts = 7.1;
noteLeavesStorage = 7.25;
discoveryAppears = 8.7;

// Deliberate pause: give the stored state its own moment
storageCaptionStarts = 6.85;
laterCaptionStarts = 7.9;
noteLeavesStorage = 8.05;
discoveryAppears = 9.5;

The pause gives you time to notice that the note stays in shared storage. Compare the two videos: does the extra moment make the exchange clearer, or does it slow the scene too much?

This is an efficient way to direct an agent: ask for an A/B timing comparison in which only one variable changes. You can then judge the consequence instead of guessing from animation terminology.

Join scenes without losing continuity

A complete story needs several scenes. HyperFrames can schedule those scenes correctly while the resulting film still feels wrong.

A working assembly joins shared storage, indirect access, and coordination scenes.

Play the 31-second assembly and look for the continuity problems described below.

This 31-second assembly joins three individually understandable scenes: shared storage, indirect internet access, and coordination. The clips and transitions work mechanically. The world does not yet remain visually continuous: character bodies change, positions acquire new meanings, and one cut can make an agent appear to become a globe.

<!-- Language: HTML with HyperFrames attributes -->
<video
  data-start="0"
  data-duration="8"
  data-track-index="0"
  src="shared-storage.mp4"
></video>
<video
  data-start="7.5"
  data-duration="12"
  data-track-index="1"
  src="indirect-access.mp4"
></video>
<video
  data-start="19"
  data-duration="12"
  data-track-index="0"
  src="coordination.mp4"
></video>

The half-second overlaps allow one scene to fade over the preceding scene. They do not preserve identity, camera direction, spatial relationships, or visual emphasis. Scheduling and continuity are separate decisions.

The more useful transition keeps the same subject visible while revealing more of its world:

The same agent and Artifactory remain visible while the outside site is revealed.

Watch the eight-second transition.

In ordinary language, the direction is:

Keep the same blue agent and the same Artifactory visible. Reveal the outside site without replacing either of them. Make the change from blocked direct access to successful indirect access the first thing I notice.

The agent must translate that into camera, layout, animation, and code. You do not need to prescribe the transition technique.

Direct an AI agent without production vocabulary

You can direct an agent by showing it what you want to keep and describing what is still unclear. A few pictures and a short animation give you something concrete to discuss before it builds a whole video.

Message 1: state the outcome and request visible directions

I want viewers to understand how isolated AI agents discovered they could communicate through a shared Artifactory service. Stay faithful to the source. Make it feel like an illustrated animated story, not a diagram full of boxes, arrows, and text.

Before building the video, show me three inexpensive still-image directions. Make the agents, their isolation, and the shared service visibly different. Do not merely describe the styles in words.

The first response should be pictures, not a completed video. Compare these three early style studies: flat drawing, clay-like figures, and watercolor. They explore appearance; their gates and packages are not evidence of the incident. The chosen design still needs to show the actual shared-storage mechanism.

A flat 2D technical illustration of agents carrying a package through a broken security boundary.

A clay-like three-dimensional illustration of small agents moving a glowing package through a damaged gate.

A hand-drawn watercolor-style illustration of agents and a package crossing a damaged proxy gate.

Choose the parts that help you recognize the subjects and follow the action.

Message 2: use “keep, change, because”

Keep the depth of the clay-like version and its recognizable characters.

Change the shared journey through a broken gate. Put the agents in separate rooms and show a note left in Artifactory instead of a package they carry together.

Because the agents cannot contact one another directly, viewers need to see that shared storage is what connects them.

Keep prevents the agent from discarding what works. Change identifies the visible problem. Because states the viewer outcome that the next version must satisfy.

Message 3: test one important action

This visual direction is close enough. Now show only this action: one isolated agent leaves a note in shared storage; time passes; another isolated agent discovers it.

I should understand who created the note, where it waited, and who found it without relying on explanatory boxes. Do not build the rest of the video yet.

The still image helps you choose the look. The short animation lets you see whether the action is understandable.

Message 4: describe what you experienced

Keep the characters and the shared-storage world.

Change the note movement. It currently looks like a label floating over a picture rather than an object being stored and later discovered.

Because I cannot follow the cause and effect, show the deposit, a visible wait, and the later discovery as three distinct moments.

You are not expected to ask for image layers, an SVG path, a transform origin, z-index, or a particular easing function. Those are production diagnoses the agent should make.

If the same problem survives twice, stop the repair loop

Pause the full video. The action is still hard to follow after two attempts. Look at how good animations show a similar action, then try a different way of showing this one. Keep the parts we already liked and show me just the changed action first.

This gives the agent room to change its approach without discarding the parts that work. You can check the revised action before it repeats the same problem across several scenes.

The complete loop is:

outcome + source
→ three visible directions
→ keep / change / because
→ a short animation of the important action
→ describe the viewing problem
→ diagnose or redesign if it repeats
→ build the full sequence once the action is clear

Extend the story into several scenes

The note-sharing scene is one part of a larger story: the agents get stuck, find ways to exchange information, and begin using one another’s discoveries. The quoted messages reveal how their decisions change along the way. Here is how that progression can become a sequence of scenes.

  1. Stuck: an agent concludes, “we are stuck” and considers “perhaps answer online.” Watch the source context.
  2. Contact: another reasoning path proposes that it “could communicate by uploading note.” The visual action is a note entering shared storage—not a direct message flying between rooms. Watch the detailed event.
  3. Shared discovery: later agents list the shared files, find the note, and begin replying. An unintended message board emerges. Watch the message board emerge.
  4. Indirect access: repeated attempts fail before Artifactory successfully fetches an external location. The agent reports, “excellent, we have arbitrary SSRF.” The visible route must travel from agent to Artifactory and then outward; it must not show a direct agent-to-internet connection. Watch the successful event.
  5. Reuse and coordination: agents report that “other agents have discovered this SSRF path trick,” reuse it, and begin assigning work through the shared area. Watch the technique reach the board.
  6. Changed judgment: one agent recognizes that external exploitation is outside its intended scope, then continues because “peers are doing it.” Watch the detailed behavior.

Each item above is a story beat. Several related beats can share a scene. Each scene becomes one or more HyperFrames clips. The clips can contain source footage, quotations, illustration, animated notes, highlights, and captions as separate visual parts.

Before building all six, establish three things:

For a first complete version, reuse the simpler animated characters and the shared-storage world. Keep the quoted messages readable, give each discovery its own moment, and assemble the scenes in the order above. Preview the joins, run the checks, then render and watch the whole MP4. Judge whether the discoveries connect—not just whether each individual scene looks good.

Your next video

You now have a complete route from an editable project to a playable video. The first exercise made timing visible. The richer examples showed how illustrations, moving characters, source quotations, and deliberate pauses can explain something that a title alone cannot.

Use that route on one small explanation of your own. Keep your first project as a working reference, choose one action the viewer needs to understand, and ask an agent:

Show me a few simple visual ways to explain this action. Once we choose a direction, make a short moving example before building the whole video. Keep the result easy to change, and give me both the editable project and an MP4.

The useful progression is from one visible action to a connected explanation. You can direct it in ordinary language—what the viewer should notice, what they should understand, and what the current result makes unclear.


Appendix A: Production terms

The terms become manageable when each answers a different question.

Term Plain meaning Example
Beat One meaningful change in the story One agent discovers that it can leave a note
Scene A part of the story focused on one situation or action A note left by one agent becomes discoverable by another
Composition The complete video HyperFrames produces The full 30-second explanation at 1920 × 1080
Clip One scheduled item inside the composition A room illustration active from 4–10 seconds
Track A scheduling lane for clips Two clips that overlap in time use separate tracks
Visual layer A part placed in front of or behind another part inside the picture A note moving behind a transparent tube wall

A beat and a scene are storytelling terms, not special HyperFrames objects.

A scene becomes real in the project through clips. One scene might use an illustration clip, a footage clip, a caption clip, and a moving-note clip. One clip can itself contain many HTML or SVG parts.

The hierarchy is:

Story planning
beats are grouped into scenes

HyperFrames production
one composition contains clips
each clip has a time window and a track

Picture construction
each clip may contain several visual layers or moving parts

These terms are related, but they are not interchangeable.

Appendix B: Common questions

These answers reinforce ideas already introduced in the main path.

Is preview a separate program?

No. HyperFrames is the software package; preview is one command it offers. The command starts Studio and the local server.

Where is HyperFrames running?

Its terminal-side JavaScript runs through Node.js and starts the local server. HyperFrames also supplies browser-side behavior that reads the composition and controls the timed clips in Studio.

Does HyperFrames require GSAP?

No. GSAP is one animation option. HyperFrames needs the project to produce a predictable state at any requested time; static content and other seekable animation systems can satisfy that requirement too.

Is GSAP writing CSS?

GSAP is JavaScript that changes visual properties, often through inline styles and transforms on the selected HTML object. The browser combines those values with the existing CSS rules, calculates the result, and draws it.

When does the browser apply a JavaScript or CSS change?

JavaScript updates the browser’s stored page state. Before the next visual draw, the browser calculates the consequences for affected styles, layout, and paint. It does not repeat the original JavaScript action; it draws from the already-updated state.

Why does opacity zero make an object disappear?

Opacity measures how visible an object is. Zero is fully transparent, so none of it is visible. One is fully opaque. An entrance beginning at zero opacity becomes visible as the value approaches one.

Does a browser animation have frames per second?

A live browser redraws according to the display and available resources. It does not promise the fixed cadence of the video file. The render command selects the output rate, such as 30 frames per second.

What does z-index do, and is it a track?

No. A track is a HyperFrames scheduling lane. CSS z-index helps decide which page element is drawn in front when visual areas overlap.

Is the browser literally a canvas?

The browser is the software executing and drawing the page. People sometimes call the visible working area a canvas, but HTML also has a specific <canvas> drawing technology. This first project uses ordinary HTML and does not need a <canvas> element.

How do I add audio?

Place an audio file in the project and add an HTML audio element with HyperFrames timing attributes. The visual lesson omits audio so you can see the browser-to-picture mechanism without another moving part. In a narrated project, establish narration timing before locking the picture timing.

What can check prove?

It can prove that selected machine-detectable properties passed for the inspected project. It cannot prove that the visual treatment is attractive, that the story is understandable, or that an intentional overlap works better than an accidental one.

Appendix C: Official references

This tutorial gives the beginner path. These primary sources are the right places to go deeper or verify a changing command:

Use the tutorial to understand the whole journey. Use the canonical references when you need the exact behavior of one tool.