PishPosh is a lightweight, pure-DOM visual programming environment with modular plugin architecture. Users build βprogramsβ by placing stations (nodes) and connecting them (edges). It uses reactive signals and event-driven agents for computation and data flow.
SubwayBuilder (Web Component)
ββ Application (core)
ββ GridPlugin
ββ ToolboxPlugin
ββ PanZoomPlugin
ββ StationPlugin
ββ ConnectPlugin
ββ ConnectionLinePlugin
ββ MoveStationPlugin
ββ AgentLibraryPlugin
ββ AgentsPlugin
ββ AgentChooserPlugin
ββ PropertiesPanelPlugin
Each plugin adds one cohesive feature β from visuals and interaction to agents and metadata β allowing for clean, feature-by-feature extension.
-
Application.js sets up the main SVG canvas (
<svg id="svg-canvas">) and provides:use(plugin): loads a plugininit(): initializes all pluginsgraph: instance of reactiveGraph(nodes & connections)- Event bus with
on(event, handler)andemit(event, data)
-
GridPlugin
- Renders a tile-based grid behind everything
- Updates automatically when panning/zooming happens
-
ToolboxPlugin
- Renders a floating toolbar with tool icons
- Emits
toolSelectedwhen user switches between select / station / connect modes
-
PanZoomPlugin
- Enables click-drag panning and wheel zooming of the SVG viewBox
- Emits
viewBoxChangedto trigger grid redraw
-
StationPlugin
- Handles creating stations (nodes) when in station-mode
- Renders circles and labels and hooks them into the reactive graph
-
ConnectPlugin
-
Enables βconnectingβ mode:
- Press down on a station, drag to another, then release to create a connection
-
Draws a temporary line during interaction
-
-
ConnectionLinePlugin
- Listens on
connectionAdded/Removed - Renders permanent lines and labels, reacts to station moves
- Follows a similar reactive pattern to StationPlugin
- Listens on
-
MoveStationPlugin
- Moves existing stations by dragging in select mode
- Snaps movement to the grid
-
AgentLibraryPlugin
- Registers agent types (e.g.,
TimerAgent,GraphAgent) - Agents are small event-driven objects that can
send,receive, and emit data
- Registers agent types (e.g.,
-
AgentsPlugin
- Instantiates agents for each node or connection using
Graphmetadata - Routes agent I/O via the application event bus (
agentCreated,agentOutput, etc.)
- Instantiates agents for each node or connection using
-
AgentChooserPlugin
- Renders a draggable palette of available agent types
- Drag an agent type onto the map to create a new node with that agent attached
- PropertiesPanelPlugin
- Displays selected station/connection properties (position, label, agent)
- Supports live editing
1. Installation
npm install pishposh
# or clone the repo:
git clone https://github.com/catpea/pishposh.git2. Add to your HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="styles.css">
</head>
<body>
<subway-builder></subway-builder>
<script type="module" src="./SubwayBuilder.js"></script>
</body>
</html>3. Interact!
- π Switch tools via the toolbar
- βͺ Click in station mode to add nodes
- π Drag in select mode to pan or move nodes
- π In connect mode, drag from one station to another
- π§ͺ Use the Agents panel to assign agents (e.g., TimerAgent, GraphAgent)
- βοΈ Inspect and edit station/connection properties in the Properties panel
- Modular structure: combine only what you need
- Pure DOM + SVG: no dependencies, full control
- Reactive & event-driven: clear flow of data between UI and agents
- Self-hosted computing: nodes can introspect or mutate the graph itself (via GraphAgent)
- Great starter/project learning: accessible, extendable, and fun to hack