Fake terminal demos. YAML in, SVG out. No recording.
Project description
termstage
Generate polished terminal demo SVGs from a YAML file. No recording, no live shell, no asciinema.
Write what you want the terminal to show. Get a clean SVG you can drop into any README, doc, or portfolio.
Install
pip install termstage
# or
uv add termstage
The Flow
1. Scaffold a starter file
termstage init
Creates demo.yaml in the current directory with example steps you can edit.
2. Edit demo.yaml
Open demo.yaml and replace the example steps with your own commands and output. See YAML format below.
3. Preview in browser
termstage preview demo.yaml
Opens a rendered SVG in your default browser. Iterate here until it looks right.
4. Render to SVG
# Static SVG
termstage render demo.yaml
# Animated CSS typewriter (recommended for READMEs)
termstage render demo.yaml --animated
# Custom output path
termstage render demo.yaml --animated -o assets/demo.svg
5. Embed in your README

Or for more control over sizing:
<img src="demo-animated.svg" alt="demo" width="700">
The animated SVG uses pure CSS — no JavaScript. Works on GitHub, GitLab, and anywhere SVG is rendered.
YAML Format
title: "my-cli" # Title bar text
theme: dark # dark | light | dracula | nord (default: dark)
prompt: "$ " # Prompt string (default: "$ ")
width: 700 # SVG width in pixels (default: 700)
steps:
- cmd: "my-cli --version"
output: "my-cli 1.0.0"
- cmd: "my-cli process data.csv"
output: |
Reading data.csv...
Processed 10,000 rows
Output → results.jsonl
- comment: "# Comments render without a prompt, styled as code comments"
- cmd: "my-cli --help"
output: |
Usage: my-cli [OPTIONS] COMMAND
process Process a CSV file
export Export results
Options:
--help Show this message and exit.
Step types
| Type | Fields | Description |
|---|---|---|
cmd |
cmd, output (optional) |
Renders prompt + command + output |
comment |
comment |
Renders a line styled as a code comment, no prompt |
Top-level fields
| Field | Default | Description |
|---|---|---|
title |
"terminal" |
Title bar text |
theme |
dark |
Colour theme |
prompt |
"$ " |
Prompt string |
width |
700 |
SVG width in pixels |
Themes
termstage themes
| Theme | Background | Based on |
|---|---|---|
dark |
#1e1e1e |
VS Code Dark+ (default) |
light |
#ffffff |
Clean light terminal |
dracula |
#282a36 |
Dracula |
nord |
#2e3440 |
Nord |
Set with theme: <name> in your YAML.
Commands
| Command | Description |
|---|---|
termstage init [output.yaml] |
Scaffold a starter YAML (default: demo.yaml) |
termstage render <file.yaml> |
Render static SVG |
termstage render <file.yaml> --animated |
Render animated CSS typewriter SVG |
termstage render <file.yaml> -o out.svg |
Custom output path |
termstage preview <file.yaml> |
Render and open in browser |
termstage preview <file.yaml> --animated |
Preview animated version |
termstage themes |
List available themes |
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file termstage-0.3.0.tar.gz.
File metadata
- Download URL: termstage-0.3.0.tar.gz
- Upload date:
- Size: 12.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bbd7d7f00c83f9bff1317ecb3707bbea6d068485dd4eff308351ce225c70ff85
|
|
| MD5 |
6231957ceddb6b36161bd43489a7eceb
|
|
| BLAKE2b-256 |
4a24539f0dd13eb1dd9a1eb60e351ac439ccc9d43649abfbb87e28c0576c1491
|
Provenance
The following attestation bundles were made for termstage-0.3.0.tar.gz:
Publisher:
release.yml on saikatkumardey/termstage
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
termstage-0.3.0.tar.gz -
Subject digest:
bbd7d7f00c83f9bff1317ecb3707bbea6d068485dd4eff308351ce225c70ff85 - Sigstore transparency entry: 993782335
- Sigstore integration time:
-
Permalink:
saikatkumardey/termstage@0443db0ceae0b9a850c049e6c2b4fead195f105f -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/saikatkumardey
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0443db0ceae0b9a850c049e6c2b4fead195f105f -
Trigger Event:
push
-
Statement type:
File details
Details for the file termstage-0.3.0-py3-none-any.whl.
File metadata
- Download URL: termstage-0.3.0-py3-none-any.whl
- Upload date:
- Size: 10.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
91fe8e22918b4431490ad9b34e48fc9fec6810ef8811ad5f3011f7a0e485c89a
|
|
| MD5 |
650b2f6af85717868844b2a5372ab3ae
|
|
| BLAKE2b-256 |
41379715b5f06c08f4aaf9da29d01c17b4132f66f84fd2d0c20ef6c2e7e66d73
|
Provenance
The following attestation bundles were made for termstage-0.3.0-py3-none-any.whl:
Publisher:
release.yml on saikatkumardey/termstage
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
termstage-0.3.0-py3-none-any.whl -
Subject digest:
91fe8e22918b4431490ad9b34e48fc9fec6810ef8811ad5f3011f7a0e485c89a - Sigstore transparency entry: 993782403
- Sigstore integration time:
-
Permalink:
saikatkumardey/termstage@0443db0ceae0b9a850c049e6c2b4fead195f105f -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/saikatkumardey
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0443db0ceae0b9a850c049e6c2b4fead195f105f -
Trigger Event:
push
-
Statement type: