Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Generate CS2 highlights and fragmovies from demos using the Demo-Slap API. Includes optional Leetify integration for auto-fetching demo URLs. Use when a user...
Generate CS2 highlights and fragmovies from demos using the Demo-Slap API. Includes optional Leetify integration for auto-fetching demo URLs. Use when a user...
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
Generate MP4 highlights and fragmovies from CS2 demos. This skill is designed for OpenClaw environments where background jobs, local helper scripts, and chat-aware delivery are available. It uses Python 3 scripts and the requests package for HTTP API access. Expected runtime inputs: Required: DEMOSLAP_API_KEY Optional: LEETIFY_API_KEY Optional deployment helper: DEMO_SLAP_WATCHDOG_JOB_ID
Run bundled scripts relative to the skill root, usually from scripts/.
ScriptPurposedemo_slap_matches.pyList recent matches from Demo-Slap /public-api/matchesdemo_slap_resolve.pyTry to resolve replay/demo URL from Demo-Slap match history by index; fail clearly if the API exposes only jobIddemo_slap_match_pick.pyPick a Demo-Slap match by index and return structured match info including jobIddemo_slap_analyze.pySubmit a demo for analysis, poll until done, output highlights JSONdemo_slap_render.pyRender one or more highlights, poll until done, output clip URLdemo_slap_common.pyShared utilities (config, API calls, state)
ScriptPurposeleetify/leetify_matches.pyList recent matchesleetify/leetify_resolve.pyResolve replay URL by username + match indexleetify/leetify_save_id.pySave username -> Steam64 ID mappingleetify/leetify_common.pyShared Leetify utilities
Prefer Leetify for recent match discovery when LEETIFY_API_KEY is available. If LEETIFY_API_KEY is not configured but DEMOSLAP_API_KEY is available, use Demo-Slap match history from /public-api/matches. Swagger: https://api-doc.demo-slap.net/ Treat Demo-Slap match history as the fallback discovery path for listing matches and selecting an existing analyzed match or replay context before analyze/render.
Use these files as optional local runtime state during execution: data/state.json data/highlights.json data/history.log data/steam_ids.json data/config.json These files are runtime helpers for local operation and are not required to understand or inspect the skill package itself. state.json tracks the current operation: { "status": "idle|analyzing|rendering|done|error", "job_id": "...", "render_job_id": "...", "chat_id": "telegram:182314856", "clip_urls": {"highlight_id": "https://..."}, "progress": "polling 3/30", "last_completed_op": "analyze|render", "notification": { "sent": false, "sent_at": null, "last_attempt_at": null, "error": null }, "updated_at": "ISO timestamp" }
Preferred path when LEETIFY_API_KEY is available: python3 scripts/leetify/leetify_matches.py <USERNAME> [--limit 10] Fallback path when LEETIFY_API_KEY is missing but DEMOSLAP_API_KEY is available: python3 scripts/demo_slap_matches.py [<USERNAME>] [--limit 10] uses Demo-Slap /public-api/matches use the Demo-Slap swagger docs at https://api-doc.demo-slap.net/ if schema details are needed if <USERNAME> is provided and mapped, filter matches to that player's Steam ID when possible after the user picks a match, run: python3 scripts/demo_slap_match_pick.py [<USERNAME>] --match-index <N> treat the returned jobId as the primary handle for downstream Demo-Slap operations
Preferred path when using Leetify: python3 scripts/leetify/leetify_resolve.py <USERNAME> --match-index <N> When using Demo-Slap fallback: python3 scripts/demo_slap_match_pick.py [<USERNAME>] --match-index <N> use the returned jobId as the selected match identifier if demoUrl is present, you may still use analyze-by-URL if demoUrl is absent, skip URL resolution and continue by API endpoints that accept the existing analyze jobId use GET /public-api/analyze/{jobId}/status and GET /public-api/analyze/{jobId}/data to inspect existing highlights if the user wants clips and highlights already exist, render directly from that jobId
python3 -u scripts/demo_slap_analyze.py --url '<REPLAY_URL>' --username <USERNAME> --chat-id <CHAT_ID> Run with exec(background: true) and keep the returned process/session id. Optional deployment-specific watchdog pattern for OpenClaw environments: Use a watchdog only when background analyze/render work benefits from periodic delivery checks. Reuse an existing deployment watchdog when available instead of assuming a new persistent scheduler entry is always needed. If a deployment chooses to create or enable a watchdog through the built-in cron tool, keep it scoped to the active run and disable it again after terminal delivery. A 2 minute interval is a reasonable default. Use scripts/demo_slap_watchdog.sh status|tail|job only as a local helper for inspecting runtime state, logs, or deployment-specific job references. Treat data/state.json and data/highlights.json as the source of truth during runtime. Agent workflow: Choose the match source: Leetify if LEETIFY_API_KEY exists Demo-Slap /public-api/matches if LEETIFY_API_KEY is missing and DEMOSLAP_API_KEY exists If using Leetify, resolve the replay URL and run analyze If using Demo-Slap fallback, pick a match and inspect the returned jobId If the selected Demo-Slap match already has analyze data, continue by jobId instead of forcing analyze-by-URL Use or enable a deployment watchdog only when long-running analyze/render work benefits from it Launch analyze or render and save the returned process/session id when applicable Let the watchdog deliver the result when a deployment uses one Disable the watchdog again after terminal delivery
# Single highlight python3 -u scripts/demo_slap_render.py <JOB_ID> <HIGHLIGHT_ID> --chat-id <CHAT_ID> # Fragmovie python3 -u scripts/demo_slap_render.py <JOB_ID> <ID1> <ID2> ... --fragmovie --chat-id <CHAT_ID> Run with exec(background: true) and keep the returned process/session id. Optional deployment-specific watchdog pattern for OpenClaw environments: Use a watchdog only when background analyze/render work benefits from periodic delivery checks. Reuse an existing deployment watchdog when available instead of assuming a new persistent scheduler entry is always needed. If a deployment chooses to create or enable a watchdog through the built-in cron tool, keep it scoped to the active run and disable it again after terminal delivery. A 2 minute interval is a reasonable default. Use scripts/demo_slap_watchdog.sh status|tail|job only as a local helper for inspecting runtime state, logs, or deployment-specific job references. Treat data/state.json and data/highlights.json as the source of truth during runtime. Agent workflow: Enable or reuse a deployment watchdog only when needed for the active run Launch render and save the returned process/session id Poll process output for the Estimated finish: line and tell the user the ETA if present Let the watchdog deliver the result when one is in use Disable the watchdog again after terminal delivery Critical: set <CHAT_ID> from inbound metadata of the originating request. Treat hardcoded chat identifiers as local examples only, not as a reusable default.
Read data/state.json.
python3 scripts/leetify/leetify_save_id.py <USERNAME> <STEAM_64_ID>
Prefer environment variables: DEMOSLAP_API_KEY - required LEETIFY_API_KEY - optional, only for Leetify-backed match discovery DEMO_SLAP_WATCHDOG_JOB_ID - optional deployment-specific helper for watchdog inspection scripts Source selection rules: If LEETIFY_API_KEY exists, use Leetify for match discovery. If LEETIFY_API_KEY is absent but DEMOSLAP_API_KEY exists, use Demo-Slap /public-api/matches for match discovery. DEMOSLAP_API_KEY is always required for analyze/render. Optional local fallback for controlled self-hosted setups: put them in data/config.json.
For access and support, please join our Discord community: https://discord.gg/8nfh26W9wQ
Code helpers, APIs, CLIs, browser automation, testing, and developer operations.
Largest current source with strong distribution and engagement signals.