RuView CLI, API and WASM
ruvnet/RuView
Covers the RuView `wifi-densepose` command line binary, its Axum REST API and the WebAssembly builds for browsers and ESP32, for embedding or scripting RuView.
Add a new edition of an existing woogles lexicon (e.g. An agent skill from woogles-io/liwords.
$ npx skills add woogles-io/liwords --skill update-lexicon -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install woogles-io/liwords update-lexicon --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/woogles-io/liwords.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/update-lexicon .claude/skills/update-lexicon && 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 "update-lexicon" agent skill from https://github.com/woogles-io/liwords/tree/master/.claude/skills/update-lexicon into .claude/skills/update-lexicon/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "update-lexicon", 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/woogles-io/liwords/tree/master/.claude/skills/update-lexiconType 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 woogles-io/liwords --skill update-lexicon -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install woogles-io/liwords update-lexicon --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/woogles-io/liwords.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/update-lexicon .agents/skills/update-lexicon && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "update-lexicon" agent skill from https://github.com/woogles-io/liwords/tree/master/.claude/skills/update-lexicon into .agents/skills/update-lexicon/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "update-lexicon", 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 woogles-io/liwords --skill update-lexicon -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install woogles-io/liwords update-lexicon --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/woogles-io/liwords.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/update-lexicon .cursor/skills/update-lexicon && 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 "update-lexicon" agent skill from https://github.com/woogles-io/liwords/tree/master/.claude/skills/update-lexicon into .cursor/skills/update-lexicon/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "update-lexicon", 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/woogles-io/liwords.git --path .claude/skills/update-lexicon--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 woogles-io/liwords --skill update-lexicon -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install woogles-io/liwords update-lexicon --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/woogles-io/liwords.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/update-lexicon .gemini/skills/update-lexicon && 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 "update-lexicon" agent skill from https://github.com/woogles-io/liwords/tree/master/.claude/skills/update-lexicon into .gemini/skills/update-lexicon/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "update-lexicon", 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 woogles-io/liwords update-lexiconInstalls 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 woogles-io/liwords --skill update-lexicon -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/woogles-io/liwords.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/update-lexicon .github/skills/update-lexicon && 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 "update-lexicon" agent skill from https://github.com/woogles-io/liwords/tree/master/.claude/skills/update-lexicon into .github/skills/update-lexicon/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "update-lexicon", 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 woogles-io/liwords --skill update-lexicon -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install woogles-io/liwords update-lexicon --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/woogles-io/liwords.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/update-lexicon .opencode/skills/update-lexicon && 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 "update-lexicon" agent skill from https://github.com/woogles-io/liwords/tree/master/.claude/skills/update-lexicon into .opencode/skills/update-lexicon/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "update-lexicon", 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.
update-lexiconAdd a new edition of an existing woogles lexicon (e.g. An agent skill from woogles-io/liwords.
Update Lexicon is an agent skill from woogles-io/liwords. Add a new edition of an existing woogles lexicon (e.g. NSF25 - NSF26, CSW21 - CSW24) from a raw word list. It builds and verifies the .kwg/.kad with kwgc, reuses or accepts a .klv2, wires the lexicon into liwords, retires the old edition, opens the PR and walks through the production rollout. Use when the user says a new dictionary, word list or lexicon version is out, or asks to update, add or obsolete a lexicon.
Its SKILL.md is about 3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 6 other files, including scripts (for example `reference/new-alphabet.md`, `reference/prod-sql.md` and `scripts/build_lexicon.py`).
It works with WebAssembly. The repository describes itself as: A site that allows people to play a crossword board game against each other. The licence is AGPL-3.0.
10 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 1a69ec9. 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 2 files in scripts/ (Python and Shell), which the agent can run.
Shell commands in SKILL.md call:
gitgonpxmakepython3npmsshFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, npx, npm and ssh, 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.
Update Lexicon loads about 3k tokens when it runs. Until then it costs about 109 tokens; SKILL.md has 1,591 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 woogles-io/liwords at commit 1a69ec9, republished under its AGPL-3.0 licence (© woogles-io). 1,591 words, ~3,004 tokens.
.claude/skills/update-lexicon/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.This covers a new edition of a lexicon whose alphabet woogles already supports. A brand-new alphabet or letter distribution (for example Slovene in PR #1952 and #1955) is a different, multi-repo job. See reference/new-alphabet.md and stop to plan it with the user before touching anything.
Work carefully. The repo usually has unrelated untracked files, and the old edition's files are still needed by existing games. Several steps affect production and must never be done without explicit approval.
Throughout, OLD is the edition being replaced (e.g. NSF25), NEW is the new one (e.g. NSF26), and WASM=liwords-ui/public/wasm/2024. data/lexica/gaddag is a symlink to WASM, so local dev and CI read the same files.
Work these out before building, and confirm them with the user in one message:
| Input | How to decide |
|---|---|
| Word list path | Given by the user. Look at it first: head, line count, encoding, case, and whether there's a second column (definitions). |
NEW code | <FAMILY><2-digit year>, following the existing ones (ls $WASM). A file named nsf2026.txt becomes NSF26. |
OLD code | The family's current entry in AllowedNewGameLexica (pkg/entity/lexica.go). |
| Alphabet | tilemapping.ProbableLetterDistributionName prefix map in word-golib, e.g. NSF → norwegian. It must exist in pkg/memento/letterdistributions/ and as a kwgc tileset. If either is missing, this isn't a version update. |
Leaves (.klv2) | Reuse OLD.klv2 (copied as NEW.klv2) unless the user supplies new leaves. Same for super-OLD.klv2 if it exists. |
| Length window | min 2 (no 1-tile plays exist). Max 15, or 21 if super-OLD.klv2 exists (that lexicon is also played on the 21x21 SuperCrosswordGame board). |
| Obsolete OLD? | Default yes: OLD leaves new-game lists but stays loadable (see step 3). |
Earlier editions were not always filtered. NSF25.kwg contains 1-letter words and words up to 33 letters, so a big "fewer words" number compared with OLD's raw count is expected and not a problem. The diff below only compares words inside the length window.
cd ~/code/kwgc && make # only if ./kwgc is missing or stale
python3 .claude/skills/update-lexicon/scripts/build_lexicon.py \
--input <wordlist> --name NEW --alphabet <alphabet> \
--prev $WASM/OLD.kwg --max-len <15|21> \
--out <scratchpad>/NEWThe script normalizes the list: NFC, uppercase, first column only, duplicates removed. It stops if any character is outside the alphabet, drops words outside the length window, and builds NEW.kwg and NEW.kad with kwgc. It then reads them back and checks them exactly:
.kad = the set of per-word sorted-tile anagram keysreverse(prefix)?suffix entry for every wordIt also writes report.json, dropped.txt, added.txt and removed.txt (diff against OLD inside the length window). kwgc exits 0 even when it fails, so rely on the script's checks, never on kwgc's exit code.
Show the user a summary and wait for an OK before going on. Include: raw / kept / dropped (short, long, invalid) counts, the 1-letter words dropped, the blank-only word count (words using zero-count tiles such as Q/X/Z/Ä/Ö/Ü in Norwegian are valid and stay in), added and removed counts with examples, and the file sizes next to OLD's. Stop and ask if:
--drop-invalid was neededStart from an up-to-date master on a new branch: git fetch && git checkout -b NEW-lexicon origin/master && git branch --unset-upstream. Without the unset, the branch tracks master. The working tree usually has unrelated untracked files (plans, binaries, test JSON). Never git add -A or git add .. Stage paths explicitly.
Copy into $WASM: NEW.kwg, NEW.kad, NEW.klv2 (from OLD.klv2 or the supplied file), and super-NEW.klv2 if OLD has a super table. Check with md5 that the copies match their sources.
Never delete, rename or overwrite OLD's files. Existing games, annotated games, the analyzer, and macondo's download-on-demand (it fetches from $WASM on GitHub master) all load lexica by name.
Grep for every mention first: git grep -n 'OLD' -- ':!*.kwg' ':!*.kad' ':!*.klv2' ':!*_pb*'. The usual edits (compare with commit ddb1199d for NSF25 and PR #1381 for CSW24):
pkg/entity/lexica.go: in AllowedNewGameLexica, replace OLD with NEW. This list is the only thing stopping new games on OLD.liwords-ui/src/shared/lexica.ts: rename the AllLexica entry's key, code, and matchName if it's versioned. Update shortDescription, and the longDescription copyright year if it has one. Do not touch lexiconCodeToInternalRatingName or InternalRatingNameToProfileRatingName: ratings are keyed by family (NSF* → NSF21), so players keep their rating across editions. pkg/entity/ratings.go transformLexiconName is the same, so leave it alone.liwords-ui/src/shared/lexicon_display.tsx:lexiconOrder: replace OLD with NEW.puzzleLexica: replace OLD if it's there.historicalLexica: add OLD, so annotated games and GCG imports can still use it.liwords-ui/src/wasm/loader.ts: add NEW.kad, NEW.klv2, NEW.kwg (and super-NEW.klv2) in sorted position. Keep OLD's entries. The browser loader needs a klv2 next to every kwg.liwords-ui/src/lobby/seek_form.tsx: the stored-form migration switch should send OLD and every older edition to NEW. Merge them into one case group; don't just add a new case, or older editions stay pointed at OLD.liwords-ui/src/App.tsx puzzleLexicon migration: same, if the family is a puzzle lexicon.liwords-ui/src/utils/hooks/definitions.tsx, and any defaults like pkg/league/season_start.go, liwords-ui/src/leagues/admin.tsx, pkg/broadcasts/obs.go, db/migrations/*broadcasts* defaults, and sought_game_interactions.test.ts.Do not regenerate protos, bump go.mod, or touch letter distributions for a version update.
Add a test in pkg/cwgame/lexicon_test.go next to TestCSW15IsNotALaterEdition / TestNSF26IsNotAnEarlierEdition, using the lexiconHasWord helper there. It asserts that a few words from added.txt are present and a few from removed.txt are absent. Pick 2–3 of each, 2–15 tiles long, using only non-zero-count tiles. Also assert a dropped 1-letter and a >max-len word are absent, and check the reverse against OLD. This catches a wrong or mislabeled file being copied in.
In pkg/entity/lexica_test.go, add OLD to the historical list in TestHistoricalLexicaCannotStartGames.
go build ./pkg/... && source local.env && go test ./pkg/cwgame/ ./pkg/entity/
cd liwords-ui && npx prettier --write <changed files> && npx tsc && npx vitest run src/lobbyIf tsc or vitest complain about missing modules or native bindings, the local node_modules is stale: run npm ci (it doesn't change the lockfile) and retry. Don't blame the lexicon change.
Optional but worth it: start the app, open the browser analyzer or WordSmog in NEW, and check that a word from added.txt is accepted.
Stage only the files you touched, plus the new binaries. Commit, then ask before pushing. PR body:
Order matters, because the API's word service only picks up kwgs that exist when it starts.
Before merging:
scripts/deploy_to_efs.sh NEW OLD. It does a dry run by default: it lists the local md5s, shows OLD's files on the volume, and flags any NEW target that already exists. Show the user that output, then run it with --apply only once they approve. The script never overwrites anything. The volume is mounted at /mnt/efs on woogles-wg (ssh woogles-wg, as ec2-user, which owns the files), with data under /mnt/efs/data:lexica/gaddag/2024/: NEW.kwg, NEW.kad, NEW.klv2, super-NEW.klv2. This is what the API, the bot and the analysis workers read. The 2024 is the KWG path prefix; it's not lexica/gaddag/.strategy/NEW/leaves.klv2 (+ super-leaves.klv2): the legacy leaves folder. Every current lexicon has one, identical to its gaddag klv2.lexica/NEW.wmp: the word map (step 2). Not handled by the script.lexica/words/NEW.txt: optional definitions (WORD\tdefinition, LC_ALL=C sorted). There isn't one for NSF. Not handled by the script.NEW.klv2 on disk, macondo doesn't download it: it silently borrows the family default's leaves from defaultForLexicon in macondo dataloaders/strategy.go (NSF → NSF23), which is an older table.go run ./cmd/make_all_wmps -lexica NEW in macondo and put it on the volume. Norwegian and Polish have 33 letters, so skip it for them.After the deploy:
3. Restart the macondo bot. It also serves WordSmog natively, from NEW.kad; there is no wolges_awsm service any more.
4. Clubs whose default is an old edition: before writing the PR, check whether there are any. Run the read-only query in reference/prod-sql.md with bin/proddb -c "<SELECT>" (it opens an SSH tunnel to the prod DB; SELECT only). If there are none (NSF26 had none), skip this step: no migration, no SQL. If there are some, add a migration to the PR (./gen_migration.sh <name>, which needs docker, or create the two files by hand with a UTC YYYYMMDDHHmm prefix; see 202402150312_default_club_settings_nwl23 for the pattern). Match with an explicit list of editions, never LIKE 'CSW%': that would also catch CSW24X.
5. List, but don't change, leagues (settings->>'lexicon') and unfinished tournaments still on OLD, and ask the user what to do with them. Running events keep their lexicon. Leagues use their settings at the next season start.
6. Smoke test: a rated game against a bot in NEW, playing a word from added.txt; WordSmog; the browser analyzer; a word lookup.
dataloaders/strategy.go defaultForLexicon (the family's fallback leaves), and cmd/make_all_wmps/main.go defaultLexica, which must mirror AllowedNewGameLexica. Suggest a small PR if either still names an older edition.pkg/analysis/service.go): only for a new alphabet.Adding-a-new-lexicon-(2026) in the liwords wiki (a separate git repo, liwords.wiki.git), and this skill.© woogles-io, AGPL-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 4 other files (scripts) in .claude/skills/update-lexicon of woogles-io/liwords.
Open the folder on GitHubat commit 1a69ec9
Update Lexicon 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 |
|---|---|---|---|---|---|---|
| Update Lexicon this skillwoogles-io/liwords | 117 | — | ~3k | Automated safety check: Pass | AGPL-3.0 | |
| RuView CLI, API and WASMruvnet/RuView | 97k | — | ~1.2k | Automated safety check: Notes | MIT | |
| Nginx To Higress Migrationhigress-group/higress | 9.5k | — | ~3.9k | Automated safety check: Pass | Apache-2.0 | |
| Update V86felixrieseberg/windows95 | 24k | — | ~1.7k | Automated safety check: Pass | Custom licence | |
| Dotlottie WebLottieFiles/dotlottie-web | 892 | — | ~3.5k | Automated safety check: Pass | MIT | |
| Adding Internal API RouteTriliumNext/Trilium | 38k | — | ~3.3k | Automated safety check: Pass | AGPL-3.0 |
ruvnet/RuView
Covers the RuView `wifi-densepose` command line binary, its Axum REST API and the WebAssembly builds for browsers and ESP32, for embedding or scripting RuView.
higress-group/higress
Migrate from ingress-nginx to Higress in Kubernetes environments.
felixrieseberg/windows95
Build and install v86 (wasm + libv86.js + BIOS) into windows95.
LottieFiles/dotlottie-web
Implement Lottie animations using dotLottie runtimes (@lottiefiles/dotlottie-web and @lottiefiles/dotlottie-react).
TriliumNext/Trilium
A skill your agent uses when adding, moving, or wiring an internal REST endpoint in Trilium (a new /api/ route) — choosing between a core-shared handler (packages/trilium-core/src/routes/index.ts…
awarexone/Agentic-Bug-Hunter
Recovers a client-side request signature or anti-bot token just far enough to replay blocked requests in bug bounty testing, starting from a captured packet.
Works with
Add a new edition of an existing woogles lexicon (e.g. An agent skill from woogles-io/liwords. Update Lexicon is an agent skill from woogles-io/liwords.g.
Update Lexicon fits situations like: the user says a new dictionary; lexicon version is out; obsolete a lexicon.
Run `npx skills add woogles-io/liwords --skill update-lexicon -a claude-code`. Or copy the skill folder (.claude/skills/update-lexicon in woogles-io/liwords) into .claude/skills/update-lexicon in your project. Claude Code loads it when a task matches its description.
Run `npx skills add woogles-io/liwords --skill update-lexicon -a codex`. Or copy the skill folder (.claude/skills/update-lexicon in woogles-io/liwords) into .agents/skills/update-lexicon 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 woogles-io/liwords --skill update-lexicon -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/update-lexicon, .gemini/skills/update-lexicon, .github/skills/update-lexicon and .opencode/skills/update-lexicon in your project.
Going by SKILL.md and its folder, Update Lexicon needs Python and a shell for the scripts in its folder and the command-line tools its instructions call (git, go, npx, make, python3 and npm). Our summary lists: Python 3; Node.js; A Bash shell; Docker.
SKILL.md contains no URLs. Its commands use git, npx, npm and ssh, 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.
Update Lexicon is published under the AGPL-3.0 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 Update Lexicon: RuView CLI, API and WASM (ruvnet/RuView, 97k stars), Nginx To Higress Migration (higress-group/higress, 9.5k stars), Update V86 (felixrieseberg/windows95, 24k stars) and Dotlottie Web (LottieFiles/dotlottie-web, 892 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
woogles-io (a GitHub organization) maintains it in woogles-io/liwords, which has 117 GitHub stars. The repository was last updated on October 11, 2026.
Source: woogles-io/liwords on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.