→ now boarding
ABOUT OUR DSL

Describe your system the way you think about it.

Basalt is a small declarative language for network, OT and cloud architecture. You write zones, devices and the conduits between them in plain text — Basalt turns it into a living, versionable diagram of your architecture.

Explore the language ↓code ⇄ canvas — live
factory.bslt
zone "Enterprise Network" [level: 4-5, color: blue] {
ERP System [icon: sap-erp]
Corporate Firewall [icon: cisco-fw]
}
zone "Industrial DMZ" [level: dmz, color: orange] {
Historian Mirror [icon: historian]
}
zone "Control Network" [level: 2-3, color: purple] {
SCADA Server [icon: scada]
}
 
Corporate Firewall > DMZ Firewall [firewall, conduit: HTTPS:443]
SCADA Server > Main PLC [conduit: EtherNet/IP:44818]
▢
01 → ZONES

Zones draw the boundaries.

A zone is the top-level container of a Basalt file — a network segment, a security tier, a cloud account. Everything you declare lives inside one, and Basalt renders each zone as a distinct region with its own color and border. Add [level:] for the Purdue hierarchy — 0 is the physical process, 5 is the enterprise.

// a zone per trust boundary
zone "Enterprise Network" [level: 4-5, color: blue] {
ERP System [icon: sap-erp]
Corporate Firewall [icon: cisco-fw]
}
 
zone "Industrial DMZ" [level: dmz, color: orange] {
Historian Mirror [icon: historian]
}
→ solid ground
LAYERED, LIKE STRATA
Zones stack and never overlap — Purdue levels render as clean horizontal bands, enterprise at the top, process at the bottom.
level
Purdue level 0–5, a range like 4-5, or dmz. Drives the level banding on the canvas — the attribute generic tools don’t have.
color
blue = IT, orange = DMZ, purple = control, green = field, yellow = devices. Nodes inside inherit the tint.
group
Same syntax, minus the level — for cloud accounts or logical clusters that don’t sit on the Purdue ladder.
▣
02 → CELLS

Nest structure inside structure.

A cell is a process area inside a zone — an assembly line, a plant subsystem. Where zones are network tiers, cells group what’s physically together: a local controller plus the sensors and actuators around it.

zone "Field Network" [level: 1, color: green] {
Main PLC [icon: allen-bradley]
cell "Assembly Line" {
Assembly PLC [icon: plc]
Assembly Robot Controller [icon: robot-controller]
Assembly Sensors [icon: sensor]
}
}
Process areas, not tiers
A cell is everything physically on the line — as opposed to a zone, which is a network or security boundary. Two zones can each have their own “Welding” cell; Basalt keeps them distinct.
Fully wired in
Cell devices connect cleanly up to the broader field network — a local controller’s traffic flows out to the rest of the diagram, no isolated islands.
→ nests all the way down
⚬
03 → EDGES

Edges are the story.

An edge is a directed connection between two nodes — a call, a stream, a control link. Direction is part of the syntax: source > target, and the arrowhead lands on the target. Edges cross zones freely — that top-to-bottom flow is the whole point of a correct diagram.

→ two nodes, one stream
EVERY PATH, TRACED
Basalt routes edges around zones automatically — orthogonal, obstacle-avoiding, no manual waypoints.
Corporate Firewall > DMZ Firewall [firewall, conduit: HTTPS:443]
DMZ Firewall > SCADA Server [firewall, conduit: OPC-UA:4840]
SCADA Server > Main PLC [conduit: EtherNet/IP:44818]
 
// fan-out: one source, many targets
Assembly PLC > Assembly Sensors, Assembly Actuators [conduit: PROFINET]
conduit
The protocol pill rendered on the line — OPC-UA:4840, PROFINET, MQTT:8883, Modbus, EtherNet/IP, HTTPS:443.
firewall
Marks an inspected boundary crossing. The compliance validator checks it on every IT/OT boundary edge.
A > B, C
Fan-out — a comma sends one source to many targets in a single line.
○
04 → NODES

Nodes are the things that run.

Services, databases, PLCs, sensors, people — a node is anything worth a box on the map. Declare it inside a zone with a name and an icon. The name is both the label you see and the identifier edges reference.

zone "Control Network" [level: 2-3, color: purple] {
SCADA Server [icon: scada]
HMI Station [icon: hmi]
Engineering Workstation [icon: workstation]
Plant Historian [icon: osisoft-pi]
}
The name is the id
The display name doubles as the identifier in edges — SCADA Server > Main PLC reads exactly like the boxes it connects. Unresolved icon slugs render as a visible subtitle, so a typo shows on the canvas instead of failing silently.
Smart about physical devices
List the same device in a cell and again in a flat field zone, and Basalt merges them into one — field devices (sensors, actuators, robots) sink to the lowest Purdue level, controllers (PLC, HMI, SCADA) rise to the control level. Edges rewire to the survivor automatically.
→ everything that runs
◇
05 → ICONS

A shared visual vocabulary.

Basalt ships a built-in library of 1,900+ icons — AWS, Azure, GCP, Cisco, PLC and SCADA vendors, plus industrial, hardware and security glyphs. Search by keyword and drop one in with [icon: slug].

The built-in icon picker — searchable, categorized
ONE SET, EVERY DIAGRAM — twelve categories: AWS · Azure · Cisco · GCP · Generic · Hardware · Industrial · Patterns · PLC · SAP · SCADA · Security.
ERP System [icon: sap-erp]
Corporate Firewall [icon: cisco-fw]
SCADA Server [icon: scada]
Main PLC [icon: allen-bradley]
Plant Historian [icon: osisoft-pi]
Azure IoT Hub [icon: iot-hub]
⇄ TWO-WAY BY DESIGN

Edit either side. Both stay in sync.

Change the code and the canvas updates. Drag a node, rename a device, draw or delete an edge — it writes straight back to the code. Most diagram-as-code tools render one way; Basalt is a true round trip.