A workspace framework,
drawn to spec.
Hudson is the chrome your apps share — nav, panels, command palette, status bar, voice. Declare what your app is; the framework renders it on iOS, macOS, and the web from the same source.
The component below is a Hudson embed.
The same workspace shell twice. Mock: a stripped-down schematic — same design language, same colors, no recreated content. Live: the real primitives, rendered from the SDK. Same chrome any Hudson app inherits.
Note. Every parameter on this sheet is read from the same manifest.ts the embedded workspace consumes.
A typed object names your app.
id, mode, intents, ports — Hudson reads it like a blueprint.
Intents become voice + ⌘K.
Each entry is indexed for fuzzy match, hotkeys, and the assistant.
Drop in primitives.
Frame, Nav, Panel, Canvas, Status — same chrome every app inherits.
Three surfaces, zero forks.
iOS through TestFlight, macOS notarized, Web via CDN. One command.
Type a phrase. Watch it draw.
A virtual pen plotter renders your words in single-stroke drafting type, then dimensions the result like an engineering specimen. Download the SVG and use it however.
Speak. The chrome understands.
Every intent you declare is searchable — by keystroke, by ⌘K, and by voice. Hudson handles the loop: capture, transcribe, match, dispatch. Your app gets a typed call.
Every intent fuzzy-searched. Open with ⌘K, type three letters, hit return.
Tap-and-hold or hotword. Same intents, no extra wiring per surface.
Assistant reads the result back if the intent declares a voice reply.
Write once. Render on iOS, macOS, and the Web.
id: "talkie",
mode: "canvas",
intents: [12],
surfaces: [
"ios",
"macos",
"web",
],
};
Same primitives, same intents, same chrome dimensions across every target. Hudson swaps the platform layer underneath — Swift on Apple, React on the web — but the components your app declares are identical. Zero forks. Zero "iOS-only" features. Zero per-platform UI debt.
$ ▌
Four apps,
one kit.
Each ships independently — its own brand, its own scope, its own audience. They share Hudson the way print designers share a type system: identical bones, distinct identities.
The whole kit, itemized.
Eight components do every job. They compose, they nest, and they obey the same dimensions on every surface. If you've used one Hudson app, the rest are already familiar.
Chrome root. Hosts nav, panels, canvas, status.
Crumbs, ⌘K, install. Always pinned to top.
Manifest, inspector, file tree. Either side.
Pan/zoom workspace. Floating windows live here.
Live runtime: uptime, intents, logs, version.
Fuzzy-searches every intent. Voice + keys.
Slide-up shell. Natural-language → bash.
AI primitive. Reads capability map, dispatches commands.
End of our drawing. Start of yours.
Seven sheets in, you’ve seen the shape of a Hudson app: manifest, primitives, voice loop, the whole drawing set. Now the drawing ends and the build begins. Three commands and the docs are waiting.
$ bun add hudsonkitOne package. SDK, primitives, and voice in the same import surface.
$ hudson new my-appManifest, app folder, primitives wired up. Ready to run.
$ bun devYour standard dev server. Hudson runs alongside whatever you already use.
Build software the way you'd draw it.