React package / AI-native terminal / typed output
Signal Terminal
An embeddable terminal for web applications where command output can become structured text, charts, tables, file
previews, graphs, JSON inspectors, and LLM-ready insight without leaving the shell flow.
Product shape
Signal Terminal is prepared as a React component, not a full desktop shell. It has no application window chrome,
title bar, traffic-light buttons, side panels, or dashboard wrapper. Host applications can place it inside any
page, workspace, or VM-backed container and provide the data, file, model, and command bridges they trust.
- Embeddable React component exported as
@signal-terminal/react.
- Typed transcript renderer with visual blocks inside normal scrollback.
- Host-owned data objects, remote data adapters, and LLM bridge.
- Production boundary where privileged VM/file access is supplied by the host app.
$ data inspect orders
regionlatencystatus
east128msok
west212mswarn
eu154msok
$ build me a graph detailing latency by region
$
Output flow
Shell rhythm stays intact while output becomes structured UI.
The host owns privileged bridges and data access. Signal Terminal owns the transcript experience: command input,
typed output validation, rich rendering, and a prompt that resumes under the result.
Command
User asks in shell
Normal terminal input remains the primary interaction surface.
Bridge
Host resolves access
Data, files, model calls, and VM execution stay behind host-owned adapters.
Type
Output is validated
Tables, charts, JSON, markdown, and graph specs pass through typed render contracts.
Render
Transcript gets richer
Structured UI blocks appear inline without turning the terminal into a dashboard.
Resume
Prompt continues
The next command starts directly beneath the output, preserving terminal flow.
Embedding API
import { TerminalApp } from '@signal-terminal/react';
import '@signal-terminal/react/styles.css';
<TerminalApp config={config} />
Host-owned integration
Host applications wire data in through dataObjects for in-memory page/session objects or
dataBridge for remote objects, VM files, database-backed resources, and app-specific systems. LLM
integration is also host-owned through llmModels and an llmBridge that returns typed
terminal outputs.
Terminal behavior
The prompt resumes beneath the work.
Commands appear in scrollback, status lines stream inline, visual blocks remain part of the transcript, and the
active prompt resumes immediately beneath charts, tables, graphs, file previews, and structured analysis. The
point is to keep shell rhythm while letting output become richer than text.
Output blocks
- Text, markdown, and code blocks.
- Tables, JSON inspectors, and file previews.
- Vega-Lite-shaped charts and ECharts-shaped graphs.
- Status lines and inline error blocks.
- LLM-created commands registered for the current terminal session.
Useful commands
ai help
data list
data inspect <id>
model list
model set <id>
theme set midnight
theme set matrix
clear
Production boundaries
- No bundled sample datasets or auto-running commands.
- Local file access routes through host-provided bridge interfaces and fails closed when not configured.
- AI requests route to the host
llmBridge instead of placeholder analysis.
- Visualization renderers validate structured output specs and fail safely inline.
- PTY execution, VM file access, and privileged tools are supplied by the host app.
Publishing
npm run build --workspace apps/desktop
npm pack --workspace apps/desktop
npm publish --workspace apps/desktop --access public
Package contract
The package build emits dist/index.js, dist/index.cjs, dist/index.d.ts, and
dist/styles.css. React and React DOM stay as peer dependencies, so host applications import the
component and stylesheet while keeping ownership of runtime configuration.
Why it belongs
Signal Terminal is another version of the same systems instinct: make powerful workflows embeddable, typed,
inspectable, and safe at the edges. The interesting part is not pretending a terminal is a dashboard; it is
letting the terminal speak richer UI when the output deserves it.