HUDSON

Build rich, composable,
canvas-friendly,
AI-powered web apps.

Hudson is a shell and primitives library for composing canvas workspaces and single-app dashboards. Provider + Slots  + Hooks — apps own state, the shell renders chrome.

Live / Interactive

The workspace, running inline

HUDSON
Mock
Search…⌘K
Hudson Docs
Building AppsOverview

The HudsonApp interface

Every Hudson app implements a single TypeScript interface. The shell reads your Provider, slots, and hooks — and renders the rest.

interface HudsonApp {
  id: string;
  name: string;
  Provider: React.FC;
  slots: { Content, LeftPanel?, Inspector? };
  hooks: { useCommands, useStatus, ... };
}
Mock fallback·Hudson Docs
Kv0.1
Click to interactSpace + drag to panScroll to zoom⌘K opens the command palette

Built for builders

The Pattern

Provider + Slots + Hooks

  • Apps own their state

    Each app is a React Provider. The shell nests providers and renders slots.

  • Slots, not prescriptions

    Apps declare what they want in the nav, side panels, overlays. The shell composes.

  • Strict TypeScript interface

    Implement HudsonApp and you get chrome, windows, intents, and AI for free.

The Primitives

Canvas · Windows · Chrome

  • Canvas workspace

    Pan, zoom, and windowed apps on an infinite plane. Or static panels for dashboards.

  • Built-in AI + terminal

    Bottom drawer ships with Hudson AI and an embedded PTY terminal.

  • Keyboard-first

    Command palette, focus model, hold-space pan — designed for power users.

Two shells, same primitives

Pick the chrome that fits.

AppShell
Single app
Single app. Full chrome.

For most consumers. A polished frame around one HudsonApp — nav, sidebar, status bar. Use when you're shipping a focused tool.

WorkspaceShell
Multi-app
Multi-app canvas.

Infinite pan/zoom plane with windowed apps. Used by Hudson's own /app route. Use when the interface is the environment.

This is all you need

Implement the HudsonApp interface and plug into any workspace

export interface HudsonApp {
  id: string;
  name: string;
  description?: string;
  mode: 'canvas' | 'panel';

  Provider: React.FC<{ children: ReactNode }>;

  slots: {
    Content: React.FC;
    LeftPanel?: React.FC;
    Inspector?: React.FC;
    Terminal?: React.FC;
  };

  hooks: {
    useCommands: () => CommandOption[];
    useStatus: () => { label: string; color: StatusColor };
    useSearch?: () => SearchConfig;
  };
}
See the full guide →

Stay in the loop

Get notified when the Hudson SDK is available for building your own apps.