Record E2E Gif
lablup/backend.ai-webui
Record Playwright e2e tests as one GIF per test case (video → ffmpeg palette GIF) and return a markdown table for a PR description.
A skill your agent uses when asked to make a demo, training, how-to or tutorial video with sound or voice-over showing an HMIS function or configuration (e.g.
$ npx skills add hmislk/hmis --skill demo-video -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install hmislk/hmis demo-video --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/hmislk/hmis.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/demo-video .claude/skills/demo-video && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "demo-video" agent skill from https://github.com/hmislk/hmis/tree/development/.claude/skills/demo-video into .claude/skills/demo-video/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "demo-video", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/hmislk/hmis/tree/development/.claude/skills/demo-videoType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add hmislk/hmis --skill demo-video -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install hmislk/hmis demo-video --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/hmislk/hmis.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/demo-video .agents/skills/demo-video && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "demo-video" agent skill from https://github.com/hmislk/hmis/tree/development/.claude/skills/demo-video into .agents/skills/demo-video/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "demo-video", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add hmislk/hmis --skill demo-video -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install hmislk/hmis demo-video --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/hmislk/hmis.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/demo-video .cursor/skills/demo-video && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "demo-video" agent skill from https://github.com/hmislk/hmis/tree/development/.claude/skills/demo-video into .cursor/skills/demo-video/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "demo-video", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/hmislk/hmis.git --path .claude/skills/demo-video--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add hmislk/hmis --skill demo-video -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install hmislk/hmis demo-video --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/hmislk/hmis.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/demo-video .gemini/skills/demo-video && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "demo-video" agent skill from https://github.com/hmislk/hmis/tree/development/.claude/skills/demo-video into .gemini/skills/demo-video/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "demo-video", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install hmislk/hmis demo-videoInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add hmislk/hmis --skill demo-video -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/hmislk/hmis.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/demo-video .github/skills/demo-video && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "demo-video" agent skill from https://github.com/hmislk/hmis/tree/development/.claude/skills/demo-video into .github/skills/demo-video/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "demo-video", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add hmislk/hmis --skill demo-video -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install hmislk/hmis demo-video --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/hmislk/hmis.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/demo-video .opencode/skills/demo-video && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "demo-video" agent skill from https://github.com/hmislk/hmis/tree/development/.claude/skills/demo-video into .opencode/skills/demo-video/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "demo-video", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
demo-videoA skill your agent uses when asked to make a demo, training, how-to or tutorial video with sound or voice-over showing an HMIS function or configuration (e.g.
Demo Video is an agent skill from hmislk/hmis. Use when asked to make a demo, training, how-to or tutorial video with sound or voice-over showing an HMIS function or configuration (e.g. "make a video showing how to enable X", "record a demo of Y for users", "Sinhala/Tamil narrated walkthrough"), to publish such a video to YouTube, or via /demo-video. Not for bug demonstrations (use demonstrate-issues) or plain E2E verification (use playwright-e2e).
Its SKILL.md is about 3.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 18 other files, including scripts (for example `examples/login-department-select/flow.js`, `examples/login-department-select/script.json` and `examples/pharmacy-issue-own-department/flow.js`).
It sits in Testing & QA, covering Video production, Text to speech and voice and End-to-end testing. It works with YouTube and Playwright. The repository describes itself as: This is an Open Source Java EE based Hospital Information Management System. The licence is GPL-3.0.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 19f723d. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 7 files in scripts/ (JavaScript and Python), which the agent can run.
Shell commands in SKILL.md call:
pythonpipnpxnpmnodeFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use pip, npx and npm, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Demo Video loads about 3.9k tokens when it runs. Until then it costs about 105 tokens; SKILL.md has 2,180 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from hmislk/hmis at commit 19f723d, republished under its GPL-3.0 licence (© hmislk). 2,180 words, ~3,907 tokens.
.claude/skills/demo-video/SKILL.md (or your agent's skills folder). This skill also uses 13 other files; get the full folder from GitHub.Narrated MP4 demos of real HMIS screens. Playwright drives the running app through the menus only, an injected overlay adds a cursor, click highlights and captions, edge-tts voices each step, and ffmpeg mixes it all. Everything comes from a script, so when the UI changes you re-run the video instead of re-recording it.
Works on both Windows and Linux (verified on Ubuntu). See the Linux notes under Work dir and Credentials below — the only differences are the one-time pip setup and how credential paths are supplied; the recording/build/upload steps themselves are identical.
Worked examples:
examples/pharmacy-issue-own-department/ — the first accepted video; normal case, login happens silently before narration starts.examples/login-department-select/ — a video about logging in itself, using manualLogin: true (see Recorder API below).examples/pvc-card-print/ — a video whose key moment is a print button (see Printing below).Chrome's print dialog is browser UI, not page content: Playwright's video never contains it, a headless recorder can't open it, and on this machine the shell can't screenshot the desktop either. Show what gets printed instead, with scripts/printcap.js:
await pc.install(r.page) at the start of flow. It makes print() and document.execCommand('print') (which PrimeFaces p:printer tries first) record the printed document instead of opening the dialog.html = await pc.waitForPrint(page, n) (n = 1-based print count).pdf = await pc.toPdf(page.context(), HMIS_BASE, html, 'x.pdf') renders that exact HTML with Chrome's print engine at the CSS @page size, then { png, pages } = pc.toPng(pdf) (needs pip install pymupdf).pc.showPrinted(page, png, 'Printed front') overlays it on camera; pc.hidePrinted(page) removes it.Assert pages === 1 (or whatever the paper needs): the PDF is real verification, not decoration. The first take of the PVC card video exposed that every card side printed as 2 pages (#24305). If the user wants the real dialog in the video, they must screenshot it themselves (PrtScn) and you show the image as a still the same way.
setup() put the configuration back to its default in an unrecorded browser session first. Never fake a screen state.check_frames.py). Green scripts are not proof that the video shows the right thing.tmp/demo-videos/<slug>/ (gitignored). One-time setup in tmp/demo-videos/:
npm init -y && npm i playwright, then NODE_OPTIONS=--dns-result-order=ipv4first npx playwright install ffmpeg, then python -m pip install edge-tts imageio-ffmpeg.
The recorder launches the installed Google Chrome (channel: 'chrome'), because Playwright's own Chromium download fails on this network. Chrome must be installed; there is no npx playwright install chromium step.
On Debian/Ubuntu, the plain pip install fails with externally-managed-environment (PEP 668). Use python -m pip install --user --break-system-packages edge-tts imageio-ffmpeg instead (a venv also works, but needs python3-venv installed first, which most boxes don't have by default).script.json. Write one {id, say} per step, one or two short sentences each. Name menus and buttons exactly as they are labelled on screen. For a Sinhala or Tamil version, reuse the same ids and flow.js, translate only the say text, and keep the on-screen labels in English exactly as the app shows them ("Pharmacy මෙනුව විවෘත කර, Consumption ක්ලික් කරන්න"). Ask for a native speaker's review before the video goes to users.python <skill>/scripts/tts.py [voice]. The default voice is en-GB-SoniaNeural. For Sinhala use si-LK-ThiliniNeural; for Tamil use ta-LK-SaranyaNeural.flow.js. Copy the example and edit it. Each step is r.step(id) → actions → r.done(), and r.done() waits until that step's narration has finished. Add a throw wherever the result must be true (e.g. the block message appears, the screen opens), so a wrong recording fails loudly.HMIS_BASE=http://localhost:8080/rh/ DEPT="<login dept>" node flow.js. It exits non-zero if a throw fires. Don't pipe it (e.g. | tail), because the pipe hides the failure and build.py would then build a broken video.python <skill>/scripts/build.py <slug>.mp4.python <skill>/scripts/check_frames.py <slug>.mp4 and read frames/sheet.png. Every caption must match what is on screen at that moment. Fix the flow and repeat steps 6–8 until it does.tmp/demo-videos/ and report its path. Say which environment and test data appear in it.youtube.json in the work dir (title of at most 100 characters, plus optional tags, privacy, language such as si/ta, playlistId and description, which defaults to the script.json narration). Run python <skill>/scripts/upload.py <slug>.mp4 --dry-run, show the user the metadata, and upload only after they confirm: python <skill>/scripts/upload.py <slug>.mp4. The script writes youtube-upload.json, which blocks a second upload of the same video unless you pass --force. Report the youtu.be link. The one-time setup is below.Credentials live outside the repo in C:/Credentials/youtube/ on Windows (override with YT_CREDENTIALS_DIR). On Linux there is no default path — always set YT_CREDENTIALS_DIR (e.g. /home/<user>/Credentials/youtube). Use pip install google-api-python-client google-auth-oauthlib (add --user --break-system-packages on Debian/Ubuntu).
client_secret.json. The secret cannot be shown again once the dialog closes, so find the file first. Chrome may save it to a non-default Downloads folder.upload.py run opens the consent page. Pick the Google account; for a Brand Account channel such as CareCode, pick it on the channel chooser that follows. On "Google hasn't verified this app", click Continue. The script saves token.json. While the app is in Testing mode that token lasts about 7 days, after which the consent page simply reappears.r inside flow)| Call | Does |
|---|---|
step(id, {keep}) / done(extraMs) | show the caption and start the clip (clears a pinned growl unless keep:true) / hold until the clip ends |
menu(top, item) | hover a top menu, highlight the item, click it. top is 'Administration' or an icon menu id suffix: smPharmacy, smInpatient, smOpd, smLab, smStore, smReports, smSettings |
click(loc, {nav}) | move the cursor, highlight, click. Use nav:true for ajax="false" buttons |
point(loc, ms) | move the cursor and highlight without clicking, to draw attention |
highlight(loc, ms) | red outline only, cursor stays put. Use it for the menu bar or anything that opens on hover |
type(loc, text) / autocomplete(text, pick) | visible typing / pick from the first PrimeFaces autocomplete |
pinGrowl() / unpin() | pin a styled copy of the growl; returns its text for asserting. To keep it through the explaining step, open that step with step(id, {keep:true}) |
Environment variables: VIEW sets the window size. The default 1920x1080 is the zoom level users work at, where the whole top menu fits on one line; below about 1760 px wide it wraps to two lines. Captions scale with the width. Credentials come from HMIS_USER/HMIS_PASS, or otherwise from C:/Credentials/hmis_web_login.txt (Windows default). On Linux there is no default path — always set HMIS_USER/HMIS_PASS explicitly.
run(chromium, { setup, flow, manualLogin }): by default (manualLogin unset/false) the recorder logs in and picks DEPT silently before recording narration, and that portion is trimmed from the final video — this is right for a video about some other feature. Set manualLogin: true to skip that automatic step and have flow perform (and narrate) the login and department-selection itself, e.g. for a video that teaches login — see examples/login-department-select/. Read credentials inside flow with creds() (also exported from recorder.js), which resolves HMIS_USER/HMIS_PASS the same way the automatic login does.
| Symptom | Fix |
|---|---|
npx playwright install ffmpeg fails with "Download failure" | Prefix NODE_OPTIONS=--dns-result-order=ipv4first. IPv6 to Azure is black-holed on this machine |
pip install fails with externally-managed-environment | Debian/Ubuntu (PEP 668). Add --user --break-system-packages |
| An error message is gone before the narration explains it | Call pinGrowl() right after the action that raises it, before done() |
| A datatable column filter finds nothing | PrimeFaces filters match from the start of the text. Type the beginning of the value |
| Department picker click times out | Its items are table rows (tr), not li. login() already handles this |
Hover on Administration times out | Several menu items are labelled Administration. topMenu() targets the top-level entry |
| Edited XHTML not showing on local Payara | Production stage caches Facelets. Run asadmin disable <app> then asadmin enable <app> |
| Bash heredoc "unexpected EOF" when writing JS | Write files with the Write tool, not heredocs; the caption quotes break the shell |
| Red "Database Migration Pending" bar visible | The overlay hides it. If it still shows, it only appears on dev builds, not to users |
| Screen and voice drift apart | Never use fixed sleeps for pacing. Let done() pace each step from the clip duration |
| Consent says "Access blocked: … has not completed the Google verification process" (403 access_denied) | The account is not a saved test user. Add it under Audience → Test users and check the count shows it |
| Consent says "Something went wrong" after picking a Brand Account | Sign in as the managing Google account (the test user), then pick the channel from the chooser |
Upload hangs, the log shows WinError 10060 retries | IPv6 is black-holed. upload.py forces IPv4 by default; don't set YT_ALLOW_IPV6 on this network |
| Consent page closed or lost while the script waits | The full URL is in the script's output. Open it again; the local listener keeps waiting |
quotaExceeded | About 6 uploads per day on the default 10,000-unit quota. Retry after midnight Pacific time |
| Upload lands private although public was asked | Unaudited API projects may be locked to private. Change the visibility in Studio, or file the API audit form (link in the script output) |
r.click() on a page accordion/tab header silently has no effect the first time (aria-expanded stays false, next step's target is hidden) | Read aria-expanded back after the click and click again if it didn't flip — some PrimeFaces accordion/tab headers on this app need two clicks right after page load |
A nested flyout item (hover a top icon, then hover a second-level category, then click a third-level item) times out as "not visible" even though a plain .isVisible() check just said true | The default r.click()/r.point() mouse path travels from wherever the cursor currently is, and crossing other menu items on the way closes the flyout before the click lands. After the hover opens it, move the mouse in two short steps straight down the submenu column first (to just below the hovered header, then to the target's row — see r.menu()'s internal path in recorder.js) and only then call r.click() |
button:has-text("X")/:text-is("X") resolves but the action times out "element is not visible" | On a busy admin page, several other hidden buttons (other accordion tabs, conditionally-rendered sections) can also match that text and sort earlier in DOM order than the one you want — .first() then grabs the wrong one. Dump all matches with page.evaluate (text + offsetParent!==null + id) to find the real one, then target it by its own id instead of by text |
button[title="…"] locator works once, then times out | PrimeFaces tooltip strips title on hover. Locate by icon class (button:has(.fa-pills)) or id |
pinGrowl() returns '' although the growl is on screen | PrimeFaces adds the growl container before the text fades in. Fixed in recorder.js (waits for .ui-growl-message); if a save is slow, give the step r.sleep(2500) after pinGrowl() and open the next step with {keep:true} so the confirmation is readable |
| A captured print renders as 2+ PDF pages only while recording | The recorder overlay (#__cap, #__cur) is injected into every page of the recorded context, including the one toPdf opens. printcap.toPdf strips it; don't render captured HTML in a page without that step |
| The page's live preview scrolls out of view while editing lower fields | That is a UX defect for real users too — fix the page (e.g. position:sticky preview), don't film around it |
| Receipt/print page records as blank white | It calls window.print(). Before navigating: await p.context().addInitScript(() => { window.print = () => {}; }) |
| Re-record fails "Insufficient stock" | Earlier takes drained the first batch. Pass its expiry as pick: r.autocomplete('Panadeine', '31 May 28') |
| Failed takes clutter the next take's lists | Never clean up. Use per-take names via env vars; for per-day lists (tokens), record in a department with none today |
© hmislk, GPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 13 other files (scripts) in .claude/skills/demo-video of hmislk/hmis.
Open the folder on GitHubat commit 19f723d
Demo Video next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Demo Video this skillhmislk/hmis | 236 | — | ~3.9k | Automated safety check: Pass | GPL-3.0 | |
| Record E2E Giflablup/backend.ai-webui | 133 | — | ~907 | Automated safety check: Notes | LGPL-3.0 | |
| Whiteboard Videotrustfuture/simon-skills | 382 | — | ~1.8k | Automated safety check: Notes | MIT | |
| Immersive Short Videoxrkseek/XRK-AGT | 138 | — | ~1k | Automated safety check: Pass | MIT | |
| Motion Adfabricioctelles/skills | 106 | — | ~4.1k | Automated safety check: Pass | Apache-2.0 | |
| Render Mosaic Grid Revealgooseworks-ai/goose-skills | 1.2k | — | ~1.1k | Automated safety check: Pass | MIT |
lablup/backend.ai-webui
Record Playwright e2e tests as one GIF per test case (video → ffmpeg palette GIF) and return a markdown table for a PR description.
trustfuture/simon-skills
手绘白板风"边画边讲"讲解视频出片 skill(Excalidraw 风格逐笔动画 + 火山引擎配音 + 烧录字幕 + 品牌水印与片尾卡 + 横竖两张封面 + 各平台发布文案)。当用户说"做一期白板视频 / 边画边讲 / 手绘讲解视频 / 用 excalidraw 做视频 / whiteboard video",或要在本仓库里新建一期、改场景、换贴纸或真实…
xrkseek/XRK-AGT
Produce immersive vertical short videos (口播/科普/产品讲解) without AI-slop aesthetics.
fabricioctelles/skills
Produce a short motion-graphics video ad — a 15s Facebook/Instagram/TikTok spot — as a rendered MP4.
gooseworks-ai/goose-skills
Render a 'mosaic-grid-reveal' video from a config — a real-DOM FULL-BLEED N×N mosaic of real product tiles that pops in one tile at a time (scatter order, ease-out-back overshoot), the grid clears…
gooseworks-ai/goose-skills
Render a 'model comparison grid' video from a config — a fal-style "same prompt, N contenders" showcase — a dark real-DOM stage where per beat a monospace prompt fades in centered, docks to a small…
hmislk/hmis
Reference for calling existing HMIS REST APIs. An agent skill from hmislk/hmis.
hmislk/hmis
Application configuration options reference for the HMIS project.
hmislk/hmis
Ultra-compressed communication mode. An agent skill from hmislk/hmis.
hmislk/hmis
MySQL database development guide for the HMIS project. An agent skill from hmislk/hmis.
hmislk/hmis
Sync development into QA/testing environment branches (QA1-QA4, local RH staging) via PR + merge on GitHub.
hmislk/hmis
Run a GitHub issue through its full lifecycle end-to-end: investigate, discuss the approach, gather test context (department/data), implement, rebuild + local redeploy, verify with Playwright and…
Works with
Categories
A skill your agent uses when asked to make a demo, training, how-to or tutorial video with sound or voice-over showing an HMIS function or configuration (e.g. Demo Video is an agent skill from hmislk/hmis.g.
Demo Video fits situations like: asked to make a demo; tutorial video with sound; voice-over showing an HMIS function; configuration (e.g.
Run `npx skills add hmislk/hmis --skill demo-video -a claude-code`. Or copy the skill folder (.claude/skills/demo-video in hmislk/hmis) into .claude/skills/demo-video in your project. Claude Code loads it when a task matches its description.
Run `npx skills add hmislk/hmis --skill demo-video -a codex`. Or copy the skill folder (.claude/skills/demo-video in hmislk/hmis) into .agents/skills/demo-video in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add hmislk/hmis --skill demo-video -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/demo-video, .gemini/skills/demo-video, .github/skills/demo-video and .opencode/skills/demo-video in your project.
Going by SKILL.md and its folder, Demo Video needs JavaScript and Python for the scripts in its folder and the command-line tools its instructions call (python, pip, npx, npm and node). Our summary lists: Python 3; Node.js.
SKILL.md contains no URLs. Its commands use pip, npx and npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Demo Video is published under the GPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.9k tokens (SKILL.md is roughly 16k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Demo Video: Record E2E Gif (lablup/backend.ai-webui, 133 stars), Whiteboard Video (trustfuture/simon-skills, 382 stars), Immersive Short Video (xrkseek/XRK-AGT, 138 stars) and Motion Ad (fabricioctelles/skills, 106 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
hmislk (a GitHub organization) maintains it in hmislk/hmis, which has 236 GitHub stars. The repository holds 33 skills in this directory. The repository was last updated on October 10, 2026.
Source: hmislk/hmis on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.