[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-deepgram-tui":3,"mdc--xnyg79-key":29,"related-repo-deepgram-tui":1139,"related-org-deepgram-tui":1227},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":19,"repoUrl":20,"updatedAt":21,"license":22,"forks":23,"topics":24,"repo":25,"sourceUrl":27,"mdContent":28},"tui","operate terminal user interfaces","Use when you need to operate a full-screen terminal application (TUI) via wsh. Examples: \"navigate vim to edit a file\", \"use lazygit to stage and commit changes\", \"interact with htop or k9s\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"deepgram","Deepgram","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fdeepgram.png",[12,16],{"name":13,"slug":14,"type":15},"CLI","cli","tag",{"name":17,"slug":18,"type":15},"Engineering","engineering",5,"https:\u002F\u002Fgithub.com\u002Fdeepgram\u002Fwsh","2026-07-12T08:29:31.064083",null,2,[],{"repoUrl":20,"stars":19,"forks":23,"topics":26,"description":22},[],"https:\u002F\u002Fgithub.com\u002Fdeepgram\u002Fwsh\u002Ftree\u002FHEAD\u002Fskills\u002Ftui","---\nname: tui\ndescription: >\n  Use when you need to operate a full-screen terminal application (TUI)\n  via wsh. Examples: \"navigate vim to edit a file\", \"use lazygit to stage\n  and commit changes\", \"interact with htop or k9s\".\n---\n\n> **IMPORTANT: EXECUTION CONTEXT**\n> This skill describes *what to do* — domain patterns and decision-making.\n> It does NOT describe *how* to call the API.\n>\n> 1. **If you have `wsh_*` tools** (check your toolkit for `wsh_send_input`,\n>    `wsh_get_screen`, etc.): use them directly. Operation names in this\n>    skill generally map to tool names (e.g., \"send input\" → `wsh_send_input`).\n>    When in doubt, list your available `wsh_*` tools.\n> 2. **If you do NOT have `wsh_*` tools**: you are in HTTP\u002Fcurl fallback mode.\n>    **DO NOT GUESS endpoints or CLI subcommands.**\n>    Load the full API reference first: search your workspace for\n>    `skills\u002Fcore\u002F` and read `SKILL.md`. It contains every endpoint\n>    with working curl examples and a bootstrap sequence.\n> 3. **Quick bootstrap**: `curl -sf --unix-socket ${XDG_RUNTIME_DIR:-\u002Ftmp}\u002Fwsh\u002Fdefault.http.sock http:\u002F\u002Flocalhost\u002Fhealth`\n>    — if that fails: `wsh server -L agent-$$ --ephemeral &` and retry.\n\n# wsh:tui — Operating Full-Screen Terminal Applications\n\nSome programs take over the entire terminal — vim, htop, lazygit,\nk9s, midnight commander. They use the terminal's \"alternate screen\nbuffer,\" a fixed grid where the program controls every character\nposition. This is a fundamentally different interaction model from\ncommand-and-response.\n\n## Detecting Alternate Screen Mode\n\nWhen a TUI is active, the screen response includes:\n\n    \"alternate_active\": true\n\nThis tells you you're in grid mode. The screen is no longer a\nlog of output — it's a 2D canvas the program redraws at will.\nScrollback is irrelevant while alternate screen is active;\nthe program owns the entire display.\n\nWhen the TUI exits, `alternate_active` flips back to `false`\nand the normal scrollback view resumes exactly where it left\noff. None of the TUI's screen content leaks into scrollback.\n\n## Reading a 2D Grid\n\nIn a TUI, screen position matters. A line isn't just text —\nit's a row in a spatial layout. Use `styled` format here;\nformatting carries critical information:\n\n- **Bold or highlighted text** often marks the selected item\n- **Color differences** distinguish panes, headers, status bars\n- **Inverse\u002Freverse video** typically indicates cursor position\n  or selection\n- **Dim or faint text** marks inactive elements\n\nRead the full screen and interpret it spatially. The first few\nlines are often a header or menu bar. The last line or two are\noften a status bar or command input. The middle is content.\n\n## Navigation\n\nTUI programs don't use typed commands — they use keystrokes.\nEvery key does something different depending on context. You\nneed to know the program's keybindings.\n\n### Universal Navigation Keys\n\nArrow keys, Page Up\u002FDown, Home\u002FEnd, Tab (cycle panes), Enter\n(confirm\u002Fopen), Escape (cancel\u002Fback).\n\n### Vim-Style Navigation\nMany TUIs adopt vim conventions:\n\n    h, j, k, l      # left, down, up, right\n    g, G             # top, bottom\n    \u002F                # search\n    n, N             # next\u002Fprevious match\n    q                # quit\n\n### Sending Keystrokes\nSend one keystroke at a time. Wait briefly between keystrokes\nto let the TUI redraw — TUIs repaint the screen after each\ninput, and you need the updated screen to know where you are.\n\n    send: j          # move down\n    wait (500ms)\n    read screen      # see what's selected now\n    send: j          # move down again\n    wait (500ms)\n    read screen      # verify position\n\nThis is slower than blasting keys, but reliable. You're\nnavigating blind if you don't read between keystrokes.\n\n## Understanding TUI Layouts\n\nWhen you first enter a TUI, read the full screen and build a\nmental map. Most TUIs follow common layout patterns:\n\n### Typical Structure\n\n    +----------------------------------+\n    | Menu bar \u002F Title bar             |  \u003C- rows 0-1\n    +----------------------------------+\n    |                                  |\n    | Main content area                |  \u003C- middle rows\n    | (list, editor, dashboard)        |\n    |                                  |\n    +----------------------------------+\n    | Status bar \u002F Help \u002F Command line |  \u003C- last 1-2 rows\n    +----------------------------------+\n\n### Finding Your Bearings\n- **Status bar** (usually bottom): shows mode, filename,\n  position, hints. Read this first — it often tells you\n  everything you need to know about current state.\n- **Help hints**: many TUIs show keybinding hints at the\n  bottom or top. Look for text like `q:quit  j\u002Fk:navigate\n  ?:help` or `^X Exit  ^O Save`.\n- **The selected item**: look for inverse video, bold, or\n  color-highlighted text in the content area. That's your\n  cursor position.\n- **Pane borders**: look for `|`, `-`, `+` characters or\n  box-drawing characters. These indicate split panes. Only\n  one pane is active at a time — Tab or Ctrl+W typically\n  switches between them.\n\n### Modals and Dialogs\nTUIs often pop up confirmation dialogs or input fields over\nthe main content. These appear as a differently-styled block\nin the middle of the screen. Look for:\n- A bordered box that wasn't there before\n- Text like \"Are you sure?\" or \"Enter filename\"\n- Highlighted buttons like `[ OK ]  [ Cancel ]`\n\nWhen a modal is active, navigation keys operate on the modal,\nnot the content behind it.\n\n## Common Applications\n\nYou don't need to memorize every TUI's keybindings. But\nknowing the basics for frequently encountered programs helps.\n\n### Text Editors\n**vim\u002Fneovim:** Starts in Normal mode. `i` to insert text,\n`Esc` to return to Normal. `:w` save, `:q` quit, `:wq` both.\nIf lost, press `Esc Esc` then `:q!` to quit without saving.\n\n**nano:** Simpler. Just type to edit. Keybindings shown at\nbottom. `^` means Ctrl. `^X` exits, `^O` saves.\n\n### Git TUIs\n**lazygit:** Pane-based. Tab switches panes (files, branches,\ncommits). `j\u002Fk` navigates, Enter opens, `space` stages, `c`\ncommits, `p` pushes, `q` quits.\n\n### System Monitors\n**htop\u002Ftop:** Shows processes. `j\u002Fk` or arrows to navigate,\n`k` to kill a process, `q` to quit. `F` keys for actions\n(shown at bottom).\n\n### Kubernetes\n**k9s:** Resource browser. `:` opens command mode for\nresource type (`:pods`, `:deployments`). `j\u002Fk` navigates,\n`Enter` drills in, `Esc` goes back, `d` describe, `l` logs.\n\n### General Strategy for Unfamiliar TUIs\n1. Read the screen — look for help hints at top or bottom\n2. Try `?` or `h` — most TUIs open a help screen\n3. Try F1 — some use function keys for help\n4. Read the help, then press `q` or `Esc` to close it\n5. If completely stuck: `q`, `Esc`, `:q`, `Ctrl+C`,\n   `Ctrl+Q` — try these in order to exit\n\n## Exiting a TUI\n\nGetting out is as important as getting in. When you're done\nwith a TUI, you need to return to the normal shell prompt.\n\n### Exit Strategies (in order of preference)\n1. Use the program's quit command (`q`, `:q`, `Ctrl+X`)\n2. Check the status bar for exit hints\n3. Press `Esc` to back out of any modal or sub-mode first\n4. If the program won't quit cleanly, `Ctrl+C`\n5. Last resort: `Ctrl+Z` to suspend, then `kill %1`\n\n### Confirming You're Out\nAfter sending a quit command, wait for idle, then check:\n\n    \"alternate_active\": false\n\nIf this is `false`, you're back in normal mode with your shell\nprompt. If it's still `true`, the TUI is still running —\nyour quit command may not have worked, or the program asked\nfor confirmation before exiting.\n\n## Pitfalls\n\n### Don't type commands into a TUI\nA TUI is not a shell. If you send `ls -la\\n` into vim, you'll\nget those characters inserted into the document. Always know\nwhat mode you're in before sending input.\n\n### Don't blast keystrokes\nTUIs redraw the screen after each input. If you send 10 `j`\nkeystrokes without reading in between, you won't know where\nyou landed. Navigate one step at a time.\n\n### Watch for mode changes\nMany TUIs have multiple modes (vim's Normal\u002FInsert\u002FVisual,\nlazygit's panes). The same key does different things in\ndifferent modes. Read the screen after each action to confirm\nyou're in the mode you expect.\n\n### Alternate screen within alternate screen\nIf you launch a TUI from within a TUI (e.g., vim from within\na file manager), `alternate_active` is still just `true`. You\nneed to track the nesting yourself by remembering what you\nlaunched and how many layers deep you are.\n",{"data":30,"body":31},{"name":4,"description":6},{"type":32,"children":33},"root",[34,186,193,198,205,210,222,227,248,254,267,311,316,322,327,334,339,345,350,359,365,370,379,384,390,395,401,410,416,498,504,509,533,538,544,549,555,621,655,661,710,716,756,762,833,839,928,934,939,945,1019,1025,1030,1039,1059,1065,1071,1084,1090,1103,1109,1114,1120],{"type":35,"tag":36,"props":37,"children":38},"element","blockquote",{},[39,67],{"type":35,"tag":40,"props":41,"children":42},"p",{},[43,50,52,58,60,65],{"type":35,"tag":44,"props":45,"children":46},"strong",{},[47],{"type":48,"value":49},"text","IMPORTANT: EXECUTION CONTEXT",{"type":48,"value":51},"\nThis skill describes ",{"type":35,"tag":53,"props":54,"children":55},"em",{},[56],{"type":48,"value":57},"what to do",{"type":48,"value":59}," — domain patterns and decision-making.\nIt does NOT describe ",{"type":35,"tag":53,"props":61,"children":62},{},[63],{"type":48,"value":64},"how",{"type":48,"value":66}," to call the API.",{"type":35,"tag":68,"props":69,"children":70},"ol",{},[71,121,160],{"type":35,"tag":72,"props":73,"children":74},"li",{},[75,89,91,97,99,105,107,112,114,119],{"type":35,"tag":44,"props":76,"children":77},{},[78,80,87],{"type":48,"value":79},"If you have ",{"type":35,"tag":81,"props":82,"children":84},"code",{"className":83},[],[85],{"type":48,"value":86},"wsh_*",{"type":48,"value":88}," tools",{"type":48,"value":90}," (check your toolkit for ",{"type":35,"tag":81,"props":92,"children":94},{"className":93},[],[95],{"type":48,"value":96},"wsh_send_input",{"type":48,"value":98},",\n",{"type":35,"tag":81,"props":100,"children":102},{"className":101},[],[103],{"type":48,"value":104},"wsh_get_screen",{"type":48,"value":106},", etc.): use them directly. Operation names in this\nskill generally map to tool names (e.g., \"send input\" → ",{"type":35,"tag":81,"props":108,"children":110},{"className":109},[],[111],{"type":48,"value":96},{"type":48,"value":113},").\nWhen in doubt, list your available ",{"type":35,"tag":81,"props":115,"children":117},{"className":116},[],[118],{"type":48,"value":86},{"type":48,"value":120}," tools.",{"type":35,"tag":72,"props":122,"children":123},{},[124,135,137,142,144,150,152,158],{"type":35,"tag":44,"props":125,"children":126},{},[127,129,134],{"type":48,"value":128},"If you do NOT have ",{"type":35,"tag":81,"props":130,"children":132},{"className":131},[],[133],{"type":48,"value":86},{"type":48,"value":88},{"type":48,"value":136},": you are in HTTP\u002Fcurl fallback mode.\n",{"type":35,"tag":44,"props":138,"children":139},{},[140],{"type":48,"value":141},"DO NOT GUESS endpoints or CLI subcommands.",{"type":48,"value":143},"\nLoad the full API reference first: search your workspace for\n",{"type":35,"tag":81,"props":145,"children":147},{"className":146},[],[148],{"type":48,"value":149},"skills\u002Fcore\u002F",{"type":48,"value":151}," and read ",{"type":35,"tag":81,"props":153,"children":155},{"className":154},[],[156],{"type":48,"value":157},"SKILL.md",{"type":48,"value":159},". It contains every endpoint\nwith working curl examples and a bootstrap sequence.",{"type":35,"tag":72,"props":161,"children":162},{},[163,168,170,176,178,184],{"type":35,"tag":44,"props":164,"children":165},{},[166],{"type":48,"value":167},"Quick bootstrap",{"type":48,"value":169},": ",{"type":35,"tag":81,"props":171,"children":173},{"className":172},[],[174],{"type":48,"value":175},"curl -sf --unix-socket ${XDG_RUNTIME_DIR:-\u002Ftmp}\u002Fwsh\u002Fdefault.http.sock http:\u002F\u002Flocalhost\u002Fhealth",{"type":48,"value":177},"\n— if that fails: ",{"type":35,"tag":81,"props":179,"children":181},{"className":180},[],[182],{"type":48,"value":183},"wsh server -L agent-$$ --ephemeral &",{"type":48,"value":185}," and retry.",{"type":35,"tag":187,"props":188,"children":190},"h1",{"id":189},"wshtui-operating-full-screen-terminal-applications",[191],{"type":48,"value":192},"wsh:tui — Operating Full-Screen Terminal Applications",{"type":35,"tag":40,"props":194,"children":195},{},[196],{"type":48,"value":197},"Some programs take over the entire terminal — vim, htop, lazygit,\nk9s, midnight commander. They use the terminal's \"alternate screen\nbuffer,\" a fixed grid where the program controls every character\nposition. This is a fundamentally different interaction model from\ncommand-and-response.",{"type":35,"tag":199,"props":200,"children":202},"h2",{"id":201},"detecting-alternate-screen-mode",[203],{"type":48,"value":204},"Detecting Alternate Screen Mode",{"type":35,"tag":40,"props":206,"children":207},{},[208],{"type":48,"value":209},"When a TUI is active, the screen response includes:",{"type":35,"tag":211,"props":212,"children":216},"pre",{"className":213,"code":215,"language":48},[214],"language-text","\"alternate_active\": true\n",[217],{"type":35,"tag":81,"props":218,"children":220},{"__ignoreMap":219},"",[221],{"type":48,"value":215},{"type":35,"tag":40,"props":223,"children":224},{},[225],{"type":48,"value":226},"This tells you you're in grid mode. The screen is no longer a\nlog of output — it's a 2D canvas the program redraws at will.\nScrollback is irrelevant while alternate screen is active;\nthe program owns the entire display.",{"type":35,"tag":40,"props":228,"children":229},{},[230,232,238,240,246],{"type":48,"value":231},"When the TUI exits, ",{"type":35,"tag":81,"props":233,"children":235},{"className":234},[],[236],{"type":48,"value":237},"alternate_active",{"type":48,"value":239}," flips back to ",{"type":35,"tag":81,"props":241,"children":243},{"className":242},[],[244],{"type":48,"value":245},"false",{"type":48,"value":247},"\nand the normal scrollback view resumes exactly where it left\noff. None of the TUI's screen content leaks into scrollback.",{"type":35,"tag":199,"props":249,"children":251},{"id":250},"reading-a-2d-grid",[252],{"type":48,"value":253},"Reading a 2D Grid",{"type":35,"tag":40,"props":255,"children":256},{},[257,259,265],{"type":48,"value":258},"In a TUI, screen position matters. A line isn't just text —\nit's a row in a spatial layout. Use ",{"type":35,"tag":81,"props":260,"children":262},{"className":261},[],[263],{"type":48,"value":264},"styled",{"type":48,"value":266}," format here;\nformatting carries critical information:",{"type":35,"tag":268,"props":269,"children":270},"ul",{},[271,281,291,301],{"type":35,"tag":72,"props":272,"children":273},{},[274,279],{"type":35,"tag":44,"props":275,"children":276},{},[277],{"type":48,"value":278},"Bold or highlighted text",{"type":48,"value":280}," often marks the selected item",{"type":35,"tag":72,"props":282,"children":283},{},[284,289],{"type":35,"tag":44,"props":285,"children":286},{},[287],{"type":48,"value":288},"Color differences",{"type":48,"value":290}," distinguish panes, headers, status bars",{"type":35,"tag":72,"props":292,"children":293},{},[294,299],{"type":35,"tag":44,"props":295,"children":296},{},[297],{"type":48,"value":298},"Inverse\u002Freverse video",{"type":48,"value":300}," typically indicates cursor position\nor selection",{"type":35,"tag":72,"props":302,"children":303},{},[304,309],{"type":35,"tag":44,"props":305,"children":306},{},[307],{"type":48,"value":308},"Dim or faint text",{"type":48,"value":310}," marks inactive elements",{"type":35,"tag":40,"props":312,"children":313},{},[314],{"type":48,"value":315},"Read the full screen and interpret it spatially. The first few\nlines are often a header or menu bar. The last line or two are\noften a status bar or command input. The middle is content.",{"type":35,"tag":199,"props":317,"children":319},{"id":318},"navigation",[320],{"type":48,"value":321},"Navigation",{"type":35,"tag":40,"props":323,"children":324},{},[325],{"type":48,"value":326},"TUI programs don't use typed commands — they use keystrokes.\nEvery key does something different depending on context. You\nneed to know the program's keybindings.",{"type":35,"tag":328,"props":329,"children":331},"h3",{"id":330},"universal-navigation-keys",[332],{"type":48,"value":333},"Universal Navigation Keys",{"type":35,"tag":40,"props":335,"children":336},{},[337],{"type":48,"value":338},"Arrow keys, Page Up\u002FDown, Home\u002FEnd, Tab (cycle panes), Enter\n(confirm\u002Fopen), Escape (cancel\u002Fback).",{"type":35,"tag":328,"props":340,"children":342},{"id":341},"vim-style-navigation",[343],{"type":48,"value":344},"Vim-Style Navigation",{"type":35,"tag":40,"props":346,"children":347},{},[348],{"type":48,"value":349},"Many TUIs adopt vim conventions:",{"type":35,"tag":211,"props":351,"children":354},{"className":352,"code":353,"language":48},[214],"h, j, k, l      # left, down, up, right\ng, G             # top, bottom\n\u002F                # search\nn, N             # next\u002Fprevious match\nq                # quit\n",[355],{"type":35,"tag":81,"props":356,"children":357},{"__ignoreMap":219},[358],{"type":48,"value":353},{"type":35,"tag":328,"props":360,"children":362},{"id":361},"sending-keystrokes",[363],{"type":48,"value":364},"Sending Keystrokes",{"type":35,"tag":40,"props":366,"children":367},{},[368],{"type":48,"value":369},"Send one keystroke at a time. Wait briefly between keystrokes\nto let the TUI redraw — TUIs repaint the screen after each\ninput, and you need the updated screen to know where you are.",{"type":35,"tag":211,"props":371,"children":374},{"className":372,"code":373,"language":48},[214],"send: j          # move down\nwait (500ms)\nread screen      # see what's selected now\nsend: j          # move down again\nwait (500ms)\nread screen      # verify position\n",[375],{"type":35,"tag":81,"props":376,"children":377},{"__ignoreMap":219},[378],{"type":48,"value":373},{"type":35,"tag":40,"props":380,"children":381},{},[382],{"type":48,"value":383},"This is slower than blasting keys, but reliable. You're\nnavigating blind if you don't read between keystrokes.",{"type":35,"tag":199,"props":385,"children":387},{"id":386},"understanding-tui-layouts",[388],{"type":48,"value":389},"Understanding TUI Layouts",{"type":35,"tag":40,"props":391,"children":392},{},[393],{"type":48,"value":394},"When you first enter a TUI, read the full screen and build a\nmental map. Most TUIs follow common layout patterns:",{"type":35,"tag":328,"props":396,"children":398},{"id":397},"typical-structure",[399],{"type":48,"value":400},"Typical Structure",{"type":35,"tag":211,"props":402,"children":405},{"className":403,"code":404,"language":48},[214],"+----------------------------------+\n| Menu bar \u002F Title bar             |  \u003C- rows 0-1\n+----------------------------------+\n|                                  |\n| Main content area                |  \u003C- middle rows\n| (list, editor, dashboard)        |\n|                                  |\n+----------------------------------+\n| Status bar \u002F Help \u002F Command line |  \u003C- last 1-2 rows\n+----------------------------------+\n",[406],{"type":35,"tag":81,"props":407,"children":408},{"__ignoreMap":219},[409],{"type":48,"value":404},{"type":35,"tag":328,"props":411,"children":413},{"id":412},"finding-your-bearings",[414],{"type":48,"value":415},"Finding Your Bearings",{"type":35,"tag":268,"props":417,"children":418},{},[419,429,455,465],{"type":35,"tag":72,"props":420,"children":421},{},[422,427],{"type":35,"tag":44,"props":423,"children":424},{},[425],{"type":48,"value":426},"Status bar",{"type":48,"value":428}," (usually bottom): shows mode, filename,\nposition, hints. Read this first — it often tells you\neverything you need to know about current state.",{"type":35,"tag":72,"props":430,"children":431},{},[432,437,439,445,447,453],{"type":35,"tag":44,"props":433,"children":434},{},[435],{"type":48,"value":436},"Help hints",{"type":48,"value":438},": many TUIs show keybinding hints at the\nbottom or top. Look for text like ",{"type":35,"tag":81,"props":440,"children":442},{"className":441},[],[443],{"type":48,"value":444},"q:quit  j\u002Fk:navigate ?:help",{"type":48,"value":446}," or ",{"type":35,"tag":81,"props":448,"children":450},{"className":449},[],[451],{"type":48,"value":452},"^X Exit  ^O Save",{"type":48,"value":454},".",{"type":35,"tag":72,"props":456,"children":457},{},[458,463],{"type":35,"tag":44,"props":459,"children":460},{},[461],{"type":48,"value":462},"The selected item",{"type":48,"value":464},": look for inverse video, bold, or\ncolor-highlighted text in the content area. That's your\ncursor position.",{"type":35,"tag":72,"props":466,"children":467},{},[468,473,475,481,483,489,490,496],{"type":35,"tag":44,"props":469,"children":470},{},[471],{"type":48,"value":472},"Pane borders",{"type":48,"value":474},": look for ",{"type":35,"tag":81,"props":476,"children":478},{"className":477},[],[479],{"type":48,"value":480},"|",{"type":48,"value":482},", ",{"type":35,"tag":81,"props":484,"children":486},{"className":485},[],[487],{"type":48,"value":488},"-",{"type":48,"value":482},{"type":35,"tag":81,"props":491,"children":493},{"className":492},[],[494],{"type":48,"value":495},"+",{"type":48,"value":497}," characters or\nbox-drawing characters. These indicate split panes. Only\none pane is active at a time — Tab or Ctrl+W typically\nswitches between them.",{"type":35,"tag":328,"props":499,"children":501},{"id":500},"modals-and-dialogs",[502],{"type":48,"value":503},"Modals and Dialogs",{"type":35,"tag":40,"props":505,"children":506},{},[507],{"type":48,"value":508},"TUIs often pop up confirmation dialogs or input fields over\nthe main content. These appear as a differently-styled block\nin the middle of the screen. Look for:",{"type":35,"tag":268,"props":510,"children":511},{},[512,517,522],{"type":35,"tag":72,"props":513,"children":514},{},[515],{"type":48,"value":516},"A bordered box that wasn't there before",{"type":35,"tag":72,"props":518,"children":519},{},[520],{"type":48,"value":521},"Text like \"Are you sure?\" or \"Enter filename\"",{"type":35,"tag":72,"props":523,"children":524},{},[525,527],{"type":48,"value":526},"Highlighted buttons like ",{"type":35,"tag":81,"props":528,"children":530},{"className":529},[],[531],{"type":48,"value":532},"[ OK ]  [ Cancel ]",{"type":35,"tag":40,"props":534,"children":535},{},[536],{"type":48,"value":537},"When a modal is active, navigation keys operate on the modal,\nnot the content behind it.",{"type":35,"tag":199,"props":539,"children":541},{"id":540},"common-applications",[542],{"type":48,"value":543},"Common Applications",{"type":35,"tag":40,"props":545,"children":546},{},[547],{"type":48,"value":548},"You don't need to memorize every TUI's keybindings. But\nknowing the basics for frequently encountered programs helps.",{"type":35,"tag":328,"props":550,"children":552},{"id":551},"text-editors",[553],{"type":48,"value":554},"Text Editors",{"type":35,"tag":40,"props":556,"children":557},{},[558,563,565,571,573,579,581,587,589,595,597,603,605,611,613,619],{"type":35,"tag":44,"props":559,"children":560},{},[561],{"type":48,"value":562},"vim\u002Fneovim:",{"type":48,"value":564}," Starts in Normal mode. ",{"type":35,"tag":81,"props":566,"children":568},{"className":567},[],[569],{"type":48,"value":570},"i",{"type":48,"value":572}," to insert text,\n",{"type":35,"tag":81,"props":574,"children":576},{"className":575},[],[577],{"type":48,"value":578},"Esc",{"type":48,"value":580}," to return to Normal. ",{"type":35,"tag":81,"props":582,"children":584},{"className":583},[],[585],{"type":48,"value":586},":w",{"type":48,"value":588}," save, ",{"type":35,"tag":81,"props":590,"children":592},{"className":591},[],[593],{"type":48,"value":594},":q",{"type":48,"value":596}," quit, ",{"type":35,"tag":81,"props":598,"children":600},{"className":599},[],[601],{"type":48,"value":602},":wq",{"type":48,"value":604}," both.\nIf lost, press ",{"type":35,"tag":81,"props":606,"children":608},{"className":607},[],[609],{"type":48,"value":610},"Esc Esc",{"type":48,"value":612}," then ",{"type":35,"tag":81,"props":614,"children":616},{"className":615},[],[617],{"type":48,"value":618},":q!",{"type":48,"value":620}," to quit without saving.",{"type":35,"tag":40,"props":622,"children":623},{},[624,629,631,637,639,645,647,653],{"type":35,"tag":44,"props":625,"children":626},{},[627],{"type":48,"value":628},"nano:",{"type":48,"value":630}," Simpler. Just type to edit. Keybindings shown at\nbottom. ",{"type":35,"tag":81,"props":632,"children":634},{"className":633},[],[635],{"type":48,"value":636},"^",{"type":48,"value":638}," means Ctrl. ",{"type":35,"tag":81,"props":640,"children":642},{"className":641},[],[643],{"type":48,"value":644},"^X",{"type":48,"value":646}," exits, ",{"type":35,"tag":81,"props":648,"children":650},{"className":649},[],[651],{"type":48,"value":652},"^O",{"type":48,"value":654}," saves.",{"type":35,"tag":328,"props":656,"children":658},{"id":657},"git-tuis",[659],{"type":48,"value":660},"Git TUIs",{"type":35,"tag":40,"props":662,"children":663},{},[664,669,671,677,679,685,687,693,695,700,702,708],{"type":35,"tag":44,"props":665,"children":666},{},[667],{"type":48,"value":668},"lazygit:",{"type":48,"value":670}," Pane-based. Tab switches panes (files, branches,\ncommits). ",{"type":35,"tag":81,"props":672,"children":674},{"className":673},[],[675],{"type":48,"value":676},"j\u002Fk",{"type":48,"value":678}," navigates, Enter opens, ",{"type":35,"tag":81,"props":680,"children":682},{"className":681},[],[683],{"type":48,"value":684},"space",{"type":48,"value":686}," stages, ",{"type":35,"tag":81,"props":688,"children":690},{"className":689},[],[691],{"type":48,"value":692},"c",{"type":48,"value":694},"\ncommits, ",{"type":35,"tag":81,"props":696,"children":698},{"className":697},[],[699],{"type":48,"value":40},{"type":48,"value":701}," pushes, ",{"type":35,"tag":81,"props":703,"children":705},{"className":704},[],[706],{"type":48,"value":707},"q",{"type":48,"value":709}," quits.",{"type":35,"tag":328,"props":711,"children":713},{"id":712},"system-monitors",[714],{"type":48,"value":715},"System Monitors",{"type":35,"tag":40,"props":717,"children":718},{},[719,724,726,731,733,739,741,746,748,754],{"type":35,"tag":44,"props":720,"children":721},{},[722],{"type":48,"value":723},"htop\u002Ftop:",{"type":48,"value":725}," Shows processes. ",{"type":35,"tag":81,"props":727,"children":729},{"className":728},[],[730],{"type":48,"value":676},{"type":48,"value":732}," or arrows to navigate,\n",{"type":35,"tag":81,"props":734,"children":736},{"className":735},[],[737],{"type":48,"value":738},"k",{"type":48,"value":740}," to kill a process, ",{"type":35,"tag":81,"props":742,"children":744},{"className":743},[],[745],{"type":48,"value":707},{"type":48,"value":747}," to quit. ",{"type":35,"tag":81,"props":749,"children":751},{"className":750},[],[752],{"type":48,"value":753},"F",{"type":48,"value":755}," keys for actions\n(shown at bottom).",{"type":35,"tag":328,"props":757,"children":759},{"id":758},"kubernetes",[760],{"type":48,"value":761},"Kubernetes",{"type":35,"tag":40,"props":763,"children":764},{},[765,770,772,778,780,786,787,793,795,800,802,808,810,815,817,823,825,831],{"type":35,"tag":44,"props":766,"children":767},{},[768],{"type":48,"value":769},"k9s:",{"type":48,"value":771}," Resource browser. ",{"type":35,"tag":81,"props":773,"children":775},{"className":774},[],[776],{"type":48,"value":777},":",{"type":48,"value":779}," opens command mode for\nresource type (",{"type":35,"tag":81,"props":781,"children":783},{"className":782},[],[784],{"type":48,"value":785},":pods",{"type":48,"value":482},{"type":35,"tag":81,"props":788,"children":790},{"className":789},[],[791],{"type":48,"value":792},":deployments",{"type":48,"value":794},"). ",{"type":35,"tag":81,"props":796,"children":798},{"className":797},[],[799],{"type":48,"value":676},{"type":48,"value":801}," navigates,\n",{"type":35,"tag":81,"props":803,"children":805},{"className":804},[],[806],{"type":48,"value":807},"Enter",{"type":48,"value":809}," drills in, ",{"type":35,"tag":81,"props":811,"children":813},{"className":812},[],[814],{"type":48,"value":578},{"type":48,"value":816}," goes back, ",{"type":35,"tag":81,"props":818,"children":820},{"className":819},[],[821],{"type":48,"value":822},"d",{"type":48,"value":824}," describe, ",{"type":35,"tag":81,"props":826,"children":828},{"className":827},[],[829],{"type":48,"value":830},"l",{"type":48,"value":832}," logs.",{"type":35,"tag":328,"props":834,"children":836},{"id":835},"general-strategy-for-unfamiliar-tuis",[837],{"type":48,"value":838},"General Strategy for Unfamiliar TUIs",{"type":35,"tag":68,"props":840,"children":841},{},[842,847,867,872,890],{"type":35,"tag":72,"props":843,"children":844},{},[845],{"type":48,"value":846},"Read the screen — look for help hints at top or bottom",{"type":35,"tag":72,"props":848,"children":849},{},[850,852,858,859,865],{"type":48,"value":851},"Try ",{"type":35,"tag":81,"props":853,"children":855},{"className":854},[],[856],{"type":48,"value":857},"?",{"type":48,"value":446},{"type":35,"tag":81,"props":860,"children":862},{"className":861},[],[863],{"type":48,"value":864},"h",{"type":48,"value":866}," — most TUIs open a help screen",{"type":35,"tag":72,"props":868,"children":869},{},[870],{"type":48,"value":871},"Try F1 — some use function keys for help",{"type":35,"tag":72,"props":873,"children":874},{},[875,877,882,883,888],{"type":48,"value":876},"Read the help, then press ",{"type":35,"tag":81,"props":878,"children":880},{"className":879},[],[881],{"type":48,"value":707},{"type":48,"value":446},{"type":35,"tag":81,"props":884,"children":886},{"className":885},[],[887],{"type":48,"value":578},{"type":48,"value":889}," to close it",{"type":35,"tag":72,"props":891,"children":892},{},[893,895,900,901,906,907,912,913,919,920,926],{"type":48,"value":894},"If completely stuck: ",{"type":35,"tag":81,"props":896,"children":898},{"className":897},[],[899],{"type":48,"value":707},{"type":48,"value":482},{"type":35,"tag":81,"props":902,"children":904},{"className":903},[],[905],{"type":48,"value":578},{"type":48,"value":482},{"type":35,"tag":81,"props":908,"children":910},{"className":909},[],[911],{"type":48,"value":594},{"type":48,"value":482},{"type":35,"tag":81,"props":914,"children":916},{"className":915},[],[917],{"type":48,"value":918},"Ctrl+C",{"type":48,"value":98},{"type":35,"tag":81,"props":921,"children":923},{"className":922},[],[924],{"type":48,"value":925},"Ctrl+Q",{"type":48,"value":927}," — try these in order to exit",{"type":35,"tag":199,"props":929,"children":931},{"id":930},"exiting-a-tui",[932],{"type":48,"value":933},"Exiting a TUI",{"type":35,"tag":40,"props":935,"children":936},{},[937],{"type":48,"value":938},"Getting out is as important as getting in. When you're done\nwith a TUI, you need to return to the normal shell prompt.",{"type":35,"tag":328,"props":940,"children":942},{"id":941},"exit-strategies-in-order-of-preference",[943],{"type":48,"value":944},"Exit Strategies (in order of preference)",{"type":35,"tag":68,"props":946,"children":947},{},[948,973,978,990,1000],{"type":35,"tag":72,"props":949,"children":950},{},[951,953,958,959,964,965,971],{"type":48,"value":952},"Use the program's quit command (",{"type":35,"tag":81,"props":954,"children":956},{"className":955},[],[957],{"type":48,"value":707},{"type":48,"value":482},{"type":35,"tag":81,"props":960,"children":962},{"className":961},[],[963],{"type":48,"value":594},{"type":48,"value":482},{"type":35,"tag":81,"props":966,"children":968},{"className":967},[],[969],{"type":48,"value":970},"Ctrl+X",{"type":48,"value":972},")",{"type":35,"tag":72,"props":974,"children":975},{},[976],{"type":48,"value":977},"Check the status bar for exit hints",{"type":35,"tag":72,"props":979,"children":980},{},[981,983,988],{"type":48,"value":982},"Press ",{"type":35,"tag":81,"props":984,"children":986},{"className":985},[],[987],{"type":48,"value":578},{"type":48,"value":989}," to back out of any modal or sub-mode first",{"type":35,"tag":72,"props":991,"children":992},{},[993,995],{"type":48,"value":994},"If the program won't quit cleanly, ",{"type":35,"tag":81,"props":996,"children":998},{"className":997},[],[999],{"type":48,"value":918},{"type":35,"tag":72,"props":1001,"children":1002},{},[1003,1005,1011,1013],{"type":48,"value":1004},"Last resort: ",{"type":35,"tag":81,"props":1006,"children":1008},{"className":1007},[],[1009],{"type":48,"value":1010},"Ctrl+Z",{"type":48,"value":1012}," to suspend, then ",{"type":35,"tag":81,"props":1014,"children":1016},{"className":1015},[],[1017],{"type":48,"value":1018},"kill %1",{"type":35,"tag":328,"props":1020,"children":1022},{"id":1021},"confirming-youre-out",[1023],{"type":48,"value":1024},"Confirming You're Out",{"type":35,"tag":40,"props":1026,"children":1027},{},[1028],{"type":48,"value":1029},"After sending a quit command, wait for idle, then check:",{"type":35,"tag":211,"props":1031,"children":1034},{"className":1032,"code":1033,"language":48},[214],"\"alternate_active\": false\n",[1035],{"type":35,"tag":81,"props":1036,"children":1037},{"__ignoreMap":219},[1038],{"type":48,"value":1033},{"type":35,"tag":40,"props":1040,"children":1041},{},[1042,1044,1049,1051,1057],{"type":48,"value":1043},"If this is ",{"type":35,"tag":81,"props":1045,"children":1047},{"className":1046},[],[1048],{"type":48,"value":245},{"type":48,"value":1050},", you're back in normal mode with your shell\nprompt. If it's still ",{"type":35,"tag":81,"props":1052,"children":1054},{"className":1053},[],[1055],{"type":48,"value":1056},"true",{"type":48,"value":1058},", the TUI is still running —\nyour quit command may not have worked, or the program asked\nfor confirmation before exiting.",{"type":35,"tag":199,"props":1060,"children":1062},{"id":1061},"pitfalls",[1063],{"type":48,"value":1064},"Pitfalls",{"type":35,"tag":328,"props":1066,"children":1068},{"id":1067},"dont-type-commands-into-a-tui",[1069],{"type":48,"value":1070},"Don't type commands into a TUI",{"type":35,"tag":40,"props":1072,"children":1073},{},[1074,1076,1082],{"type":48,"value":1075},"A TUI is not a shell. If you send ",{"type":35,"tag":81,"props":1077,"children":1079},{"className":1078},[],[1080],{"type":48,"value":1081},"ls -la\\n",{"type":48,"value":1083}," into vim, you'll\nget those characters inserted into the document. Always know\nwhat mode you're in before sending input.",{"type":35,"tag":328,"props":1085,"children":1087},{"id":1086},"dont-blast-keystrokes",[1088],{"type":48,"value":1089},"Don't blast keystrokes",{"type":35,"tag":40,"props":1091,"children":1092},{},[1093,1095,1101],{"type":48,"value":1094},"TUIs redraw the screen after each input. If you send 10 ",{"type":35,"tag":81,"props":1096,"children":1098},{"className":1097},[],[1099],{"type":48,"value":1100},"j",{"type":48,"value":1102},"\nkeystrokes without reading in between, you won't know where\nyou landed. Navigate one step at a time.",{"type":35,"tag":328,"props":1104,"children":1106},{"id":1105},"watch-for-mode-changes",[1107],{"type":48,"value":1108},"Watch for mode changes",{"type":35,"tag":40,"props":1110,"children":1111},{},[1112],{"type":48,"value":1113},"Many TUIs have multiple modes (vim's Normal\u002FInsert\u002FVisual,\nlazygit's panes). The same key does different things in\ndifferent modes. Read the screen after each action to confirm\nyou're in the mode you expect.",{"type":35,"tag":328,"props":1115,"children":1117},{"id":1116},"alternate-screen-within-alternate-screen",[1118],{"type":48,"value":1119},"Alternate screen within alternate screen",{"type":35,"tag":40,"props":1121,"children":1122},{},[1123,1125,1130,1132,1137],{"type":48,"value":1124},"If you launch a TUI from within a TUI (e.g., vim from within\na file manager), ",{"type":35,"tag":81,"props":1126,"children":1128},{"className":1127},[],[1129],{"type":48,"value":237},{"type":48,"value":1131}," is still just ",{"type":35,"tag":81,"props":1133,"children":1135},{"className":1134},[],[1136],{"type":48,"value":1056},{"type":48,"value":1138},". You\nneed to track the nesting yourself by remembering what you\nlaunched and how many layers deep you are.",{"items":1140,"total":1226},[1141,1158,1170,1181,1193,1203,1215],{"slug":1142,"name":1142,"fn":1143,"description":1144,"org":1145,"tags":1146,"stars":19,"repoUrl":20,"updatedAt":1157},"agent-orchestration","orchestrate multiple AI agents","Use when you need to launch and drive other AI agents (Claude Code, Aider, Codex, etc.) through their terminal interfaces via wsh. Examples: \"run multiple Claude Code sessions in parallel on different tasks\", \"feed a task to an AI agent and handle its approval prompts\", \"coordinate several AI agents working on subtasks of a larger project\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1147,1150,1153,1154],{"name":1148,"slug":1149,"type":15},"Agents","agents",{"name":1151,"slug":1152,"type":15},"Automation","automation",{"name":13,"slug":14,"type":15},{"name":1155,"slug":1156,"type":15},"Multi-Agent","multi-agent","2026-07-12T08:29:40.028618",{"slug":1159,"name":1159,"fn":1160,"description":1161,"org":1162,"tags":1163,"stars":19,"repoUrl":20,"updatedAt":1169},"cluster-orchestration","orchestrate sessions across federated clusters","Use when you need to manage sessions across multiple wsh servers in a federated cluster. Examples: \"distribute builds across several machines\", \"create sessions on a specific backend\", \"monitor health across a cluster of servers\", \"coordinate work across server boundaries\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1164,1167,1168],{"name":1165,"slug":1166,"type":15},"Architecture","architecture",{"name":1151,"slug":1152,"type":15},{"name":17,"slug":18,"type":15},"2026-07-12T08:29:38.810244",{"slug":1171,"name":1171,"fn":1172,"description":1173,"org":1174,"tags":1175,"stars":19,"repoUrl":20,"updatedAt":1180},"core","authenticate and bootstrap wsh terminal operations","REQUIRED before any wsh terminal operation when you do NOT have wsh_* MCP tools. Contains the complete HTTP API reference with working curl examples, bootstrap sequence, and authentication guide. wsh has no CLI subcommands for programmatic use — do NOT run 'wsh \u003Cverb>' commands or guess endpoints. Load this skill first.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1176,1179],{"name":1177,"slug":1178,"type":15},"Authentication","authentication",{"name":13,"slug":14,"type":15},"2026-07-12T08:29:32.614733",{"slug":1182,"name":1182,"fn":1183,"description":1184,"org":1185,"tags":1186,"stars":19,"repoUrl":20,"updatedAt":1192},"core-mcp","bootstrap MCP terminal sessions","REQUIRED before any wsh terminal operation. Contains the complete MCP tool reference and bootstrap sequence for wsh_create_session, wsh_send_input, wsh_get_screen, wsh_send_and_read, wsh_send_keys, and all wsh_* tools. Do NOT guess wsh CLI commands or HTTP endpoints — use MCP tools or load this skill first.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1187,1188,1189],{"name":1151,"slug":1152,"type":15},{"name":13,"slug":14,"type":15},{"name":1190,"slug":1191,"type":15},"MCP","mcp","2026-07-12T08:29:45.869993",{"slug":1194,"name":1194,"fn":1195,"description":1196,"org":1197,"tags":1198,"stars":19,"repoUrl":20,"updatedAt":1202},"drive-process","interact with CLI programs via wsh","Use when you need to drive a CLI program through command-and-response interaction via wsh. Examples: \"run a build command and check the output\", \"interact with an installer that asks questions\", \"execute a sequence of shell commands and handle errors\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1199,1200,1201],{"name":1151,"slug":1152,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},"2026-07-12T08:29:51.485222",{"slug":1204,"name":1204,"fn":1205,"description":1206,"org":1207,"tags":1208,"stars":19,"repoUrl":20,"updatedAt":1214},"generative-ui","build interactive terminal user interfaces","Use when you need to build dynamic, interactive terminal experiences on the fly. Examples: \"create a live dashboard in the terminal\", \"build an interactive file browser\", \"generate a custom TUI for this workflow\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1209,1210,1211],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":1212,"slug":1213,"type":15},"Frontend","frontend","2026-07-12T08:29:41.286933",{"slug":1216,"name":1216,"fn":1217,"description":1218,"org":1219,"tags":1220,"stars":19,"repoUrl":20,"updatedAt":1225},"infrastructure-ops","manage infrastructure across multiple servers","Use when you need to manage infrastructure across multiple servers interactively via wsh — deploying applications, configuring services, managing packages, performing rolling updates, and handling the prompts and judgment calls that declarative tools cannot. Examples: \"deploy this application across 10 servers with health checks between each\", \"upgrade packages across the fleet and handle diverse prompts\", \"inspect and modify configuration across servers\", \"roll back a failed deployment\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1221,1222],{"name":13,"slug":14,"type":15},{"name":1223,"slug":1224,"type":15},"Infrastructure","infrastructure","2026-07-12T08:29:57.659886",12,{"items":1228,"total":1383},[1229,1245,1259,1273,1285,1297,1309,1320,1336,1350,1360,1372],{"slug":1230,"name":1230,"fn":1231,"description":1232,"org":1233,"tags":1234,"stars":1242,"repoUrl":1243,"updatedAt":1244},"deepclaw-voice","configure phone calls with Deepgram Voice","Set up phone calling to OpenClaw using Deepgram Voice Agent API",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1235,1238,1239],{"name":1236,"slug":1237,"type":15},"API Development","api-development",{"name":9,"slug":8,"type":15},{"name":1240,"slug":1241,"type":15},"Voice","voice",78,"https:\u002F\u002Fgithub.com\u002Fdeepgram\u002Fdeepclaw","2026-07-12T08:29:25.371332",{"slug":1246,"name":1246,"fn":1247,"description":1248,"org":1249,"tags":1250,"stars":1256,"repoUrl":1257,"updatedAt":1258},"1password","manage secrets with 1Password CLI","Set up and use 1Password CLI (op). Use when installing the CLI, enabling desktop app integration, signing in (single or multi-account), or reading\u002Finjecting\u002Frunning secrets via op.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1251,1252,1253],{"name":1151,"slug":1152,"type":15},{"name":13,"slug":14,"type":15},{"name":1254,"slug":1255,"type":15},"Security","security",23,"https:\u002F\u002Fgithub.com\u002Fdeepgram\u002Fdglabs-deepclaw","2026-07-12T08:28:49.991939",{"slug":1260,"name":1260,"fn":1261,"description":1262,"org":1263,"tags":1264,"stars":1256,"repoUrl":1257,"updatedAt":1272},"apple-notes","manage Apple Notes on macOS","Manage Apple Notes via the `memo` CLI on macOS (create, view, edit, delete, search, move, and export notes). Use when a user asks OpenClaw to add a note, list notes, search notes, or manage note folders.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1265,1266,1269],{"name":13,"slug":14,"type":15},{"name":1267,"slug":1268,"type":15},"Knowledge Management","knowledge-management",{"name":1270,"slug":1271,"type":15},"macOS","macos","2026-07-12T08:29:01.538106",{"slug":1274,"name":1274,"fn":1275,"description":1276,"org":1277,"tags":1278,"stars":1256,"repoUrl":1257,"updatedAt":1284},"apple-reminders","manage Apple Reminders via CLI","Manage Apple Reminders via the `remindctl` CLI on macOS (list, add, edit, complete, delete). Supports lists, date filters, and JSON\u002Fplain output.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1279,1280,1281],{"name":13,"slug":14,"type":15},{"name":1270,"slug":1271,"type":15},{"name":1282,"slug":1283,"type":15},"Task Management","task-management","2026-07-12T08:29:14.035414",{"slug":1286,"name":1286,"fn":1287,"description":1288,"org":1289,"tags":1290,"stars":1256,"repoUrl":1257,"updatedAt":1296},"bear-notes","manage Bear notes via CLI","Create, search, and manage Bear notes via grizzly CLI.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1291,1292,1293],{"name":13,"slug":14,"type":15},{"name":1267,"slug":1268,"type":15},{"name":1294,"slug":1295,"type":15},"Notes","notes","2026-07-12T08:28:51.246011",{"slug":1298,"name":1298,"fn":1299,"description":1300,"org":1301,"tags":1302,"stars":1256,"repoUrl":1257,"updatedAt":1308},"blogwatcher","monitor blogs and RSS feeds","Monitor blogs and RSS\u002FAtom feeds for updates using the blogwatcher CLI.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1303,1304,1305],{"name":1151,"slug":1152,"type":15},{"name":13,"slug":14,"type":15},{"name":1306,"slug":1307,"type":15},"Monitoring","monitoring","2026-07-12T08:29:02.762321",{"slug":1310,"name":1310,"fn":1311,"description":1312,"org":1313,"tags":1314,"stars":1256,"repoUrl":1257,"updatedAt":1319},"blucli","control BluOS audio playback","BluOS CLI (blu) for discovery, playback, grouping, and volume.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1315,1318],{"name":1316,"slug":1317,"type":15},"Audio","audio",{"name":13,"slug":14,"type":15},"2026-07-12T08:28:21.009637",{"slug":1321,"name":1321,"fn":1322,"description":1323,"org":1324,"tags":1325,"stars":1256,"repoUrl":1257,"updatedAt":1335},"bluebubbles","send and manage iMessages","Use when you need to send or manage iMessages via BlueBubbles (recommended iMessage integration). Calls go through the generic message tool with channel=\"bluebubbles\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1326,1329,1332],{"name":1327,"slug":1328,"type":15},"Communications","communications",{"name":1330,"slug":1331,"type":15},"iMessage","imessage",{"name":1333,"slug":1334,"type":15},"Messaging","messaging","2026-07-12T08:28:57.517914",{"slug":1337,"name":1337,"fn":1338,"description":1339,"org":1340,"tags":1341,"stars":1256,"repoUrl":1257,"updatedAt":1349},"camsnap","capture frames and clips from cameras","Capture frames or clips from RTSP\u002FONVIF cameras.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1342,1343,1346],{"name":1151,"slug":1152,"type":15},{"name":1344,"slug":1345,"type":15},"Camera","camera",{"name":1347,"slug":1348,"type":15},"Media","media","2026-07-12T08:28:28.096134",{"slug":1351,"name":1351,"fn":1352,"description":1353,"org":1354,"tags":1355,"stars":1256,"repoUrl":1257,"updatedAt":1359},"clawhub","manage agent skills with ClawHub","Use the ClawHub CLI to search, install, update, and publish agent skills from clawhub.com. Use when you need to fetch new skills on the fly, sync installed skills to latest or a specific version, or publish new\u002Fupdated skill folders with the npm-installed clawhub CLI.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1356,1357,1358],{"name":1148,"slug":1149,"type":15},{"name":1151,"slug":1152,"type":15},{"name":13,"slug":14,"type":15},"2026-07-12T08:28:30.589001",{"slug":1361,"name":1361,"fn":1362,"description":1363,"org":1364,"tags":1365,"stars":1256,"repoUrl":1257,"updatedAt":1371},"coding-agent","run coding agents for programmatic control","Run Codex CLI, Claude Code, OpenCode, or Pi Coding Agent via background process for programmatic control.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1366,1367,1368],{"name":1148,"slug":1149,"type":15},{"name":1151,"slug":1152,"type":15},{"name":1369,"slug":1370,"type":15},"Coding","coding","2026-07-12T08:29:08.6658",{"slug":1373,"name":1373,"fn":1374,"description":1375,"org":1376,"tags":1377,"stars":1256,"repoUrl":1257,"updatedAt":1382},"eightctl","control Eight Sleep pod settings","Control Eight Sleep pods (status, temperature, alarms, schedules).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1378,1379],{"name":1151,"slug":1152,"type":15},{"name":1380,"slug":1381,"type":15},"Hardware","hardware","2026-07-12T08:28:39.322181",73]