Technical Writing
frappe/skills
Write prose in "Simplified Technical English". An agent skill from frappe/skills.
Land a change everywhere the same fact is stated — enumerating the full surface inventory (landing copy, docs, machine-readable summaries, changelog badges repeated across every page, sitemap…
$ npx skills add kajisho5/ffmpeg-skill --skill shipping-across-surfaces -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install kajisho5/ffmpeg-skill shipping-across-surfaces --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/kajisho5/ffmpeg-skill.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/cross-surface-changes .claude/skills/shipping-across-surfaces && 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 "shipping-across-surfaces" agent skill from https://github.com/kajisho5/ffmpeg-skill/tree/main/.claude/skills/cross-surface-changes into .claude/skills/shipping-across-surfaces/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "shipping-across-surfaces", 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/kajisho5/ffmpeg-skill/tree/main/.claude/skills/cross-surface-changesType 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 kajisho5/ffmpeg-skill --skill shipping-across-surfaces -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install kajisho5/ffmpeg-skill shipping-across-surfaces --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kajisho5/ffmpeg-skill.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/cross-surface-changes .agents/skills/shipping-across-surfaces && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "shipping-across-surfaces" agent skill from https://github.com/kajisho5/ffmpeg-skill/tree/main/.claude/skills/cross-surface-changes into .agents/skills/shipping-across-surfaces/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "shipping-across-surfaces", 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 kajisho5/ffmpeg-skill --skill shipping-across-surfaces -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install kajisho5/ffmpeg-skill shipping-across-surfaces --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kajisho5/ffmpeg-skill.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/cross-surface-changes .cursor/skills/shipping-across-surfaces && 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 "shipping-across-surfaces" agent skill from https://github.com/kajisho5/ffmpeg-skill/tree/main/.claude/skills/cross-surface-changes into .cursor/skills/shipping-across-surfaces/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "shipping-across-surfaces", 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/kajisho5/ffmpeg-skill.git --path .claude/skills/cross-surface-changes--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 kajisho5/ffmpeg-skill --skill shipping-across-surfaces -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install kajisho5/ffmpeg-skill shipping-across-surfaces --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kajisho5/ffmpeg-skill.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/cross-surface-changes .gemini/skills/shipping-across-surfaces && 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 "shipping-across-surfaces" agent skill from https://github.com/kajisho5/ffmpeg-skill/tree/main/.claude/skills/cross-surface-changes into .gemini/skills/shipping-across-surfaces/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "shipping-across-surfaces", 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 kajisho5/ffmpeg-skill shipping-across-surfacesInstalls 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 kajisho5/ffmpeg-skill --skill shipping-across-surfaces -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/kajisho5/ffmpeg-skill.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/cross-surface-changes .github/skills/shipping-across-surfaces && 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 "shipping-across-surfaces" agent skill from https://github.com/kajisho5/ffmpeg-skill/tree/main/.claude/skills/cross-surface-changes into .github/skills/shipping-across-surfaces/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "shipping-across-surfaces", 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 kajisho5/ffmpeg-skill --skill shipping-across-surfaces -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install kajisho5/ffmpeg-skill shipping-across-surfaces --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kajisho5/ffmpeg-skill.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/cross-surface-changes .opencode/skills/shipping-across-surfaces && 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 "shipping-across-surfaces" agent skill from https://github.com/kajisho5/ffmpeg-skill/tree/main/.claude/skills/cross-surface-changes into .opencode/skills/shipping-across-surfaces/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "shipping-across-surfaces", 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.
shipping-across-surfacesLand a change everywhere the same fact is stated — enumerating the full surface inventory (landing copy, docs, machine-readable summaries, changelog badges repeated across every page, sitemap…
Shipping Across Surfaces is an agent skill from kajisho5/ffmpeg-skill. Land a change everywhere the same fact is stated — enumerating the full surface inventory (landing copy, docs, machine-readable summaries, changelog badges repeated across every page, sitemap, README, descriptions embedded in code, and untyped frontend consumers of typed responses), generating a surface instead of restating it, drift tests where you cannot generate, never hand-maintaining a copy of a surface another codebase owns, shipping a paired PR when you change a format a different codebase decodes, and…
Its SKILL.md is about 3k 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 Development, covering Copywriting, Changelog and release notes and Technical documentation. The licence is MIT.
Read from SKILL.md and the folder at commit 1f7e7e3. 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:
rgFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
github.comFrom 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.
Shipping Across Surfaces loads about 3k tokens when it runs. Until then it costs about 216 tokens; SKILL.md has 1,371 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 kajisho5/ffmpeg-skill at commit 1f7e7e3, republished under its MIT licence (© kajisho5). 1,371 words, ~2,966 tokens.
.claude/skills/shipping-across-surfaces/SKILL.md (or your agent's skills folder).Most product facts are stated more than once. The feature exists in code, is described on a landing page, summarized for agents, listed in a changelog, repeated in a nav badge, restated in a README, and embedded again in the description string of every tool or endpoint that exposes it. Each copy drifts independently, and none of them are covered by tests.
The failure is never loud. Nothing goes red; the product simply describes itself inaccurately in the four places you didn't edit, and the one place a reader happened to look is the stale one.
"I'll remember the other places" does not survive the second feature. Write the
list down — in CONTRIBUTING.md, a PR template, or the skill/guide the project
already keeps — and treat it as the definition of done for a user-facing change.
A realistic inventory for a product with a public site:
<meta> / OG / Twitter tags, and the structured data (SoftwareApplication
description, FAQPage entries) — search engines read the copy you forgotllms.txt)That last bullet is the one that gets missed. A rename lands in the tool it was named after and stays wrong in the three sibling tools that mention it in passing. Grep for the old string across the whole tree, not just the docs directory, before calling the change done.
All of these ship in the same PR. A follow-up "update docs" commit means the interval between them shipped a product that contradicted itself.
The surfaces above are drudgery precisely because they're copies. Delete the copy where you can:
Where generation isn't practical, make drift fail a test rather than a review.
def test_readme_documents_every_registered_tool():
registered = {t.name for t in get_registered_tools()}
documented = parse_tool_names(README.read_text())
assert documented == registered # fails on add, remove, and renameCompare against the live registry, not a second hand-written list — a test that
compares two hand-maintained lists only proves you updated both copies of the
same mistake. The same rule covers duplicated dependency metadata and committed
build outputs; see build-artifacts (also in this repo's .claude/skills/).
A typed backend and an untyped frontend can disagree without either side
failing. Renaming a Pydantic field updates serialization and keeps every Python
test green, while a Jinja template's inline JavaScript still reads the old name
inside a template literal. The browser then renders undefined: valid
JavaScript, no exception, no backend failure.
Treat every serialized field rename as a producer-and-consumer change:
# Search the whole tree, not just Python call sites. Templates and committed
# JavaScript bundles are consumers too.
rg 'old_field|new_field' .Then pin the boundary with a test that uses the real serialized response and the real consumer. A browser test is ideal when available. A cheaper contract test can still make the hidden dependency explicit:
def test_dashboard_consumes_the_audit_response_contract():
payload = AuditResponse.example().model_dump()
template = Path("templates/dashboard.html").read_text()
for field in ("summary", "recommendations"):
assert field in payload
assert f"result.{field}" in templateThis test is deliberately narrow: it does not claim to execute JavaScript. It
makes a field rename fail in the same change that alters the response model,
instead of relying on someone to notice undefined in a rendered page. Prefer
generating a typed client or shared schema when the frontend architecture allows
it; otherwise keep this boundary test beside the producer's contract tests.
The tempting shortcut when validating against another system — another service's tool names, another team's enum, a partner API's status codes — is to paste the current values into a constant and check against it.
# Anti-pattern: a private snapshot of someone else's public surface.
KNOWN_TOOLS = {"search", "create", "archive"} # correct until they shipIt is stale the moment the owner ships, and the staleness surfaces as your validator rejecting valid input. Worse, nothing in your repo can detect it: you have no reference to compare against.
Truth flows outward from whoever owns it. The owning codebase publishes a
generated, versioned artifact — a committed tools.json carrying the source
version and commit — and the consumer reads that file. Ask "who owns this fact,
and which direction is it moving?" before writing the check. A design where your
repo reaches into theirs to scrape the truth is the wrong direction and will
break on access, auth, or refactor; a design where they publish and you consume
is stable.
Checks that need no external truth are fine to land standalone: a denylist of known-bad legacy patterns, a structural schema check, a "this field is required" assertion. Those describe your own expectations, not their surface.
When one codebase encodes and a different one decodes — a share-link payload, an export file, a cache key, a webhook body — the format is a contract between two repos, and half a contract is an outage.
If the counterpart repo is private and this one is public, refer to it by what it does — "the site that serves the share links" — never by slug, path, or URL. Naming the public product a piece of content is about is expected; leaking the name of a private repository is not. That distinction is worth a CI check in any public repo that has a private counterpart.
Products accumulate words that name two different things. One system may have a per-feed, unsigned POST configured on a resource and an account-wide, signed, retried event stream with a delivery log — and call both a "webhook." Once copy uses the bare word, every sentence about either becomes ambiguous and support questions stop being answerable.
Write the two definitions down with a canonical label for each, put them somewhere new copy is written against, and never let the bare overloaded word stand alone in user-facing text. This applies to nav labels and tool descriptions as much as to prose — the label is the surface most people read.
Copy that asserts things about behavior ("processes N per second", "caps withdrawals per settlement") drifts from the code faster than any other surface, because nothing recompiles when it becomes false.
Keep a claim ledger with stable identifiers, cite the identifier inline from the copy, and record provenance in the ledger rather than repeating it in the prose. Two rules make it survive:
A repo-level check that every factual sentence carries a citation turns this from a habit into a gate.
Before calling a user-facing change done:
- [ ] Surface inventory exists in the repo and was walked, not recalled
- [ ] Old strings grepped for across the whole tree, including code descriptions
- [ ] Serialized field renames grepped through templates and frontend code
- [ ] Untyped response consumers covered by a boundary contract test
- [ ] Every sibling tool/endpoint description mentioning the feature updated
- [ ] Changelog entry added and the repeated version badge bumped everywhere
- [ ] All surfaces in ONE PR, not a docs follow-up
Reducing the surface count:
- [ ] Anything renderable from a live schema/registry is generated, not typed
- [ ] Repeated fragments live in a template/partial, not N files
- [ ] Unavoidable duplication has a drift test against the live source
Across repo boundaries:
- [ ] No hand-maintained snapshot of a surface another codebase owns
- [ ] Truth flows outward from the owner as a versioned, generated artifact
- [ ] Format changes ship a paired consumer PR; payload is versioned
- [ ] Decoder deploys before encoder when cadences differ
- [ ] Public content names no private repo slug, path, or URL
Wording:
- [ ] Overloaded product terms have written definitions and canonical labels
- [ ] Factual claims cite a stable ledger identifier; identifiers are append-onlyThe "22 tools" count (and the per-category tool tables) in README.md and
SKILL.md is exactly this kind of restated surface — it drifted to "21" more
than once this session when a tool was added and only the code was updated.
tests/test_contract.py's test_mcp_tools_match_contract and
test_mcp_schema_drift_follows_the_scripts are the "generated surface" /
"drift test" answer for the MCP tool list specifically (MCP's tools/list is
derived from the contract, never hand-written) — the same rigor doesn't yet
exist for the README/SKILL.md tool-count prose, which is still grepped and
hand-edited. docs/contract.md's capability_map/provides sections are the
other real example: they explicitly promise "says nothing tools[] doesn't
already say," i.e. they are declared to be a re-index, not a second source of
truth — exactly the "truth flows outward from whoever owns it" principle.
Source: wdm0006/python-skills (MIT).
© kajisho5, 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 .claude/skills/cross-surface-changes of kajisho5/ffmpeg-skill.
Open the folder on GitHubat commit 1f7e7e3
Shipping Across Surfaces 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 |
|---|---|---|---|---|---|---|
| Shipping Across Surfaces this skillkajisho5/ffmpeg-skill | 1.9k | — | ~3k | Automated safety check: Pass | MIT | |
| Technical Writingfrappe/skills | 147 | — | ~1.1k | Automated safety check: Pass | None | |
| Technical Writercuriositech/some_claude_skills | 244 | — | ~1.4k | Automated safety check: Pass | MIT | |
| Simple Englishmoeru-ai/airi | 50k | 2 repos | ~4.6k | Automated safety check: Pass | MIT | |
| Ccb GitHubSeemSeam/claude_codex_bridge | 3.6k | — | ~4.9k | Automated safety check: Pass | Custom licence | |
| Golang Documentationunxed/f4 | 244 | 3 repos | ~3.5k | Automated safety check: Pass | MIT |
frappe/skills
Write prose in "Simplified Technical English". An agent skill from frappe/skills.
curiositech/some_claude_skills
Expert technical documentation specialist for developer docs, API references, and runbooks.
moeru-ai/airi
Write or rewrite technical text with the rules of ASD-STE100 Simplified Technical English so it is clear, unambiguous, and free of AI slop.
SeemSeam/claude_codex_bridge
Maintain this CCB project's GitHub-facing release and npm publication surface.
unxed/f4
Comprehensive documentation guide for Golang projects, covering godoc comments, README, CONTRIBUTING, CHANGELOG, Go Playground, Example tests, API docs, and llms.txt.
ropensci/ckanr
Write or rewrite text in plain, layman-readable English in the spirit of ASD-STE100 Simplified Technical English: short sentences, active voice, simple tenses, one word one meaning, condition before…
kajisho5/ffmpeg-skill
Edit video and audio with local FFmpeg from natural-language requests: cut, trim, join, resize/reframe (9:16, 1:1), speed change, captions and subtitles (SRT/ASS, animated, karaoke), logos and text…
kajisho5/ffmpeg-skill
Generate GitHub Actions CI/CD pipeline configurations for automated building and testing of library and package projects.
kajisho5/ffmpeg-skill
Review a change to the ffmpeg-skill repository for the failures its own contract makes possible — a claim in a result document that is true at one layer and false at the layer a caller reads, a new…
kajisho5/ffmpeg-skill
Builds robust Python MCP (Model Context Protocol) servers with FastMCP — tool design, error contracts, event-loop-safe blocking work, subprocess/CLI wrapping, single-file vs packaged distribution…
kajisho5/ffmpeg-skill
Resolve conflicts and merges when several branches are open against one repo at the same time — the hotspot files every change must touch (registry manifests, a single version field, shared tool…
kajisho5/ffmpeg-skill
Add and review preconditions on operations that delete, overwrite, rewrite history, or resolve a caller-supplied name to a filesystem path — refusing instead of warning, placing the guard ahead of…
Categories
Land a change everywhere the same fact is stated — enumerating the full surface inventory (landing copy, docs, machine-readable summaries, changelog badges repeated across every page, sitemap…. Shipping Across Surfaces is an agent skill from kajisho5/ffmpeg-skill.
Shipping Across Surfaces fits situations like: renaming a user-facing feature; editing product/marketing copy; renaming a serialized response field; changing a serialization.
Run `npx skills add kajisho5/ffmpeg-skill --skill shipping-across-surfaces -a claude-code`. Or copy the skill folder (.claude/skills/cross-surface-changes in kajisho5/ffmpeg-skill) into .claude/skills/shipping-across-surfaces in your project. Claude Code loads it when a task matches its description.
Run `npx skills add kajisho5/ffmpeg-skill --skill shipping-across-surfaces -a codex`. Or copy the skill folder (.claude/skills/cross-surface-changes in kajisho5/ffmpeg-skill) into .agents/skills/shipping-across-surfaces 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 kajisho5/ffmpeg-skill --skill shipping-across-surfaces -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/shipping-across-surfaces, .gemini/skills/shipping-across-surfaces, .github/skills/shipping-across-surfaces and .opencode/skills/shipping-across-surfaces in your project.
Going by SKILL.md and its folder, Shipping Across Surfaces needs the command-line tools its instructions call (rg). Our summary lists: Python 3.
SKILL.md names 1 domain. As links in the text: github.com. 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.
Shipping Across Surfaces is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3k 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 Shipping Across Surfaces: Technical Writing (frappe/skills, 147 stars), Technical Writer (curiositech/some_claude_skills, 244 stars), Simple English (moeru-ai/airi, 50k stars) and Ccb GitHub (SeemSeam/claude_codex_bridge, 3.6k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
kajisho5 (a GitHub user) maintains it in kajisho5/ffmpeg-skill, which has 1,909 GitHub stars. The repository holds 14 skills in this directory. The repository was last updated on October 10, 2026.
Source: kajisho5/ffmpeg-skill on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.