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 →