Skip to content
Part of the ArchCanvas family

Designs that compile.

A small declarative language that compiles to professional SVG floor plans. Zero-dependency, deterministic, isomorphic.

laneway-house.archcompiled
# A one-bedroom laneway cottage — 49 m² that reads as one program.
#
# Nothing here is positioned by hand. Every opening is pinned to a run distance along a
# named wall (`on <wall> at <pos>`), every fixture resolves against a room or a wall
# (`in <room> anchor …`, `against wall …`), and the bath/bedroom pair is laid out by
# `strip`. `site { street north }` names the two facades the plan turns on: the door
# faces the lane, the glass faces the garden.
plan "Laneway House" {
  units mm
  grid 50            # partitions are 100 thick, so a `flush` fixture lands on a …50
  north up
  dims auto all
  site { street north }

  wall id=w_lane   exterior  thickness 200 { (0,0) (7500,0) }
  wall id=w_east   exterior  thickness 200 { (7500,0) (7500,6500) }
  wall id=w_garden exterior  thickness 200 { (0,6500) (7500,6500) }
  wall id=w_west   exterior  thickness 200 { (0,0) (0,6500) }
  wall id=w_hall   partition thickness 100 { (4200,0) (4200,6500) }
  wall id=w_bath   partition thickness 100 { (4200,2500) (7500,2500) }

  room id=r_live at (0,0) size 4200x6500 label "Living / Kitchen" uses living kitchen
  strip down at (4200,0) gap 0 width 3300 {
    room id=r_bath size 2500 label "Bath"    uses bath
    room id=r_bed  size 4000 label "Bedroom" uses bedroom
  }

  door id=d_front  on w_lane at 2100 width 900 hinge near start swing into r_live
  door id=d_garden sliding on w_garden at 2700 width 1800 slide left
  door id=d_bed    on w_hall at 5600 width 800 hinge left swing into r_bed
  # `w_hall` is walked lane→garden, so `slide right` sends the panel down the solid wall
  # below the jamb; `slide left` would aim it at 500 mm and trip `W_POCKET_RUN`.
  door id=d_bath   pocket on w_hall at 900 width 800 slide right

  window on w_west   at 2400 width 1200
  window on w_garden at 700  width 1000
  window on w_garden at 5850 width 1600
  window on w_east   at 1500 width 600

  furniture fridge       against wall w_west offset 400  in r_live
  furniture stove        against wall w_west offset 1200 in r_live
  furniture kitchen_sink against wall w_west offset 2000 in r_live
  # The rug is an UNDERLAY, drawn before the pieces that stand on it so the sofa and
  # table sit visibly on top rather than hiding it — anchored to the room, like
  # everything else here, never a coordinate.
  furniture rug   in r_live anchor bottom-left inset 400 size 2800x3400
  furniture table  in r_live centered size 1300x900 label "Table"
  furniture sofa   in r_live anchor bottom-left flush inset 250 size 900x2000  label "Sofa"
  furniture bed    in r_bed  anchor bottom-right flush inset 250 size 1500x2000 label "Bed"
  furniture robe   in r_bed  anchor top-left     flush inset 200 size 1800x600  label "Wardrobe"
  furniture shower in r_bath anchor top-right    flush size 900x900
  furniture wc     in r_bath anchor bottom-left  flush size 400x700
  furniture basin  in r_bath anchor bottom-right flush size 600x450

  title { project "Laneway House" drawn_by "ArchLang" date "2026-08-16" }
}
Laneway HouseSheet A-101
Living / Kitchen 27.3 m² Bath 8.3 m² Bedroom 13.2 m² 300 1000 600 1800 1450 1600 950 4200 3300 7700 1900 1200 3600 2500 4000 6700 1750 900 5050 4200 3300 7700 1300 600 4800 2500 4000 6700 100 200 N 02 m PROJECTLaneway HouseDRAWN BYArchLangDATE2026-08-16
The whole language on one sheet — a compiled ArchLang floor plan
A-101Showpiece

The whole language on one sheet

Site orientation, a polygon reading nook and an L-shaped suite, a bowed arc bay, all five door kinds, a shared stair shaft, a void over a double-height living room, a roof overhang, and a mirrored pair of bathrooms composed from one component — a two-storey villa with an attached garage, on one A2 sheet at 1:50. Every room is reachable, every doorway clears.

hillside-villa.archOpen in Playground ↗
Deterministic by design — a compiled ArchLang floor plan
A-102Principle

Deterministic by design

The same source always compiles to byte-identical output — no clocks, no randomness, no I/O. Every loop, conditional and function is evaluated as the drawing is built. This 49 m² laneway house has no hand-placed opening in it: each one is pinned to a run along a named wall, so the numbers are the drawing.

laneway-house.archOpen in Playground ↗
Zero-dependency core — a compiled ArchLang floor plan
A-103Principle

Zero-dependency core

The default SVG path pulls no runtime dependencies. Optional power — PNG raster, vector PDF, angled-wall geometry — loads lazily and is never required. An 11-room courtyard house, 163 m² around an open middle, compiles with nothing installed.

courtyard-house.archOpen in Playground ↗
Professional CAD output — a compiled ArchLang floor plan
A-104Output

Professional CAD output

Layers, line weights, wall poché, openings that void walls, real fixture symbols, dimensions, a north arrow, scale bar and a title block — plus a room schedule and a legend, both derived. Here: a 50 × 32 m library on A2 at 1:200, its column grid and shelf runs written as for loops rather than coordinates. Export to SVG, DXF, PDF or PNG.

library.archOpen in Playground ↗
Not only rectangles — a compiled ArchLang floor plan
A-105Geometry

Not only rectangles

Polygonal rooms measured by exact shoelace area, circular rooms measured as πR², and true arc wall edges — SVG A commands and native DXF arcs, never faceted at any zoom. This pavilion is rectangular nowhere: six trapezoid galleries ring a 28 m² drum.

hexagon-pavilion.archOpen in Playground ↗
Reads its own plans — a compiled ArchLang floor plan
A-106Read-back

Reads its own plans

describe() returns rooms, areas, adjacency, an access graph and circulation facts; lint() flags habitability problems — image-free, so an agent can verify intent without an image. The legend and hatches below are derived the same way: one row per material actually used.

materials.archOpen in Playground ↗

describe() & lint

Reads its own plans

A plan compiles to a drawing — and to facts. describe() returns rooms, areas, adjacency, a modelled access graph and circulation figures; lint() flags habitability and circulation problems. Both are image-free, so an agent can confirm what it drew without rendering a pixel.

GARDEN LOFT · A-201 · SCALE 1:50
Living / Kitchen 21.0 m² Bedroom 9.0 m² Bath 5.0 m² 2850 900 1050 600 1800 4200 2800 7200 3000 1400 800 3200 1800 5200 1600 1800 1700 1200 900 4200 2800 7200 100 200 N 02 m PROJECTGarden LoftDRAWN BYArchLangDATE2026-08-16SCALE1:50
garden-loft.archOpen in Playground ↗
Room schedule← describe()
RoomUseAreaAdj.
Living / Kitchenliving, kitchen21 m²2
Bedroombedroom8.96 m²2
Bathbath5.04 m²2
Total3 rooms35 m²7

3 doors · 4 windows · entrance verified · every room reachable

// built for agents

An interface, not just an image.

ArchLang answers on an agent's own terms. Every arch command takes --json with deterministic exit codes; arch context prints the whole language, workflow and error catalog as one system-prompt-ready bundle (llms-full.txt); and SKILL.md is the write → compile → describe → repair loop it follows. No pixels required to verify intent.