LLM-useful CLI tools and agent skills, packaged with Nix.
Installs into both Claude Code
and opencode by default — each skill is symlinked into
every directory listed in programs.ak2k-skills.skillDirs.
Structure and approach is inspired by Mic92/mics-skills.
| Skill | Description |
|---|---|
| atlassian-cli | Query and update Atlassian Jira, Confluence, and Compass via Atlassian's official Remote MCP; bundles 5 official workflow skills under workflows/ |
| claude-sessions | List and search recent Claude Code sessions for resumption |
| gemtts | Generate Gemini text-to-speech audio (voices, style, pace). Binary from paperfoot/gemtts. |
| kagi | Search the web or summarize a URL via Kagi — no API credits used (session-token auth) |
| krisp-cli | Dynamic CLI for Krisp's MCP server — search meetings, action items, transcripts |
msgvault-query |
SQL analytics over a msgvault email/chat archive. Binary + skill from wesm/msgvault. |
pplx-agent-tools |
Query Perplexity via a Pro web session — pplx search, pplx fetch --prompt, pplx snippets. Binary + skill from ak2k/pplx-agent-tools. |
| siplink | Place a phone call via VoIP.ms (binary from elsewhere) |
Bundles are skill sets re-exported from another flake as a single unit. Each bundle contributes many entries to the registry, all sharing one package.
| Bundle | Description | Helper |
|---|---|---|
gws |
Google Workspace CLI from googleworkspace/cli — ~100 skills covering Gmail, Drive, Calendar, Sheets, Docs, Chat, Slides, Forms, Tasks, and more |
inputs.ak2k-skills.lib.bundles.gws |
Add as a flake input and import the home-manager module:
# flake.nix
inputs.ak2k-skills.url = "github:ak2k/ak2k-skills";
inputs.ak2k-skills.inputs.nixpkgs.follows = "nixpkgs-unstable";
home-manager.sharedModules = [
inputs.ak2k-skills.homeManagerModules.default
];# home.nix or darwin.nix
programs.ak2k-skills = {
enable = true;
# Default: every registered skill, including the entire gws bundle.
# Pass an explicit list to install a subset:
# skills =
# [ "claude-sessions" "krisp-cli" "msgvault-query" ]
# ++ inputs.ak2k-skills.lib.bundles.gws;
# Default: [ ".claude/skills" ".opencode/skills" ].
# Override to target only one harness:
# skillDirs = [ ".claude/skills" ];
};The module installs each selected skill's CLI (if one exists) into
home.packages and symlinks the skill definition at ~/<skillDir>/<name>/
for every configured skillDir.
# List every registered skill:
nix eval .#legacyPackages.aarch64-darwin.skill-registry --apply builtins.attrNames
# List skills in the gws bundle:
nix eval .#lib.bundles.gws --json | jq- Create
<name>/with<name>.py,pyproject.toml,default.nix, plus the skill definition underskills/<name>/SKILL.md. - In
<name>/default.nix, add apostInstallthat copies../skills/<name>/.into$out/share/skills/<name>/(copy the shape fromkrisp-cli/default.nix). - Register the package in
flake.nixunderperSystem.packages. - Add a registry entry in
nix/registry.nixpointingsourceat$out/share/skills/<name>andpackageat the new package.
For a docs-only skill (no binary), skip the package and point source at
the source tree directly — see the siplink entry as an example.
Bundles re-use one upstream flake's binary across many skills. To add one:
- Add the upstream flake as an input in
flake.nix. - Re-export its binary in
perSystem.packages.<name>. - Extend
nix/registry.nixto enumerate the upstream'sskills/tree (readDir+filterAttrsbySKILL.mdexistence) and emit one registry entry per directory, each pointing at the same package and taggedbundle = "<name>". - Expose
flake.lib.bundles.<name>for ergonomic consumer composition.