commit 0da912f9c96725bff615d4fbb08ffdd1b44e6467
parent 00ce72ee9e39b9bb3cb1265ef4b9fd8359699307
Author: Erik Loualiche <eloualic@umn.edu>
Date: Sun, 1 Mar 2026 21:03:42 -0600
docs: add demo directory with VHS tape and animated gif
Move demo tape into demo/ with its own esync.toml, sample project
files, and pre-recorded gif. Update README with centered hero section
matching podcast-go style.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat:
12 files changed, 112 insertions(+), 116 deletions(-)
diff --git a/.gitignore b/.gitignore
@@ -20,5 +20,5 @@ esync
# temporary ignores
test-sync
tests
-esync.toml
+/esync.toml
sync.log
diff --git a/README.md b/README.md
@@ -1,8 +1,17 @@
-# esync
+<div align="center">
+
+<h1>esync</h1>
+<h3>Watch local files and sync them with rsync, shown in a live TUI</h3>
[](https://claude.ai)
-A lightweight file synchronization tool that watches your local directory for changes and automatically syncs them to a local or remote destination using rsync.
+<a href="demo/demo.gif">
+<img src="demo/demo.gif" width="800" alt="Demo of esync TUI" />
+</a>
+
+</div>
+
+***
## Installation
diff --git a/demo.tape b/demo.tape
@@ -1,113 +0,0 @@
-# ─────────────────────────────────────────────────────────────────────────────
-# esync demo — watch local files and sync them with rsync, shown in a live TUI
-#
-# Usage: vhs demo.tape
-# Requires: go, rsync, vhs (https://github.com/charmbracelet/vhs)
-# ─────────────────────────────────────────────────────────────────────────────
-
-Output demo.gif
-Require rsync
-
-Set Shell "bash"
-Set FontSize 14
-Set Width 1200
-Set Height 600
-Set TypingSpeed 50ms
-Set Theme "Catppuccin Mocha"
-Set Padding 20
-Set WindowBar Colorful
-Set WindowBarSize 40
-
-# ── Hidden setup ────────────────────────────────────────────────────────────
-Hide
-
-# Build esync from the current repo
-Type "go build -o /tmp/esync-bin/esync . 2>/dev/null"
-Enter
-Sleep 3s
-Type "export PATH=/tmp/esync-bin:$PATH"
-Enter
-Sleep 500ms
-
-# Clean previous runs
-Type "rm -rf /tmp/esync-demo /tmp/esync"
-Enter
-Sleep 500ms
-
-# Create a demo project with source files from this repo
-Type "mkdir -p /tmp/esync-demo/project/{cmd,internal/{tui,config,syncer,watcher}}"
-Enter
-Sleep 300ms
-Type "cp main.go go.mod go.sum README.md /tmp/esync-demo/project/"
-Enter
-Sleep 300ms
-Type "cp cmd/*.go /tmp/esync-demo/project/cmd/"
-Enter
-Sleep 300ms
-Type "cp internal/tui/*.go /tmp/esync-demo/project/internal/tui/"
-Enter
-Sleep 300ms
-Type "cp internal/config/*.go /tmp/esync-demo/project/internal/config/"
-Enter
-Sleep 300ms
-Type "cp internal/syncer/*.go /tmp/esync-demo/project/internal/syncer/"
-Enter
-Sleep 300ms
-Type "cp internal/watcher/*.go /tmp/esync-demo/project/internal/watcher/"
-Enter
-Sleep 300ms
-
-# Write a minimal config file
-Type `cat > /tmp/esync-demo/project/esync.toml << 'EOF'
-[sync]
-local = "."
-remote = "/tmp/esync"
-
-[settings]
-ignore = [".git", "node_modules", ".DS_Store", "build"]
-
-[settings.rsync]
-archive = true
-compress = false
-EOF`
-Enter
-Sleep 500ms
-
-Type "cd /tmp/esync-demo/project"
-Enter
-Sleep 300ms
-
-Show
-
-# ── Demo ────────────────────────────────────────────────────────────────────
-
-# 1. Show the project
-Type "ls"
-Enter
-Sleep 2s
-
-# 2. Show the config file
-Type "cat esync.toml"
-Enter
-Sleep 4s
-
-# 3. Preview what will be synced
-Type "esync check"
-Enter
-Sleep 5s
-
-# 4. Queue background file edits (fire while the TUI is running)
-Hide
-Type '(sleep 5 && echo "// refactored handler" >> /tmp/esync-demo/project/cmd/sync.go && sleep 3 && printf "package cmd\n\nfunc Version() string { return \"1.0\" }\n" > /tmp/esync-demo/project/cmd/version.go && sleep 3 && echo "// updated styles" >> /tmp/esync-demo/project/internal/tui/styles.go) &'
-Enter
-Sleep 300ms
-Show
-
-# 5. Launch the TUI — file changes sync in real time
-Type "esync sync"
-Enter
-Sleep 16s
-
-# 6. Quit
-Type "q"
-Sleep 1s
diff --git a/demo/.gitignore b/demo/.gitignore
@@ -0,0 +1,2 @@
+# VHS output
+*.gif
diff --git a/demo/README.md b/demo/README.md
@@ -0,0 +1,3 @@
+# Demo Project
+
+Sample files for the esync demo.
diff --git a/demo/config/secrets.env b/demo/config/secrets.env
@@ -0,0 +1,2 @@
+API_KEY=sk-demo-12345
+DB_PASSWORD=hunter2
diff --git a/demo/config/settings.toml b/demo/config/settings.toml
@@ -0,0 +1,2 @@
+title = "demo"
+debug = false
diff --git a/demo/demo.gif b/demo/demo.gif
Binary files differ.
diff --git a/demo/demo.tape b/demo/demo.tape
@@ -0,0 +1,69 @@
+# ─────────────────────────────────────────────────────────────────────────────
+# esync demo — watch local files and sync them with rsync, shown in a live TUI
+#
+# Usage: cd demo && vhs demo.tape
+# Requires: esync, rsync, bat, vhs (https://github.com/charmbracelet/vhs)
+# ─────────────────────────────────────────────────────────────────────────────
+
+Output demo.gif
+Require rsync
+Require bat
+
+Set FontSize 20
+Set Width 1200
+Set Height 600
+Set Padding 20
+Set Theme "GruvboxDarkHard"
+
+Set TypingSpeed 100ms
+
+Set Shell "bash"
+
+
+# ── Hidden setup ────────────────────────────────────────────────────────────
+Hide
+ Type 'export PS1="> "'
+ Enter
+ # Clear the screen
+ Type "clear"
+ Enter
+ Type "rm -rf /tmp/esync-demo"
+ Enter
+ # Sleep 100ms
+Show
+
+
+# ── Demo ──────────────────────────────────────────────────────────────────
+
+# 1. Show the config
+Type "bat esync.toml"
+Enter
+Sleep 4s
+
+# 2. Show the project files
+Type "ls"
+Enter
+Sleep 2s
+
+# 3. Preview what will be synced
+Type "esync check"
+Sleep 500ms
+Enter
+Sleep 5s
+
+# 4. Queue background file edits (fire while the TUI is running)
+Hide
+ Type '(sleep 5 && echo "// refactored" >> src/handler.go && sleep 3 && echo "// updated" >> config/settings.toml && sleep 3 && echo "// new file" > src/utils.go) &'
+ Enter
+ Sleep 300ms
+Show
+
+# 5. Launch the TUI — file changes sync in real time
+Type "esync sync"
+Sleep 500ms
+Enter
+Sleep 10s
+
+# 6. Quit
+Type "q"
+Sleep 1s
diff --git a/demo/esync.toml b/demo/esync.toml
@@ -0,0 +1,10 @@
+[sync]
+local = "."
+remote = "/tmp/esync-demo"
+
+[settings]
+ignore = [".git", ".DS_Store", "*.tape", "*.gif", "config/secrets.env"]
+
+[settings.rsync]
+archive = true
+compress = false
diff --git a/demo/src/handler.go b/demo/src/handler.go
@@ -0,0 +1,5 @@
+package main
+
+func handleSync() error {
+ return nil
+}
diff --git a/demo/src/main.go b/demo/src/main.go
@@ -0,0 +1,7 @@
+package main
+
+import "fmt"
+
+func main() {
+ fmt.Println("hello from esync demo")
+}