This skill should be used when editing, translating, or reviewing an Astro-style i18n string corpus (files of the form export default { en: {...}, ru: {...} } under src/i18n/strings), or when the user wants to fill in missing translations, audit coverage, accept/review translations, propagate an edit across duplicate strings, get translation candidates, bulk-edit UI microcopy, or open a visual/keyboard translation editor. Drives the standalone i18n Studio tool at ~/ai_projects/i18n-studio (AST-safe minimal-diff saves via ts-morph, acceptance review state, duplicate propagation, hot-reload, and Claude translation suggestions).
npx skills add https://github.com/glebis/claude-skills --skill i18n-studio
i18n Studio edits Astro-style i18n string files safely: files shaped like
export default { en: {...}, ru: {...} } where leaves are UI strings. It writes
one string literal at a time through a ts-morph AST, so every save is a minimal
one-line diff with all surrounding formatting preserved, and a running dev server
hot-reloads. It also produces Claude translation candidates that preserve HTML
tags and tone.
Use it instead of hand-editing .ts string files with Edit/sed: manual edits
risk formatting churn, broken quoting/escaping, and desynced languages. The AST
layer avoids all three.
Applies to any repo whose translations follow the export default { <lang>: {...} }
convention, not one specific project.
The tool defaults to <cwd>/src/i18n/strings. Confirm the real location before
starting (it may differ):
ls src/i18n/strings 2>/dev/null || find . -path '*/i18n/strings' -type d -not -path '*/node_modules/*' | head
Use that path as --dir below. Ensure the tool is installed once:
cd ~/ai_projects/i18n-studio && npm install.
Start it in the background, pointed at the target strings dir, and wait until it
is reachable:
node ~/ai_projects/i18n-studio/server.mjs --dir "$PWD/src/i18n/strings" --port 4331 &
until curl -sf http://localhost:4331/api/strings >/dev/null; do sleep 0.5; done
Pass --langs en,ru,de if the corpus has languages beyond the en,ru default,
and --voice "<one-line tone brief>" to steer suggestion style. Stop it with
kill %1 (or the printed PID) when finished.
For a human to edit visually, start the server the same way and share the URL
(http://localhost:4331); do not try to click the web UI programmatically.
scripts/i18n.mjs (dependency-free, Node 18+) wraps the API. Point it at the
server with I18N_URL if the port is not 4331.
S=~/ai_projects/claude-skills/i18n-studio/scripts/i18n.mjs
node "$S" audit --to ru # status breakdown + untranslated/missing
node "$S" audit --to ru --pending # also list translated-but-unaccepted
node "$S" get Hero.ts en h1 # read a value
node "$S" suggest Hero.ts h1 --from en --to ru # 3 candidates (proposals only)
node "$S" set Hero.ts ru h1 "Сначала — результат" # AST-safe write (→ pending)
node "$S" accept Hero.ts ru h1 # mark reviewed/accepted
node "$S" unaccept Hero.ts ru h1 # back to pending
node "$S" ignore Dream.ts ru s2 # mark n/a — "doesn't need translation"
node "$S" unignore Dream.ts ru s2 # back to untranslated/pending
Typical translation-fill loop: audit --to <lang> to see the breakdown and gaps →
for each gap, suggest from the source language → review the candidate (see rules
below) → set the chosen value → accept once it is right.
Acceptance is a durable review state (sidecar .i18n-status.json); editing a
value automatically drops it back to pending. A cell can instead be marked n/a
("doesn't need translation" — a name, a fragment, a shared token): ignore drops
it out of the untranslated/pending gap counts so it stops nagging, and — unlike
accept — works on an empty/untranslated cell. Like acceptance it is value-coupled,
so translating the cell later re-surfaces it. For a human reviewer, the fullscreen
review mode (below) is faster than the CLI.
The raw routes (GET /api/strings, POST /api/save, POST /api/suggest), data
shapes, dot-path rules, config flags, and a no-server library path are documented
in references/api.md. Read it before doing anything beyond the CLI above.
For a human, the browser UI is the fast path. Start the server, share the URL, and
point out:
by file, with sort (file / path / status / duplicates-first) and live counts.
detected and hidden from the queue by default (they rarely need translation).
×N). The n/atoggle marks a string as not needing translation — it works even on empty cells and
removes them from the untranslated queue.
offers *apply to all* — one click updates every entry that held the old value.
review ▸): steps through the filtered set one at a time,fully keyboard driven with a visible legend — ←/→ or j/k move, a accept &
next, p pending, i mark n/a & next, e edit, s suggest, 1/2/3 apply a suggestion, u undo,
Esc close, > focus. Tab lands on the edit field; clicking the file name
filters the list to that file. This is the tool for grinding through thousands.
Shift + .): hides all chrome, leaving only the strings.set, verify the candidate keeps thesame HTML tags and entities as the source (<b>, <span ...>, , ',
—) in the same positions, and does not translate code identifiers or
proper nouns. Suggestions are proposals, not decisions.
with ${...} come back editable: true, interp: true (badged ${…}); translate
the prose but keep every ${...} placeholder exactly. Only non-string leaves
(numbers, identifiers) stay read-only and must be edited in the .ts source.
weeks.2.sessions.1.t.on disk either way.
outward-facing change to the product copy; surface the gap list and confirm scope
with the user before writing many strings.
Guide users through a structured workflow for co-authoring documentation. Use when user wants to write documentation, proposals, technical specs, decision docs, or similar structured content. This workflow helps users efficiently transfer context, refine content through iteration, and verify the doc works for readers. Trigger when user mentions writing docs, creating proposals, drafting specs, or similar documentation tasks.
Automatically creates user-facing changelogs from git commits by analyzing commit history, categorizing changes, and transforming technical commits into clear, customer-friendly release notes. Turns hours of manual changelog writing into minutes of automated generation.
Use when implementing any feature or bugfix, before writing implementation code
Use when you have a spec or requirements for a multi-step task, before touching code
Use when creating new skills, editing existing skills, or verifying skills work before deployment
Use when writing or improving README files. Not all READMEs are the same — provides templates and guidance matched to your audience and project type.
| Remove signs of AI-generated writing from text. Use when editing or reviewing text to make it sound more natural and human-written. Based on Wikipedia's inflated symbolism, promotional language, superficial -ing analyses, vague attributions, em dash overuse, rule of three, AI vocabulary words, negative parallelisms, and excessive conjunctive phrases.
Official Opentrons Protocol API for OT-2 and Flex robots. Use when writing protocols specifically for Opentrons hardware with full access to Protocol API v2 features. Best for production Opentrons protocols, official API compatibility. For multi-vendor automation or broader equipment control use pylabrobot.
Take glebis/i18n-studio from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference npm.
Without those the skill loads but fails at the first command.