knit is a keyboard-first terminal UI for managing npx skills skills.
It keeps the upstream CLI as the source of truth, then adds the part terminals are good at: fast browsing, focused detail views, visible actions, and no command memorization.
npx skills is already good. It is simple, scriptable, and the right tool when you know the exact command to run.
knit exists for the other half of the workflow: browsing installed skills, discovering new ones, checking source metadata, and managing changes without repeatedly typing long commands. A TUI makes that loop faster because the current state stays on screen.
- Browse project and global skills in one place.
- Search installed skills, discovered skills, and sources.
- Inspect focused skill and source detail views with
Escback navigation. - Install, update, uninstall, and prune skills from the TUI.
- Add, update, remove, and inspect skill sources.
- Sync skills from a project or global skills lock file.
- Review session action logs, including command output details.
- Go version matching
go.mod. - Node.js/npm with
npxavailable. - The upstream
skillsCLI runnable asnpx skills ....
curl -fsSL https://github.com/ntk148v/knit/raw/master/scripts/install.sh | bashiex "& { $(Invoke-RestMethod https://github.com/ntk148v/knit/raw/master/scripts/install.ps1) }"The script installs npx skills (first run caches it) then downloads the latest knit binary from GitHub releases to /usr/local/bin (Unix) or ~/.local/bin (Windows).
Override the install directory:
INSTALL_DIR=~/.local/bin curl -fsSL https://github.com/ntk148v/knit/raw/master/scripts/install.sh | bash$InstallDir = "$env:USERPROFILE\bin"; iex "& { $(Invoke-RestMethod https://github.com/ntk148v/knit/raw/master/scripts/install.ps1) }"go install ./cmd/knitOr run without installing:
go run ./cmd/knitknitknit opens with four tabs:
| Tab | Purpose |
|---|---|
| Installed | View and manage installed skills. |
| Discover | Search available skills and install them. |
| Sources | Manage skill sources. |
| Logs | Inspect actions run in this session. |
| Key | Action |
|---|---|
| Tab / Shift+Tab | Switch tabs. |
| 1-4 | Jump to a tab. |
| / | Focus search. |
| j/k or arrows | Move selection. |
| Enter | View selected item or confirm selected action. |
| Esc | Go back, close overlay, or clear search. |
| ? | Show help for the current tab. |
| q / Ctrl+C | Quit. |
| Tab | Keys |
|---|---|
| Installed | u update, d uninstall, c actions. |
| Discover | i install, s add source, c actions. |
| Sources | a add, u update, d remove. |
| Logs | Enter detail, c clear. |
knit uses the upstream skills lock files directly:
| Scope | Lock file |
|---|---|
| Project | ./skills-lock.json |
| Global | ~/.agents/.skill-lock.json |
Sync a lock file into the current project:
knit sync -f skills-lock.jsonSync a lock file globally:
knit sync -f ~/.agents/.skill-lock.json -gUntil upstream skills sync is implemented, knit sync is the boring bridge: it reads the lock file and installs each entry with npx skills add <source> --skill <name> -y.
go test ./...
go run ./cmd/knitProject layout:
cmd/knit— CLI entrypoint.internal/app— Bubble Tea model, views, and key handling.internal/skills—npx skillsadapter, parsers, and lock-file reader.
Keep changes boring: prefer small UI/state updates, no extra dependencies unless the standard library and current Charm stack cannot do it.
The project includes a VHS tape to record a UI demo GIF:
scripts/vhs/record.shRequires vhs from github.com/charmbracelet/vhs.
The recording uses a fake npx binary and isolated home directory fixtures so it's fully deterministic and independent of your local skills configuration.

