Back to Blog
Guide February 26, 2026

How to record a product demo video without a screen recorder

Skip OBS, Loom, and Camtasia. Define your demo as a step sequence, add a narration script, get an MP4 back. No recording setup, no editing, no voice acting.

How to Record a Product Demo Video Without a Screen Recorder

Screen recorders have a setup tax: install OBS or Loom, configure audio input, do a test recording, re-record when you fumble a click, edit out the pauses, export, compress, upload. For a 60-second product demo, you're looking at 30–45 minutes of work.

There's a different approach: define the demo as a step sequence, add narration, call an API.

The basic demo

import fs from 'fs';

const res = await fetch('https://api.pagebolt.dev/v1/video', {
  method: 'POST',
  headers: {
    'x-api-key': process.env.PAGEBOLT_API_KEY,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    steps: [
      { action: 'navigate', url: 'https://yourapp.com', note: 'Open the app' },
      { action: 'click', selector: '#sign-up', note: 'Start signup' },
      { action: 'fill', selector: '#email', value: 'demo@example.com', note: 'Enter email' },
      { action: 'click', selector: '[type="submit"]', note: 'Submit' },
      { action: 'wait_for', selector: '.dashboard', note: 'Dashboard loads' }
    ],
    audioGuide: {
      enabled: true,
      voice: 'nova',
      script: "Here's how to get started. {{1}} Hit Sign Up. {{2}} Enter your email. {{3}} Submit — and {{4}} you're in. {{5}} Your dashboard is ready."
    },
    frame: { enabled: true, style: 'macos' },
    background: { enabled: true, type: 'gradient', gradient: 'ocean' },
    cursor: { style: 'highlight', persist: true },
    pace: 'slow'
  })
});

fs.writeFileSync('demo.mp4', Buffer.from(await res.arrayBuffer()));

Run it. Get demo.mp4. Done.

Choosing a voice

The voice parameter accepts: nova, alloy, echo, fable, onyx, shimmer (OpenAI) or ava, jenny, aria, emma (Azure). Pick one, keep it consistent across all your demos for brand coherence.

Making it repeatable

Store the step sequence and narration separately so you can update either independently:

// demos/signup.json
{
  "steps": [...],
  "narration": "Here's how to get started. {{1}} Hit Sign Up..."
}
// record.js
const demo = JSON.parse(fs.readFileSync(`demos/${process.argv[2]}.json`));

const res = await fetch('https://api.pagebolt.dev/v1/video', {
  method: 'POST',
  headers: { 'x-api-key': process.env.PAGEBOLT_API_KEY, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    steps: demo.steps,
    audioGuide: { enabled: true, voice: 'nova', script: demo.narration },
    frame: { enabled: true, style: 'macos' },
    pace: 'slow'
  })
});

fs.writeFileSync(`demos/${process.argv[2]}.mp4`, Buffer.from(await res.arrayBuffer()));
node record.js signup
node record.js integrations
node record.js billing

One script, multiple demos, each defined in a JSON file checked into the repo.

What you skip

Screen recorder workflow API workflow
Audio setup + levels check None
Live recording (no mistakes) JSON step file
Edit out pauses and fumbles Pace parameter
Re-record when UI changes Update JSON, re-run
Export + compress MP4 returned directly
Upload to host Save or pipe to S3

The output is identical — an MP4 with narration. The process is a node record.js command.


Try it free — 100 requests/month, no credit card. → pagebolt.dev

Get Started Free

100 requests/month, no credit card

Screenshots, PDFs, video recording, and browser automation — no headless browser to manage.

Get Your Free API Key →