← LeaderboardThe Skill Leaderboard

video-maker-free

video-maker-free is a ClawHub AI skill that lets anyone assemble, trim, and enhance videos through plain conversation β€” no timeline scrubbing or manual exports required. Upload raw footage, describe what you want, and the skill handles cuts, transitions, text overlays, and basic color grading autonomously. Ideal for content creators, small business owners, educators, and social media managers who need polished results without subscription fees. Supports mp4, mov, avi, webm, and mkv formats.

Published by LeoYeAI β†—LeoYeAI/agent-master-skills

Try your first task

A source-grounded starter task has not been verified for this skill yet.

SKILL.md

name: video-maker-freeversion: "1.0.0"displayName: "Free Video Maker: Create & Edit Videos Instantly with AI"description: >  video-maker-free is a ClawHub AI skill that lets anyone assemble, trim, and enhance videos through plain conversation β€” no timeline scrubbing or manual exports required. Upload raw footage, describe what you want, and the skill handles cuts, transitions, text overlays, and basic color grading autonomously. Ideal for content creators, small business owners, educators, and social media managers who need polished results without subscription fees. Supports mp4, mov, avi, webm, and mkv formats.metadata: {"openclaw": {"emoji": "🎬", "requires": {"env": [], "configPaths": ["~/.config/nemovideo/"]}, "primaryEnv": "NEMO_TOKEN"}}homepage: https://nemovideo.comrepository: https://github.com/nemovideo/nemovideo_skills

Turn Raw Footage Into Finished Videos Through Conversation

Most video editing tools assume you already know your way around a timeline. video-maker-free flips that assumption entirely. Instead of dragging clips and hunting for the right menu, you describe the outcome you want β€” 'cut the first ten seconds, add a title card, and fade to black at the end' β€” and the skill executes it. This makes professional-looking video production accessible to people who have never opened an editing application in their lives.

Behind every request sits the OpenClaw agent, ClawHub's orchestration layer that interprets your instructions, breaks them into discrete editing operations, and sequences them against your uploaded footage. The agent resolves ambiguity by asking targeted follow-up questions rather than guessing, which means fewer do-overs and faster turnarounds. It also tracks the state of your project across multiple turns, so you can refine iteratively without re-explaining context each time.

The skill is deliberately scoped around the tasks that consume the most time for casual creators: trimming dead air, stitching clips in order, dropping in lower-thirds or captions, and adjusting brightness or contrast for consistency across shots. Because it operates on your actual media files rather than a preview proxy, the exported result is ready to publish immediately in whichever format you supplied β€” mp4, mov, avi, webm, or mkv.

Environment Variables

VariableRequiredDefault
NEMO_TOKENNoAuto-generated (100 free credits, expires in 7 days, revocable via Settings β†’ API Tokens)
NEMO_API_URLNohttps://mega-api-prod.nemovideo.ai
NEMO_WEB_URLNohttps://nemovideo.com
NEMO_CLIENT_IDNoAuto-generated UUID, persisted to ~/.config/nemovideo/client_id (UUID only, no secrets)
SKILL_SOURCENoAuto-detected from install path, fallback unknown

If NEMO_TOKEN is not set, get one (requires X-Client-Id header):

# Generate or read persisted Client-Id
CLIENT_ID="${NEMO_CLIENT_ID:-$(cat ~/.config/nemovideo/client_id 2>/dev/null)}"
if [ -z "$CLIENT_ID" ]; then
  CLIENT_ID=$(uuidgen 2>/dev/null || echo "client-$(date +%s)-$RANDOM")
  mkdir -p ~/.config/nemovideo && echo "$CLIENT_ID" > ~/.config/nemovideo/client_id
fi
curl -s -X POST "$API/api/auth/anonymous-token" -H "X-Client-Id: $CLIENT_ID"
# β†’ {"code":0,"data":{"token":"nmv_usr_xxx","credits":100,...}}

Save token as NEMO_TOKEN, CLIENT_ID as NEMO_CLIENT_ID. Anonymous: 1 token per client per 7 days; token expires in 7 days and can be revoked at any time via Settings β†’ API Tokens on nemovideo.com. If your token expires, request a new one with the same X-Client-Id.

Local persistence: This skill writes ~/.config/nemovideo/client_id to persist the Client-Id across sessions. This avoids generating a new ID on every request, which would hit the per-IP rate limit quickly (default 10 tokens per 7 days per IP). The file contains only a UUID β€” no credentials are stored locally.

2. Routing Incoming Requests to the Correct Endpoint

Use the table below to determine which API endpoint should handle each type of user request.

User says...ActionSkip SSE?
"export" / "ε―Όε‡Ί" / "download" / "send me the video"β†’ Β§3.5 Exportβœ…
"credits" / "η§―εˆ†" / "balance" / "余钝"β†’ Β§3.3 Creditsβœ…
"status" / "ηŠΆζ€" / "show tracks"β†’ Β§3.4 Stateβœ…
"upload" / "上传" / user sends fileβ†’ Β§3.2 Uploadβœ…
Everything else (generate, edit, add BGM…)β†’ Β§3.1 SSE❌

3. Primary Workflow Procedures

$API = ${NEMO_API_URL:-https://mega-api-prod.nemovideo.ai}, $TOKEN = ${NEMO_TOKEN}, $WEB = ${NEMO_WEB_URL:-https://nemovideo.com}.

Skill attribution variables β€” do NOT hardcode:

  • $SKILL_NAME = this file's YAML frontmatter name
  • $SKILL_VERSION = this file's YAML frontmatter version
  • $SKILL_SOURCE = detect at runtime using the first match:
    1. Env SKILL_SOURCE if set
    2. If this file's path contains a known platform directory (e.g. ~/.clawhub/ β†’ clawhub, ~/.cursor/skills/ β†’ cursor)
    3. Fallback: unknown

CRITICAL: ALL API requests (including render/export/upload/state/credits) MUST include these headers. Missing them will cause export to fail with 402.

X-Skill-Source: $SKILL_NAME
X-Skill-Version: $SKILL_VERSION
X-Skill-Platform: $SKILL_SOURCE

3.0 Initializing a New Session

curl -s -X POST "$API/api/tasks/me/with-session/nemo_agent" \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -H "X-Skill-Source: $SKILL_NAME" -H "X-Skill-Version: $SKILL_VERSION" -H "X-Skill-Platform: $SKILL_SOURCE" \
  -d '{"task_name":"project","language":"<lang>"}'
# β†’ {"code":0,"data":{"task_id":"...","session_id":"..."}}

Before any other API calls can be made, a session must be established. This session identifier is required for all subsequent interactions within the same conversation.

Open in browser: After creating a session, give the user a link to view/edit the task in NemoVideo: $WEB/workspace/claim?token=$TOKEN&task={task_id}&session={session_id}&skill_name=$SKILL_NAME&skill_version=$SKILL_VERSION&skill_source=$SKILL_SOURCE

3.1 Delivering Messages Through SSE

curl -s -X POST "$API/run_sse" \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -H "Accept: text/event-stream" -H "X-Skill-Source: $SKILL_NAME" -H "X-Skill-Version: $SKILL_VERSION" -H "X-Skill-Platform: $SKILL_SOURCE" --max-time 900 \
  -d '{"app_name":"nemo_agent","user_id":"me","session_id":"<sid>","new_message":{"parts":[{"text":"<msg>"}]}}'

All message exchanges with the backend are streamed to the client using Server-Sent Events (SSE).

SSE Handling

EventAction
Text responseApply GUI translation (Β§4), present to user
Tool call/resultWait silently, don't forward
heartbeat / empty data:Keep waiting. Every 2 min: "⏳ Still working..."
Stream closesProcess final response

Typical durations: text 5-15s, video generation 100-300s, editing 10-30s.

Timeout: 10 min heartbeats-only β†’ assume timeout. Never re-send during generation (duplicates + double-charge).

Ignore trailing "I encountered a temporary issue" if prior responses were normal.

Silent Response Fallback (CRITICAL)

Approximately 30% of editing operations complete without returning any text content in the SSE stream. When no text is received after the stream closes, do not treat this as a failure β€” instead, immediately call the state query endpoint to retrieve the current project status and surface the result to the user.

Two-stage generation: After the raw video is produced, the backend automatically triggers a second processing stage that layers in background music and a title overlay. Expect two distinct completion events: one when the raw video is ready and a second when the fully composed version with BGM and title is finalized.

3.2 Handling File Uploads

File upload: curl -s -X POST "$API/api/upload-video/nemo_agent/me/<sid>" -H "Authorization: Bearer $TOKEN" -H "X-Skill-Source: $SKILL_NAME" -H "X-Skill-Version: $SKILL_VERSION" -H "X-Skill-Platform: $SKILL_SOURCE" -F "files=@/path/to/file"

URL upload: curl -s -X POST "$API/api/upload-video/nemo_agent/me/<sid>" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -H "X-Skill-Source: $SKILL_NAME" -H "X-Skill-Version: $SKILL_VERSION" -H "X-Skill-Platform: $SKILL_SOURCE" -d '{"urls":["<url>"],"source_type":"url"}'

Use me in the path; backend resolves user from token.

Supported: mp4, mov, avi, webm, mkv, jpg, png, gif, webp, mp3, wav, m4a, aac.

The upload endpoint accepts media files that users wish to incorporate into their video projects.

3.3 Checking Available Credits

curl -s "$API/api/credits/balance/simple" -H "Authorization: Bearer $TOKEN" \
  -H "X-Skill-Source: $SKILL_NAME" -H "X-Skill-Version: $SKILL_VERSION" -H "X-Skill-Platform: $SKILL_SOURCE"
# β†’ {"code":0,"data":{"available":XXX,"frozen":XX,"total":XXX}}

Query the credits endpoint before starting a generation task to confirm the user has a sufficient balance.

3.4 Retrieving Current Project State

curl -s "$API/api/state/nemo_agent/me/<sid>/latest" -H "Authorization: Bearer $TOKEN" \
  -H "X-Skill-Source: $SKILL_NAME" -H "X-Skill-Version: $SKILL_VERSION" -H "X-Skill-Platform: $SKILL_SOURCE"

Use me for user in path; backend resolves from token. Key fields: data.state.draft, data.state.video_infos, data.state.canvas_config, data.state.generated_media.

Draft field mapping: t=tracks, tt=track type (0=video, 1=audio, 7=text), sg=segments, d=duration(ms), m=metadata.

Draft ready for export when draft.t exists with at least one track with non-empty sg.

Track summary format:

Timeline (3 tracks): 1. Video: city timelapse (0-10s) 2. BGM: Lo-fi (0-10s, 35%) 3. Title: "Urban Dreams" (0-3s)

3.5 Exporting and Delivering the Final Video

Export does NOT cost credits. Only generation/editing consumes credits.

Triggering an export does not deduct any credits from the user's balance. The export flow proceeds as follows: (a) call the export endpoint with the project ID, (b) receive the export job identifier from the response, (c) poll the export status endpoint until the job reaches a completed state, (d) retrieve the download URL from the completed response, and (e) present the URL to the user for download or sharing.

b) Submit: curl -s -X POST "$API/api/render/proxy/lambda" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -H "X-Skill-Source: $SKILL_NAME" -H "X-Skill-Version: $SKILL_VERSION" -H "X-Skill-Platform: $SKILL_SOURCE" -d '{"id":"render_<ts>","sessionId":"<sid>","draft":<json>,"output":{"format":"mp4","quality":"high"}}'

Note: sessionId is camelCase (exception). On failure β†’ new id, retry once.

c) Poll (every 30s, max 10 polls): curl -s "$API/api/render/proxy/lambda/<id>" -H "Authorization: Bearer $TOKEN" -H "X-Skill-Source: $SKILL_NAME" -H "X-Skill-Version: $SKILL_VERSION" -H "X-Skill-Platform: $SKILL_SOURCE"

Status at top-level status: pending β†’ processing β†’ completed / failed. Download URL at output.url.

d) Download from output.url β†’ send to user. Fallback: $API/api/render/proxy/<id>/download.

e) When delivering the video, always also give the task detail link: $WEB/workspace/claim?token=$TOKEN&task={task_id}&session={session_id}&skill_name=$SKILL_NAME&skill_version=$SKILL_VERSION&skill_source=$SKILL_SOURCE

Progress messages: start "⏳ Rendering ~30s" β†’ "⏳ 50%" β†’ "βœ… Video ready!" + file + task detail link.

3.6 Recovering from an SSE Disconnection

When an SSE connection drops unexpectedly, follow these five steps to recover: (1) detect the disconnection via a connection-close or error event on the stream; (2) wait a brief interval before attempting to reconnect to avoid hammering the server; (3) re-open the SSE connection using the same session and message identifiers; (4) call the state query endpoint to determine whether the backend completed the task during the outage; (5) if the task is already finished, present the result to the user directly without re-submitting the request.

4. Translating Backend GUI References for Users

The backend is built around the assumption that users are interacting through a graphical interface, so any GUI-specific instructions or labels returned by the backend must be converted into plain conversational language before being shown to the user.

Backend saysYou do
"click [button]" / "点击"Execute via API
"open [panel]" / "打开"Show state via Β§3.4
"drag/drop" / "ζ‹–ζ‹½"Send edit via SSE
"preview in timeline"Show track summary
"Export button" / "ε―Όε‡Ί"Execute Β§3.5
"check account/billing"Check Β§3.3

Keep content descriptions. Strip GUI actions.

5. Recommended Interaction Patterns

β€’ Always confirm what the user wants to create or modify before initiating an API call, reducing unnecessary requests. β€’ After a silent SSE response, proactively query project state and report back rather than asking the user to retry. β€’ When presenting export links, include a brief summary of what was produced so the user has context alongside the download URL. β€’ If a user's request is ambiguous β€” for example, unclear clip length or style β€” ask a single clarifying question rather than making assumptions. β€’ Keep the user informed during long-running operations by acknowledging that processing is underway and that results will appear shortly.

6. Known Constraints and Limitations

β€’ Video generation tasks are asynchronous and may take several minutes; real-time preview is not supported. β€’ The API does not support simultaneous concurrent editing sessions under the same user account. β€’ Uploaded files must conform to the accepted format and size limits defined by the upload endpoint; oversized or unsupported files will be rejected. β€’ Credits are consumed at the point of generation, not at export; failed generations may still result in a credit deduction depending on how far processing progressed. β€’ SSE streams do not guarantee a text payload on every successful operation β€” silent completions are normal and must be handled via state polling.

7. Error Handling Reference

The table below maps common HTTP error codes and API-specific error states to the recommended recovery action for each.

CodeMeaningAction
0SuccessContinue
1001Bad/expired tokenRe-auth via anonymous-token (tokens expire after 7 days)
1002Session not foundNew session Β§3.0
2001No creditsAnonymous: show registration URL with ?bind=<id> (get <id> from create-session or state response when needed). Registered: "Top up at nemovideo.ai"
4001Unsupported fileShow supported formats
4002File too largeSuggest compress/trim
400Missing X-Client-IdGenerate Client-Id and retry (see Β§1)
402Free plan export blockedSubscription tier issue, NOT credits. "Register at nemovideo.ai to unlock export."
429Rate limit (1 token/client/7 days)Retry in 30s once

Common: no video β†’ generate first; render fail β†’ retry new id; SSE timeout β†’ Β§3.6; silent edit β†’ Β§3.1 fallback.

8. API Version and Required Token Scopes

Always verify that the API version specified in your request headers matches the version documented here before going live; mismatched versions may cause unexpected behavior or endpoint unavailability. The access token used for all requests must include the scopes required by each endpoint β€” ensure token scopes are provisioned correctly during OAuth authorization, as requests made with insufficient scopes will be rejected with a 403 response.

video-maker-free by LeoYeAI Β· The Skill Leaderboard