Open-Source DSL

Declarative BIM scripting
for agentic workflows

Lite-STEP is a Python-based scripting language designed for Building Information Modeling with explicit optimization for LLM code generation. Semantically complete interface to IFC 4.3 through primitives structured for reliable AI output.

From code to building

A four-storey apartment block with 32 windows and an entry door — defined in 35 lines. The DSL compiles to IFC, the open standard for BIM data exchange.

Live 3D Preview
📄 apartment.py
from lite_step.models import Slab, Roof

bldg = Building(name="Modern Apartment Block")
L, W, t, h, floors = 18000, 10000, 250, 3200, 4
bx, bz = I(L/2), I(W/2)

bldg.add(create_flat_site(length_x=L, width_z=W))
bldg.add(Slab(start=Point(x=-bx-400, y=0, z=-bz-400),
    end=Point(x=bx+400, y=400, z=bz+400), type="foundation", id="fdn"))

faces = [("south",-bx,-bz,bx,-bz+t), ("north",-bx,bz-t,bx,bz),
         ("east",bx-t,-bz,bx,bz), ("west",-bx,-bz,-bx+t,bz)]

for f in range(floors):
    y = 400 + f * h
    if f > 0:
        bldg.add(Slab(start=Point(x=-bx, y=y, z=-bz),
            end=Point(x=bx, y=y+200, z=bz), type="floor", id=f"slab_{f}"))
    for face, x1, z1, x2, z2 in faces:
        wall = Wall(id=f"{face}_f{f}")
        wall.add(Solid(start=Point(x=x1, y=y, z=z1),
            end=Point(x=x2, y=y+h, z=z2), type="wall", id=f"body_{face}_{f}"))
        if face in ("south", "north"):
            for i, xo in enumerate(range(2000, L, 4000)):
                wall.add(Window(offset=xo, sill=800, width=2400, height=2000,
                    id=f"w_{face}_{f}_{i}"))
        if f == 0 and face == "south":
            wall.add(Door(offset=I(L/2)-600, sill=0, width=1200, height=2400,
                id="entry"))
        bldg.add(wall)

roof = Roof(id="roof")
y_top = 400 + floors * h
roof.add(Solid(start=Point(x=-bx-200, y=y_top, z=-bz-200),
    end=Point(x=bx+200, y=y_top+300, z=bz+200), type="roof", id="roof_body"))
bldg.add(roof)

result = bldg

Six design principles

Derived from empirical testing of LLM code generation behavior. Each principle eliminates a class of errors that models handle poorly.

Integer-only coordinates

Millimeter integers for all spatial coordinates. Eliminates floating-point rounding ambiguity that propagates through generated code.

🔖

Mnemonic identifiers

Human-readable IDs like wall_north_01 instead of GUIDs. Models generate these reliably and the code remains interpretable.

🐍

Python syntax

LLM training corpora contain substantially more Python than proprietary DSLs. Models generate syntactically correct Python at higher rates.

🛠

Construction Noun primitives

Seven semantic primitives (Solid, Panel, Profile, …) that carry intent. A Profile implies structural linearity; a Panel implies planar enclosure — no ambiguity.

🌐

Three.js/glTF conventions

Right-handed Y-up coordinate system matches the 3D graphics convention most represented in training data. Correct transformations more frequently.

🏗

Full IFC 4.3 coverage

Maps directly to IFC entity types. A wall is a semantic wall object, not a geometric extrusion that must be separately classified.

Geometry primitive classification

Lite-STEP abandons generic computer graphics terminology in favor of a Construction Noun philosophy. Every generated object carries intent — eliminating the “geometric hallucination” common in generic mesh generators. The system reduces the vast IFC geometric landscape into seven distinct, predictable primitives.

Lite-STEPDescriptionIFC Equivalent
SolidGeneric mass/boxIfcExtrudedAreaSolid, IfcFacetedBrep
PanelFlat, thick sheetIfcExtrudedAreaSolid, IfcPlate
ProfileLinear extrusionIfcExtrudedAreaSolid, IfcBeam/IfcColumn
Swept SolidExtrusion along a curveIfcSurfaceCurveSweptAreaSolid
Revolved SolidShape spun around an axisIfcRevolvedAreaSolid
MeshExplicit vertices/facesIfcTriangulatedFaceSet, IfcPolygonalFaceSet
PipeTubular segment with flowIfcSweptDiskSolid

Bold primitives are implemented and available. Others are planned for upcoming releases.

Unified positioning & modification

Regardless of the primitive used, any element can be positioned via three mutually exclusive methods — decoupling geometry from location.

🌎

Global (Method 1)

Absolute world coordinates (XYZ). Ideal for primary structures and site context. Walls, foundations, and roof faces are placed directly in world space.

Solid(start=Point(x=-6000, y=0, z=-4000),
      end=Point(x=6000, y=3000, z=-3700),
      type="wall", id="south_wall")
🔄

Local (Method 2)

Self-contained definitions placed via a local Transform. Optimized for repetitive furniture, equipment, or prefab components.

element = Block(...,
    placement=Transform(
        location=Point(x=2000, y=0, z=3000),
        rotation_y=90))
🔗

Anchor (Method 3)

Relative positioning defined by an offset from a host element. Essential for parametric relationships like windows and doors on walls.

Window(offset=2000, sill=900,
       width=1200, height=1400,
       id="win_south_1")

Chainable modifiers

Interaction between elements is standardized through three chainable modifiers. Geometric operations are separated from semantic nesting, ensuring valid IFC relationship mapping.

.cuts()

Boolean difference. Subtract geometry from an element. Used for door openings, stair voids, duct chases.

.adds()

Boolean union. Merge geometry into an element. Used for corbels, extensions, composite shapes.

.fills()

Semantic fill. Creates void + fill for hierarchical assembly. Used for placing windows and doors in walls.

Competitive position

Existing tools optimize for human productivity within specific software ecosystems. Lite-STEP optimizes for LLM output reliability across the IFC standard.

FeatureDesignScriptHypar.ElementsLite-STEP
Compact syntaxYesYes
Python-basedYes
Math/plugin librariesYesYes
Open sourceYesYes
LLM-optimizedYes
BIM semanticYesYes
Standalone runtimeYesYes
LightweightYes

* DesignScript is open source but requires the proprietary Dynamo runtime for practical use.

Roadmap

Development proceeds in three phases.

Current

Phase 1: Core Language

Complete primitive coverage for IFC 4.3 geometric representations. Validation against reference IFC files. Open-source release of parser and compiler.

Phase 2: Workflow Integration

Helper function libraries for common design patterns. Bidirectional compilation to/from IFC STEP format. Native integration with open-source BIM tools (BlenderBIM, FreeCAD).

Phase 3: Ecosystem

Open-source validators for code correctness. Parametric libraries for regional building codes. Profile libraries for standard construction assemblies.

Language reference

Core building blocks of the Lite-STEP DSL. All coordinates are integer millimeters. Right-handed Y-up coordinate system (Three.js/glTF convention).

Building(name)

Root container for all building elements. Every script assigns a Building to result.

Solid(start, end, type, id)

3D solid volume. Box mode (start/end corners) or contour mode (contour + thickness). Foundations, walls, site volumes, roofs.

Panel(contour, profile, id)

Flat sheet extruded along its normal. Catalog profile or direct thickness. Floor slabs, decks, glass.

Profile(shape, start, end, id)

Linear extrusion with constant cross-section from catalog. Studs, beams, columns, rafters.

Wall(id)

Assembly container for a body Solid + Window/Door children. Automatic IFC opening creation.

Window(offset, sill, width, height, id)

Window assembly positioned on a parent Wall by offset along the wall baseline.

Door(offset, sill, width, height, id)

Door assembly positioned on a parent Wall. Same positioning model as Window.

create_flat_site(length_x, width_z)

Helper: generates flat terrain pad centered at origin with configurable margins.

create_sloped_site(length_x, width_z, slope_angle_centideg, slope_direction)

Helper: sloped terrain with foundation cutout. Automatic boolean cut for slope surface.

Get in touch to access our lite-paper: