DemoIt is a tool that helps you create beautiful live-coding demonstrations.
I'm doing lots of live-coding during conferences and I like tools like reveal.js to create slides. What I wanted was a tool that has some of the properties of reveal.js but with capabilities to code and run commands in front of the audience.
Two things are really important to me:
This is how I came up with DemoIt.
DemoIt is a small command line tool written in Go. It serves rich web content composed of text, images and smart web components.
Those web components make most of the magic.
curl -L -odemoit https://github.com/dgageot/demoit/releases/download/v1.0/demoit-`uname -s | tr '[:upper:]' '[:lower:]'`-`uname -m`
sudo install demoit /usr/local/bin/demoit
To have a correct display in the web terminal, it's better to install the font Inconsolata for Powerline on your computer.
This font can be found here.
# Create an empty directory
cd $HOME; mkdir my-demoit-presentation; cd $HOME/my-demoit-presentation
# Download a sample demo
curl -L https://github.com/dgageot/demoit/archive/master.tar.gz | tar xvf - --strip-components=2 demoit-master/sample
# Run demoit
demoit
Then, browse to http://localhost:8888
Press ⌘K in a focused terminal to clear its screen and scrollback, then send Ctrl-L to redraw the shell prompt and any pending input without executing it. Other terminals are unaffected; the session is not restarted.
Pro tip: Run demoit -dev instead and enjoy live reload each time you change the content of the slides.
When Git is available and the presentation is inside a repository, live reload skips Git-ignored files and directories (including nested .gitignore rules, .git/info/exclude, and global excludes). Tracked files still trigger reloads, even if they match an ignore rule. Outside a repository or without Git, live reload continues normally.
Basically, the idea is to:
demoit.html at the root of the project. This file contains all the html slides separated with ---..demoit folder at the root of the project..demoit/style.css.
git clone https://github.com/dgageot/demoit.git
cd demoit
go install
This requires Go 1.26 or later.
go test -race ./...
golangci-lint run
node --test handlers/terminal*_test.js
DEMOIT_BENCHMARK=1 node --test handlers/terminal_browser_test.js
The browser test uses an installed Chrome/Chromium (or CHROME_BIN) and a mock
WebSocket: it never starts shells or presentation commands. The benchmark reports
Canvas CPU time for single-row edits and full redraws, not keyboard-to-display
latency. Node tests also exercise the shipped WASM without a browser.
Terminal assets are embedded in the binary. After changing them, run go install,
restart DemoIt, and reload the presentation. Local emulator patches are recorded in
handlers/resources/ghostty-web/provenance.json; update asset digests and the
versioned route when bytes change so immutable browser caches cannot serve stale code.
(top 24 of 29)
244 followers · starred Oct 2020
154 followers · starred Jan 2019
700 followers · starred Jan 2019
546 followers · starred Oct 2019
DemoIt is a tool that helps you create beautiful live-coding demonstrations.
I'm doing lots of live-coding during conferences and I like tools like reveal.js to create slides. What I wanted was a tool that has some of the properties of reveal.js but with capabilities to code and run commands in front of the audience.
Two things are really important to me:
This is how I came up with DemoIt.
DemoIt is a small command line tool written in Go. It serves rich web content composed of text, images and smart web components.
Those web components make most of the magic.
curl -L -odemoit https://github.com/dgageot/demoit/releases/download/v1.0/demoit-`uname -s | tr '[:upper:]' '[:lower:]'`-`uname -m`
sudo install demoit /usr/local/bin/demoit
To have a correct display in the web terminal, it's better to install the font Inconsolata for Powerline on your computer.
This font can be found here.
# Create an empty directory
cd $HOME; mkdir my-demoit-presentation; cd $HOME/my-demoit-presentation
# Download a sample demo
curl -L https://github.com/dgageot/demoit/archive/master.tar.gz | tar xvf - --strip-components=2 demoit-master/sample
# Run demoit
demoit
Then, browse to http://localhost:8888
Press ⌘K in a focused terminal to clear its screen and scrollback, then send Ctrl-L to redraw the shell prompt and any pending input without executing it. Other terminals are unaffected; the session is not restarted.
Pro tip: Run demoit -dev instead and enjoy live reload each time you change the content of the slides.
When Git is available and the presentation is inside a repository, live reload skips Git-ignored files and directories (including nested .gitignore rules, .git/info/exclude, and global excludes). Tracked files still trigger reloads, even if they match an ignore rule. Outside a repository or without Git, live reload continues normally.
Basically, the idea is to:
demoit.html at the root of the project. This file contains all the html slides separated with ---..demoit folder at the root of the project..demoit/style.css.
git clone https://github.com/dgageot/demoit.git
cd demoit
go install
This requires Go 1.26 or later.
go test -race ./...
golangci-lint run
node --test handlers/terminal*_test.js
DEMOIT_BENCHMARK=1 node --test handlers/terminal_browser_test.js
The browser test uses an installed Chrome/Chromium (or CHROME_BIN) and a mock
WebSocket: it never starts shells or presentation commands. The benchmark reports
Canvas CPU time for single-row edits and full redraws, not keyboard-to-display
latency. Node tests also exercise the shipped WASM without a browser.
Terminal assets are embedded in the binary. After changing them, run go install,
restart DemoIt, and reload the presentation. Local emulator patches are recorded in
handlers/resources/ghostty-web/provenance.json; update asset digests and the
versioned route when bytes change so immutable browser caches cannot serve stale code.
(top 24 of 29)
244 followers · starred Oct 2020
154 followers · starred Jan 2019
700 followers · starred Jan 2019
546 followers · starred Oct 2019