Package Structure
Klaxon is a pnpm monorepo with Rust and TypeScript packages.
klaxon/
├── crates/
│ └── klaxon-server/ # Rust cloud server
├── packages/
│ ├── protocol/ # @ottercoders/klaxon-protocol — Zod schemas
│ ├── common/ # @ottercoders/klaxon-common — shared UI library
│ ├── ui/ # @klaxon/ui — desktop client entry point
│ └── web/ # @klaxon/web — browser web app
├── apps/
│ └── klaxon-mobile/ # Expo React Native mobile app
├── deploy/
│ └── helm/klaxon/ # Kubernetes Helm chart
└── docs/ # VitePress documentationPackage Dependency Graph
@ottercoders/klaxon-protocol (Zod schemas — no deps)
↑
@ottercoders/klaxon-common (components, hooks, api, utils)
↑
┌────┼────┐
↑ ↑ ↑
@klaxon/ui @klaxon/web klaxon-mobile
(desktop) (browser) (Expo app)Package Details
@ottercoders/klaxon-protocol (packages/protocol/)
The TypeScript contract between server and clients. Contains only Zod schemas — no React, no DOM, no side effects.
KlaxonItemSchema— 28 fieldsFormFieldSchema— discriminated union of 18 field typesAppSettingsSchema— settings with defaultsOrgIdSchema,UserIdSchema,AgentIdSchema,ActorTypeSchema— cloud identity types
No build step. main and types point at src/index.ts directly.
@ottercoders/klaxon-common (packages/common/)
Shared component library used by all client apps. Contains:
- API transport (
api.ts):invoke()maps command names to REST calls,listen()emits WebSocket events - Components: FormField (15 types), FormWizard, HistoryCard, ContextMenu, SnoozePicker, DateRangeChips, KeyboardHelp, UndoToast
- Widgets: MainWidget (full sidebar/list/detail), SettingsWidget, TemplatesTab
- Hooks:
useEvent,useEvents,useInvoke,useRefreshOnVisible,useKeyboardShortcuts - Utils:
relTime,levelColor,priorityLabel,deadlineLabel - Styles: CSS variables with theme support (dark/light/dracula/nord)
No build step. Consumers resolve TS source directly via moduleResolution: "Bundler".
@klaxon/ui (packages/ui/)
Desktop client — a thin Vite entry point that renders <MainWidget /> from common. One file: src/main.tsx.
@klaxon/web (packages/web/)
Browser web app — same as desktop but runs on port 5173. Identical <MainWidget /> render.
klaxon-mobile (apps/klaxon-mobile/)
Expo React Native app with its own component set (form renderers adapted for React Native). Shares @ottercoders/klaxon-protocol types but does not use @ottercoders/klaxon-common (which depends on react-dom).
klaxon-server (crates/klaxon-server/)
Rust binary. Not a workspace package visible to pnpm — built with Cargo separately.
Adding a New Component
- Create it in
packages/common/src/components/ - Export it from
packages/common/src/index.ts - Import it from
@ottercoders/klaxon-commonin any client app - Add tests in
packages/common/src/__tests__/