---
title: First and last frame — Gemini Omni Flash 1.2 | Runware Docs
url: https://runware.ai/docs/models/google-gemini-omni-flash-1-2/guides/first-and-last-frame
description: How to animate an opening frame or connect a first and last frame with Gemini Omni Flash 1.2, from building a matching pair to describing the motion between them.
---
### [Introduction](https://runware.ai/docs/models/google-gemini-omni-flash-1-2/guides/first-and-last-frame#introduction)

Gemini Omni Flash 1.2 can **start a clip on an image you supply**, or **start on one image and end on another**. One image in `inputs.frameImages` becomes the opening frame. With two, the first and last frames are fixed and the model generates the motion that connects them.

![An empty apartment living room with light oak floorboards, white walls and a large bare window on the left letting in morning daylight](https://runware.ai/docs/assets/source-hero-first.COJi3QLQ_Z3hqEd.jpg)

*First frame*

> **Prompt**: An empty living room in a bright modern apartment, photographed for a real estate listing. Light oak floorboards, smooth white walls, a large bare window on the left wall letting in soft morning daylight, and a white ceiling with recessed lights. The room is completely empty, with no furniture, rugs, plants, or decor. Wide eye-level shot from the doorway with straight vertical lines, 24mm lens, photoreal.

![The same living room staged with a light gray sofa, a round oak coffee table on a cream rug, a fiddle-leaf fig by the window, a brass floor lamp and two framed black-and-white photographs](https://runware.ai/docs/assets/source-hero-last.o2ra5-7Z_1oiVKY.jpg)

*Last frame*

> **Prompt**: Stage this empty living room for a real estate listing. Add a light gray three-seat sofa against the back wall, a round oak coffee table on a cream wool rug in front of it, a tall fiddle-leaf fig in a white pot beside the window, a brass floor lamp next to the sofa, and two framed black-and-white landscape photographs above it. Keep the walls, floor, window, ceiling, daylight, and camera angle exactly the same.

[Watch video](https://runware.ai/docs/assets/hero.DmkRcA6E.mp4)

> **Prompt**: Open on the first frame and end exactly on the last frame. The room is staged in a quick stop-motion sequence while the daylight stays the same: the rug unrolls across the floor, the sofa slides in against the back wall, the coffee table lands on the rug, the plant and the floor lamp pop into place, and the two photographs appear on the wall last. Locked-off camera, single continuous shot, no cuts. Audio: a soft thud as each piece lands over light acoustic guitar music. No voiceover, no on-screen text.

The last frame is **an image edit of the first**, so everything but the furniture matches before the video starts. [Choosing a frame pair](https://runware.ai/docs/models/google-gemini-omni-flash-1-2/guides/first-and-last-frame#choosing-a-frame-pair) shows how to build one.

### [Request shape](https://runware.ai/docs/models/google-gemini-omni-flash-1-2/guides/first-and-last-frame#request-shape)

`inputs.frameImages` takes one or two images. Each item is either **a plain image** or **an object that names its position**, `{ "image": ..., "frame": "first" }` or `"last"`. This is the hero request, written with objects:

**TypeScript**:

```typescript
import { createClient } from '@runware/sdk'

const client = await createClient({ apiKey: process.env.RUNWARE_API_KEY })
await client.connect()

const [result] = await client.run({
  model: 'google:gemini@omni-flash-1.2',
  positivePrompt: 'Open on the first frame and end exactly on the last frame. The room is staged in a quick stop-motion sequence while the daylight stays the same: the rug unrolls across the floor, the sofa slides in against the back wall, the coffee table lands on the rug, the plant and the floor lamp pop into place, and the two photographs appear on the wall last. Locked-off camera, single continuous shot, no cuts. Audio: a soft thud as each piece lands over light acoustic guitar music. No voiceover, no on-screen text.',
  resolution: '1080p',
  duration: 8,
  inputs: {
    frameImages: [
      {
        image: 'https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-hero-first.jpg',
        frame: 'first'
      },
      {
        image: 'https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-hero-last.jpg',
        frame: 'last'
      }
    ]
  }
})
```

**Python**:

```python
import asyncio
import os

from runware import Runware

async def main():
    async with Runware(api_key=os.environ["RUNWARE_API_KEY"]) as client:
        results = await client.run({
            "model": "google:gemini@omni-flash-1.2",
            "positivePrompt": "Open on the first frame and end exactly on the last frame. The room is staged in a quick stop-motion sequence while the daylight stays the same: the rug unrolls across the floor, the sofa slides in against the back wall, the coffee table lands on the rug, the plant and the floor lamp pop into place, and the two photographs appear on the wall last. Locked-off camera, single continuous shot, no cuts. Audio: a soft thud as each piece lands over light acoustic guitar music. No voiceover, no on-screen text.",
            "resolution": "1080p",
            "duration": 8,
            "inputs": {
                "frameImages": [
                    {
                        "image": "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-hero-first.jpg",
                        "frame": "first"
                    },
                    {
                        "image": "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-hero-last.jpg",
                        "frame": "last"
                    }
                ]
            }
        })

asyncio.run(main())
```

**cURL**:

```bash
curl https://api.runware.ai/v1 \
  -H "Authorization: Bearer $RUNWARE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '[
    {
      "taskType": "videoInference",
      "taskUUID": "45e73ce9-3d8d-45b0-a4cb-c8139a0905f9",
      "model": "google:gemini@omni-flash-1.2",
      "positivePrompt": "Open on the first frame and end exactly on the last frame. The room is staged in a quick stop-motion sequence while the daylight stays the same: the rug unrolls across the floor, the sofa slides in against the back wall, the coffee table lands on the rug, the plant and the floor lamp pop into place, and the two photographs appear on the wall last. Locked-off camera, single continuous shot, no cuts. Audio: a soft thud as each piece lands over light acoustic guitar music. No voiceover, no on-screen text.",
      "resolution": "1080p",
      "duration": 8,
      "inputs": {
        "frameImages": [
          {
            "image": "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-hero-first.jpg",
            "frame": "first"
          },
          {
            "image": "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-hero-last.jpg",
            "frame": "last"
          }
        ]
      }
    }
  ]'
```

**CLI**:

```bash
runware run google:gemini@omni-flash-1.2 \
  positivePrompt="Open on the first frame and end exactly on the last frame. The room is staged in a quick stop-motion sequence while the daylight stays the same: the rug unrolls across the floor, the sofa slides in against the back wall, the coffee table lands on the rug, the plant and the floor lamp pop into place, and the two photographs appear on the wall last. Locked-off camera, single continuous shot, no cuts. Audio: a soft thud as each piece lands over light acoustic guitar music. No voiceover, no on-screen text." \
  resolution=1080p \
  duration=8 \
  inputs.frameImages.0.image=https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-hero-first.jpg \
  inputs.frameImages.0.frame=first \
  inputs.frameImages.1.image=https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-hero-last.jpg \
  inputs.frameImages.1.frame=last
```

**JSON**:

```json
{
  "taskType": "videoInference",
  "taskUUID": "45e73ce9-3d8d-45b0-a4cb-c8139a0905f9",
  "model": "google:gemini@omni-flash-1.2",
  "positivePrompt": "Open on the first frame and end exactly on the last frame. The room is staged in a quick stop-motion sequence while the daylight stays the same: the rug unrolls across the floor, the sofa slides in against the back wall, the coffee table lands on the rug, the plant and the floor lamp pop into place, and the two photographs appear on the wall last. Locked-off camera, single continuous shot, no cuts. Audio: a soft thud as each piece lands over light acoustic guitar music. No voiceover, no on-screen text.",
  "resolution": "1080p",
  "duration": 8,
  "inputs": {
    "frameImages": [
      {
        "image": "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-hero-first.jpg",
        "frame": "first"
      },
      {
        "image": "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-hero-last.jpg",
        "frame": "last"
      }
    ]
  }
}
```

With plain images, **the order sets the position**: the first item is the opening frame and the second the closing one. The same pair as above:

```json
{
  "inputs": {
    "frameImages": [
      "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-hero-first.jpg",
      "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-hero-last.jpg"
    ]
  }
}
```

The number of frames **sets the duration ceiling**: one frame allows a `duration` of up to 15 seconds, and two frames up to 10. [Resolution and duration](https://runware.ai/docs/models/google-gemini-omni-flash-1-2/guides/resolution-and-duration) has the full limits.

Frames **can't be mixed with other media inputs**. Adding reference images, reference videos or a source video to a request with `inputs.frameImages` is rejected.

Set the size with `resolution` and **the clip takes the shape of the frame**: a 16:9 frame gives a horizontal clip and a 9:16 frame a vertical one. Those are the only two shapes the model renders, so generate frames in one of them. Each frame can be up to 4096 px on a side and 5 MB.

### [Animating a single frame](https://runware.ai/docs/models/google-gemini-omni-flash-1-2/guides/first-and-last-frame#animating-a-single-frame)

A single opening frame tells the model **where the clip starts and nothing more**. Everything after the first frame comes from the prompt, so describe **what the subject does and what the camera does**. A prompt that only asks for movement leaves both to the model.

![A closed matte black gift box on a white marble counter against a warm gray wall](https://runware.ai/docs/assets/source-box.BqP4_MmM_15xs4F.jpg)

*Opening frame*

> **Prompt**: A closed matte black gift box with a fitted lid sits in the center of a white marble counter, with a soft warm-gray wall behind it and gentle window light from the left. E-commerce product photo for an unboxing video, eye-level medium shot, 50mm lens, photoreal. No text, no logos.

[Watch video](https://runware.ai/docs/assets/output-vague.C3vq8CiG.mp4)

*Vague prompt*

> **Prompt**: Make this image move.

[Watch video](https://runware.ai/docs/assets/output-concrete.B_j04KH0.mp4)

*Concrete prompt*

> **Prompt**: Use the image as the opening frame of an unboxing video. Two hands, the only hands in the shot, enter from the bottom of the frame, lift the lid straight up, and set it down beside the box, revealing a sage green, pebble-shaped wireless earbuds charging case in a black foam tray. One hand lifts the case out and opens its lid toward the camera, showing both earbuds inside. The camera pushes in slowly over the whole clip, from the medium shot to a close-up of the open case. Single continuous shot, no cuts. Audio: the soft scrape of the lid, the click of the case opening, and quiet room tone. No music, no voiceover, no on-screen text.

The concrete prompt gives the subject and the camera a part each:

**[Frame]** Use the image as the opening frame of an unboxing video., **[Subject motion]** Two hands, the only hands in the shot, enter from the bottom of the frame, lift the lid straight up, and set it down beside the box, revealing a sage green, pebble-shaped wireless earbuds charging case in a black foam tray. One hand lifts the case out and opens its lid toward the camera, showing both earbuds inside., **[Camera motion]** The camera pushes in slowly over the whole clip, from the medium shot to a close-up of the open case., **[Shot]** Single continuous shot, no cuts., **[Audio]** Audio: the soft scrape of the lid, the click of the case opening, and quiet room tone. No music, no voiceover, no on-screen text.

Describe **what the frame cannot show**: the box is closed in the opening frame, so the prompt says what is inside it. The camera move has **a start and an end**, the medium shot of the frame and a close-up of the case, which spreads one push-in over the whole clip.

The request sends the frame as a plain image and runs 12 seconds, inside the 15-second ceiling for one frame:

**TypeScript**:

```typescript
import { createClient } from '@runware/sdk'

const client = await createClient({ apiKey: process.env.RUNWARE_API_KEY })
await client.connect()

const [result] = await client.run({
  model: 'google:gemini@omni-flash-1.2',
  positivePrompt: 'Use the image as the opening frame of an unboxing video. Two hands, the only hands in the shot, enter from the bottom of the frame, lift the lid straight up, and set it down beside the box, revealing a sage green, pebble-shaped wireless earbuds charging case in a black foam tray. One hand lifts the case out and opens its lid toward the camera, showing both earbuds inside. The camera pushes in slowly over the whole clip, from the medium shot to a close-up of the open case. Single continuous shot, no cuts. Audio: the soft scrape of the lid, the click of the case opening, and quiet room tone. No music, no voiceover, no on-screen text.',
  resolution: '1080p',
  duration: 12,
  inputs: {
    frameImages: [
      'https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-box.jpg'
    ]
  }
})
```

**Python**:

```python
import asyncio
import os

from runware import Runware

async def main():
    async with Runware(api_key=os.environ["RUNWARE_API_KEY"]) as client:
        results = await client.run({
            "model": "google:gemini@omni-flash-1.2",
            "positivePrompt": "Use the image as the opening frame of an unboxing video. Two hands, the only hands in the shot, enter from the bottom of the frame, lift the lid straight up, and set it down beside the box, revealing a sage green, pebble-shaped wireless earbuds charging case in a black foam tray. One hand lifts the case out and opens its lid toward the camera, showing both earbuds inside. The camera pushes in slowly over the whole clip, from the medium shot to a close-up of the open case. Single continuous shot, no cuts. Audio: the soft scrape of the lid, the click of the case opening, and quiet room tone. No music, no voiceover, no on-screen text.",
            "resolution": "1080p",
            "duration": 12,
            "inputs": {
                "frameImages": [
                    "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-box.jpg"
                ]
            }
        })

asyncio.run(main())
```

**cURL**:

```bash
curl https://api.runware.ai/v1 \
  -H "Authorization: Bearer $RUNWARE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '[
    {
      "taskType": "videoInference",
      "taskUUID": "cbb73a75-9ffe-48d6-b525-80ed87916e75",
      "model": "google:gemini@omni-flash-1.2",
      "positivePrompt": "Use the image as the opening frame of an unboxing video. Two hands, the only hands in the shot, enter from the bottom of the frame, lift the lid straight up, and set it down beside the box, revealing a sage green, pebble-shaped wireless earbuds charging case in a black foam tray. One hand lifts the case out and opens its lid toward the camera, showing both earbuds inside. The camera pushes in slowly over the whole clip, from the medium shot to a close-up of the open case. Single continuous shot, no cuts. Audio: the soft scrape of the lid, the click of the case opening, and quiet room tone. No music, no voiceover, no on-screen text.",
      "resolution": "1080p",
      "duration": 12,
      "inputs": {
        "frameImages": [
          "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-box.jpg"
        ]
      }
    }
  ]'
```

**CLI**:

```bash
runware run google:gemini@omni-flash-1.2 \
  positivePrompt="Use the image as the opening frame of an unboxing video. Two hands, the only hands in the shot, enter from the bottom of the frame, lift the lid straight up, and set it down beside the box, revealing a sage green, pebble-shaped wireless earbuds charging case in a black foam tray. One hand lifts the case out and opens its lid toward the camera, showing both earbuds inside. The camera pushes in slowly over the whole clip, from the medium shot to a close-up of the open case. Single continuous shot, no cuts. Audio: the soft scrape of the lid, the click of the case opening, and quiet room tone. No music, no voiceover, no on-screen text." \
  resolution=1080p \
  duration=12 \
  inputs.frameImages.0=https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-box.jpg
```

**JSON**:

```json
{
  "taskType": "videoInference",
  "taskUUID": "cbb73a75-9ffe-48d6-b525-80ed87916e75",
  "model": "google:gemini@omni-flash-1.2",
  "positivePrompt": "Use the image as the opening frame of an unboxing video. Two hands, the only hands in the shot, enter from the bottom of the frame, lift the lid straight up, and set it down beside the box, revealing a sage green, pebble-shaped wireless earbuds charging case in a black foam tray. One hand lifts the case out and opens its lid toward the camera, showing both earbuds inside. The camera pushes in slowly over the whole clip, from the medium shot to a close-up of the open case. Single continuous shot, no cuts. Audio: the soft scrape of the lid, the click of the case opening, and quiet room tone. No music, no voiceover, no on-screen text.",
  "resolution": "1080p",
  "duration": 12,
  "inputs": {
    "frameImages": [
      "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-box.jpg"
    ]
  }
}
```

### [Choosing a frame pair](https://runware.ai/docs/models/google-gemini-omni-flash-1-2/guides/first-and-last-frame#choosing-a-frame-pair)

A pair works when the two frames **differ only in what the clip should change**. Keep the subject, the setting, the light and the lens the same in both, and the model only has to animate the change. Two unrelated photos leave it to invent a route between two different shots.

A reliable way to get a matching pair is to **build the last frame from the first** with an image edit. Send the first frame to [Nano Banana 2.1](https://runware.ai/docs/models/google-nano-banana-2-1) in `inputs.referenceImages`, name the one change, and list what stays. Request the last frame at **the same size as the first**, with matching `width` and `height`:

**TypeScript**:

```typescript
import { createClient } from '@runware/sdk'

const client = await createClient({ apiKey: process.env.RUNWARE_API_KEY })
await client.connect()

const [result] = await client.run({
  model: 'google:nano-banana@2.1',
  positivePrompt: 'Change only her outfit to a tailored camel wool coat over a black turtleneck, black wide-leg trousers, and black leather loafers. Keep her face, hair, pose, the backdrop, the light, and the framing exactly the same.',
  width: 1536,
  height: 2752,
  inputs: {
    referenceImages: [
      'https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-outfit-first.jpg'
    ]
  }
})
```

**Python**:

```python
import asyncio
import os

from runware import Runware

async def main():
    async with Runware(api_key=os.environ["RUNWARE_API_KEY"]) as client:
        results = await client.run({
            "model": "google:nano-banana@2.1",
            "positivePrompt": "Change only her outfit to a tailored camel wool coat over a black turtleneck, black wide-leg trousers, and black leather loafers. Keep her face, hair, pose, the backdrop, the light, and the framing exactly the same.",
            "width": 1536,
            "height": 2752,
            "inputs": {
                "referenceImages": [
                    "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-outfit-first.jpg"
                ]
            }
        })

asyncio.run(main())
```

**cURL**:

```bash
curl https://api.runware.ai/v1 \
  -H "Authorization: Bearer $RUNWARE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '[
    {
      "taskType": "imageInference",
      "taskUUID": "1385b9e4-8239-4a7e-a44a-e3c553d86154",
      "model": "google:nano-banana@2.1",
      "positivePrompt": "Change only her outfit to a tailored camel wool coat over a black turtleneck, black wide-leg trousers, and black leather loafers. Keep her face, hair, pose, the backdrop, the light, and the framing exactly the same.",
      "width": 1536,
      "height": 2752,
      "inputs": {
        "referenceImages": [
          "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-outfit-first.jpg"
        ]
      }
    }
  ]'
```

**CLI**:

```bash
runware run google:nano-banana@2.1 \
  positivePrompt="Change only her outfit to a tailored camel wool coat over a black turtleneck, black wide-leg trousers, and black leather loafers. Keep her face, hair, pose, the backdrop, the light, and the framing exactly the same." \
  width=1536 \
  height=2752 \
  inputs.referenceImages.0=https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-outfit-first.jpg
```

**JSON**:

```json
{
  "taskType": "imageInference",
  "taskUUID": "1385b9e4-8239-4a7e-a44a-e3c553d86154",
  "model": "google:nano-banana@2.1",
  "positivePrompt": "Change only her outfit to a tailored camel wool coat over a black turtleneck, black wide-leg trousers, and black leather loafers. Keep her face, hair, pose, the backdrop, the light, and the framing exactly the same.",
  "width": 1536,
  "height": 2752,
  "inputs": {
    "referenceImages": [
      "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-outfit-first.jpg"
    ]
  }
}
```

![A woman with shoulder-length dark curly hair in a cream cable-knit sweater, light-wash jeans and white sneakers, standing against a warm gray studio backdrop](https://runware.ai/docs/assets/source-outfit-first.Ue2Mwf3V_Z1HIqKq.jpg)

*First frame*

> **Prompt**: Full-length fashion lookbook photo of a woman in her late twenties with shoulder-length dark curly hair, standing relaxed with her weight on one leg and one hand in her pocket. She wears a cream cable-knit sweater, straight light-wash jeans, and white leather sneakers. Plain warm-gray studio backdrop, soft even studio light, camera at waist height, 50mm lens, photoreal. Vertical frame with space above her head and below her feet.

![The same woman in the same pose wearing a camel wool coat over a black turtleneck, black wide-leg trousers and black loafers](https://runware.ai/docs/assets/source-outfit-last.C0o5UxdR_1tQncM.jpg)

*Last frame, edited from the first*

> **Prompt**: Change only her outfit to a tailored camel wool coat over a black turtleneck, black wide-leg trousers, and black leather loafers. Keep her face, hair, pose, the backdrop, the light, and the framing exactly the same.

[Watch video](https://runware.ai/docs/assets/output-outfit.BkvOLa1h.mp4)

> **Prompt**: An outfit transition for a fashion reel. Open on the first frame and end on the last frame. She spins once on the spot, and as her back turns to the camera the casual outfit is replaced by the tailored one in a single instant, hidden in the motion blur of the spin, with no dissolve and no second figure, so she finishes the turn in the new look and settles back into the same pose. Static camera, single continuous shot, no cuts. Audio: a whoosh on the spin over an upbeat pop beat. No dialogue, no on-screen text.

Both frames share one camera position, so the video prompt **locks the camera**. It never describes either outfit, since the frames carry the look, and spends its words on **when the switch happens**: as her back turns to the camera, which hides the change inside the spin.

### [Describing the transition](https://runware.ai/docs/models/google-gemini-omni-flash-1-2/guides/first-and-last-frame#describing-the-transition)

The two frames fix the ends of the clip, and **the prompt sets the route** between them: the order things change in, and how each one moves. Write it as a sequence.

![A mobile app product page in its loading state, with light gray placeholder blocks for a photo, a name, a price and a button on a white background](https://runware.ai/docs/assets/source-app-first.CihBPgdw_Z2m3sjD.jpg)

*First frame*

> **Prompt**: A full-screen mobile app product page in its loading state, shown flat and edge to edge with no phone frame. White background with light gray rounded placeholder blocks: a large square block for the product photo at the top, a wide bar for the product name below it, a short bar for the price, and a wide pill-shaped block for the button near the bottom. Only these four placeholder blocks, with no other bars or lines. Clean flat UI design with generous margins. No text, no icons, no logos.

![The finished product page with a photo of a white running shoe, the name Trail Runner, the price $129 and a black Add to cart button](https://runware.ai/docs/assets/source-app-last.CGu3VvO1_Cy1WI.jpg)

*Last frame*

> **Prompt**: Fill in this loading screen as the finished product page, with every element in the same position and size as its placeholder. Put a studio photo of an unbranded white running shoe on a pale sand background in the large square block, the product name "Trail Runner" in bold black type on the wide bar, the price "$129" on the short bar, and a black pill button with the white label "Add to cart" in place of the button block. Keep the white background, the margins, and the layout exactly the same. No other text, no logos.

[Watch video](https://runware.ai/docs/assets/output-app.COYf3i02.mp4)

> **Prompt**: A UI animation for an app launch video. Open on the loading screen in the first frame and end on the finished page in the last frame. The layout never moves. The placeholders resolve one at a time from top to bottom: the shoe photo fades in inside the large block with a slight zoom that settles, the name "Trail Runner" types in letter by letter, the price "$129" slides up into place, and the button fills with black as its label "Add to cart" fades in with a small bounce. Flat 2D motion graphics, static camera, single continuous shot. Audio: a soft click as each element lands over a light electronic beat. No voiceover.

**[Purpose]** A UI animation for an app launch video., **[Frames]** Open on the loading screen in the first frame and end on the finished page in the last frame., **[What holds]** The layout never moves., **[Order]** The placeholders resolve one at a time from top to bottom:, **[Motion]** the shoe photo fades in inside the large block with a slight zoom that settles, the name "Trail Runner" types in letter by letter, the price "$129" slides up into place, and the button fills with black as its label "Add to cart" fades in with a small bounce., **[Camera]** Flat 2D motion graphics, static camera, single continuous shot., **[Audio]** Audio: a soft click as each element lands over a light electronic beat. No voiceover.

"One at a time from top to bottom" **gives the four changes an order**, and "the layout never moves" holds everything the two frames share in place. Quote on-screen words **exactly as the last frame shows them**, so the text the clip types in matches the text it ends on.

### [Tips](https://runware.ai/docs/models/google-gemini-omni-flash-1-2/guides/first-and-last-frame#tips)

1. **Describe motion, not the scene.** The frames already show the scene, so spend the prompt on what moves and how.
    
2. **Give the camera one move with a start and an end.** When both frames come from one edit and share a framing, lock the camera instead.
    
3. **Ask for a single continuous shot.** The model often cuts between several shots by default, and "single continuous shot, no cuts" keeps the clip on one path from frame to frame.
    
4. **Build the last frame from the first.** An image edit with one change keeps everything else identical in both frames.
    
5. **Put the transition in order.** Say what changes first and what lands last.
    
6. **Match the frames to the clip shape.** Generate them at 16:9 or 9:16, since the clip takes the shape of the frame.