Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions assets/README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
# Tether — visual assets

Demo gifs for README embeds, social posts, and YC/grant applications. Recorded on Modal A10G with TRT EP active so the doctor checks render green; output is verbatim from the CLI in the container, only the typing animation is synthesized.
Demo gifs for README embeds, social posts, and YC/grant applications. Recorded on Modal A10G; output is verbatim from the CLI in the container, only the typing animation is synthesized.

> **Stale branding:** both gifs were recorded before the v0.12.0 rename (Reflex → Tether) and show the old `reflex` CLI commands on screen. Re-record under the `tether` CLI before using them in any new public post; the table notes which recordings are pre-rename.
> **`tether-chat-demo.gif` is still pre-rename** (v0.5.0, shows old `reflex` commands on screen) and is not embedded in the README. Re-record under the `tether` CLI before using it in any new public post.

| Asset | Recorded | Version | Length / size | Use for |
|---|---|---|---|---|
| `tether-tweet.gif` | 2026-05-03 | v0.8.0 (pre-rename) | 11.8 s · 152 KB · 1075×873 | X/Twitter posts, tight demo embeds. Shows `reflex --version` → `reflex doctor` (4 green ✓ on TensorRT runtime, cuBLAS, cuDNN, ORT-TRT EP) → `reflex --help` (11-verb listing). |
| `tether-tweet.gif` | 2026-06-10 | v0.12.0 | 9.8 s · 126 KB · 1075×873 | X/Twitter posts, tight demo embeds. Shows `tether --version` → `tether inspect targets` (Jetson Orin/Thor + RTX/A100/H100 support table) → `tether --help` (verb listing). |
| `tether-chat-demo.gif` | 2026-04-28 | v0.5.0 (pre-rename) | 37.3 s · 197 KB · 1280×760 | YC application demo upload, longer-form embeds. Shows the `reflex chat` natural-language interface routing through CLI tools. |

## Recording recipe
Expand All @@ -29,7 +29,9 @@ Cost: ~$0.30 on A10G (~10 min including image cold start).
## Refresh policy

Re-record the tweet gif when:
- A minor version ships that changes `tether doctor` output, the verb listing, or the tagline.
- A minor version ships that changes `tether inspect targets`, the verb listing, or the tagline.
- The README claims a number that's no longer in the gif (e.g., new architectures verified).

> The recording deliberately avoids `tether doctor`: its deploy-diagnostic checks crash on a GPU box with no exported model (`Path(ModelProto)` TypeError) — a real bug tracked separately. Restore the `doctor` panel once that's fixed.

The full experiment note for any re-record lives at `reflex_context/03_experiments/YYYY-MM-DD-tweet-gif-*.md`.
Binary file modified assets/tether-tweet.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
25 changes: 15 additions & 10 deletions scripts/modal_record_demo_gif.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@

Approach justified per CLAUDE.md no-band-aid: real CLI output captured
live in container, not faked. Typing animation is synthesized but every
character of output is verbatim from `tether --version`, `tether doctor`,
`tether --help` running in the container with TRT EP active.
character of output is verbatim from `tether --version`,
`tether inspect targets`, `tether --help` running in the container.
"""
import modal

Expand All @@ -26,9 +26,9 @@
.apt_install("git", "wget", "curl", "fontconfig", "fonts-jetbrains-mono")
.pip_install("uv")
.run_commands(
# Install from the repo until `tether` is published to PyPI (the old
# pinned 'reflex-vla==0.8.0' / 'tether-vla' package names are dead).
"uv pip install --system 'fastcrest-tether[serve,gpu] @ git+https://github.com/FastCrest/tether'",
# Install the published artifact users actually get (dist name is
# 'fastcrest-tether'; the bare 'tether' name is reserved on PyPI).
"uv pip install --system 'fastcrest-tether[serve,gpu]==0.12.0'",
"uv pip install --system 'tensorrt>=10.0,<11'",
# agg = official asciinema gif renderer (Rust binary)
"wget -qO /usr/local/bin/agg https://github.com/asciinema/agg/releases/download/v1.5.0/agg-x86_64-unknown-linux-gnu",
Expand Down Expand Up @@ -66,11 +66,16 @@ def run(cmd: str) -> str:

print("=== capturing real CLI output ===")
out_version = run("tether --version")
out_doctor = run("tether doctor")
# `tether inspect targets` — static supported-hardware registry. Replaces
# the old `tether doctor` panel: doctor's deploy-diagnostic checks crash on
# a GPU box with no exported model (Path(ModelProto) TypeError), which is
# both a real bug (tracked separately) and a bad look in a marketing gif.
# `inspect targets` is GPU-free, narrow, and on-brand (Jetson/RTX/Thor).
out_targets = run("tether inspect targets")
out_help = run("tether --help")
print(f"version: {out_version!r}")
print(f"doctor first line: {out_doctor.splitlines()[0] if out_doctor else 'EMPTY'!r}")
print(f"doctor lines: {len(out_doctor.splitlines())}")
print(f"targets first line: {out_targets.splitlines()[0] if out_targets else 'EMPTY'!r}")
print(f"targets lines: {len(out_targets.splitlines())}")
print(f"help lines: {len(out_help.splitlines())}")

# ----- build asciinema cast programmatically -----
Expand Down Expand Up @@ -107,8 +112,8 @@ def show_output(output: str, lead_pause: float = 0.3, post_pause: float = 1.4) -
type_command("tether --version")
show_output(out_version, post_pause=1.0)

type_command("tether doctor")
show_output(out_doctor, post_pause=2.5)
type_command("tether inspect targets")
show_output(out_targets, post_pause=2.5)

type_command("tether --help")
show_output(out_help, post_pause=2.0)
Expand Down
Loading