Review-only uploads nothing
Use the recommended command first to render a local MP4 without creating a public share.
Turn Codex, Claude, Gemini, OpenCode, and Grok sessions into redacted, shareable videos. Render locally. Review secrets. Publish only when ready.
npx @asdftube/cli@latest replay codex latest --review-only
Use the recommended command first to render a local MP4 without creating a public share.
Inspect the transcript, JSON, and MP4 before publishing the final hosted asset.
Publish output includes the revoke command so leaked or stale shares can be removed.
Review-only mode does not require auth. Publishing asks for magic-link email auth.
Hosted upload limit is 4.20 GiB. Public shares host the final MP4 and optional replay payload.
Share URLs are public but hard to guess. Delete by share id and revoke token.
Capture your screen and coding agent sessions. Redact secrets, edit videos, and publish from Codex, Claude, Gemini, and more. Ready for Mac. Windows and Linux in beta.
npm install -g @asdftube/cli
Use the provider tab that matches the agent CLI you already have open.
Paste this into the agent CLI you already have open.
Install and authenticate asdf.tube, then redact sensitive info and publish this Codex session. Run: asdftube auth asdftube replay codex "${CODEX_THREAD_ID:-latest}" --publish --yes When auth asks for email, use [your email here] and wait for the magic-link or PIN step to complete. Output shareable URL and optional command to revoke video.
Install and authenticate asdf.tube, then redact sensitive info and publish this Claude session. Run: asdftube auth asdftube replay claude "${CLAUDE_SESSION_ID:-latest}" --publish --yes --title "Claude session replay" If local Claude transcript discovery is unavailable, export the current Claude session and pass --input ./claude-export.jsonl instead. When auth asks for email, use [your email here] and wait for the magic-link or PIN step to complete. Output shareable URL and optional command to revoke video.
Install and authenticate asdf.tube, then redact sensitive info and publish this Gemini session. Run: asdftube auth asdftube replay gemini "${GEMINI_SESSION_ID:-latest}" --publish --yes If local Gemini session history is unavailable, export the current Gemini session to ./gemini-session.json and use --input ./gemini-session.json instead. When auth asks for email, use [your email here] and wait for the magic-link or PIN step to complete. Output shareable URL and optional command to revoke video.
Install and authenticate asdf.tube, then redact sensitive info and publish this OpenCode session. Run: asdftube auth asdftube replay opencode "${OPENCODE_SESSION_ID:-latest}" --publish --yes --title "OpenCode session replay" If vendor CLI session discovery fails on this machine, export the current OpenCode session and pass --input ./opencode-export.json instead. When auth asks for email, use [your email here] and wait for the magic-link or PIN step to complete. Output shareable URL and optional command to revoke video.
Install and authenticate asdf.tube, then redact sensitive info and publish this Grok session export. Run: asdftube auth asdftube replay grok --input "${GROK_SESSION_EXPORT:-./grok-session.json}" --publish --yes --title "Grok replay" Export the current Grok session to ./grok-session.json first. When auth asks for email, use [your email here] and wait for the magic-link or PIN step to complete. Output shareable URL and optional command to revoke video.
Paste this into the agent CLI you already have open.
Install and authenticate asdf.tube, then redact sensitive info and publish this Codex session. Run: npx @asdftube/cli@latest auth npx @asdftube/cli@latest replay codex "${CODEX_THREAD_ID:-latest}" --publish --yes When auth asks for email, use [your email here] and wait for the magic-link or PIN step to complete. Output shareable URL and optional command to revoke video.
Install and authenticate asdf.tube, then redact sensitive info and publish this Claude session. Run: npx @asdftube/cli@latest auth npx @asdftube/cli@latest replay claude "${CLAUDE_SESSION_ID:-latest}" --publish --yes --title "Claude session replay" If local Claude transcript discovery is unavailable, export the current Claude session and pass --input ./claude-export.jsonl instead. When auth asks for email, use [your email here] and wait for the magic-link or PIN step to complete. Output shareable URL and optional command to revoke video.
Install and authenticate asdf.tube, then redact sensitive info and publish this Gemini session. Run: npx @asdftube/cli@latest auth npx @asdftube/cli@latest replay gemini "${GEMINI_SESSION_ID:-latest}" --publish --yes If local Gemini session history is unavailable, export the current Gemini session to ./gemini-session.json and use --input ./gemini-session.json instead. When auth asks for email, use [your email here] and wait for the magic-link or PIN step to complete. Output shareable URL and optional command to revoke video.
Install and authenticate asdf.tube, then redact sensitive info and publish this OpenCode session. Run: npx @asdftube/cli@latest auth npx @asdftube/cli@latest replay opencode "${OPENCODE_SESSION_ID:-latest}" --publish --yes --title "OpenCode session replay" If vendor CLI session discovery fails on this machine, export the current OpenCode session and pass --input ./opencode-export.json instead. When auth asks for email, use [your email here] and wait for the magic-link or PIN step to complete. Output shareable URL and optional command to revoke video.
Install and authenticate asdf.tube, then redact sensitive info and publish this Grok session export. Run: npx @asdftube/cli@latest auth npx @asdftube/cli@latest replay grok --input "${GROK_SESSION_EXPORT:-./grok-session.json}" --publish --yes --title "Grok replay" Export the current Grok session to ./grok-session.json first. When auth asks for email, use [your email here] and wait for the magic-link or PIN step to complete. Output shareable URL and optional command to revoke video.
Install the local stdio server for your agent, then prompt it to authenticate, review, and publish with asdf.tube.
Install MCP first, then prompt your agent to use the asdftube tools.
codex mcp add asdftube -- asdftube mcp-server
Use the asdftube MCP tools to authenticate with [your email here], redact secrets, render the current Codex session locally for review using selector CODEX_THREAD_ID when available, and wait for my approval before publishing. Output shareable URL and optional command to revoke video.
claude mcp add asdftube -- asdftube mcp-server
Use the asdftube MCP tools to authenticate with [your email here], redact secrets, render the current Claude session locally for review using selector CLAUDE_SESSION_ID when available, and wait for my approval before publishing. Output shareable URL and optional command to revoke video.
{
"mcpServers": {
"asdftube": {
"command": "asdftube",
"args": ["mcp-server"]
}
}
}
Add this to ~/.gemini/settings.json, then use the asdftube MCP tools to authenticate with [your email here], redact secrets, render the current Gemini session locally for review using selector GEMINI_SESSION_ID when available, and wait for my approval before publishing. Output shareable URL and optional command to revoke video.
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"asdftube": {
"type": "local",
"command": ["asdftube", "mcp-server"],
"enabled": true
}
}
}
Use the asdftube MCP tools to authenticate with [your email here], redact secrets, render the current OpenCode session locally for review using selector OPENCODE_SESSION_ID when available, and wait for my approval before publishing. Output shareable URL and optional command to revoke video.
If your Grok client can connect to local MCP servers, point it at: asdftube mcp-server
Use the asdftube MCP tools to authenticate with [your email here], redact secrets, render the current Grok export from GROK_SESSION_EXPORT or ./grok-session.json locally with provider grok for review, and wait for my approval before publishing. Output shareable URL and optional command to revoke video.
Install MCP first, then prompt your agent to use the asdftube tools.
codex mcp add asdftube -- npx -y @asdftube/cli@latest mcp-server
Use the asdftube MCP tools to authenticate with [your email here], redact secrets, render the current Codex session locally for review using selector CODEX_THREAD_ID when available, and wait for my approval before publishing. Output shareable URL and optional command to revoke video.
claude mcp add asdftube -- npx -y @asdftube/cli@latest mcp-server
Use the asdftube MCP tools to authenticate with [your email here], redact secrets, render the current Claude session locally for review using selector CLAUDE_SESSION_ID when available, and wait for my approval before publishing. Output shareable URL and optional command to revoke video.
{
"mcpServers": {
"asdftube": {
"command": "npx",
"args": ["-y", "@asdftube/cli@latest", "mcp-server"]
}
}
}
Add this to ~/.gemini/settings.json, then use the asdftube MCP tools to authenticate with [your email here], redact secrets, render the current Gemini session locally for review using selector GEMINI_SESSION_ID when available, and wait for my approval before publishing. Output shareable URL and optional command to revoke video.
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"asdftube": {
"type": "local",
"command": ["npx", "-y", "@asdftube/cli@latest", "mcp-server"],
"enabled": true
}
}
}
Use the asdftube MCP tools to authenticate with [your email here], redact secrets, render the current OpenCode session locally for review using selector OPENCODE_SESSION_ID when available, and wait for my approval before publishing. Output shareable URL and optional command to revoke video.
If your Grok client can connect to local MCP servers, point it at: npx -y @asdftube/cli@latest mcp-server
Use the asdftube MCP tools to authenticate with [your email here], redact secrets, render the current Grok export from GROK_SESSION_EXPORT or ./grok-session.json locally with provider grok for review, and wait for my approval before publishing. Output shareable URL and optional command to revoke video.
Run local video edits directly from the shell. Nothing publishes until you add publish flags and approve the result.
asdftube edit video ./demo.mp4 --prompt "crop out the first 15 seconds of the video"
asdftube edit video ./demo.mp4 --prompt "speed up video 3x from 0:30 to 0:50"
asdftube edit video ./demo.mp4 --prompt "blur out 0:55 to 1:10 while I type something sensitive"
asdftube edit video ./demo.mp4 --asset ./intro.mp3 --prompt "add this mp3 to the clip, fade out intro showing a centered text \"Hello World\""
asdftube edit video ./demo.mp4 --asset ./clip-2.mp4,./clip-3.mp4 --prompt "stitch together different clips together"
asdftube edit video ./demo.mp4 --prompt "split 0:00-0:15 and 0:30-0:45 into separate files"
npx @asdftube/cli@latest edit video ./demo.mp4 --prompt "crop out the first 15 seconds of the video"
npx @asdftube/cli@latest edit video ./demo.mp4 --prompt "speed up video 3x from 0:30 to 0:50"
npx @asdftube/cli@latest edit video ./demo.mp4 --prompt "blur out 0:55 to 1:10 while I type something sensitive"
npx @asdftube/cli@latest edit video ./demo.mp4 --asset ./intro.mp3 --prompt "add this mp3 to the clip, fade out intro showing a centered text \"Hello World\""
npx @asdftube/cli@latest edit video ./demo.mp4 --asset ./clip-2.mp4,./clip-3.mp4 --prompt "stitch together different clips together"
npx @asdftube/cli@latest edit video ./demo.mp4 --prompt "split 0:00-0:15 and 0:30-0:45 into separate files"
Capture is available from the CLI. macOS is supported now; Windows and Linux are available as beta. Use record doctor to check capture readiness on a machine.
asdftube record terminal --cmd "seq 1 10" --text-size standard --publish --title "Terminal demo"
asdftube record desktop --seconds 10 --publish --title "Desktop capture"
asdftube record windows
asdftube record window --app "Firefox" --seconds 10 --publish --title "Window capture"
asdftube record doctor --json
asdftube record terminal --cmd "seq 1 10" --text-size standard --publish --title "Terminal demo"
asdftube record desktop --seconds 10 --publish --title "Desktop capture"
asdftube record windows
asdftube record window --app "Firefox" --seconds 10 --publish --title "Window capture"
asdftube record doctor --json
asdftube record terminal --cmd "seq 1 10" --text-size standard --publish --title "Terminal demo"
asdftube record desktop --seconds 10 --publish --title "Desktop capture"
asdftube record windows
asdftube record window --app "Firefox" --seconds 10 --publish --title "Window capture"
asdftube record doctor --json
asdftube record terminal --cmd "seq 1 10" --text-size standard --publish --title "Terminal demo"
asdftube record desktop --seconds 10 --publish --title "Desktop capture"
asdftube record windows
asdftube record window --app "Firefox" --seconds 10 --publish --title "Window capture"
asdftube record doctor --json
asdftube record terminal --cmd "seq 1 10" --text-size standard --publish --title "Terminal demo"
asdftube record desktop --seconds 10 --publish --title "Desktop capture"
asdftube record windows
asdftube record window --app "Firefox" --seconds 10 --publish --title "Window capture"
asdftube record doctor --json
npx @asdftube/cli@latest record terminal --cmd "seq 1 10" --text-size standard --publish --title "Terminal demo"
npx @asdftube/cli@latest record desktop --seconds 10 --publish --title "Desktop capture"
npx @asdftube/cli@latest record windows
npx @asdftube/cli@latest record window --app "Firefox" --seconds 10 --publish --title "Window capture"
npx @asdftube/cli@latest record doctor --json
npx @asdftube/cli@latest record terminal --cmd "seq 1 10" --text-size standard --publish --title "Terminal demo"
npx @asdftube/cli@latest record desktop --seconds 10 --publish --title "Desktop capture"
npx @asdftube/cli@latest record windows
npx @asdftube/cli@latest record window --app "Firefox" --seconds 10 --publish --title "Window capture"
npx @asdftube/cli@latest record doctor --json
npx @asdftube/cli@latest record terminal --cmd "seq 1 10" --text-size standard --publish --title "Terminal demo"
npx @asdftube/cli@latest record desktop --seconds 10 --publish --title "Desktop capture"
npx @asdftube/cli@latest record windows
npx @asdftube/cli@latest record window --app "Firefox" --seconds 10 --publish --title "Window capture"
npx @asdftube/cli@latest record doctor --json
npx @asdftube/cli@latest record terminal --cmd "seq 1 10" --text-size standard --publish --title "Terminal demo"
npx @asdftube/cli@latest record desktop --seconds 10 --publish --title "Desktop capture"
npx @asdftube/cli@latest record windows
npx @asdftube/cli@latest record window --app "Firefox" --seconds 10 --publish --title "Window capture"
npx @asdftube/cli@latest record doctor --json
npx @asdftube/cli@latest record terminal --cmd "seq 1 10" --text-size standard --publish --title "Terminal demo"
npx @asdftube/cli@latest record desktop --seconds 10 --publish --title "Desktop capture"
npx @asdftube/cli@latest record windows
npx @asdftube/cli@latest record window --app "Firefox" --seconds 10 --publish --title "Window capture"
npx @asdftube/cli@latest record doctor --json
Review locally with --review-only or --json first, then publish only when you are satisfied with the output.
asdftube auth
asdftube replay codex latest --review-only --text-size standard
asdftube replay codex 019d97eb-3dbc-70c2-ac2b-dfad275f98c6 --publish --yes
asdftube edit video ./demo.mp4 --prompt "crop out the first 15 seconds of the video"
asdftube edit video ./demo.mp4 --asset ./music.mp3,./clip-2.mp4 --prompt "speed up video 3x from 0:30 to 0:50, blur out 0:55 to 1:10, add this mp3 to the clip, stitch together different clips together"
asdftube publish ./demo.mp4 --preset landscape_hd --title "Desktop walkthrough"
asdftube replay codex latest --review-only --json
asdftube auth
asdftube replay claude "${CLAUDE_SESSION_ID:-latest}" --review-only --text-size standard
asdftube replay claude "${CLAUDE_SESSION_ID:-latest}" --publish --yes --title "Claude replay"
asdftube edit video ./demo.mp4 --prompt "crop out the first 15 seconds of the video"
asdftube edit video ./demo.mp4 --asset ./music.mp3,./clip-2.mp4 --prompt "speed up video 3x from 0:30 to 0:50, blur out 0:55 to 1:10, add this mp3 to the clip, stitch together different clips together"
asdftube publish ./demo.mp4 --preset landscape_hd --title "Desktop walkthrough"
asdftube replay claude --input ./claude-export.jsonl --review-only --json
asdftube auth
asdftube replay gemini "${GEMINI_SESSION_ID:-latest}" --review-only --text-size standard
asdftube replay gemini "${GEMINI_SESSION_ID:-latest}" --publish --yes --title "Gemini replay"
asdftube edit video ./demo.mp4 --prompt "crop out the first 15 seconds of the video"
asdftube edit video ./demo.mp4 --asset ./music.mp3,./clip-2.mp4 --prompt "speed up video 3x from 0:30 to 0:50, blur out 0:55 to 1:10, add this mp3 to the clip, stitch together different clips together"
asdftube publish ./demo.mp4 --preset landscape_hd --title "Desktop walkthrough"
asdftube replay gemini latest --review-only --json
asdftube auth
asdftube replay opencode "${OPENCODE_SESSION_ID:-latest}" --review-only --text-size standard
asdftube replay opencode "${OPENCODE_SESSION_ID:-latest}" --publish --yes --title "OpenCode replay"
asdftube edit video ./demo.mp4 --prompt "crop out the first 15 seconds of the video"
asdftube edit video ./demo.mp4 --asset ./music.mp3,./clip-2.mp4 --prompt "speed up video 3x from 0:30 to 0:50, blur out 0:55 to 1:10, add this mp3 to the clip, stitch together different clips together"
asdftube publish ./demo.mp4 --preset landscape_hd --title "Desktop walkthrough"
asdftube replay opencode latest --review-only --json
asdftube auth
asdftube replay grok --input "${GROK_SESSION_EXPORT:-./grok-session.json}" --review-only --text-size standard
asdftube replay grok --input "${GROK_SESSION_EXPORT:-./grok-session.json}" --publish --yes --title "Grok replay"
asdftube edit video ./grok-demo.mp4 --prompt "crop out the first 15 seconds of the video"
asdftube edit video ./grok-demo.mp4 --asset ./music.mp3,./clip-2.mp4 --prompt "speed up video 3x from 0:30 to 0:50, blur out 0:55 to 1:10, add this mp3 to the clip, stitch together different clips together"
asdftube publish ./grok-demo.mp4 --preset landscape_hd --title "Grok walkthrough"
asdftube share delete <share-id> --token <revoke-token>
npx @asdftube/cli@latest auth
npx @asdftube/cli@latest replay codex latest --review-only --text-size standard
npx @asdftube/cli@latest replay codex 019d97eb-3dbc-70c2-ac2b-dfad275f98c6 --publish --yes
npx @asdftube/cli@latest edit video ./demo.mp4 --prompt "crop out the first 15 seconds of the video"
npx @asdftube/cli@latest edit video ./demo.mp4 --asset ./music.mp3,./clip-2.mp4 --prompt "speed up video 3x from 0:30 to 0:50, blur out 0:55 to 1:10, add this mp3 to the clip, stitch together different clips together"
npx @asdftube/cli@latest publish ./demo.mp4 --preset landscape_hd --title "Desktop walkthrough"
npx @asdftube/cli@latest replay codex latest --review-only --json
npx @asdftube/cli@latest auth
npx @asdftube/cli@latest replay claude "${CLAUDE_SESSION_ID:-latest}" --review-only --text-size standard
npx @asdftube/cli@latest replay claude "${CLAUDE_SESSION_ID:-latest}" --publish --yes --title "Claude replay"
npx @asdftube/cli@latest edit video ./demo.mp4 --prompt "crop out the first 15 seconds of the video"
npx @asdftube/cli@latest edit video ./demo.mp4 --asset ./music.mp3,./clip-2.mp4 --prompt "speed up video 3x from 0:30 to 0:50, blur out 0:55 to 1:10, add this mp3 to the clip, stitch together different clips together"
npx @asdftube/cli@latest publish ./demo.mp4 --preset landscape_hd --title "Desktop walkthrough"
npx @asdftube/cli@latest replay claude --input ./claude-export.jsonl --review-only --json
npx @asdftube/cli@latest auth
npx @asdftube/cli@latest replay gemini "${GEMINI_SESSION_ID:-latest}" --review-only --text-size standard
npx @asdftube/cli@latest replay gemini "${GEMINI_SESSION_ID:-latest}" --publish --yes --title "Gemini replay"
npx @asdftube/cli@latest edit video ./demo.mp4 --prompt "crop out the first 15 seconds of the video"
npx @asdftube/cli@latest edit video ./demo.mp4 --asset ./music.mp3,./clip-2.mp4 --prompt "speed up video 3x from 0:30 to 0:50, blur out 0:55 to 1:10, add this mp3 to the clip, stitch together different clips together"
npx @asdftube/cli@latest publish ./demo.mp4 --preset landscape_hd --title "Desktop walkthrough"
npx @asdftube/cli@latest replay gemini latest --review-only --json
npx @asdftube/cli@latest auth
npx @asdftube/cli@latest replay opencode "${OPENCODE_SESSION_ID:-latest}" --review-only --text-size standard
npx @asdftube/cli@latest replay opencode "${OPENCODE_SESSION_ID:-latest}" --publish --yes --title "OpenCode replay"
npx @asdftube/cli@latest edit video ./demo.mp4 --prompt "crop out the first 15 seconds of the video"
npx @asdftube/cli@latest edit video ./demo.mp4 --asset ./music.mp3,./clip-2.mp4 --prompt "speed up video 3x from 0:30 to 0:50, blur out 0:55 to 1:10, add this mp3 to the clip, stitch together different clips together"
npx @asdftube/cli@latest publish ./demo.mp4 --preset landscape_hd --title "Desktop walkthrough"
npx @asdftube/cli@latest replay opencode latest --review-only --json
npx @asdftube/cli@latest auth
npx @asdftube/cli@latest replay grok --input "${GROK_SESSION_EXPORT:-./grok-session.json}" --review-only --text-size standard
npx @asdftube/cli@latest replay grok --input "${GROK_SESSION_EXPORT:-./grok-session.json}" --publish --yes --title "Grok replay"
npx @asdftube/cli@latest edit video ./grok-demo.mp4 --prompt "crop out the first 15 seconds of the video"
npx @asdftube/cli@latest edit video ./grok-demo.mp4 --asset ./music.mp3,./clip-2.mp4 --prompt "speed up video 3x from 0:30 to 0:50, blur out 0:55 to 1:10, add this mp3 to the clip, stitch together different clips together"
npx @asdftube/cli@latest publish ./grok-demo.mp4 --preset landscape_hd --title "Grok walkthrough"
npx @asdftube/cli@latest share delete <share-id> --token <revoke-token>
The safety model is simple: render and redact locally, inspect the transcript, JSON, and MP4 locally, then publish only the final hosted asset you want others to see. If you panic after publish, delete the share immediately with the revoke token printed in the publish result.
Custom redactions are supported. --redactions accepts regex rules. The short form is case-insensitive by default, so a pipe-delimited word list works out of the box.
asdftube replay codex latest --review-only --redactions 'acme|internal-only|staging-secret=>[REDACTED_TERM]'
asdftube replay claude "${CLAUDE_SESSION_ID:-latest}" --review-only --redactions 'acme|internal-only|staging-secret=>[REDACTED_TERM]'
asdftube replay gemini "${GEMINI_SESSION_ID:-latest}" --review-only --redactions 'acme|internal-only=>[REDACTED_TERM]||CF-[0-9]{4,}=>[REDACTED_TICKET]'
asdftube replay opencode "${OPENCODE_SESSION_ID:-latest}" --review-only --redactions 'acme|internal-only|staging-secret=>[REDACTED_TERM]'
asdftube replay grok --input "${GROK_SESSION_EXPORT:-./grok-session.json}" --review-only --redactions 'internal-only|staging-secret=>[REDACTED_TERM]'
asdftube share delete <share-id> --token <revoke-token>
npx @asdftube/cli@latest replay codex latest --review-only --redactions 'acme|internal-only|staging-secret=>[REDACTED_TERM]'
npx @asdftube/cli@latest replay claude "${CLAUDE_SESSION_ID:-latest}" --review-only --redactions 'acme|internal-only|staging-secret=>[REDACTED_TERM]'
npx @asdftube/cli@latest replay gemini "${GEMINI_SESSION_ID:-latest}" --review-only --redactions 'acme|internal-only=>[REDACTED_TERM]||CF-[0-9]{4,}=>[REDACTED_TICKET]'
npx @asdftube/cli@latest replay opencode "${OPENCODE_SESSION_ID:-latest}" --review-only --redactions 'acme|internal-only|staging-secret=>[REDACTED_TERM]'
npx @asdftube/cli@latest replay grok --input "${GROK_SESSION_EXPORT:-./grok-session.json}" --review-only --redactions 'internal-only|staging-secret=>[REDACTED_TERM]'
npx @asdftube/cli@latest share delete <share-id> --token <revoke-token>
Delete uses the share id and revoke token printed after publish. You do not need to hunt for them separately: the publish result includes the full delete command for you. Keep that output around until you are fully comfortable with the result.
asdftube share delete <share-id> --token <revoke-token>
npx @asdftube/cli@latest share delete <share-id> --token <revoke-token>