Audio Jingle
sanqiufong/slides-from-anything
Audio generation skill — jingles, beds, voiceover, and sound effects.
Async music, sound-effect and long-form voice generation via Venice.
$ npx skills add veniceai/skills --skill venice-audio-music -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install veniceai/skills venice-audio-music --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/veniceai/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/venice-audio-music .claude/skills/venice-audio-music && 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 "venice-audio-music" agent skill from https://github.com/veniceai/skills/tree/main/skills/venice-audio-music into .claude/skills/venice-audio-music/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "venice-audio-music", 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/veniceai/skills/tree/main/skills/venice-audio-musicType 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 veniceai/skills --skill venice-audio-music -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install veniceai/skills venice-audio-music --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/veniceai/skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/venice-audio-music .agents/skills/venice-audio-music && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "venice-audio-music" agent skill from https://github.com/veniceai/skills/tree/main/skills/venice-audio-music into .agents/skills/venice-audio-music/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "venice-audio-music", 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 veniceai/skills --skill venice-audio-music -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install veniceai/skills venice-audio-music --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/veniceai/skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/venice-audio-music .cursor/skills/venice-audio-music && 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 "venice-audio-music" agent skill from https://github.com/veniceai/skills/tree/main/skills/venice-audio-music into .cursor/skills/venice-audio-music/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "venice-audio-music", 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/veniceai/skills.git --path skills/venice-audio-music--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 veniceai/skills --skill venice-audio-music -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install veniceai/skills venice-audio-music --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/veniceai/skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/venice-audio-music .gemini/skills/venice-audio-music && 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 "venice-audio-music" agent skill from https://github.com/veniceai/skills/tree/main/skills/venice-audio-music into .gemini/skills/venice-audio-music/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "venice-audio-music", 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 veniceai/skills venice-audio-musicInstalls 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 veniceai/skills --skill venice-audio-music -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/veniceai/skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/venice-audio-music .github/skills/venice-audio-music && 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 "venice-audio-music" agent skill from https://github.com/veniceai/skills/tree/main/skills/venice-audio-music into .github/skills/venice-audio-music/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "venice-audio-music", 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 veniceai/skills --skill venice-audio-music -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install veniceai/skills venice-audio-music --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/veniceai/skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/venice-audio-music .opencode/skills/venice-audio-music && 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 "venice-audio-music" agent skill from https://github.com/veniceai/skills/tree/main/skills/venice-audio-music into .opencode/skills/venice-audio-music/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "venice-audio-music", 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.
venice-audio-musicAsync music, sound-effect and long-form voice generation via Venice.
Venice Audio Music is an agent skill from veniceai/skills. Async music, sound-effect and long-form voice generation via Venice. Covers the /audio/quote + /audio/queue + /audio/retrieve + /audio/complete lifecycle, lyrics vs instrumental and the lyrics optimizer, duration options, seamless loop (ElevenLabs sound effects), voice selection incl. custom ElevenLabs Voice IDs, language, speed, model capability probing via /models?type=music, pricing shapes, refunds, and polling.
Its SKILL.md is about 3.1k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Media & Creative, covering Text to speech and voice and Music and audio generation. It works with ElevenLabs, MiniMax and x402. The repository describes itself as: Agent Skills for the Venice.ai API. One folder per surface area, each with a SKILL.md for agent runtimes (Cursor, Claude, Codex, etc.). The licence is MIT.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 5eaeac5. 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.
Shell commands in SKILL.md call:
curlFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
api.venice.aiFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
VENICE_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Venice Audio Music loads about 3.1k tokens when it runs. Until then it costs about 109 tokens; SKILL.md has 999 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); files beside SKILL.md are not scanned.
The full file from veniceai/skills at commit 5eaeac5, republished under its MIT licence (© veniceai). 999 words, ~3,075 tokens.
.claude/skills/venice-audio-music/SKILL.md (or your agent's skills folder).Music, sound effects and character-priced voice generation are asynchronous:
| Method | Path | Auth | Notes |
|---|---|---|---|
POST | /api/v1/audio/quote | None required (key optional) | Price in USD. |
POST | /api/v1/audio/queue | Bearer key or x402 (SIWX) | Charges and enqueues → queue_id. 40 req/min per user. |
POST | /api/v1/audio/retrieve | Bearer key or x402 (SIWX) | Status JSON or the audio bytes. 120 req/min per user. |
POST | /api/v1/audio/complete | Bearer key or x402 (SIWX) | Delete the stored media. |
For short synchronous text-to-speech use venice-audio-speech. Voice-changer (speech-to-speech) models are refused on these four endpoints with a 400 pointing at /audio/voice-changer/* (callers who can't see the model get 404 instead) — see venice-audio-voice-changer.
Query GET /models?type=music for the current list and each model's model_spec. Representative ids (all in the live list):
| Kind | Examples |
|---|---|
| Instrumental / songs | elevenlabs-music, elevenlabs-music-v2-5, lyria-3-pro, sonilo-v1-1-music, stable-audio-25 |
| Songs with lyrics | minimax-music-v25, minimax-music-v26, minimax-music-v2 (lyrics required), ace-step-15 (lyrics optional) |
| Sound effects | elevenlabs-sound-effects-v2 (supports loop), sonilo-v1-1-sound-effects, mmaudio-v2-text-to-audio |
Voice (text in prompt) | elevenlabs-tts-v4, elevenlabs-tts-v4-turbo, elevenlabs-tts-v3, elevenlabs-tts-multilingual-v2, seed-audio-1-0 |
POST /audio/quote — price it firstcurl https://api.venice.ai/api/v1/audio/quote \
-H "Content-Type: application/json" \
-d '{ "model": "elevenlabs-music", "duration_seconds": 60 }'Response: {"quote": 0.69} (USD). No API key needed; sending one lets you price models only your account can see.
| Field | Notes |
|---|---|
model | Required. |
duration_seconds | Integer or numeric string. Only for models that expose duration metadata (min_duration / max_duration / duration_options) — rejected otherwise. Omit to price the model's default_duration. |
character_count | Integer ≤ prompt_character_limit. Required for models priced by per_thousand_characters. |
Unknown fields → 400.
POST /audio/queue — enqueuecurl https://api.venice.ai/api/v1/audio/queue \
-H "Authorization: Bearer $VENICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "elevenlabs-music",
"prompt": "Uplifting indie-folk acoustic track, 120 BPM, major key.",
"duration_seconds": 60,
"force_instrumental": true
}'Song with lyrics (minimax-music-v25 supports lyrics, the optimizer and instrumental mode, but no duration_seconds):
{
"model": "minimax-music-v25",
"prompt": "Warm indie-pop ballad, female vocals, acoustic guitar.",
"lyrics_prompt": "[Verse]\nWalking through the city lights...\n[Chorus]\nWe are the dreamers..."
}Response: { "model": "...", "queue_id": "...", "status": "QUEUED" }.
The body is strict: every optional field below is rejected with 400 when the model's model_spec says it isn't supported.
| Field | Notes |
|---|---|
model | Required. |
prompt | Required. Between min_prompt_length (default 10) and prompt_character_limit; trimmed. For the voice models this is the text to speak. |
lyrics_prompt | Up to lyrics_character_limit (default 4096). Required when lyrics_required=true; rejected when supports_lyrics=false. |
duration_seconds | Integer or numeric string. Must be one of duration_options when present, else within min_duration–max_duration. Defaults to default_duration. |
force_instrumental | supports_force_instrumental=true only. |
lyrics_optimizer | Auto-writes lyrics from prompt. supports_lyrics_optimizer=true only; lyrics_prompt must then be empty. |
loop | Render a seamless loop (end splices into start). supports_loop=true only — currently elevenlabs-sound-effects-v2. |
voice | Voice-enabled models only. One of voices; defaults to default_voice. Models with supports_custom_voice_id=true (the ElevenLabs TTS models) also accept a raw ElevenLabs Voice ID. |
language_code | ISO 639-1. supports_language_code=true only — no model in the current list sets it. |
speed | supports_speed=true only, within min_speed–max_speed. |
Model-specific rules also apply: minimax-music-v25 needs a lyrics_prompt of at least 10 chars unless force_instrumental or lyrics_optimizer is true; minimax-music-v26 needs the same unless force_instrumental is true; minimax-music-v2 needs a non-blank lyrics_prompt.
POST /audio/retrieve — poll / downloadcurl https://api.venice.ai/api/v1/audio/retrieve \
-H "Authorization: Bearer $VENICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"elevenlabs-music","queue_id":"..."}' \
--output track.mp3200 JSON {"status":"PROCESSING","average_execution_time":<ms, P80 estimate>,"execution_duration":<ms since queued>}.200 with the audio bytes. Content-Type is the audio type; headers x-venice-audio-format, x-venice-inference-time (s), x-venice-model-id, x-venice-model-name, and for Seed Audio also x-venice-audio-duration and x-venice-audio-subtitle.delete_media_on_completion: true deletes the media after this download, so you can skip step 4.If generation fails (content policy, capacity, provider validation), the charge is refunded (except a DIEM charge from a previous epoch) and the error is returned here.
POST /audio/complete — cleanupcurl https://api.venice.ai/api/v1/audio/complete \
-H "Authorization: Bearer $VENICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"elevenlabs-music","queue_id":"..."}'Returns {"success": true} once the stored media is deleted (false if the delete didn't go through). Use it after you've saved the bytes, unless you retrieved with delete_media_on_completion: true.
import fs from 'node:fs/promises'
const base = 'https://api.venice.ai/api/v1'
const headers = {
Authorization: `Bearer ${process.env.VENICE_API_KEY}`,
'Content-Type': 'application/json',
}
async function generateTrack() {
// 1. Quote
const quote = await fetch(`${base}/audio/quote`, {
method: 'POST', headers,
body: JSON.stringify({ model: 'elevenlabs-music', duration_seconds: 60 }),
}).then(r => r.json())
console.log('price:', quote.quote)
// 2. Queue
const { queue_id, model } = await fetch(`${base}/audio/queue`, {
method: 'POST', headers,
body: JSON.stringify({
model: 'elevenlabs-music',
prompt: 'Uplifting indie-folk acoustic track, 120 BPM.',
duration_seconds: 60,
force_instrumental: true,
}),
}).then(r => r.json())
// 3. Poll
while (true) {
const res = await fetch(`${base}/audio/retrieve`, {
method: 'POST', headers,
body: JSON.stringify({ model, queue_id, delete_media_on_completion: true }),
})
if (!res.ok) throw new Error(`retrieve failed: ${res.status} ${await res.text()}`)
const ct = res.headers.get('content-type') ?? ''
if (!ct.startsWith('application/json')) {
await fs.writeFile('track.mp3', Buffer.from(await res.arrayBuffer()))
break
}
const { status } = await res.json()
if (status !== 'PROCESSING') throw new Error(`unexpected ${status}`)
await new Promise(r => setTimeout(r, 3000))
}
// delete_media_on_completion: true made /audio/complete unnecessary
}Each GET /models?type=music entry's model_spec exposes:
supports_lyrics, lyrics_required, lyrics_character_limit, supports_lyrics_optimizersupports_force_instrumental, supports_loop, supports_language_codesupports_speed, default_speed, min_speed, max_speedvoices[], default_voice, supports_custom_voice_idduration_options[], min_duration, max_duration, default_durationmin_prompt_length, prompt_character_limitsupported_formats, default_format (the output container — informational, not a request field)voice_changer: true marks speech-to-speech models that belong on /audio/voice-changer/*pricing, one of:durations — { "<tier>": { usd, diem, min_seconds, max_seconds } } (e.g. elevenlabs-music, ace-step-15)generation — flat per job (e.g. minimax-music-v25, lyria-3-pro, stable-audio-25)per_second — per generated second (e.g. elevenlabs-sound-effects-v2, sonilo-v1-1-music, seed-audio-1-0)per_thousand_characters — by prompt length (the ElevenLabs TTS models)| Code | Meaning |
|---|---|
400 | Schema error (strict body), unsupported option for the model, bad duration_seconds, lyrics_optimizer + lyrics_prompt, voice-changer model on these endpoints, a provider-side validation failure reported on retrieve (refunded), or an unknown / foreign queue_id on retrieve/complete ("Request ID is invalid."). Voice errors include details.supported_voices. |
401 | Authentication failed. |
402 | Insufficient balance. Bearer → {"error":"Insufficient USD or Diem balance…"}, or `"API key USD |
403 | A PRIVATE_ONLY key calling an anonymized model, or region restriction. |
404 | Unknown model; or on retrieve, media not found / expired / already deleted. |
422 | Content policy violation (queue or retrieve). May include suggested_prompt. Charge refunded (except a DIEM charge from a previous epoch). |
429 | Rate limited (40/min queue, 120/min retrieve, per user). |
500 | Inference failure. |
503 | Model at capacity — retry later. |
See venice-errors for body shapes.
data.balances from GET /api_keys/rate_limits, which works with an INFERENCE key and is already capped at the key's spend limit; the request is charged to the first currency that covers the whole quote (DIEM, then earned credits, then bundled credits, then USD; balances doesn't list earned credits). With a wallet, use /x402/balance/....lyrics_prompt, voice, speed, language_code, loop, duration_seconds, …) is a 400, not a silent no-op. Build the body from model_spec.queue_id and model — every later call needs both.complete (or delete_media_on_completion) the audio is gone.seed-audio-1-0 takes no duration_seconds: it reserves its 120 s output cap at queue time and settles on the actual length when done.average_execution_time to pick the first delay. Faster polling doesn't speed the job up and eats the 120/min retrieve limit.© veniceai, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/venice-audio-music of veniceai/skills.
Open the folder on GitHubat commit 5eaeac5
Venice Audio Music 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 |
|---|---|---|---|---|---|---|
| Venice Audio Music this skillveniceai/skills | 144 | — | ~3.1k | Automated safety check: Pass | MIT | |
| Audio Jinglesanqiufong/slides-from-anything | 132 | 1 repos | ~1.1k | Automated safety check: Pass | Apache-2.0 | |
| Musictadaspetra/loop | 296 | 2 repos | ~827 | Automated safety check: Pass | MIT | |
| ElevenLabs Voiceover Generatordigitalsamba/claude-code-video-toolkit | 2.2k | 1 repos | ~2.7k | Automated safety check: Notes | MIT | |
| Sound Effectstadaspetra/loop | 296 | 2 repos | ~1.1k | Automated safety check: Pass | MIT | |
| Hyperframes Mediachmonitor/chmonitor | 301 | 1 repos | ~2.8k | Automated safety check: Notes | GPL-3.0 |
sanqiufong/slides-from-anything
Audio generation skill — jingles, beds, voiceover, and sound effects.
tadaspetra/loop
Generate music using ElevenLabs Music API. An agent skill from tadaspetra/loop.
digitalsamba/claude-code-video-toolkit
Generates narration, sound effects and cloned voices through the ElevenLabs API, with model and setting choices tuned to the content's style.
tadaspetra/loop
Generate sound effects from text descriptions using ElevenLabs.
chmonitor/chmonitor
Audio and media assets for HyperFrames compositions, produced by one shared audio engine (scripts/audio.mjs) — multi-provider TTS (HeyGen / ElevenLabs / Kokoro local), background music + sound…
BlockRunAI/blockrun-mcp
Pay-per-call access to AI models, real-time data, media generation and multi-chain RPC over x402 micropayments (USDC on Base or Solana), or a BlockRun account API key.
veniceai/skills
Picks which Venice text model to call for a prompt based on privacy tier, input modality, capabilities and cost, and decides when to escalate from a local agent.
veniceai/skills
Documents Venice's model discovery endpoints, GET /models, /models/traits and /models/compatibility_mapping, so an agent can pick a model by capability, constraint or price.
veniceai/skills
Manages Venice API keys through the /api_keys endpoints: create, list, update and revoke keys, set spending limits, and read rate limits.
veniceai/skills
High-level map of the Venice.ai API: base URL, auth modes per endpoint, endpoint categories, response headers, pricing model, error shape and versioning.
veniceai/skills
Generate speech from text via POST /audio/speech, and clone a voice via POST /audio/voices.
veniceai/skills
Transcribe audio files to text via POST /audio/transcriptions.
Works with
Categories
Async music, sound-effect and long-form voice generation via Venice. Venice Audio Music is an agent skill from veniceai/skills. Async music, sound-effect and long-form voice generation via Venice.
Venice Audio Music fits situations like: tasks that involve Text to speech and voice; tasks that involve Music and audio generation.
Run `npx skills add veniceai/skills --skill venice-audio-music -a claude-code`. Or copy the skill folder (skills/venice-audio-music in veniceai/skills) into .claude/skills/venice-audio-music in your project. Claude Code loads it when a task matches its description.
Run `npx skills add veniceai/skills --skill venice-audio-music -a codex`. Or copy the skill folder (skills/venice-audio-music in veniceai/skills) into .agents/skills/venice-audio-music 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 veniceai/skills --skill venice-audio-music -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/venice-audio-music, .gemini/skills/venice-audio-music, .github/skills/venice-audio-music and .opencode/skills/venice-audio-music in your project.
Going by SKILL.md and its folder, Venice Audio Music needs the command-line tools its instructions call (curl) and credentials named VENICE_API_KEY. Our summary lists: A credential in VENICE_API_KEY.
SKILL.md names 1 domain. In commands or code: api.venice.ai; the agent is likely to contact it when it follows the instructions. 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. Review the folder before installing.
Venice Audio Music is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.1k tokens (SKILL.md is roughly 12k 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 Venice Audio Music: Audio Jingle (sanqiufong/slides-from-anything, 132 stars), Music (tadaspetra/loop, 296 stars), ElevenLabs Voiceover Generator (digitalsamba/claude-code-video-toolkit, 2.2k stars) and Sound Effects (tadaspetra/loop, 296 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
veniceai (a GitHub organization) maintains it in veniceai/skills, which has 144 GitHub stars. The repository holds 22 skills in this directory. The repository was last updated on October 5, 2026.
Source: veniceai/skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.