Record Your Screen, Edit It By Just Talking
Most screen recorders stop at the recording itself — leaving you to hunt down a separate editor, learn its timeline, and export through a maze of settings. The screen-recorder-free skill collapses that entire workflow into a single conversation. You capture your screen, describe what you want changed, and the skill handles the rest.
Under the hood, the OpenClaw agent interprets your natural-language instructions and maps them onto precise video operations — whether that means silencing a fumbled sentence, zooming into a specific UI element mid-recording, or stitching two clips together with a clean cut. The agent understands context across your session, so you can say 'remove the part where I switched tabs by mistake' and it knows exactly which segment you mean.
This approach is especially useful for people who record frequently but aren't video editors — customer support reps building knowledge-base walkthroughs, developers documenting bugs, or educators producing quick how-to clips. No timeline scrubbing, no keyframe panels. Just describe the result you want, and the skill produces a polished file ready to share or embed. Final recordings export in mp4, mov, avi, webm, or mkv to fit any platform requirement.
Environment Variables
| Variable | Required | Default |
|---|
| INLINECODE0 | No | Auto-generated (100 free credits, expires in 7 days, revocable via Settings → API Tokens) |
| INLINECODE1 |
No |
https://mega-api-prod.nemovideo.ai |
|
NEMO_WEB_URL | No |
https://nemovideo.com |
|
NEMO_CLIENT_ID | No | Auto-generated UUID, persisted to
~/.config/nemovideo/client_id (UUID only, no secrets) |
|
SKILL_SOURCE | No | Auto-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 "https://mega-api-prod.nemovideo.ai/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
Use the table below to determine which endpoint handles each type of incoming request.
| User says... | Action | Skip 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 Operational Flows
$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 INLINECODE21 - INLINECODE22 = this file's YAML frontmatter INLINECODE23
- INLINECODE24 = 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: INLINECODE30
CRITICAL: ALL API requests (including render/export/upload/state/credits) MUST include these headers. Missing them will cause export to fail with 402.
CODEBLOCK1
3.0 Initialize a Session
curl -s -X POST "https://mega-api-prod.nemovideo.ai/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 action can take place, a session must be established. Every subsequent request depends on the session identifier returned at this stage.
Open in browser: After creating a session, give the user a link to view/edit the task in NemoVideo:
INLINECODE31
3.1 Deliver a Message Over SSE
curl -s -X POST "https://mega-api-prod.nemovideo.ai/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 conversational messages to the backend are transmitted through a Server-Sent Events channel.
SSE Handling
| Event | Action |
|---|
| Text response | Apply GUI translation (§4), present to user |
| Tool call/result |
Wait silently, don't forward |
|
heartbeat / empty
data: | Keep waiting. Every 2 min: "⏳ Still working..." |
| Stream closes | Process 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 edit operations return no text in the response. When this occurs: first, check the HTTP status code to confirm the request succeeded; second, poll the session state endpoint to retrieve the current operation status; third, surface a status update to the user rather than treating the empty response as a failure.
Two-stage generation: After raw video is produced, the backend automatically triggers a second processing stage that appends background music and a title sequence. Be aware of both stages when tracking job completion — the final deliverable is not ready until stage two has finished.
3.2 Handling File Uploads
File upload: INLINECODE34
URL upload: INLINECODE35
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 will be used as source material within the current session.
3.3 Checking Available Credits
curl -s "https://mega-api-prod.nemovideo.ai/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 to verify the user has a sufficient balance before initiating any operation that consumes credits.
3.4 Retrieving Current Session State
curl -s "https://mega-api-prod.nemovideo.ai/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:
CODEBLOCK6
3.5 Exporting and Delivering the Final Output
Export does NOT cost credits. Only generation/editing consumes credits.
Exporting a finished video does not deduct any credits from the user's balance. The export flow proceeds as follows: (a) confirm the job has reached a completed state; (b) call the export endpoint with the session identifier; (c) await the download URL in the response; (d) verify the URL is reachable before presenting it to the user; (e) deliver the link along with the filename and format details.
b) Submit: INLINECODE47
Note: sessionId is camelCase (exception). On failure → new id, retry once.
c) Poll (every 30s, max 10 polls): INLINECODE50
Status at top-level status: pending → processing → completed / failed. Download URL at output.url.
d) Download from output.url → send to user. Fallback: https://mega-api-prod.nemovideo.ai/api/render/proxy/<id>/download.
e) When delivering the video, always also give the task detail link: INLINECODE55
Progress messages: start "⏳ Rendering ~30s" → "⏳ 50%" → "✅ Video ready!" + file + task detail link.
3.6 Recovering from an SSE Disconnection
When an SSE connection drops, follow these steps: (1) detect the disconnection event and pause any pending UI updates; (2) wait a short back-off interval before attempting to reconnect; (3) re-establish the SSE connection using the existing session identifier — do not create a new session; (4) once reconnected, poll the state endpoint to reconcile any events that may have been missed during the outage; (5) resume normal message handling and inform the user if the interruption affected a running operation.
4. Translating GUI Elements for the Backend
The backend operates under the assumption that a graphical interface is present — never forward raw GUI instructions or UI component references directly to it.
| Backend says | You 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 a session is active before dispatching any request to the backend.
• When a response body is empty, rely on state polling rather than assuming an error has occurred.
• Present progress indicators to the user during both processing stages of video generation.
• Validate credit availability ahead of any credit-consuming action to avoid unnecessary failures.
• After an SSE reconnect, reconcile missed events via the state endpoint before resuming user-facing updates.
6. Known Limitations
• A single session cannot be shared across multiple concurrent users.
• Silent responses are expected behavior for a subset of edit operations and should not be treated as errors.
• Background music and title injection occur automatically server-side and cannot be suppressed through the API.
• Export URLs are time-limited and should be delivered to the user promptly after retrieval.
• Credit balances are read-only through the API; top-ups must be handled outside this integration.
7. Error Handling Reference
The table below maps common error codes to their causes and the recommended remediation steps.
| Code | Meaning | Action |
|---|
| 0 | Success | Continue |
| 1001 |
Bad/expired token | Re-auth via anonymous-token (tokens expire after 7 days) |
| 1002 | Session not found | New session §3.0 |
| 2001 | No credits | Anonymous: show registration URL with
?bind=<id> (get
<id> from create-session or state response when needed). Registered: "Top up at nemovideo.ai" |
| 4001 | Unsupported file | Show supported formats |
| 4002 | File too large | Suggest compress/trim |
| 400 | Missing X-Client-Id | Generate Client-Id and retry (see §1) |
| 402 | Free plan export blocked | Subscription tier issue, NOT credits. "Register at nemovideo.ai to unlock export." |
| 429 | Rate 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. Version Information and Token Scopes
Before going live, confirm the API version in use matches the version this skill was built and validated against. Token scopes must include permissions for session management, messaging, file upload, export, and credits retrieval — requests made with tokens missing any required scope will be rejected with an authorization error.
录制屏幕,只需说话即可编辑
大多数屏幕录制工具在录制完成后就止步了——你需要另外找一个编辑器,学习它的时间线操作,再通过一堆设置选项导出视频。而 screen-recorder-free 技能将整个工作流程浓缩为一次对话。你录制屏幕,描述你想要修改的内容,剩下的交给技能处理。
在底层,OpenClaw 代理会解析你的自然语言指令,并将其映射到精确的视频操作上——无论是静音一段说错的话,在录制过程中放大某个特定的 UI 元素,还是将两个片段干净利落地拼接在一起。代理能理解你整个会话的上下文,所以你可以说删掉我不小心切换标签页的那部分,它就知道你指的是哪个片段。
这种方法对于经常录制视频但并非视频编辑者的人来说特别有用——比如制作知识库教程的客服支持人员、记录 bug 的开发者,或者制作快速操作指南的教育工作者。无需拖动时间线,无需关键帧面板。只需描述你想要的结果,技能就会生成一个可直接分享或嵌入的精美视频文件。最终录制文件可导出为 mp4、mov、avi、webm 或 mkv 格式,满足任何平台的要求。
环境变量
| 变量 | 是否必需 | 默认值 |
|---|
| NEMOTOKEN | 否 | 自动生成(100 个免费积分,7 天后过期,可通过设置 → API 令牌撤销) |
| NEMOAPI_URL |
否 | https://mega-api-prod.nemovideo.ai |
| NEMO
WEBURL | 否 | https://nemovideo.com |
| NEMO
CLIENTID | 否 | 自动生成的 UUID,持久化存储到 ~/.config/nemovideo/client_id(仅 UUID,无密钥) |
| SKILL_SOURCE | 否 | 从安装路径自动检测,回退为 unknown |
如果未设置 NEMO_TOKEN,请获取一个(需要 X-Client-Id 请求头):
bash
生成或读取持久化的 Client-Id
CLIENT
ID=${NEMOCLIENT
ID:-$(cat ~/.config/nemovideo/clientid 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/clientid
fi
curl -s -X POST https://mega-api-prod.nemovideo.ai/api/auth/anonymous-token -H X-Client-Id: $CLIENT_ID
→ {code:0,data:{token:nmvusrxxx,credits:100,...}}
将 token 保存为 NEMOTOKEN,CLIENTID 保存为 NEMOCLIENTID。匿名用户:每个客户端每 7 天 1 个令牌;令牌 7 天后过期,可随时通过 nemovideo.com 上的设置 → API 令牌撤销。如果令牌过期,使用相同的 X-Client-Id 请求一个新令牌。
本地持久化: 此技能会将 ~/.config/nemovideo/client_id 写入文件,以在会话之间持久化 Client-Id。这避免了每次请求都生成新 ID,从而防止触发每个 IP 的速率限制(默认每个 IP 每 7 天 10 个令牌)。该文件仅包含一个 UUID——本地不存储任何凭据。
2. 路由传入请求
使用下表确定哪个端点处理每种类型的传入请求。
| 用户说... | 操作 | 跳过 SSE |
|---|
| export / 导出 / download / send me the video | → §3.5 导出 | ✅ |
| credits / 积分 / balance / 余额 |
→ §3.3 积分 | ✅ |
| status / 状态 / show tracks | → §3.4 状态 | ✅ |
| upload / 上传 / 用户发送文件 | → §3.2 上传 | ✅ |
| 其他所有内容(生成、编辑、添加背景音乐...) | → §3.1 SSE | ❌ |
3. 主要操作流程
$API = ${NEMOAPIURL:-https://mega-api-prod.nemovideo.ai},$TOKEN = ${NEMOTOKEN},$WEB = ${NEMOWEB_URL:-https://nemovideo.com}。
技能归属变量——请勿硬编码:
- - $SKILLNAME = 此文件的 YAML 前置元数据 name
- $SKILLVERSION = 此文件的 YAML 前置元数据 version
- $SKILL_SOURCE = 在运行时使用第一个匹配项检测:
1. 如果设置了环境变量 SKILL_SOURCE
2. 如果此文件的路径包含已知的平台目录(例如 ~/.clawhub/ → clawhub,~/.cursor/skills/ → cursor)
3. 回退:unknown
关键:所有 API 请求(包括渲染/导出/上传/状态/积分)必须包含这些请求头。缺少它们将导致导出失败并返回 402。
X-Skill-Source: $SKILL_NAME
X-Skill-Version: $SKILL_VERSION
X-Skill-Platform: $SKILL_SOURCE
3.0 初始化会话
bash
curl -s -X POST https://mega-api-prod.nemovideo.ai/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: $SKILLVERSION -H X-Skill-Platform: $SKILL_SOURCE \
-d {task_name:project,language:
}
→ {code:0,data:{taskid:...,sessionid:...}}
在任何其他操作进行之前,必须先建立会话。每个后续请求都依赖于在此阶段返回的会话标识符。
在浏览器中打开:创建会话后,给用户一个链接,以便在 NemoVideo 中查看/编辑任务:
$WEB/workspace/claim?task={taskid}&session={sessionid}&skillname=$SKILLNAME&skillversion=$SKILLVERSION&skillsource=$SKILLSOURCE
3.1 通过 SSE 传递消息
bash
curl -s -X POST https://mega-api-prod.nemovideo.ai/run_sse \
-H Authorization: Bearer $TOKEN -H Content-Type: application/json \
-H Accept: text/event-stream -H X-Skill-Source: $SKILLNAME -H X-Skill-Version: $SKILLVERSION -H X-Skill-Platform: $SKILL_SOURCE --max-time 900 \
-d {appname:nemoagent,userid:me,sessionid:,new_message:{parts:[{text:}]}}
所有与后端的对话消息都通过服务器发送事件通道传输。
SSE 处理
| 事件 | 操作 |
|---|
| 文本响应 | 应用 GUI 翻译(§4),呈现给用户 |
| 工具调用/结果 |
静默等待,不转发 |
| heartbeat / 空 data: | 继续等待。每 2 分钟:⏳ 仍在处理中... |
| 流关闭 | 处理最终响应 |
典型持续时间:文本 5-15 秒,视频生成 100-300 秒,编辑 10-30 秒。
超时:仅收到心跳信号持续 10 分钟 → 视为超时。生成期间切勿重新发送(会导致重复和重复计费)。
如果之前的响应正常,忽略末尾的我遇到了临时问题。
静默响应回退(关键)
大约 30% 的编辑操作在响应中不返回文本。发生这种情况时:首先,检查 HTTP 状态码以确认请求成功;其次,轮询会话状态端点以获取当前操作状态;第三,向用户显示状态更新,而不是将空响应视为失败。
两阶段生成:原始视频生成后,后端会自动触发第二阶段处理,添加背景音乐和标题序列。在跟踪任务完成时要注意这两个阶段——最终交付物在第二阶段完成之前尚未就绪。
3.2 处理文件上传
文件上传:curl -s -X POST https://mega-api-prod.nemovideo.ai/api/upload-video/nemo_agent/me/ -H Authorization: Bearer $TOKEN