Appearance
FlowPad package boundaries
@open-matrix/flowpad is intentionally narrow. It owns the editor, the run loop, the panes, and a small set of in-page services. Everything else is a workspace dependency or a runtime mount it talks to over the bus.
What lives inside the package
projects/matrix-3/packages/flowpad/src/ (entire tree):
src/
├── FlowpadApp.ts # The MatrixActor; orchestrates examples + run loop
├── index.ts # Re-exports + customElements.define for every shell
├── index.html # The mount point
├── components/ # Pane components (each is actor + shell pair)
│ ├── PipelineEditor.ts # Editor with auto Flow/LISP detection
│ ├── ResultsPanel.ts # Results manager — adds children per result
│ ├── ExecutionStatus.ts # Status bar + topology summary
│ ├── TransportLog.ts # Log of bus messages observed in the page
│ ├── FlowpadControl.ts # Header strip / labelled frame
│ ├── addressing.ts # resolveMountAddress() helper
│ └── sidebar/ # FlowpadSidebar + ActorTree + PackageBrowser + ExampleList
├── shell/ # FlowpadAppShell + projectCatalog + transport-indicator
├── dsl/ # parseFlowDSL + DSL_EXAMPLES + query-catalog + validateExamples
├── runtime/ # queryPipeline.ts — IR + executeCanonicalIR
├── services/ # In-page service actors (MockDb, FlowRunner, SecurityRealm, TopicClaim)
├── projects/ # Six bundled "projects" (database, federation, lisp, security, serialization, vlm)
├── template/ # flowpad.template.ts — the page HTML
├── styles/ # flowpad.styles.ts
├── config/defaults.ts # FLOWPAD_DEFAULTS
└── vlm/ # VLM visualization shellThat is the boundary: anything not in this tree is somebody else's package.
What FlowPad imports from elsewhere
package.json declares a single workspace devDependency (projects/matrix-3/packages/flowpad/package.json:42-46):
json
"devDependencies": {
"@open-matrix/core": "workspace:*",
"tsx": "^4.15.6",
"vite": "^6.0.0"
}Inside src/, FlowPad imports from @open-matrix/core/... deeply. The cross-package imports are limited to:
@open-matrix/core/core/MatrixActor— base class for all actors.@open-matrix/core/framework/MatrixActorHtmlElement— base for the shells.@open-matrix/core/framework/components/index—MxSplit,MxDock,MxTheme.@open-matrix/core/flow/FlowBuilder— fluent builder used byrunFlow.@open-matrix/core/flow/viewers— DataViewer, TableViewer, TreeViewer, ErrorViewer (the result viewers ResultsPanel mounts as children).@open-matrix/core/engine/remoting/RequestReply— used by_executeRemoteCall.@open-matrix/core/engine/core/IMatrixContext— context type.@open-matrix/core/serialization— five-representation parity (HTML / Fluent / JSON / S-expr / Topics).@open-matrix/core/lisp— the canonical LISP/Scheme/VLM evaluators (LispEval,SchemeEval,BootstrapNode,parseSExpr, etc.).@open-matrix/core/browser/HostedRuntimeRecoveryandHostedRuntimeTarget— the page reads its target authority root from the host element.
Note: Rule 9 of
CLAUDE.mdforbids cross-package../../imports. FlowPad obeys this — every cross-package reference is an@open-matrix/core/...subpath that goes through the package's declared exports.
What FlowPad does NOT own
These are common confusions. They are not part of @open-matrix/flowpad:
- Director, Smithers, Chat, Inference Settings, Matrix Web, Matrix Edge. These are sibling packages. FlowPad neither launches them nor loads code from them.
- Host-service supervision. FlowPad has no daemon. The retired daemon path is forbidden product surface; FlowPad's lifecycle is the browser's.
- Auth. FlowPad does not perform login; it accepts an authority root passed in by the page bootstrap and uses whatever credentials the surrounding shell already established.
- Bundled NATS. The transport is provided by the surrounding page (browser WebSocket to the Host's
/nats-wsfor federated mode, or InMemory for standalone test pages). Seetransport-indicator.ts. - The 1270-line
dsl/examples.tsbody is bundled, but the runtime "projects" (src/projects/database/,lisp/,security/,serialization/,vlm/,federation/) are loaded at runtime byshell/projectCatalog.tsfromdist/projects/<id>/manifest.json. That means the catalog can be replaced by an external package or a user-supplied root URL without rebuilding FlowPad.
Project catalog and external roots
projectCatalog.ts (projects/matrix-3/packages/flowpad/src/shell/projectCatalog.ts:115-166) accepts multiple ProjectCatalogRootConfig entries. The default is the bundled root:
ts
const DEFAULT_PROJECT_ROOT: ProjectCatalogRootConfig = {
id: 'flowpad-projects',
label: 'FlowPad Projects',
baseUrl: new URL('./projects/', FLOWPAD_BASE_URL_STR).toString(),
projectIds: ['database', 'federation', 'lisp', 'security', 'serialization', 'vlm'],
source: 'bundled',
};Additional roots — matrix (the package authority's system.catalog) or user (a user-supplied URL serving the same manifest contract) — can be passed to loadProjectCatalog to surface their packages and examples in the FlowPad sidebar without code changes.
Versioning and shipping
@open-matrix/flowpad ships its compiled browser bundle in dist/ plus dist-path.js (an export entry that other packages can use to find the on-disk path of FlowPad's assets). The webapp block in matrix.json tells the gateway how to mount it: appName=flowpad, served as /apps/flowpad/, with displayName=FlowPad and navOrder=40.
See also
Source:
projects/matrix-3/packages/flowpad/package.json,projects/matrix-3/packages/flowpad/matrix.json,projects/matrix-3/packages/flowpad/src/index.ts.