Skip to content

Review & Delivery Portal

Clawbot, the videoclaw mascot, illustrating preview portal

One command turns your raw project folder into polished, share-ready web pages: an internal editor review, a clean client approve/decline page, and a final showcase — then publishes them to the web with content hashes and a public URL.

What it does

  • Generates four standard HTML surfaces from a project's on-disk assets, with no hand-written HTML:
    • edit.html / review.html — editor/operator human-in-the-loop page with approve and regenerate controls. Decisions copy out as a VIDEOCLAW_REVIEW_DECISIONS block for agent handoff.
    • client-review.html — lightweight client approve/decline/comment page. Feedback copies out as a VIDEOCLAW_CLIENT_FEEDBACK block.
    • preview.html — polished final showcase: every production image is click-to-fullscreen (lightbox), a soundtrack <audio controls preload="none"> player appears only when an audio track is discovered, plus downloads.
  • Adapts section labels and ordering per project type: music-video, story-film, documentary, product-ad, sports-recap, or generic-video (unknown template values fall back to generic-video).
  • Builds a portfolio index across all projects, optionally filtered to one client.
  • Surfaces the real generation inputs reviewers care about — the exact Seedance start-frame images (Seedance Input Frames) and the prompt packets from artifacts/filmmaking-prompts.json (Seedance Prompt Packets) — beside the resulting clip.
  • Publishes any surface (or an index) to a Cloudflare R2 bucket: deterministic upload plan, per-file SHA-256 hash, content type, and public URL.
  • Keeps the on-disk project the source of truth — approve/regenerate/feedback decisions flow back through copy-paste env-var blocks, not a server round-trip.

How to use it

All examples use node dist/cli/vclaw.js; once installed on PATH the same commands run as vclaw ....

bash
node dist/cli/vclaw.js video portal --project my-film

Generates edit.html, review.html, client-review.html, and preview.html inside projects/my-film/.

bash
node dist/cli/vclaw.js video portal --project my-film --surface preview

Regenerates a single surface only — pick from edit, review, client-review, preview, compare, or index.

bash
node dist/cli/vclaw.js video portal-index --client acme

Builds a client-filtered portfolio index at projects/clients/acme/index.html; omit --client for the global projects/index.html.

bash
node dist/cli/vclaw.js video publish-preview --project my-film --client acme --bucket vclaw-reviews --public-base-url https://review.example.com --dry-run

Prints the exact R2 upload plan (local paths, remote keys, content types, SHA-256 hashes, public URL) without uploading anything.

bash
node dist/cli/vclaw.js video publish-preview --project my-film --client acme --bucket vclaw-reviews --run run-002 --public-base-url https://review.example.com

Uploads the surface and its local assets to clients/acme/my-film/runs/run-002/ via wrangler r2 object put and appends a surface.published event.

bash
node dist/cli/vclaw.js video publish-portal-index --client acme --bucket vclaw-reviews --public-base-url https://review.example.com

Publishes the client index to clients/acme/index.html, linking to each published project run.

TIP

Use --wrangler-bin <path> to pin a specific Wrangler executable in CI or agent automation, and always run publish-preview / publish-portal-index with --dry-run first to inspect the plan before spending uploads.

How it flows

preview portal diagram

Diagram source (live Mermaid)

Artifacts & outputs

Generated into projects/<slug>/:

  • edit.html, review.html, client-review.html, preview.html — the four review surfaces (compare.html and index.html are also available via --surface).
  • project-audit.jsonl — append-only audit log; each generate writes a surface.generated event and each non-dry-run publish writes a surface.published event (with htmlHash and public url).

Portfolio indexes:

  • projects/index.html — global index.
  • projects/clients/<client>/index.html — client-filtered index.

The portal reads (but does not write) artifacts/asset-manifest.json for image assets and artifacts/filmmaking-prompts.json for prompt packets. Each command prints its result as JSON on stdout (output paths, project count, or the publish plan).

Tips & gotchas

WARNING

publish-preview requires --project, --client, and --bucket, and publish-portal-index requires --bucket — a missing required flag throws and exits non-zero. --run defaults to run-001 if you don't pass one.

TIP

Set a project soundtrack (or audio) field in project.json, or just drop an .mp3/.m4a/.wav/.aac into the project; the preview showcase auto-discovers it and renders the audio player. No audio found means no empty player is emitted.

TIP

Set template or previewTemplate in project.json to control section labels and ordering — e.g. music-video relabels the prompt-packet section as Seedance Prompt Packets.

Driving it from an agent

Every command emits machine-readable JSON on stdout and exits non-zero on a missing required flag, so an agent can generate surfaces, parse the output paths, then call publish-preview --dry-run to validate the upload plan before committing real R2 uploads. Editor and client decisions return as copyable VIDEOCLAW_REVIEW_DECISIONS / VIDEOCLAW_CLIENT_FEEDBACK blocks the agent can read back to drive the next regenerate pass.

Built to be driven by agent hosts like Claude Code, Claude Desktop, or Codex · Source-available, commercial use requires a paid license.