detached f0cb4a1

feat(demo): arch-based vhs recording image and runner

commit
f0cb4a1a03f054b4338a41ac4f2343510e41df21
author
brice · · 2026-07-24 05:10 UTC
parent
ddf1935
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
4 files · +58 -1
M Makefile +7 -1
@@ -1,4 +1,4 @@
1-.PHONY: install test test-installer lint mocks
1+.PHONY: install test test-installer lint mocks demo
22
33 install:
44 go install .
@@ -24,3 +24,9 @@ mocks:
2424 exit 1; \
2525 fi
2626 mockery
27+
28+demo:
29+ docker build -f scripts/demo/Dockerfile -t vev-demo .
30+ ./scripts/demo/run.sh demo.tape
31+ mkdir -p docs/assets
32+ cp scripts/demo/out/demo.gif docs/assets/demo.gif
@@ -1,4 +1,4 @@
1-.PHONY: install test test-installer lint mocks1+.PHONY: install test test-installer lint mocks demo
2 2
3 install:3 install:
4 go install .4 go install .
@@ -24,3 +24,9 @@ mocks:
24 exit 1; \24 exit 1; \
25 fi25 fi
26 mockery26 mockery
27+
28+demo:
29+ docker build -f scripts/demo/Dockerfile -t vev-demo .
30+ ./scripts/demo/run.sh demo.tape
31+ mkdir -p docs/assets
32+ cp scripts/demo/out/demo.gif docs/assets/demo.gif
A scripts/demo/Dockerfile +25 -0
@@ -0,0 +1,25 @@
1+# syntax=docker/dockerfile:1
2+FROM golang:1.26 AS build
3+WORKDIR /src
4+COPY go.mod go.sum ./
5+RUN go mod download
6+COPY . .
7+RUN CGO_ENABLED=0 go build -o /out/vev .
8+
9+FROM archlinux:latest
10+RUN pacman -Sy --noconfirm archlinux-keyring \
11+ && pacman -Syu --noconfirm \
12+ vhs ttyd ffmpeg chromium \
13+ btop fastfetch gifsicle \
14+ nodejs npm \
15+ && pacman -Scc --noconfirm
16+RUN npm install -g --allow-scripts=@anthropic-ai/claude-code @anthropic-ai/claude-code
17+RUN setcap -r /usr/sbin/btop
18+RUN useradd -m -u 1000 demo
19+COPY --from=build /out/vev /usr/local/bin/vev
20+COPY scripts/demo/ticker.sh /usr/local/bin/ticker
21+RUN chmod +x /usr/local/bin/ticker
22+USER demo
23+WORKDIR /home/demo
24+ENV VHS_NO_SANDBOX=true
25+ENTRYPOINT ["vhs"]
@@ -0,0 +1,25 @@
1+# syntax=docker/dockerfile:1
2+FROM golang:1.26 AS build
3+WORKDIR /src
4+COPY go.mod go.sum ./
5+RUN go mod download
6+COPY . .
7+RUN CGO_ENABLED=0 go build -o /out/vev .
8+
9+FROM archlinux:latest
10+RUN pacman -Sy --noconfirm archlinux-keyring \
11+ && pacman -Syu --noconfirm \
12+ vhs ttyd ffmpeg chromium \
13+ btop fastfetch gifsicle \
14+ nodejs npm \
15+ && pacman -Scc --noconfirm
16+RUN npm install -g --allow-scripts=@anthropic-ai/claude-code @anthropic-ai/claude-code
17+RUN setcap -r /usr/sbin/btop
18+RUN useradd -m -u 1000 demo
19+COPY --from=build /out/vev /usr/local/bin/vev
20+COPY scripts/demo/ticker.sh /usr/local/bin/ticker
21+RUN chmod +x /usr/local/bin/ticker
22+USER demo
23+WORKDIR /home/demo
24+ENV VHS_NO_SANDBOX=true
25+ENTRYPOINT ["vhs"]
A scripts/demo/claude-settings.json +6 -0
@@ -0,0 +1,6 @@
1+{
2+ "preferredNotifChannel": "terminal_bell",
3+ "permissions": {
4+ "allow": ["Bash(sleep:*)"]
5+ }
6+}
@@ -0,0 +1,6 @@
1+{
2+ "preferredNotifChannel": "terminal_bell",
3+ "permissions": {
4+ "allow": ["Bash(sleep:*)"]
5+ }
6+}
A scripts/demo/run.sh +20 -0
@@ -0,0 +1,20 @@
1+#!/usr/bin/env bash
2+set -euo pipefail
3+cd "$(dirname "$0")/../.."
4+
5+TAPE="${1:-demo.tape}"
6+mkdir -p scripts/demo/out
7+
8+CLAUDE_TMP=$(mktemp -d)
9+trap 'rm -rf "$CLAUDE_TMP"' EXIT
10+mkdir -p "$CLAUDE_TMP/.claude"
11+cp "$HOME/.claude/.credentials.json" "$CLAUDE_TMP/.claude/"
12+cp scripts/demo/claude-settings.json "$CLAUDE_TMP/.claude/settings.json"
13+printf '{"hasCompletedOnboarding": true, "theme": "dark"}\n' > "$CLAUDE_TMP/.claude.json"
14+
15+docker run --rm --hostname vev-demo \
16+ -v "$PWD/scripts/demo:/tape:ro" \
17+ -v "$PWD/scripts/demo/out:/home/demo/out" \
18+ -v "$CLAUDE_TMP/.claude:/home/demo/.claude" \
19+ -v "$CLAUDE_TMP/.claude.json:/home/demo/.claude.json" \
20+ vev-demo "/tape/$TAPE"
@@ -0,0 +1,20 @@
1+#!/usr/bin/env bash
2+set -euo pipefail
3+cd "$(dirname "$0")/../.."
4+
5+TAPE="${1:-demo.tape}"
6+mkdir -p scripts/demo/out
7+
8+CLAUDE_TMP=$(mktemp -d)
9+trap 'rm -rf "$CLAUDE_TMP"' EXIT
10+mkdir -p "$CLAUDE_TMP/.claude"
11+cp "$HOME/.claude/.credentials.json" "$CLAUDE_TMP/.claude/"
12+cp scripts/demo/claude-settings.json "$CLAUDE_TMP/.claude/settings.json"
13+printf '{"hasCompletedOnboarding": true, "theme": "dark"}\n' > "$CLAUDE_TMP/.claude.json"
14+
15+docker run --rm --hostname vev-demo \
16+ -v "$PWD/scripts/demo:/tape:ro" \
17+ -v "$PWD/scripts/demo/out:/home/demo/out" \
18+ -v "$CLAUDE_TMP/.claude:/home/demo/.claude" \
19+ -v "$CLAUDE_TMP/.claude.json:/home/demo/.claude.json" \
20+ vev-demo "/tape/$TAPE"

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 12

Tags 11

↑↓ moveenter openesc close