Open source · MIT

YAML in, narrated video out.

HowTo Recorder drives a real browser through a flow you describe declaratively, then hands back a finished video — animated cursor, AI voiceover, karaoke subtitles, and an optional push to YouTube. It works against any web app.

Three formats, one file

Demo flowTutorialShort
Turned on byno title:title:format: short
Resolution1920×10801920×10801080×1920
Output.webm.mp4.mp4 + subtitles
Loginvisiblebehind a title cardnever in the video
Audiononevoice + musicvoice at 1.1× + music

What a scenario looks like

name: howto-create-user
title: "How do I create a user?"
fadeOut: 1.5

steps:
  - login
  - wait.ready

  - narrate: In this tutorial I'll show you how to add a user.

  - click.text: Users
    narrate: We open the user list.
    highlight: Users
  - wait.url: /users

  - fill:
      Name: Ada Lovelace
    narrate: We type the name.

  - click.button: Create
    narrate: One click and the user is saved.
  - wait.idle

How it fits together

Architecture — from YAML to a published video Interactive: switch theme, trace a relationship, or export. Opens full screen →

Built for adapting

One config file

Selectors, login, formats, subtitle styling and the YouTube target all live in recorder.config.yaml. Presets ship for WordPress, Next.js, React-Admin, Filament, Vuetify and Django.

Plugins for the rest

Widgets a generic click cannot reach get their own actions. The bundled Filament plugin covers custom selects, a TipTap editor and Fabric.js canvases.

Preview before you pay

--preview records silently and pulls one frame per planned narration point, so you can check the wording against the real picture before spending a single speech-synthesis credit.

Publish and take back

Upload to YouTube, order the playlist, and delete again — with a sidecar that stops a second run from creating a duplicate video.