ink

Renders JSON specs into interactive terminal UIs using the Ink renderer for json-render.

1|Updated Jun 30, 2026
One-click install
npx skills add https://github.com/khulnasoft-bot/design.md --skill ink-khulnasoft-bot
Or copy as Structured Prompt for Agent▼
Please help me install this Agent Skill.
Skill: ink
Source: https://github.com/khulnasoft-bot/design.md/tree/main/.agents/skills/ink
Command: npx skills add https://github.com/khulnasoft-bot/design.md --skill ink-khulnasoft-bot

SYSTEM DOCUMENTATION & REQUIREMENTS

💡 This Skill requires @json-render/core, @json-render/ink, zod.

What problem does it solve? Building terminal user interfaces from AI-generated or hand-written JSON specifications requires a renderer that understands component catalogs, state binding, and event handling. This Skill provides the knowledge to turn flat JSON element maps into interactive terminal UIs with the @json-render/ink package, without manually wiring Ink components. ## Core Features & Use Cases - JSON-to-Terminal Rendering: Converts flat element map specs into interactive Ink component trees with standard components like Box, Table, Tabs, Spinner, and Markdown. - State and Data Binding: Supports one-way state reads, two-way $bindState bindings, visibility conditions, dynamic prop expressions, and repeat loops over state arrays. - Streaming and AI Integration: Streams specs progressively via useUIStream and generates AI system prompts from component catalogs for server-side spec generation. - Use Case: An AI agent generates a JSON spec describing a dashboard with tabs, a progress bar, and a table; this Skill guides rendering it as a live terminal UI with keyboard navigation and state updates. ## Quick Start Ask the AI to build a terminal dashboard spec with a heading, tabs, and a table, then render it with @json-render/ink using the standard component catalog.

Frequently Asked Questions about ink

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I render a JSON spec as a terminal UI with Ink?▼

Define a catalog with defineCatalog using the ink schema and standard component definitions, create a registry with defineRegistry, then pass the spec to the Renderer component inside JSONUIProvider. The spec uses a flat element map with a root key.

How to add two-way data binding in json-render terminal forms?▼

Use { "$bindState": "/path" } on the natural value prop of form components like TextInput or Select. Components do not use a statePath prop; two-way binding is handled through the $bindState expression resolved at render time.

What components does @json-render/ink include?▼

It includes layout components (Box, Text, Spacer), content components (Heading, Table, Card, Markdown, Sparkline, BarChart), and interactive components (TextInput, Select, MultiSelect, ConfirmInput, Tabs) with keyboard navigation.

Can I stream AI-generated UI specs to the terminal?▼

Yes, useUIStream progressively renders specs from JSONL patch streams returned by an API endpoint. It returns the current spec, a send function, and an isStreaming flag for loading states.

Does @json-render/ink support external state management?▼

Yes, create a StateStore with createStateStore and pass it to StateProvider or JSONProvider via the store prop. When a store is provided, initialState and onStateChange are ignored, and store updates trigger re-renders.

Why is my terminal UI layout broken in json-render?▼

Box defaults to flexDirection row, so main structures usually need flexDirection column explicitly. Also note Newline must be inside a column-direction Box, and terminal width is typically 80-120 columns.