vibeknow-cli
The official VibeKnow CLI tool — built for humans and AI Agents. Turn documents, URLs, and files into professional videos from the command line. One command, zero editing skills.
Install · AI Agent Skills · Auth · Commands · Advanced · Contributing
Why vibeknow-cli?
- One Command, Full Video —
vibeknow create --from report.pdfhandles everything: document parsing, script generation, TTS, scene design, rendering, and packaging - Agent-Native Design — 3 structured Skills out of the box, compatible with Claude Code, Cursor, and other AI tools — Agents can create videos with zero extra setup
- Real-Time Stage Progress — SSE streaming with 4-stage progress tracking (outline → tts → render → publish), both for human progress bars and machine-readable NDJSON
- Multi-Service Architecture — Connects to multiple backend services with per-service endpoint configuration and independent auth
- Open Source, Zero Barriers — MIT license, ready to use, just
npm install - Secure & Controllable — OS-native keychain credential storage, ANSI escape sanitization, credential redaction in verbose logs, non-production endpoint trust boundaries
Features
| Category | Capabilities |
|---|---|
| Create | One-command video generation from files, URLs, or doc IDs; custom prompts; voice selection; async mode |
| Document | Upload files/URLs, poll parsing status, fetch document details |
| Video | Check task status, stream live progress (SSE), download exported videos |
| Voice | List available voice templates with category, tags, and preview URLs |
| Auth | Browser-based Device Flow login (vibeknow init / vibeknow auth login); two-phase agent flow (--no-wait / --device-code); PAT via stdin; VIBEKNOW_TOKEN env var for CI |
| Profile | Multi-environment profiles (prod/staging/dev), per-service endpoint overrides, trust boundaries |
| Config | Global key-value config store, persistent across sessions |
| Doctor | Environment diagnostics: config dir, keychain, locale, endpoint reachability checks |
| Raw API | Escape hatch: vibeknow api call for direct backend access |
Installation & Quick Start
Requirements
- Node.js (
npm/npx) for distribution - Go
v1.25+ (only required for building from source)
Quick Start (Human Users)
Note for AI assistants: If you are an AI Agent helping the user with installation, jump directly to Quick Start (AI Agent).
# 1. Install
npm install -g vibeknow-cli
# 2. Log in — creates the default profile and walks you through browser auth
vibeknow init
# 3. Make a video
vibeknow create --from https://example.com/article
That's the whole flow. vibeknow init handles profile creation, opens the browser for Device Flow authentication, and stores the token in your OS keychain.
Where the binary comes from:
vibeknow-cliships each platform's Go binary as its own npm package (@vectorfunc/vibeknow-cli-darwin-arm64and friends), listed inoptionalDependencies. npm matches theiros/cpuagainst your machine and installs only the one that fits — so the binary arrives over whichever registry you already use, public mirror or corporate proxy, with no second host needing to be reachable.If those were skipped (
--no-optionaland similar),postinstallfalls back to downloading from GitHub Releases. On restricted networks that step tends to fail; reinstall with--include=optionalinstead.
From source (only needed if you want to build the Go binary yourself):
git clone https://github.com/vibeknow/cli.git
cd vibeknow-cli
make install
Quick Start (AI Agent)
vibeknow init requires a TTY, so agents use the two-phase Device Flow instead. One human in the loop clicks a verification URL once; after that the agent runs unattended.
# 1. Install
npm install -g vibeknow-cli
# 2. Start a device-code flow WITHOUT blocking — prints JSON with the
# verification_uri and device_code. The agent extracts both.
vibeknow auth login --no-wait
# Sample output:
# {
# "device_code": "dc_2913bcc...",
# "user_code": "UWWA-R8KS",
# "verification_uri": "https://vibeknow.com/account/device",
# "expires_in": 900,
# "hint": "请访问 https://... 并输入验证码 UWWA-R8KS"
# }
# 3. The agent shows the verification_uri to the human operator, who opens
# it in a browser and approves. (One interaction per token, not per call.)
# 4. Resume polling with the device_code from step 2 — blocks until approved.
vibeknow auth login --device-code dc_2913bcc...
# 5. Token is now in the OS keychain; every subsequent command is authenticated.
vibeknow auth whoami
vibeknow auth status --output json # machine-parseable login state
vibeknow create --from report.pdf
For CI / container environments with a pre-issued JWT, skip the Device Flow entirely — see Environment Variables below.
Hosts that spawn the CLI (connector platforms, IDE integrations) want one blocking command instead of the two-phase flow above:
vibeknow auth login --headless
# Prints {"user_code", "verification_uri", "expires_in", "hint"} to stdout
# immediately, then polls until authorized. No TTY, no Enter key, and it
# never opens a browser itself — the host does that after reading the URL.
The pending authorization is also written to the config dir, so a host that
kills the process before the user finishes authorizing does not lose the
login: the next vibeknow auth status completes the token exchange. While
one is outstanding, auth status --output json reports
"pending_authorization": true alongside "authenticated": false, which
distinguishes "waiting on the user" from "never logged in". auth logout
discards it.
Agent Skills
The ./skills/ directory ships three skills in the open
Agent Skills format, compatible with 55+ AI agent
runtimes (Claude Code, Cursor, OpenCode, GitHub Copilot, Gemini CLI, and more).
| Skill | Description |
|---|---|
vibeknow-core |
Profile setup, auth management, environment diagnostics, credential configuration |
vibeknow-create |
End-to-end video generation: create command, video status/wait/download, voice selection, async workflows |
vibeknow-doc |
Document upload (file + URL), parsing status polling, document retrieval |
Install
npx skills add vibeknow/cli # install all three to current project
npx skills add vibeknow/cli -g # install globally (across projects)
npx skills add vibeknow/cli --skill vibeknow-create # install one
Auto-detects locally installed agents and symlinks the skills into each agent's skill directory. See skills.sh for the full option set.
Each skill follows the SKILL.md + references/ structure with trigger/skip
conditions, command recipes, and exit-code-driven error handling.
Authentication
vibeknow-cli supports three authentication paths, covering humans, AI Agents, and CI.
| Method | When to use | Storage |
|---|---|---|
vibeknow init / vibeknow auth login |
Interactive human setup (Device Flow via browser) | OS keychain |
vibeknow auth login --no-wait then --device-code <code> |
AI Agents — initiate without blocking, resume after human approval | OS keychain |
VIBEKNOW_TOKEN=<jwt> env var |
CI pipelines, containers, short-lived scripts (bypasses keychain) | None (per-invocation) |
vibeknow auth login --with-token (reads PAT from stdin) |
Scripted install with a pre-issued token | OS keychain |
# Who am I?
vibeknow auth whoami
# Token source, profile, expiry — add --output json for agents
vibeknow auth status
vibeknow auth status --output json
# Clear stored credentials
vibeknow auth logout
Command Reference
Hero Command
# Generate video from a URL
vibeknow create --from https://example.com/article
# List voices first, then pass either column (# or SPEECH_VOICE_ID)
vibeknow voice list
vibeknow create --from report.pdf --voice 1
# Reuse an already-uploaded document (doc_id needs its --kb-id)
vibeknow create --from <doc_id> --kb-id <kb_id>
# Text you already have, rather than a file — for a passage pasted into a chat
vibeknow create --text "Three common mistakes in knowledge management…"
vibeknow create --from - --script-lock <<'EOF' # narrate it verbatim
Hello. Today I want to talk about one thing only…
EOF
# Custom prompt
vibeknow create --from data.csv --prompt "Create a 2-minute explainer video"
# Reuse a saved style bundle (~/.config/vibeknow/presets/brand.yaml)
vibeknow create --from deck.pdf --preset brand
vibeknow create --from deck.pdf --preset brand --aspect vertical # your flag wins
# Async mode — submit, confirm the run started, then detach
vibeknow create --from doc.pdf --async
# Follow it in steps short enough for a caller that cannot block for minutes.
# Exit 6 with reason "wait_budget_expired" means keep going; exit 0 means done.
vibeknow video wait --for 90s --output json
vibeknow video wait # reattaches to the most recent run
A preset is a YAML file holding the style flags you reuse — mode, aspect,
theme, voice, language, bgm, avatar placement. It supplies defaults only:
anything you also pass on the command line wins. It cannot carry --export,
--yes or --confirm, so opening someone else's preset can never approve a
charge. See AGENTS.md for the full contract.
--async returns once the backend confirms the run is live (seconds),
not once the video is done (minutes). The render continues server-side
after the CLI disconnects. An immediate rejection — bad input, no
credits — is reported by --async itself with a non-zero exit, so a
printed task_id means the run really started.
Finding a run again
Every run is a (task_id, session_id) pair, and create records it
locally so you never have to keep it yourself:
vk jobs list # every run this machine started, newest first
vk jobs list --active # only the ones still going
vk video wait # reattach to the most recent
vk video wait 42 # …or to a specific task, session looked up for you
vk jobs prune --terminal # forget finished runs
Passing --session-id explicitly still works and always wins over the
ledger.
Document Management
# Upload a file (creates KB, uploads, polls until ready)
vibeknow doc upload report.pdf
# Upload a URL
vibeknow doc upload --url https://example.com/page
# Check document status
vibeknow doc get --kb-id <kb_id> --doc-id <doc_id>
Video Tasks
# Check task status
vibeknow video status <task_id>
# Stream progress (blocks until complete)
vibeknow video wait <task_id>
# Download rendered video (--dest is the file path; --output is the format)
vibeknow video download <task_id> --dest ./final.mp4
Create a shareable video
$ vk create --from ./slides.pdf
…
share_url=https://vibeknow.com/share/tok_abc
hint: Render MP4 (several minutes, extra credits) — vk video export 42 --session-id sess_xxx
The pipeline finishes at the preview stage: the share_url plays
the finished video in a browser, ready to share.
(Optional) Render an MP4 for download
$ vk video export 42 --session-id sess_xxx --yes
exporting: 72% — rendering frames
export complete
$ vk video download 42 --session-id sess_xxx
output=sess_xxx.mp4
A failed render exits 7, not 0 — vk video export takes its exit
code from the state it waited for.
Or one-shot: vk create --from ... --export --yes.
Fix one line without regenerating the video
$ vk video script 42 # free: read what it says, shot by shot
[3] 结论 (4.5s)
增长主要来自海外市场。
$ vk video edit 42 --scene 3 --script "增长几乎全部来自海外市场。"
A wrong sentence used to mean a fresh create at full price. video edit
replaces one shot's narration and regenerates that shot; --script-only
regenerates the voice-over alone, for less.
It bills, so it goes through the same confirmation gate as video export —
and shows both the current and the proposed wording, because that diff is
what you are agreeing to. There is no undo, and the previously rendered MP4
is left in place: video download returns the old narration until you
export again.
Make the subtitles readable
$ vk subtitle presets
# NAME LOOK
1 白字·黑底 text #ffffff · plate rgba(8,8,12,0.68) · no outline
2 白字·黑边 text #ffffff · no plate · outline 3px rgba(0,0,0,0.92) · Noto Sans SC 600
$ vk video set 42 --subtitle-preset 2 --subtitle-size 52
Subtitle readability is a combination, not a set of independent settings — an outline behind a solid plate is invisible, a plate under an outline is muddy. The presets are the looks the design team ships, each carrying every field it needs. Individual flags still apply on top, so the call above means "that look, but bigger".
vk subtitle fonts lists the families that are allowed, which previously had
no way to be discovered at all.
Choose a video mode
vk create --from deck.pdf --mode replica # PPT/PDF page-by-page
vk create --from post.md --mode image --pages 8 # one AI illustration per page
vk create --from notes.md --mode handdraw # hand-drawn animation (mid-run silence is normal)
vk create --from <src> --aspect vertical --bgm
Style and language ride along with any pipeline mode:
vk theme list --mode image # browse a mode's style catalog
vk create --from post.md --mode image --theme <theme_id>
vk create --from post.md --language en-US # script + narration language
Add a talking-head avatar
vk avatar list # sys_<id> presets + your trained ua_<id>
vk create --from deck.pdf --avatar sys_7 --voice <its VOICE_ID>
vk create --from deck.pdf --avatar ua_12 --avatar-position bottom-right --avatar-size 300
Not available with --mode handdraw or --engine agent. If video export is refused because avatar scenes failed, run
vk video avatar-retry (free) and export again once they finish.
--script-lock narrates the document verbatim instead of writing a
script from it, and stacks on top of any mode (it replaced the old
--mode script, which still works but warns):
vk create --from talk.docx --script-lock # verbatim narration
vk create --from talk.docx --mode image --script-lock # …illustrated per page
Pick a generation engine (optional)
vk create --from <src> --engine agent # v=2 agent engine (frontend toggle parity)
vk create --from <src> --engine pipeline # v=3 pipeline (default)
Clean up accumulated knowledgebases
vk kb list --output json --size 5 # peek at what's there
vk kb prune --pattern 'vibeknow-cli-*' # dry-run (default)
vk kb prune --pattern 'vibeknow-cli-*' --yes # actually delete
Voice Templates
# List all available voices
vibeknow voice list
Profile Management
# Add a dev profile with local endpoint overrides
vibeknow profile add dev \
--endpoint-figlens http://localhost:<port> \
--credential-ref vibeknow.dev \
--trust dev --is-production=false
# Switch profiles
vibeknow profile use prod
# Show profile details
vibeknow profile show
# List all profiles
vibeknow profile list
Raw API Access
# Call any backend endpoint directly
vibeknow api call --service <service> --method GET --path /v1/<resource>
# POST with JSON body
vibeknow api call --service <service> --method POST --path /v1/<resource> --body '{"key":"value"}'
# POST with body from file
vibeknow api call --service <service> --method POST --path /v1/<resource> --body @request.json
Advanced Usage
Output Formats
# Default: human-friendly text (auto-detected in TTY)
vibeknow voice list
# JSON output
vibeknow voice list --output json
# Pipe-friendly (non-TTY auto-selects json)
vibeknow voice list --output json | jq '.templates[0].name'
Environment Variables
| Variable | Purpose |
|---|---|
VIBEKNOW_TOKEN |
JWT token for all services (highest priority credential source) |
VIBEKNOW_CONFIG_HOME |
Override config directory (default: ~/.config/vibeknow) |
VIBEKNOW_TRACE |
Set to 1 to display trace IDs for debugging |
VIBEKNOW_DEBUG |
Set to 1 for verbose logging (use with care) |
Diagnostics
# Full environment check (config, credentials, endpoint reachability)
vibeknow doctor
Architecture
vibeknow-cli uses a multi-endpoint architecture — the CLI connects to multiple backend services, each responsible for a specific domain (auth, documents, video pipeline, etc.). Services are configured via profiles, allowing per-environment endpoint overrides.
The create command orchestrates the full pipeline: document upload → video generation (SSE) → export & download.
Contributing
Issues and pull requests are welcome at github.com/vibeknow/cli.
# Development setup
git clone https://github.com/vibeknow/cli.git
cd vibeknow-cli
make build # build binary
make test # run all tests (with race detector)
make lint # go vet
No comments yet
Be the first to share your take.