Recording demos
Instead of writing scenes and moves by hand, you can record what you do in the editor and let Demo Time turn it into an act for you. Click record, create a file, type some content, save and highlight a few lines, then click stop — Demo Time writes a version 3 act file with the matching create, open, applyPatch, save and highlight moves.
Start and stop recording
The recorder is controlled from the Acts & Scenes view in the Demo Time activity bar:
- Click the ● Record button in the view title bar to start. The button changes to a ■ Stop button while recording.
- Do your thing in the editor — create files, type, save, switch files.
- Click ■ Stop to finish. Demo Time asks for a title and creates a new act file in the
.demofolder.
You can also use the command palette: Demo Time: Record demo and Demo Time: Stop demo recording.
When you press Escape at the title prompt, Demo Time asks whether to discard the recording. Keep creates the act with the suggested title. When an act file with the same name already exists, a number is added to the file name, like my-demo-2.json.
What gets captured
| You do… | Recorded move |
|---|---|
| Have a file open when you start recording | open |
| Create a new file | create followed by open |
| Create a file outside VS Code (terminal, git, a CLI) | create, open and an applyPatch with its content, once you open or edit it |
| Type or edit a file | applyPatch (edits are coalesced — see segmentation) |
| Save a file | save (can be disabled, see settings). Only manual saves are captured, auto save is ignored |
| Switch to another file | flushes the pending edits into a move, and open for the file you switch to |
Every move happens in the file that the replay shows: when you go back to a file you edited before, or a file changes in the background, the recording adds an open move for it first. Each scene starts with an open move, so it also works when you start the play from that scene.
Highlights, move boundaries and new scenes are added on demand through the recording actions.
How edits become moves
While recording, your edits to a file are coalesced: everything you type piles up and only becomes a single applyPatch move when a boundary is reached. The boundaries are:
- Switching to another file
- Saving the file manually (auto saves, like with
files.autoSave, are not a boundary) - The Split move action (a manual boundary, see below)
- The New scene action
- Stopping the recording
This keeps the result clean — one move per meaningful chunk instead of one move per keystroke. Use Split move when you want to break a long edit into several steps within the same scene.
Recording actions
While recording, right-click in the editor to open the Demo Time submenu, or run the actions from the command palette (Demo Time: Mark highlight, Demo Time: Split move, Demo Time: New scene). The menu and commands only appear while a recording is active.
| Action | What it does |
|---|---|
| Mark highlight | Capture the current selection as a highlight move. With no selection it highlights the current line. A selection that ends at the start of a line, like after Shift+Down or a triple-click, does not include that line. |
| Split move | End the current move and start a new one — without leaving the file or saving. |
| New scene | End the current scene and start a new one. You are prompted for the scene title; leave it empty for Scene N, or press Escape to cancel. |
| Stop demo recording | Finish recording and create the act file. |
The actions have no default keyboard shortcuts. To add your own, search for the command in Keyboard Shortcuts and use demo-time.isRecording as the when clause.
Generated files
When you stop, Demo Time creates:
- A new act file in the
.demofolder (in JSON or YAML, depending on yourdemoTime.defaultFileTypesetting). - A snapshot and patch per edit move, under
.demo/snapshots/recording-<timestamp>/and.demo/patches/recording-<timestamp>/. These are referenced by theapplyPatchmoves and use the same format as the Patch actions.
Here is an example of what a recorded act looks like:
{ "$schema": "https://demotime.show/demo-time.schema.json", "title": "Recorded demo 20260625-101500", "description": "Recorded with Demo Time", "version": 3, "scenes": [ { "title": "Scene 1", "moves": [ { "action": "create", "path": "/src/app.ts" }, { "action": "open", "path": "/src/app.ts" }, { "action": "applyPatch", "path": "/src/app.ts", "contentPath": "/.demo/snapshots/recording-20260625-101500/001-app.ts", "patch": "/.demo/patches/recording-20260625-101500/001-app.ts.patch" }, { "action": "highlight", "path": "/src/app.ts", "position": "1:3" }, { "action": "save" } ] } ]}title: Recorded demo 20260625-101500description: Recorded with Demo Timeversion: 3scenes: - title: Scene 1 moves: - action: create path: /src/app.ts - action: open path: /src/app.ts - action: applyPatch path: /src/app.ts contentPath: /.demo/snapshots/recording-20260625-101500/001-app.ts patch: /.demo/patches/recording-20260625-101500/001-app.ts.patch - action: highlight path: /src/app.ts position: "1:3" - action: saveBefore you present
- Reset your workspace. When you stop recording, your files are in their final state. Undo the changes before you present, for instance with
git restoreand by deleting the files you created (git clean), so the play starts from the same files as the recording. - Choose a typing mode. The recorded
applyPatchmoves have noinsertTypingMode, so they replay with thedemoTime.insertTypingModesetting, which isinstantby default. SetinsertTypingModetocharacter-by-characterorline-by-lineon the moves, or change the setting, to type the code like you did while recording.
Limitations
- Only files in the first workspace folder are recorded.
- Terminal commands are not recorded. Add
executeTerminalCommandmoves in the Act Editor. - Renaming and deleting files is not recorded. Add
renameanddeleteFilemoves in the Act Editor.
Settings
| Setting | Description | Default |
|---|---|---|
demoTime.recording.captureSaves | When recording a demo, capture file saves as save moves. | true |