[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-deepgram-generative-ui":3,"mdc--k46pld-key":32,"related-org-deepgram-generative-ui":676,"related-repo-deepgram-generative-ui":837},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":22,"repoUrl":23,"updatedAt":24,"license":25,"forks":26,"topics":27,"repo":28,"sourceUrl":30,"mdContent":31},"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},"deepgram","Deepgram","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fdeepgram.png",[12,16,19],{"name":13,"slug":14,"type":15},"CLI","cli","tag",{"name":17,"slug":18,"type":15},"Engineering","engineering",{"name":20,"slug":21,"type":15},"Frontend","frontend",5,"https:\u002F\u002Fgithub.com\u002Fdeepgram\u002Fwsh","2026-07-12T08:29:41.286933",null,2,[],{"repoUrl":23,"stars":22,"forks":26,"topics":29,"description":25},[],"https:\u002F\u002Fgithub.com\u002Fdeepgram\u002Fwsh\u002Ftree\u002FHEAD\u002Fskills\u002Fgenerative-ui","---\nname: generative-ui\ndescription: >\n  Use when you need to build dynamic, interactive terminal experiences on the\n  fly. Examples: \"create a live dashboard in the terminal\", \"build an\n  interactive file browser\", \"generate a custom TUI for this workflow\".\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:generative-ui — Building Dynamic Experiences\n\nThe terminal isn't just a place to run existing programs.\nWith wsh, you can create interactive experiences on the\nfly — interfaces that didn't exist before this moment,\ntailored to this specific task, this specific user,\nthis specific context.\n\n## What You Have to Work With\n\nThree layers of capability, from simple to complex:\n\n**Layer 1: Overlays and Panels**\nThe wsh primitives. Position styled text anywhere on\nscreen, carve out panel regions, capture input. No\nexternal programs needed. Good for: annotations,\nstatus displays, menus, prompts, simple dashboards.\n\n**Layer 2: Composed Experiences**\nCombine overlays + panels + input capture into\ncohesive interactive applications. A selection menu\nwith a preview panel. A dashboard with live-updating\nsections. A wizard that walks through multiple steps.\nStill no external programs — just wsh primitives\norchestrated together.\n\n**Layer 3: Direct Drawing**\nUse overlays and panels as 2D drawing surfaces. Opaque\noverlays with explicit dimensions become windows and\ndialogs. Named spans enable surgical updates to\nindividual elements. Region writes let you place text\nat specific coordinates within an overlay or panel.\nAlternate screen mode gives you a clean canvas that\nvanishes when you're done. This layer turns the wsh\nprimitives into a full rendering engine — no external\nprograms, no generated scripts, just direct control\nover every cell on screen.\n\n## Choosing a Layer\n\nStart with the simplest layer that works:\n- Need to show some text? Layer 1.\n- Need interaction with multiple elements? Layer 2.\n- Need windows, live-updating fields, structured\n  layouts, or a temporary full-screen UI? Layer 3.\n\nMost generative UI lives in layers 1 and 2. Layer 3\nis for when you need precise control over what\nappears where, or when you want a fully immersive\nexperience that cleans up after itself.\n\n## Design Patterns\n\n### Live Dashboard\nCombine panels with periodic updates to create a\nreal-time display. Use named spans so you can update\nindividual values without redrawing the whole panel:\n\n    panel (top, 3 lines):\n      \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\"\n      \" CPU: ████░░░░ 52%  │  MEM: 3.2\u002F8G \"\n      \" Pods: 12 ready     │  Errs: 0     \"\n\n    named spans:\n      id=\"cpu\"  → \"████░░░░ 52%\"\n      id=\"mem\"  → \"3.2\u002F8G\"\n      id=\"pods\" → \"12 ready\"\n      id=\"errs\" → \"0\"\n\nWhen new data arrives, update just the span that\nchanged — e.g., update the \"cpu\" span to \"██████░░ 75%\"\nwithout touching anything else. No flicker, no\nredrawing borders or labels.\n\n### Interactive Browser\nLet the human explore structured data — files,\ncommits, log entries, API responses. Use an opaque\noverlay as a window:\n\n    overlay (width: 40, height: 12, background: dark):\n      \"┌─ Recent Commits ──────────────────┐\"\n      \"│ ▸ 81883ad docs: rewrite README    │\"\n      \"│   8acf8d7 feat: clear screen on   │\"\n      \"│   55719e8 feat: add session detach │\"\n      \"│                                   │\"\n      \"│   ↑↓ navigate  Enter: view diff   │\"\n      \"│   q: close                        │\"\n      \"└───────────────────────────────────┘\"\n\nThe explicit width and height create an opaque\nrectangle that cleanly covers terminal content behind\nit. On Enter, fetch the diff for the selected commit,\nreplace the overlay content with the diff view,\nand add a \"Back\" option. You're building a mini\napplication from overlays and keystrokes.\n\n### Dialog Window\nCreate a modal dialog using an opaque overlay.\nThe background fills the rectangle, giving it a\nsolid, window-like appearance:\n\n    overlay (center, width: 50, height: 8, background: dark):\n\n    region writes within the overlay:\n      (1, 2)  \"Confirm Deployment\"        bold\n      (3, 2)  \"Environment:  production\"\n      (4, 2)  \"Version:      v2.4.1\"\n      (5, 2)  \"Containers:   12\"\n      (7, 8)  \"[Y]es\"   green\n      (7, 20) \"[N]o\"    red\n\nRegion writes place each piece of text at a specific\n(row, col) offset within the overlay. No need to\nconstruct a single spans array with exact spacing —\njust draw each element where it belongs.\n\n### Canvas Rendering\nUse region writes to build structured layouts like\ntables, grids, or charts:\n\n    overlay (width: 60, height: 15, background: dark):\n\n    # Draw headers\n    region write (0, 0):  \"Service\" bold\n    region write (0, 20): \"Status\"  bold\n    region write (0, 40): \"Latency\" bold\n\n    # Draw separator\n    region write (1, 0):  \"─\" × 60\n\n    # Draw rows\n    region write (2, 0):  \"auth-service\"\n    region write (2, 20): \"● healthy\"   green\n    region write (2, 40): \"12ms\"\n\n    region write (3, 0):  \"api-gateway\"\n    region write (3, 20): \"● degraded\"  yellow\n    region write (3, 40): \"340ms\"\n\nEach row and column is independently addressable.\nUpdate a single cell when data changes — no need\nto redraw the entire table.\n\n### Live-Updating Status\nCombine named spans with periodic updates for\nelements that change independently:\n\n    panel (bottom, 1 line):\n      span id=\"status\": \"● connected\"  green\n      span id=\"sep1\":   \" │ \"\n      span id=\"time\":   \"14:32:07\"\n      span id=\"sep2\":   \" │ \"\n      span id=\"count\":  \"47 events\"\n\nUpdate the \"time\" span every few seconds. Update\n\"count\" when events arrive. Update \"status\" if the\nconnection state changes. Each is independent — no\nneed to rebuild the entire status bar.\n\n### Wizard\nWalk the human through a multi-step process,\nbuilding up configuration or input along the way.\nUse a panel for progress and an overlay for the\ncurrent step:\n\n    panel (bottom, 1 line):\n      \" Step 2\u002F4: Configure database ──────\"\n\n    overlay (center, width: 35, height: 6, background: dark):\n      \"┌─ Database Type ───────────────┐\"\n      \"│   SQLite                      │\"\n      \"│ ▸ PostgreSQL                  │\"\n      \"│   MySQL                       │\"\n      \"└───────────────────────────────┘\"\n\nEach step collects input, updates the progress\npanel, and advances. At the end, summarize all\nchoices and ask for confirmation before acting.\n\n### Contextual Preview\nShow a preview that updates based on what the\nhuman is doing. Combine monitoring with visual\nfeedback:\n\n    # Human is editing a Markdown file\n    # Panel shows a simplified rendered preview\n\n    panel (bottom, 5 lines):\n      \"━━ Preview ━━━━━━━━━━━━━━━━━━━━━━\"\n      \" # My Document                   \"\n      \" This is the **first** paragraph \"\n      \" - item one                      \"\n      \" - item two                      \"\n\nRead the file periodically, render a simplified\nversion, update the panel. The human gets live\nfeedback without switching tools.\n\n### Full-Screen Agent UI\nUse alternate screen mode to take over the entire\ndisplay temporarily. Create a fully immersive\ninterface, then exit cleanly:\n\n    enter alt screen\n\n    # Now working on a clean canvas.\n    # Create panels and overlays freely — they exist\n    # only in alt screen mode.\n\n    panel (top, 1 line):  \"═══ Environment Setup ═══\"\n    panel (bottom, 1 line): \" [Tab] next  [Esc] cancel \"\n\n    overlay (center, width: 60, height: 20, background: dark):\n      # Your main UI content here\n\n    # When done:\n    exit alt screen\n    # Everything created in alt mode is automatically\n    # deleted. The human's original terminal is restored.\n\nAlt screen mode is perfect for intensive workflows\nthat need the full terminal — setup wizards,\ndashboards, configuration editors. The human's\nterminal is completely preserved underneath.\n\n## Composition Philosophy\n\nThe best generative UI combines layers fluidly. A\ndashboard panel at the bottom. An overlay window when\nthe human needs to make a choice. Named spans for\nlive-updating values. Region writes for structured\nlayouts. Alt screen mode when you need a clean slate.\nEach layer serves its purpose, then gets out of the way.\n\n### Design Principles\n\n**Fit the terminal aesthetic.** The human chose to work\nin a terminal. Respect that. Use box-drawing characters,\nmonospace alignment, and ASCII art — not emoji-heavy\ndecoration. Clean, functional, information-dense.\n\n**Build incrementally.** Start with the simplest version\nthat's useful. A one-line panel is better than nothing.\nAdd complexity only when the human needs it or asks\nfor it.\n\n**Make it disposable.** Every UI element you create\nshould be easy to dismiss and leave no trace. The\nhuman should never have to clean up after your\ninterface. When they're done, everything disappears.\nAlt screen mode is the ultimate expression of this —\nexit and it's as if your UI never existed.\n\n**Adapt to the terminal size.** Read `cols` and `rows`\nfrom the screen response. A dashboard designed for\n120 columns is useless on a 80-column terminal. Scale\nyour layouts:\n- \u003C 80 cols: minimal, single-column, short labels\n- 80-120 cols: standard layout\n- > 120 cols: multi-column, more detail\n\n**Respond to context.** A generative UI should feel\nrelevant to what's happening right now. A deployment\ndashboard during deployment. A test results browser\nafter a test run. A log viewer when errors appear.\nBuild it when it's needed, tear it down when it's not.\n\n## Pitfalls\n\n### Don't Build What Already Exists\nBefore generating a custom file browser, check if\n`ranger` or `lf` is installed. Before building a git\nlog viewer, try `lazygit` or `tig`. Generated UI\nis for gaps — when no existing tool fits the need.\nUse wsh:tui to drive existing tools when they're\navailable.\n\n### Don't Over-Engineer\nA simple overlay that solves the problem in seconds\nis better than an elaborate multi-panel layout that\ntakes minutes to construct. The human is waiting.\nBias toward quick and functional.\n\n### Don't Mix Layers Carelessly\nOverlays sit on top of terminal content. If you have\nmultiple opaque overlays stacked, or overlays fighting\nwith panels for attention, the result is confusing.\nBe deliberate about what's visible when. If you need\na clean canvas without worrying about layering, use\nalt screen mode — it gives you a fresh surface where\nyou control everything.\n\n### Test on Small Terminals\nIf you don't know the terminal size, design for 80x24\n— the classic default. Everything you build should\nbe usable at this size, even if it looks better on\na larger terminal.\n",{"data":33,"body":34},{"name":4,"description":6},{"type":35,"children":36},"root",[37,189,196,201,208,213,223,233,243,249,254,273,278,284,291,296,308,313,319,324,333,338,344,349,358,363,369,374,383,388,394,399,408,413,419,424,433,438,444,449,458,463,469,474,483,488,494,499,505,515,525,535,561,585,595,601,607,643,649,654,660,665,671],{"type":38,"tag":39,"props":40,"children":41},"element","blockquote",{},[42,70],{"type":38,"tag":43,"props":44,"children":45},"p",{},[46,53,55,61,63,68],{"type":38,"tag":47,"props":48,"children":49},"strong",{},[50],{"type":51,"value":52},"text","IMPORTANT: EXECUTION CONTEXT",{"type":51,"value":54},"\nThis skill describes ",{"type":38,"tag":56,"props":57,"children":58},"em",{},[59],{"type":51,"value":60},"what to do",{"type":51,"value":62}," — domain patterns and decision-making.\nIt does NOT describe ",{"type":38,"tag":56,"props":64,"children":65},{},[66],{"type":51,"value":67},"how",{"type":51,"value":69}," to call the API.",{"type":38,"tag":71,"props":72,"children":73},"ol",{},[74,124,163],{"type":38,"tag":75,"props":76,"children":77},"li",{},[78,92,94,100,102,108,110,115,117,122],{"type":38,"tag":47,"props":79,"children":80},{},[81,83,90],{"type":51,"value":82},"If you have ",{"type":38,"tag":84,"props":85,"children":87},"code",{"className":86},[],[88],{"type":51,"value":89},"wsh_*",{"type":51,"value":91}," tools",{"type":51,"value":93}," (check your toolkit for ",{"type":38,"tag":84,"props":95,"children":97},{"className":96},[],[98],{"type":51,"value":99},"wsh_send_input",{"type":51,"value":101},",\n",{"type":38,"tag":84,"props":103,"children":105},{"className":104},[],[106],{"type":51,"value":107},"wsh_get_screen",{"type":51,"value":109},", etc.): use them directly. Operation names in this\nskill generally map to tool names (e.g., \"send input\" → ",{"type":38,"tag":84,"props":111,"children":113},{"className":112},[],[114],{"type":51,"value":99},{"type":51,"value":116},").\nWhen in doubt, list your available ",{"type":38,"tag":84,"props":118,"children":120},{"className":119},[],[121],{"type":51,"value":89},{"type":51,"value":123}," tools.",{"type":38,"tag":75,"props":125,"children":126},{},[127,138,140,145,147,153,155,161],{"type":38,"tag":47,"props":128,"children":129},{},[130,132,137],{"type":51,"value":131},"If you do NOT have ",{"type":38,"tag":84,"props":133,"children":135},{"className":134},[],[136],{"type":51,"value":89},{"type":51,"value":91},{"type":51,"value":139},": you are in HTTP\u002Fcurl fallback mode.\n",{"type":38,"tag":47,"props":141,"children":142},{},[143],{"type":51,"value":144},"DO NOT GUESS endpoints or CLI subcommands.",{"type":51,"value":146},"\nLoad the full API reference first: search your workspace for\n",{"type":38,"tag":84,"props":148,"children":150},{"className":149},[],[151],{"type":51,"value":152},"skills\u002Fcore\u002F",{"type":51,"value":154}," and read ",{"type":38,"tag":84,"props":156,"children":158},{"className":157},[],[159],{"type":51,"value":160},"SKILL.md",{"type":51,"value":162},". It contains every endpoint\nwith working curl examples and a bootstrap sequence.",{"type":38,"tag":75,"props":164,"children":165},{},[166,171,173,179,181,187],{"type":38,"tag":47,"props":167,"children":168},{},[169],{"type":51,"value":170},"Quick bootstrap",{"type":51,"value":172},": ",{"type":38,"tag":84,"props":174,"children":176},{"className":175},[],[177],{"type":51,"value":178},"curl -sf --unix-socket ${XDG_RUNTIME_DIR:-\u002Ftmp}\u002Fwsh\u002Fdefault.http.sock http:\u002F\u002Flocalhost\u002Fhealth",{"type":51,"value":180},"\n— if that fails: ",{"type":38,"tag":84,"props":182,"children":184},{"className":183},[],[185],{"type":51,"value":186},"wsh server -L agent-$$ --ephemeral &",{"type":51,"value":188}," and retry.",{"type":38,"tag":190,"props":191,"children":193},"h1",{"id":192},"wshgenerative-ui-building-dynamic-experiences",[194],{"type":51,"value":195},"wsh:generative-ui — Building Dynamic Experiences",{"type":38,"tag":43,"props":197,"children":198},{},[199],{"type":51,"value":200},"The terminal isn't just a place to run existing programs.\nWith wsh, you can create interactive experiences on the\nfly — interfaces that didn't exist before this moment,\ntailored to this specific task, this specific user,\nthis specific context.",{"type":38,"tag":202,"props":203,"children":205},"h2",{"id":204},"what-you-have-to-work-with",[206],{"type":51,"value":207},"What You Have to Work With",{"type":38,"tag":43,"props":209,"children":210},{},[211],{"type":51,"value":212},"Three layers of capability, from simple to complex:",{"type":38,"tag":43,"props":214,"children":215},{},[216,221],{"type":38,"tag":47,"props":217,"children":218},{},[219],{"type":51,"value":220},"Layer 1: Overlays and Panels",{"type":51,"value":222},"\nThe wsh primitives. Position styled text anywhere on\nscreen, carve out panel regions, capture input. No\nexternal programs needed. Good for: annotations,\nstatus displays, menus, prompts, simple dashboards.",{"type":38,"tag":43,"props":224,"children":225},{},[226,231],{"type":38,"tag":47,"props":227,"children":228},{},[229],{"type":51,"value":230},"Layer 2: Composed Experiences",{"type":51,"value":232},"\nCombine overlays + panels + input capture into\ncohesive interactive applications. A selection menu\nwith a preview panel. A dashboard with live-updating\nsections. A wizard that walks through multiple steps.\nStill no external programs — just wsh primitives\norchestrated together.",{"type":38,"tag":43,"props":234,"children":235},{},[236,241],{"type":38,"tag":47,"props":237,"children":238},{},[239],{"type":51,"value":240},"Layer 3: Direct Drawing",{"type":51,"value":242},"\nUse overlays and panels as 2D drawing surfaces. Opaque\noverlays with explicit dimensions become windows and\ndialogs. Named spans enable surgical updates to\nindividual elements. Region writes let you place text\nat specific coordinates within an overlay or panel.\nAlternate screen mode gives you a clean canvas that\nvanishes when you're done. This layer turns the wsh\nprimitives into a full rendering engine — no external\nprograms, no generated scripts, just direct control\nover every cell on screen.",{"type":38,"tag":202,"props":244,"children":246},{"id":245},"choosing-a-layer",[247],{"type":51,"value":248},"Choosing a Layer",{"type":38,"tag":43,"props":250,"children":251},{},[252],{"type":51,"value":253},"Start with the simplest layer that works:",{"type":38,"tag":255,"props":256,"children":257},"ul",{},[258,263,268],{"type":38,"tag":75,"props":259,"children":260},{},[261],{"type":51,"value":262},"Need to show some text? Layer 1.",{"type":38,"tag":75,"props":264,"children":265},{},[266],{"type":51,"value":267},"Need interaction with multiple elements? Layer 2.",{"type":38,"tag":75,"props":269,"children":270},{},[271],{"type":51,"value":272},"Need windows, live-updating fields, structured\nlayouts, or a temporary full-screen UI? Layer 3.",{"type":38,"tag":43,"props":274,"children":275},{},[276],{"type":51,"value":277},"Most generative UI lives in layers 1 and 2. Layer 3\nis for when you need precise control over what\nappears where, or when you want a fully immersive\nexperience that cleans up after itself.",{"type":38,"tag":202,"props":279,"children":281},{"id":280},"design-patterns",[282],{"type":51,"value":283},"Design Patterns",{"type":38,"tag":285,"props":286,"children":288},"h3",{"id":287},"live-dashboard",[289],{"type":51,"value":290},"Live Dashboard",{"type":38,"tag":43,"props":292,"children":293},{},[294],{"type":51,"value":295},"Combine panels with periodic updates to create a\nreal-time display. Use named spans so you can update\nindividual values without redrawing the whole panel:",{"type":38,"tag":297,"props":298,"children":302},"pre",{"className":299,"code":301,"language":51},[300],"language-text","panel (top, 3 lines):\n  \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\"\n  \" CPU: ████░░░░ 52%  │  MEM: 3.2\u002F8G \"\n  \" Pods: 12 ready     │  Errs: 0     \"\n\nnamed spans:\n  id=\"cpu\"  → \"████░░░░ 52%\"\n  id=\"mem\"  → \"3.2\u002F8G\"\n  id=\"pods\" → \"12 ready\"\n  id=\"errs\" → \"0\"\n",[303],{"type":38,"tag":84,"props":304,"children":306},{"__ignoreMap":305},"",[307],{"type":51,"value":301},{"type":38,"tag":43,"props":309,"children":310},{},[311],{"type":51,"value":312},"When new data arrives, update just the span that\nchanged — e.g., update the \"cpu\" span to \"██████░░ 75%\"\nwithout touching anything else. No flicker, no\nredrawing borders or labels.",{"type":38,"tag":285,"props":314,"children":316},{"id":315},"interactive-browser",[317],{"type":51,"value":318},"Interactive Browser",{"type":38,"tag":43,"props":320,"children":321},{},[322],{"type":51,"value":323},"Let the human explore structured data — files,\ncommits, log entries, API responses. Use an opaque\noverlay as a window:",{"type":38,"tag":297,"props":325,"children":328},{"className":326,"code":327,"language":51},[300],"overlay (width: 40, height: 12, background: dark):\n  \"┌─ Recent Commits ──────────────────┐\"\n  \"│ ▸ 81883ad docs: rewrite README    │\"\n  \"│   8acf8d7 feat: clear screen on   │\"\n  \"│   55719e8 feat: add session detach │\"\n  \"│                                   │\"\n  \"│   ↑↓ navigate  Enter: view diff   │\"\n  \"│   q: close                        │\"\n  \"└───────────────────────────────────┘\"\n",[329],{"type":38,"tag":84,"props":330,"children":331},{"__ignoreMap":305},[332],{"type":51,"value":327},{"type":38,"tag":43,"props":334,"children":335},{},[336],{"type":51,"value":337},"The explicit width and height create an opaque\nrectangle that cleanly covers terminal content behind\nit. On Enter, fetch the diff for the selected commit,\nreplace the overlay content with the diff view,\nand add a \"Back\" option. You're building a mini\napplication from overlays and keystrokes.",{"type":38,"tag":285,"props":339,"children":341},{"id":340},"dialog-window",[342],{"type":51,"value":343},"Dialog Window",{"type":38,"tag":43,"props":345,"children":346},{},[347],{"type":51,"value":348},"Create a modal dialog using an opaque overlay.\nThe background fills the rectangle, giving it a\nsolid, window-like appearance:",{"type":38,"tag":297,"props":350,"children":353},{"className":351,"code":352,"language":51},[300],"overlay (center, width: 50, height: 8, background: dark):\n\nregion writes within the overlay:\n  (1, 2)  \"Confirm Deployment\"        bold\n  (3, 2)  \"Environment:  production\"\n  (4, 2)  \"Version:      v2.4.1\"\n  (5, 2)  \"Containers:   12\"\n  (7, 8)  \"[Y]es\"   green\n  (7, 20) \"[N]o\"    red\n",[354],{"type":38,"tag":84,"props":355,"children":356},{"__ignoreMap":305},[357],{"type":51,"value":352},{"type":38,"tag":43,"props":359,"children":360},{},[361],{"type":51,"value":362},"Region writes place each piece of text at a specific\n(row, col) offset within the overlay. No need to\nconstruct a single spans array with exact spacing —\njust draw each element where it belongs.",{"type":38,"tag":285,"props":364,"children":366},{"id":365},"canvas-rendering",[367],{"type":51,"value":368},"Canvas Rendering",{"type":38,"tag":43,"props":370,"children":371},{},[372],{"type":51,"value":373},"Use region writes to build structured layouts like\ntables, grids, or charts:",{"type":38,"tag":297,"props":375,"children":378},{"className":376,"code":377,"language":51},[300],"overlay (width: 60, height: 15, background: dark):\n\n# Draw headers\nregion write (0, 0):  \"Service\" bold\nregion write (0, 20): \"Status\"  bold\nregion write (0, 40): \"Latency\" bold\n\n# Draw separator\nregion write (1, 0):  \"─\" × 60\n\n# Draw rows\nregion write (2, 0):  \"auth-service\"\nregion write (2, 20): \"● healthy\"   green\nregion write (2, 40): \"12ms\"\n\nregion write (3, 0):  \"api-gateway\"\nregion write (3, 20): \"● degraded\"  yellow\nregion write (3, 40): \"340ms\"\n",[379],{"type":38,"tag":84,"props":380,"children":381},{"__ignoreMap":305},[382],{"type":51,"value":377},{"type":38,"tag":43,"props":384,"children":385},{},[386],{"type":51,"value":387},"Each row and column is independently addressable.\nUpdate a single cell when data changes — no need\nto redraw the entire table.",{"type":38,"tag":285,"props":389,"children":391},{"id":390},"live-updating-status",[392],{"type":51,"value":393},"Live-Updating Status",{"type":38,"tag":43,"props":395,"children":396},{},[397],{"type":51,"value":398},"Combine named spans with periodic updates for\nelements that change independently:",{"type":38,"tag":297,"props":400,"children":403},{"className":401,"code":402,"language":51},[300],"panel (bottom, 1 line):\n  span id=\"status\": \"● connected\"  green\n  span id=\"sep1\":   \" │ \"\n  span id=\"time\":   \"14:32:07\"\n  span id=\"sep2\":   \" │ \"\n  span id=\"count\":  \"47 events\"\n",[404],{"type":38,"tag":84,"props":405,"children":406},{"__ignoreMap":305},[407],{"type":51,"value":402},{"type":38,"tag":43,"props":409,"children":410},{},[411],{"type":51,"value":412},"Update the \"time\" span every few seconds. Update\n\"count\" when events arrive. Update \"status\" if the\nconnection state changes. Each is independent — no\nneed to rebuild the entire status bar.",{"type":38,"tag":285,"props":414,"children":416},{"id":415},"wizard",[417],{"type":51,"value":418},"Wizard",{"type":38,"tag":43,"props":420,"children":421},{},[422],{"type":51,"value":423},"Walk the human through a multi-step process,\nbuilding up configuration or input along the way.\nUse a panel for progress and an overlay for the\ncurrent step:",{"type":38,"tag":297,"props":425,"children":428},{"className":426,"code":427,"language":51},[300],"panel (bottom, 1 line):\n  \" Step 2\u002F4: Configure database ──────\"\n\noverlay (center, width: 35, height: 6, background: dark):\n  \"┌─ Database Type ───────────────┐\"\n  \"│   SQLite                      │\"\n  \"│ ▸ PostgreSQL                  │\"\n  \"│   MySQL                       │\"\n  \"└───────────────────────────────┘\"\n",[429],{"type":38,"tag":84,"props":430,"children":431},{"__ignoreMap":305},[432],{"type":51,"value":427},{"type":38,"tag":43,"props":434,"children":435},{},[436],{"type":51,"value":437},"Each step collects input, updates the progress\npanel, and advances. At the end, summarize all\nchoices and ask for confirmation before acting.",{"type":38,"tag":285,"props":439,"children":441},{"id":440},"contextual-preview",[442],{"type":51,"value":443},"Contextual Preview",{"type":38,"tag":43,"props":445,"children":446},{},[447],{"type":51,"value":448},"Show a preview that updates based on what the\nhuman is doing. Combine monitoring with visual\nfeedback:",{"type":38,"tag":297,"props":450,"children":453},{"className":451,"code":452,"language":51},[300],"# Human is editing a Markdown file\n# Panel shows a simplified rendered preview\n\npanel (bottom, 5 lines):\n  \"━━ Preview ━━━━━━━━━━━━━━━━━━━━━━\"\n  \" # My Document                   \"\n  \" This is the **first** paragraph \"\n  \" - item one                      \"\n  \" - item two                      \"\n",[454],{"type":38,"tag":84,"props":455,"children":456},{"__ignoreMap":305},[457],{"type":51,"value":452},{"type":38,"tag":43,"props":459,"children":460},{},[461],{"type":51,"value":462},"Read the file periodically, render a simplified\nversion, update the panel. The human gets live\nfeedback without switching tools.",{"type":38,"tag":285,"props":464,"children":466},{"id":465},"full-screen-agent-ui",[467],{"type":51,"value":468},"Full-Screen Agent UI",{"type":38,"tag":43,"props":470,"children":471},{},[472],{"type":51,"value":473},"Use alternate screen mode to take over the entire\ndisplay temporarily. Create a fully immersive\ninterface, then exit cleanly:",{"type":38,"tag":297,"props":475,"children":478},{"className":476,"code":477,"language":51},[300],"enter alt screen\n\n# Now working on a clean canvas.\n# Create panels and overlays freely — they exist\n# only in alt screen mode.\n\npanel (top, 1 line):  \"═══ Environment Setup ═══\"\npanel (bottom, 1 line): \" [Tab] next  [Esc] cancel \"\n\noverlay (center, width: 60, height: 20, background: dark):\n  # Your main UI content here\n\n# When done:\nexit alt screen\n# Everything created in alt mode is automatically\n# deleted. The human's original terminal is restored.\n",[479],{"type":38,"tag":84,"props":480,"children":481},{"__ignoreMap":305},[482],{"type":51,"value":477},{"type":38,"tag":43,"props":484,"children":485},{},[486],{"type":51,"value":487},"Alt screen mode is perfect for intensive workflows\nthat need the full terminal — setup wizards,\ndashboards, configuration editors. The human's\nterminal is completely preserved underneath.",{"type":38,"tag":202,"props":489,"children":491},{"id":490},"composition-philosophy",[492],{"type":51,"value":493},"Composition Philosophy",{"type":38,"tag":43,"props":495,"children":496},{},[497],{"type":51,"value":498},"The best generative UI combines layers fluidly. A\ndashboard panel at the bottom. An overlay window when\nthe human needs to make a choice. Named spans for\nlive-updating values. Region writes for structured\nlayouts. Alt screen mode when you need a clean slate.\nEach layer serves its purpose, then gets out of the way.",{"type":38,"tag":285,"props":500,"children":502},{"id":501},"design-principles",[503],{"type":51,"value":504},"Design Principles",{"type":38,"tag":43,"props":506,"children":507},{},[508,513],{"type":38,"tag":47,"props":509,"children":510},{},[511],{"type":51,"value":512},"Fit the terminal aesthetic.",{"type":51,"value":514}," The human chose to work\nin a terminal. Respect that. Use box-drawing characters,\nmonospace alignment, and ASCII art — not emoji-heavy\ndecoration. Clean, functional, information-dense.",{"type":38,"tag":43,"props":516,"children":517},{},[518,523],{"type":38,"tag":47,"props":519,"children":520},{},[521],{"type":51,"value":522},"Build incrementally.",{"type":51,"value":524}," Start with the simplest version\nthat's useful. A one-line panel is better than nothing.\nAdd complexity only when the human needs it or asks\nfor it.",{"type":38,"tag":43,"props":526,"children":527},{},[528,533],{"type":38,"tag":47,"props":529,"children":530},{},[531],{"type":51,"value":532},"Make it disposable.",{"type":51,"value":534}," Every UI element you create\nshould be easy to dismiss and leave no trace. The\nhuman should never have to clean up after your\ninterface. When they're done, everything disappears.\nAlt screen mode is the ultimate expression of this —\nexit and it's as if your UI never existed.",{"type":38,"tag":43,"props":536,"children":537},{},[538,543,545,551,553,559],{"type":38,"tag":47,"props":539,"children":540},{},[541],{"type":51,"value":542},"Adapt to the terminal size.",{"type":51,"value":544}," Read ",{"type":38,"tag":84,"props":546,"children":548},{"className":547},[],[549],{"type":51,"value":550},"cols",{"type":51,"value":552}," and ",{"type":38,"tag":84,"props":554,"children":556},{"className":555},[],[557],{"type":51,"value":558},"rows",{"type":51,"value":560},"\nfrom the screen response. A dashboard designed for\n120 columns is useless on a 80-column terminal. Scale\nyour layouts:",{"type":38,"tag":255,"props":562,"children":563},{},[564,569,574],{"type":38,"tag":75,"props":565,"children":566},{},[567],{"type":51,"value":568},"\u003C 80 cols: minimal, single-column, short labels",{"type":38,"tag":75,"props":570,"children":571},{},[572],{"type":51,"value":573},"80-120 cols: standard layout",{"type":38,"tag":75,"props":575,"children":576},{},[577],{"type":38,"tag":39,"props":578,"children":579},{},[580],{"type":38,"tag":43,"props":581,"children":582},{},[583],{"type":51,"value":584},"120 cols: multi-column, more detail",{"type":38,"tag":43,"props":586,"children":587},{},[588,593],{"type":38,"tag":47,"props":589,"children":590},{},[591],{"type":51,"value":592},"Respond to context.",{"type":51,"value":594}," A generative UI should feel\nrelevant to what's happening right now. A deployment\ndashboard during deployment. A test results browser\nafter a test run. A log viewer when errors appear.\nBuild it when it's needed, tear it down when it's not.",{"type":38,"tag":202,"props":596,"children":598},{"id":597},"pitfalls",[599],{"type":51,"value":600},"Pitfalls",{"type":38,"tag":285,"props":602,"children":604},{"id":603},"dont-build-what-already-exists",[605],{"type":51,"value":606},"Don't Build What Already Exists",{"type":38,"tag":43,"props":608,"children":609},{},[610,612,618,620,626,628,634,635,641],{"type":51,"value":611},"Before generating a custom file browser, check if\n",{"type":38,"tag":84,"props":613,"children":615},{"className":614},[],[616],{"type":51,"value":617},"ranger",{"type":51,"value":619}," or ",{"type":38,"tag":84,"props":621,"children":623},{"className":622},[],[624],{"type":51,"value":625},"lf",{"type":51,"value":627}," is installed. Before building a git\nlog viewer, try ",{"type":38,"tag":84,"props":629,"children":631},{"className":630},[],[632],{"type":51,"value":633},"lazygit",{"type":51,"value":619},{"type":38,"tag":84,"props":636,"children":638},{"className":637},[],[639],{"type":51,"value":640},"tig",{"type":51,"value":642},". Generated UI\nis for gaps — when no existing tool fits the need.\nUse wsh:tui to drive existing tools when they're\navailable.",{"type":38,"tag":285,"props":644,"children":646},{"id":645},"dont-over-engineer",[647],{"type":51,"value":648},"Don't Over-Engineer",{"type":38,"tag":43,"props":650,"children":651},{},[652],{"type":51,"value":653},"A simple overlay that solves the problem in seconds\nis better than an elaborate multi-panel layout that\ntakes minutes to construct. The human is waiting.\nBias toward quick and functional.",{"type":38,"tag":285,"props":655,"children":657},{"id":656},"dont-mix-layers-carelessly",[658],{"type":51,"value":659},"Don't Mix Layers Carelessly",{"type":38,"tag":43,"props":661,"children":662},{},[663],{"type":51,"value":664},"Overlays sit on top of terminal content. If you have\nmultiple opaque overlays stacked, or overlays fighting\nwith panels for attention, the result is confusing.\nBe deliberate about what's visible when. If you need\na clean canvas without worrying about layering, use\nalt screen mode — it gives you a fresh surface where\nyou control everything.",{"type":38,"tag":285,"props":666,"children":668},{"id":667},"test-on-small-terminals",[669],{"type":51,"value":670},"Test on Small Terminals",{"type":38,"tag":43,"props":672,"children":673},{},[674],{"type":51,"value":675},"If you don't know the terminal size, design for 80x24\n— the classic default. Everything you build should\nbe usable at this size, even if it looks better on\na larger terminal.",{"items":677,"total":836},[678,694,710,724,736,748,760,771,787,801,813,825],{"slug":679,"name":679,"fn":680,"description":681,"org":682,"tags":683,"stars":691,"repoUrl":692,"updatedAt":693},"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},[684,687,688],{"name":685,"slug":686,"type":15},"API Development","api-development",{"name":9,"slug":8,"type":15},{"name":689,"slug":690,"type":15},"Voice","voice",78,"https:\u002F\u002Fgithub.com\u002Fdeepgram\u002Fdeepclaw","2026-07-12T08:29:25.371332",{"slug":695,"name":695,"fn":696,"description":697,"org":698,"tags":699,"stars":707,"repoUrl":708,"updatedAt":709},"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},[700,703,704],{"name":701,"slug":702,"type":15},"Automation","automation",{"name":13,"slug":14,"type":15},{"name":705,"slug":706,"type":15},"Security","security",23,"https:\u002F\u002Fgithub.com\u002Fdeepgram\u002Fdglabs-deepclaw","2026-07-12T08:28:49.991939",{"slug":711,"name":711,"fn":712,"description":713,"org":714,"tags":715,"stars":707,"repoUrl":708,"updatedAt":723},"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},[716,717,720],{"name":13,"slug":14,"type":15},{"name":718,"slug":719,"type":15},"Knowledge Management","knowledge-management",{"name":721,"slug":722,"type":15},"macOS","macos","2026-07-12T08:29:01.538106",{"slug":725,"name":725,"fn":726,"description":727,"org":728,"tags":729,"stars":707,"repoUrl":708,"updatedAt":735},"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},[730,731,732],{"name":13,"slug":14,"type":15},{"name":721,"slug":722,"type":15},{"name":733,"slug":734,"type":15},"Task Management","task-management","2026-07-12T08:29:14.035414",{"slug":737,"name":737,"fn":738,"description":739,"org":740,"tags":741,"stars":707,"repoUrl":708,"updatedAt":747},"bear-notes","manage Bear notes via CLI","Create, search, and manage Bear notes via grizzly CLI.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[742,743,744],{"name":13,"slug":14,"type":15},{"name":718,"slug":719,"type":15},{"name":745,"slug":746,"type":15},"Notes","notes","2026-07-12T08:28:51.246011",{"slug":749,"name":749,"fn":750,"description":751,"org":752,"tags":753,"stars":707,"repoUrl":708,"updatedAt":759},"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},[754,755,756],{"name":701,"slug":702,"type":15},{"name":13,"slug":14,"type":15},{"name":757,"slug":758,"type":15},"Monitoring","monitoring","2026-07-12T08:29:02.762321",{"slug":761,"name":761,"fn":762,"description":763,"org":764,"tags":765,"stars":707,"repoUrl":708,"updatedAt":770},"blucli","control BluOS audio playback","BluOS CLI (blu) for discovery, playback, grouping, and volume.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[766,769],{"name":767,"slug":768,"type":15},"Audio","audio",{"name":13,"slug":14,"type":15},"2026-07-12T08:28:21.009637",{"slug":772,"name":772,"fn":773,"description":774,"org":775,"tags":776,"stars":707,"repoUrl":708,"updatedAt":786},"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},[777,780,783],{"name":778,"slug":779,"type":15},"Communications","communications",{"name":781,"slug":782,"type":15},"iMessage","imessage",{"name":784,"slug":785,"type":15},"Messaging","messaging","2026-07-12T08:28:57.517914",{"slug":788,"name":788,"fn":789,"description":790,"org":791,"tags":792,"stars":707,"repoUrl":708,"updatedAt":800},"camsnap","capture frames and clips from cameras","Capture frames or clips from RTSP\u002FONVIF cameras.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[793,794,797],{"name":701,"slug":702,"type":15},{"name":795,"slug":796,"type":15},"Camera","camera",{"name":798,"slug":799,"type":15},"Media","media","2026-07-12T08:28:28.096134",{"slug":802,"name":802,"fn":803,"description":804,"org":805,"tags":806,"stars":707,"repoUrl":708,"updatedAt":812},"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},[807,810,811],{"name":808,"slug":809,"type":15},"Agents","agents",{"name":701,"slug":702,"type":15},{"name":13,"slug":14,"type":15},"2026-07-12T08:28:30.589001",{"slug":814,"name":814,"fn":815,"description":816,"org":817,"tags":818,"stars":707,"repoUrl":708,"updatedAt":824},"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},[819,820,821],{"name":808,"slug":809,"type":15},{"name":701,"slug":702,"type":15},{"name":822,"slug":823,"type":15},"Coding","coding","2026-07-12T08:29:08.6658",{"slug":826,"name":826,"fn":827,"description":828,"org":829,"tags":830,"stars":707,"repoUrl":708,"updatedAt":835},"eightctl","control Eight Sleep pod settings","Control Eight Sleep pods (status, temperature, alarms, schedules).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[831,832],{"name":701,"slug":702,"type":15},{"name":833,"slug":834,"type":15},"Hardware","hardware","2026-07-12T08:28:39.322181",73,{"items":838,"total":914},[839,852,864,875,887,897,903],{"slug":840,"name":840,"fn":841,"description":842,"org":843,"tags":844,"stars":22,"repoUrl":23,"updatedAt":851},"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},[845,846,847,848],{"name":808,"slug":809,"type":15},{"name":701,"slug":702,"type":15},{"name":13,"slug":14,"type":15},{"name":849,"slug":850,"type":15},"Multi-Agent","multi-agent","2026-07-12T08:29:40.028618",{"slug":853,"name":853,"fn":854,"description":855,"org":856,"tags":857,"stars":22,"repoUrl":23,"updatedAt":863},"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},[858,861,862],{"name":859,"slug":860,"type":15},"Architecture","architecture",{"name":701,"slug":702,"type":15},{"name":17,"slug":18,"type":15},"2026-07-12T08:29:38.810244",{"slug":865,"name":865,"fn":866,"description":867,"org":868,"tags":869,"stars":22,"repoUrl":23,"updatedAt":874},"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},[870,873],{"name":871,"slug":872,"type":15},"Authentication","authentication",{"name":13,"slug":14,"type":15},"2026-07-12T08:29:32.614733",{"slug":876,"name":876,"fn":877,"description":878,"org":879,"tags":880,"stars":22,"repoUrl":23,"updatedAt":886},"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},[881,882,883],{"name":701,"slug":702,"type":15},{"name":13,"slug":14,"type":15},{"name":884,"slug":885,"type":15},"MCP","mcp","2026-07-12T08:29:45.869993",{"slug":888,"name":888,"fn":889,"description":890,"org":891,"tags":892,"stars":22,"repoUrl":23,"updatedAt":896},"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},[893,894,895],{"name":701,"slug":702,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},"2026-07-12T08:29:51.485222",{"slug":4,"name":4,"fn":5,"description":6,"org":898,"tags":899,"stars":22,"repoUrl":23,"updatedAt":24},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[900,901,902],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},{"slug":904,"name":904,"fn":905,"description":906,"org":907,"tags":908,"stars":22,"repoUrl":23,"updatedAt":913},"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},[909,910],{"name":13,"slug":14,"type":15},{"name":911,"slug":912,"type":15},"Infrastructure","infrastructure","2026-07-12T08:29:57.659886",12]