Skip to content
Open-source video, written in Flutter

You write widgets.
Fluvie shoots the film.

A real Flutter widget tree goes in. A real MP4 comes out. You say what the video is. Fluvie works out when everything happens, frame by frame. No timeline to scrub by hand. No video editor required.

It is code. It runs anywhere. It is a real video file.
lesson_01.dart Dart
import 'package:flutter/material.dart' hide Animation; // Fluvie's wins
import 'package:fluvie/fluvie.dart';

Video lesson01Video() => Video(
  size: VideoSize.square,
  scenes: [
    Scene(
      duration: 4.seconds,
      background: Background.gradient([...]),
      children: [
        Text('Hello, Fluvie')
          .animate([Animation.fadeIn(), Animation.pop()]),
      ],
    ),
  ],
);
hello.mp4 1080 × 1080 · 30fps
Hello, Fluvie
frame 9 of 16
$ fluvie render ./lib/hello.dart --out hello.mp4
no display needed
Roll your first video Open the live demo
02 · THE ONE IDEA

You bring the what.
Fluvie brings the when.

Not a recorder. A renderer. A screen recorder captures whatever happened to be on screen. Fluvie computes every frame from your description, so the timing and composition can be replayed from the same code.

The stopwatch way
0ms title.fadeIn(at: 0)
650 subtitle.show(at: 650)
900 chart.grow(at: 900)
?! move one, fix them all
The Fluvie way
show the title
after the title lands, float the subtitle
then grow the chart
move one, the rest re-flow
01
Describe, do not direct
02
The frame is the only clock
03
Replayable composition and timing
03 · THE CLEVER BIT

Triggers, not timecodes.

Say "after the title lands, float the subtitle." Fluvie schedules it. Move the title earlier and everything downstream follows. You never type a frame number. Try it: drag the title's start and watch which side keeps up.

 
Inspector
title
subtitle
subtitle*

On the Fluvie side, the subtitle is anchored after the title, so it followed automatically.

04 · THE PAYOFF

Write one. Render a thousand.

One template plus a data list renders one video per row. The frame cache keys on content, so an unchanged frame is read, not redrawn. Change one number and only the frames that moved render again.

"A thousand data-driven videos, rendered like one."

rows = [ Q1, Q2, Q3, Q4 ]
Q1
$2.4M
Q2
$3.1M
Q3
$3.0M
Q4
$4.2M

One template, one row per card. The cache shares the work across renders.

05 · THE CALL SHEET

From fluvie init to a real MP4.

Five steps, copy as you go. Each command ticks off when you grab it.

Prereqs: Flutter 3.44+. That is the list.

You do not need FFmpeg. The first render downloads a pinned build and caches it.

$ flutter --version
  1. Install the renderer
    The CLI that scaffolds, previews, and writes the file.
    dart pub global activate fluvie_cli
  2. Scaffold the project
    A composition, an assets folder, a pubspec. Works in an existing Flutter app.
    fluvie init --dir my_promo
    cd my_promo && flutter pub get
  3. Write the video
    One centered scene, a teal background, a title that fades in and pops. The import hides the names shared with Flutter.
    lib/example_video.dart
    import 'package:flutter/material.dart' hide Animation, Clip, Image, Tween;
    import 'package:fluvie/fluvie.dart';
    
    Video build() => Video(
      size: VideoSize.square,
      scenes: [
        Scene.centered(
          duration: 4.seconds,
          background: Background.color(const Color(0xFF0E9E8E)),
          child: const Text(
            'Hello, Fluvie',
            style: TextStyle(fontSize: 64, color: Colors.white),
          ).animate([Animation.fadeIn(), Animation.pop()]),
        ),
      ],
    );
    
  4. Watch it live
    Hot reload. Edit the file, save, watch it redraw. No app to run.
    fluvie preview ./lib/example_video.dart
  5. Render it
    When it looks right, write the MP4. No display needed.
    fluvie render ./lib/example_video.dart
Change the data, run the render, ship the file.
Your video is a build artifact now. That is the whole point.
Read the full guide Create from local assets Skip setup, scrub it live ↗
06 · THE REEL WALL

13 runnable lessons, each in one readable file.

Explore text and motion, scene transitions, charts, code, visualizers and captions. These illustrated cards link to the demo; the runnable Dart sources live in the gallery.

Scrub any of these live
07 · THE CREW

A small crew. One does the magic.

Ten MIT packages for authoring, rendering and tooling. Most people only ever need fluvie. The rest are there when you scale.

08 · OPEN SOURCE

MIT. Inspect it, fork it, host it, keep it.

No per-render Fluvie license fee. The MIT source lets you inspect how frames are prepared and drawn, fork it, and host it yourself.

MIT
license
10
packages
13
lessons
$0
Fluvie license fee
  • Inspectable
    The timing and capture implementations are open to inspection, with source-linked tests.
  • Auditable
    CLI receipts record source inputs, tools, output hashes and probed media facts for comparison.
  • No lock-in
    Readable Dart, ordinary media assets and exported files. Keep the inputs and re-render them.
  • Self-hostable
    Run the render API in your own Docker. Choose your own storage and the network access allowed to media and model providers.
  • Free, in the open
    MIT, with a public roadmap and issues. The lints and lessons came from real use.
09 · PICK YOUR SEAT

Same Video, four front doors.

Scrub it live in the browser. Render it from the CLI. Stand up your own render server. Or let an assistant shoot it for you. These paths share the authoring model and timing engine; each backend has its own capabilities.

For the cold visitor
open https://demo.fluvie.dev
Open the live demo

One composition, several rendering paths.

Compare the default rendering backends
Capabilitydesktopbrowsermobile
Formatsgif, imageSequence, mp4, transparentgif, imageSequence, mp4, transparentmp4
Video codecsh264, h265h264, h265h264, h265
Audioyesyesyes
Target bitrateyesyesyes
CRF controlyesyesno
Encoder presetsyesyesno

Codec availability and host requirements still depend on your environment. Unsupported requests fail before capture. Custom renderers declare their own capabilities.

Read the requirements and regression evidence
10 · EASY MODE

Or just say what you want.

fluvie_ai turns a plain sentence into a real VideoSpec. In the Playground, the AI Assistant writes editable Flutter-style Dart into the editor, so you can read it and refine it with another sentence. The model runs on the server, so the default flow keeps the provider key on that server. The MCP server in fluvie_server lets your assistant do the same from a chat. This is the optional easy mode, not the only mode.

1 · the prompt
"A 10-second product promo, brand teal, a counter rising to 10,000."
2 · editable Flutter code
Video promo() => Video(
  size: const VideoSize(320, 320),
  fps: 12,
  poster: 3.seconds,
  scenes: [
    Scene.centered(
      duration: 10.seconds,
      background: Background.color(const Color(0xFF0E9E8E)),
      child: Counter(
        to: 10000,
        reveal: 3.seconds,
        style: const TextStyle(fontSize: 48, color: Colors.white),
      ),
    ),
  ],
);
3 · actual Fluvie render

This checked-in Dart produced the preview. Model output varies.

Inspect a real model run: prompts, Dart edits and verified videos

Build with an AI assistant Read the AI & MCP guide Try it in the Playground Hosted MCP
11 · ROLL CAMERA

Roll camera.

New here? Watch the runnable examples render live. Building something? Five steps to your first MP4. Already shipping? Straight to the docs.

New here?
Watch it render live
13 runnable lessons to explore in the demo.
Open the live demo
Building something?
Render your first video
Five steps to your first MP4, copy as you go.
Roll your first video
Already shipping?
Straight to the docs
Deep-link the reference and the packages.
Open the docs

You write widgets. Fluvie shoots the film.