Inkdown
Start writing

Claude-Code

62 filesยท4 subfolders

Shared Workspace

Claude-Code
codex

14-ink-internals

Shared from "Claude-Code" on Inkdown

Ink Internals & Terminal Rendering

Overview

Ink is a React renderer for terminals. Claude Code uses a customized Ink that handles layout (Yoga), ANSI escape codes, input handling, and screen updates. Understanding Ink is key to understanding the UI.

Plain text
0000_start_here_index_and_recommended_reading_order.md
0100_project_overview_tech_stack_runtime_modes_and_folder_map.md
0200_startup_flow_entry_points_and_cold_start_sequence.md
0300_codebase_modules_layers_state_models_and_schemas.md
0400_system_architecture_and_design_rationale.md
0500_interactive_repl_request_flow_end_to_end.md
0600_headless_sdk_and_print_mode_request_flow_end_to_end.md
0700_mcp_integration_connection_and_tool_call_flow.md
0800_external_services_sdks_storage_and_local_dependencies.md
0900_environment_variables_settings_feature_flags_and_failure_modes.md
1000_non_obvious_patterns_gotchas_and_debugging_traps.md
1100_full_codebase_file_inventory_grouped_by_directory.md
kimi
00-overview.md
01-entrypoints.md
02-state-management.md
03-query-system.md
04-tools-system.md
05-tasks-system.md
06-ui-components.md
07-bridge-remote.md
08-services.md
09-skills-plugins.md
10-commands.md
11-testing-architecture.md
12-permission-system.md
13-build-system.md
14-ink-internals.md
15-git-internals.md
16-context-compaction.md
17-vim-mode.md
18-mailbox-notifications.md
19-session-persistence.md
20-hooks-system.md
21-error-recovery.md
README.md
qwen
00-overview.md
01-entry-points.md
02-query-engine.md
03-tools-and-tasks.md
04-commands-and-skills.md
05-state-management.md
06-ink-rendering.md
07-bridge-remote.md
08-mcp-services.md
09-services-overview.md
10-multi-agent.md
11-system-prompt-constants.md
12-tool-interface.md
13-memory-system.md
14-buddy-companion.md
15-keybindings.md
16-stop-hooks.md
17-vim-mode.md
18-upstreamproxy.md
19-cost-tracking-history.md
20-contexts-styles-onboarding.md
21-hooks.md
22-screens.md
tweets-explain
claude-code-memory-analysis.md
compact
memory-system
agentic-architecture

Core Ink Files

FilePurpose
ink/renderer.tsMain rendering entry
ink/reconciler.tsReact reconciler implementation
ink/layout/yoga.tsYoga layout engine integration
ink/layout/engine.tsLayout calculation
ink/layout/geometry.tsBox geometry types
ink/render-to-screen.tsANSI output generation
ink/termio/Terminal I/O handling
ink/components/Built-in components (Box, Text)
ink/hooks/React hooks (useInput, etc.)

The Ink Node Tree

TypeScript
Tree Structure Example
JavaScript
Plain text

Yoga Layout Engine

Ink uses Yoga (Facebook's flexbox engine) for layout. Same concepts as CSS flexbox, but for terminal cells.

TypeScript
Layout Calculation
TypeScript

The Reconciler

React's reconciler decides what needs to update. Ink provides a custom reconciler.

TypeScript

Rendering to Screen

ANSI Escape Codes
TypeScript
Screen Rendering
TypeScript

Efficient Screen Updates

Diff-Based Updates

Instead of redrawing everything, Ink only updates changed cells:

TypeScript
Alternate Screen Buffer

For fullscreen apps, use alternate buffer (like vim):

TypeScript

Input Handling

Raw Mode
TypeScript
Key Parsing
TypeScript
useInput Hook
TypeScript

Terminal Size Handling

TypeScript

Performance Optimizations

1. Batching Updates
TypeScript
2. Component Memoization
TypeScript
3. Lazy Text Measurement
TypeScript

Text Wrapping

TypeScript

Key Concepts

  1. Yoga Layout: Same as CSS flexbox, but for terminal
  2. Diff Rendering: Only changed cells update
  3. ANSI Codes: Control terminal cursor, colors, styles
  4. Raw Mode: Get individual keystrokes, not line input
  5. Reconciler: React decides what changed, Ink renders it

Debugging Ink

Bash