Skip to content

Examples

Every complete plan in the repository's examples/ directory, live and editable — edit the source on the left and the SVG on the right recompiles instantly (client-side, deterministic, no server). Hit Open in Playground to keep going with the full editor.

They are ordered as a tour rather than an inventory: a plan you can read in one screen first, then houses, then the large public buildings, then the drawings that exist to prove one language feature. Every figure quoted below comes from arch describe --json on the file itself, so the prose and the drawing cannot disagree.

Two things worth knowing before you start. A plan written as level blocks compiles to one drawing per storey, and a live widget shows page 1 — the lowest storey, which is what compile().svg returns; the whole set is in compile().pages, and arch describe --level 2 --json reads a specific floor. And the playground's theme selector restyles any plan — blueprint, dark, mono, presentation — without touching a line of its source, because a theme changes inks and hatches, never geometry.

The whole language on one sheet

Hillside Villa

The showpiece: a two-storey villa with an attached garage, drawn on one A2 sheet at 1:50. The widget below shows page 1 — the ground floor, 11 rooms, 196.54 m² (arch describe --json); the upper floor adds nine more rooms over 140.76 m² (arch describe --level 2 --json).

It is the plan to read when you want to see how the surfaces above fit together rather than in isolation: site { street north } names the facades a plot orientation lint rule can reason about; a room … polygon chamfers a reading nook off the study and an L-shaped master suite wraps its own ensuite; an arc wall edge bows a bay window off the living room; every door kind ships somewhere a builder would actually put it — hinged, sliding, pocket, bifold, barn; a stair carries the same id on both level blocks, so it is one shaft, not two symbols that happen to line up; a void opens a double-height gap over the living room; roof overhang draws the eaves on the upper storey; and a component authored once — ensuite() { … } — is placed twice with mirror x, so a pair of bathrooms share one definition and face opposite ways.

arch lint still raises three warnings on it, on purpose: a bathroom reachable only through a bedroom, and two bedrooms whose windows don't face the equator side. Every room is reachable and every doorway clears — the warnings are left in and named in the source as the honest cost of a real site, not something the plan was tuned to hide.

SOURCE / .ARCH
1 2 3 4 5 A B C D UP Garage 34.1 m² Utility 22.0 m² Powder 4.4 m² Pantry 8.4 m² Study 16.5 m² Entry 16.8 m² Living 28.8 m² Dining 19.2 m² Kitchen 23.2 m² Terrace 11.6 m² Service Hall 11.6 m² Terrace 5.8 x 2.0 m 2500 900 2550 1000 3800 1800 7050 4000 4000 2000 3800 19600 2600 1600 6000 10500 1450 3000 1350 700 400 700 400 700 2350 1200 4750 900 1700 4000 4000 2000 3800 19600 2900 900 950 1200 800 1200 700 1400 450 2600 1600 6000 10500 R2000 100 200 300 ROOM SCHEDULE NO. NAME AREA (m²) Service wing 01 Garage 34.10 02 Utility 22.00 03 Powder 4.40 04 Pantry 8.36 SUBTOTAL 68.86 Living wing 05 Study 16.48 06 Entry 16.80 07 Living 28.80 08 Dining 19.20 09 Kitchen 23.20 10 Terrace 11.60 11 Service Hall 11.60 SUBTOTAL 127.68 TOTAL 196.54 LEGEND poche wc basin kitchen_sink counter stove fridge armchair coffee_table tv_unit dining_table barstool desk office_chair bookshelf dishwasher island upper_cabinet washer dryer plant car rug sofa_l piano sun_lounger N 01 m PROJECTHillside VillaDRAWN BYArchLangDATE2026-08-27SCALE1:50LEVEL1 — Ground floor
11 rooms · 13 doors · 9 windows · 196.54 m²

Garden House

The other half of the language, and the one every plan above leaves out: everything outside the wall line. A two-storey family house on a 22 × 22 m suburban lot, A2 at 1:100 — 6 rooms and 136.5 m² of floor, beside 220.7 m² of ground (arch describe --json's totals.outdoor_area_m2) and a 484 m² lot (site.lot_area_m2). Those are three different numbers and the release exists to keep them apart: a terrace is not floor area, so a ground surface appears in no rooms[], no schedule rooms row and no access graph.

Twelve outdoor surfaces cover eight of the nine kinds — the driveway that runs to the garage door, paving to the front door, a patio behind the living room and a deck off the kitchen, a water pool, lawns front and back, gravel for the bin and shed yard, planting on three boundaries, and a balcony off the main bedroom whose railing is derived on the three edges with no wall behind them. Each draws a scale-aware material hatch, so the pattern is the same size on the sheet here as it would be at 1:50. Two fence runs post the lot: a panel enclosure round the pool — which is the drawing saying what the model does not, since ground obstructs nothing, water included — and a picket street frontage that stops either side of the path and the drive.

The garage is the other track meeting the first. room … uses garage classifies it and W_GARAGE_TOO_NARROW measures it (5.5 m across, against the 2.7 m one parked car needs), and its door is door garage — the sixth kind, which takes no clause at all and puts a dashed overhead projection inside the garage. Which side that is is derived rather than written: the resolver asks which face has floor, and the driveway on the other face is ground, not floor. Fifteen of the twenty-one outdoor fixture families furnish the garden, all at their catalogued footprints and none of them labelled.

arch lint raises two warnings, both left in and named in the source. One is an aspect heuristic (the one bedroom with no equator-facing window). The other is a finding: the bathroom opens straight off the landing, and describe --json's own doors[].between says so, but a balcony door counts as an exterior door, which grounds level 2 and stops the stair from being its arrival point — so the reachability walk starts inside a bedroom. The plan is right and the rule is not yet.

SOURCE / .ARCH
Driveway 22.5 m² Patio 14.2 m² Deck 13.9 m² Pool 12.0 m² Front lawn 21.4 m² Lawn 49.0 m² UP Hall 21.6 m² Study 19.3 m² Living 19.3 m² Utility 16.8 m² Kitchen/Dining 26.4 m² Garage 33.0 m² 17300 9300 ROOM SCHEDULE NO. NAME AREA (m²) 01 Hall 21.60 02 Study 19.35 03 Living 19.35 04 Utility 16.80 05 Kitchen/Dining 26.40 06 Garage 33.00 TOTAL 136.50 LEGEND deck grass gravel paving planting poche tarmac water wc basin kitchen_sink stove fridge sofa tv_unit dining_table chair desk bookshelf washer dryer car rug sun_lounger tree conifer shrub hedge bbq outdoor_table outdoor_chair umbrella bicycle trampoline bin mailbox ev_charger shed clothesline N 02 m PROJECTGarden HouseDRAWN BYArchLangDATE2026-08-28SCALE1:100LEVEL1 — Ground floor
6 rooms · 8 doors · 4 windows · 136.5 m²

Start here

One room

The smallest complete ArchLang plan, and the one the guide opens with: a 200 mm shell, one room that says what it is for, a door and a window, and a single overall dimension chain. 1 room, 20 m², fourteen lines including its comment.

Neither opening carries a coordinate. door … on shell at 60% walks 60 % of the way around the shell wall's own run and puts the door there, so the door cannot be reported off-wall and cannot drift when the room resizes. Change 5000x4000 to something else and the wall, both openings and the dimension text all follow.

SOURCE / .ARCH
Room 20.0 m² 5200 4200 N 01 m PROJECTOne RoomDRAWN BYArchLangDATE2026-08-16
1 rooms · 1 doors · 1 windows · 20 m²

Laneway House

The signature example: a one-bedroom laneway cottage of 3 rooms and 48.75 m² (Living / Kitchen 27.3, Bedroom 13.2, Bath 8.25) with 4 doors and 4 windows, on a 7.5 × 6.5 m footprint. It is the plan the home page's hero types out.

Nothing in it is positioned by hand. Every opening is pinned to a run distance along a named wall (on w_lane at 2100), every fixture resolves against a room or the wall behind it (in r_live centered, against wall w_west offset 400), and the bath/bedroom pair is laid out by a strip that assigns each room its depth and derives the rest. site { street north } (site and orientation) names the two facades the plan turns on — the front door faces the lane, the glazing faces the garden — and it draws nothing at all; it only gives those directions names an intent or a lint rule can assert against. Two of the four doors are not hinged: a sliding garden door, and a pocket door to the bath whose slide right aims the panel down the solid length of the hall partition rather than at the 500 mm that would trip W_POCKET_RUN.

SOURCE / .ARCH
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
3 rooms · 4 doors · 4 windows · 48.75 m²

Garden Loft

3 rooms, 35 m², at scale 1:50 — deliberately the smallest plan still worth describing. It is the plan the home page reads its own room schedule from, which is the constraint that shaped it: three rooms, so the derived table fits in a band beside the drawing, but a real fit-out behind each one — a kitchen run with a wall behind it, a bath with three fixtures, a door into every room.

There is no paper block here, so scale 1:50 is annotation: the title block says 1:50 and the SVG scales to whatever box it is dropped into. That is what a web page wants; a building issued to a builder wants the sheet instead, which several examples below declare.

SOURCE / .ARCH
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
3 rooms · 3 doors · 4 windows · 35 m²

Tiny House

A 7.2 × 3.0 m micro-home — 2 rooms, 19.6 m², 3 doors, 5 windows — and the example for the three language forms that are about fit rather than shape.

The wet room is 1.55 m wide, so a hinged leaf swinging in fouls the WC and swinging out sweeps the only walkway in the house; it gets a barn door instead, which sweeps nothing at all (doorSwing() returns null for every non-hinged kind, so W_SWING_OBSTRUCTED cannot even apply) and parks on the wall it came from. The wardrobe recess — 1.9 × 0.65 m, far under the 4 m² of floor lint expects of a room, so it is deliberately not declared as one — closes with a bifold: two leaves, each half of the 1600 opening, folding out of the way instead of swinging 800 mm into a 1.85 m galley. That 1.85 m is not typed anywhere: dim clear pulls each endpoint onto the inner face of the wall the measurement runs into, so the number on the drawing is the built clear width, derived. open 0.6 on the barn door is drawing-only — nothing measured reads it — and is written because a leaf drawn shut is indistinguishable from a hinged one on paper.

SOURCE / .ARCH
Ladder Living / Sleep 14.8 m² Wet room 4.8 m² 1850 7200 3000 N 02 m PROJECTTiny HouseDRAWN BYArchLangDATE2026-08-16
2 rooms · 3 doors · 5 windows · 19.6 m²

Studio (1BR)

The long-standing flagship: 4 rooms, 42 m², 3 doors, 3 windows, scale 1:50. A tour of rooms tagged with uses, a cased opening linking the living space to the hall, real fixture symbols (sink, counter, stove, fridge, shower, basin, WC), and doors whose swings stay clear of the furniture. It is lint-clean under the default profile and import-free — a single file with no import and no World seam — which is why the test suite uses it as the plan that must always compile from nothing. Run arch describe / arch lint on it to see the analysis layer in action.

SOURCE / .ARCH
Living / Kitchen 24.0 m² Bedroom 9.0 m² Hall 4.2 m² Bath 4.8 m² 4000 3000 7000 6000 N 02 m PROJECTStudio ApartmentDRAWN BYArchCanvasDATE2026-06-27SCALE1:50
4 rooms · 3 doors · 3 windows · 42 m²

Homes

Two-bedroom flat

5 rooms, 80 m², 3 doors, 4 windows on a 10 × 8 m footprint at scale 1:100 — a larger plan with a central corridor and several openings, placed absolutely at a real apartment's scale, with north reoriented.

SOURCE / .ARCH
Kitchen / Living 20.0 m² Master Bedroom 30.0 m² Bedroom 2 12.0 m² Bathroom 9.0 m² Hall 9.0 m² 10300 8300 N 02 m PROJECTTwo-Bedroom FlatDRAWN BYArchCanvasDATE2026-06-25SCALE1:100
5 rooms · 5 doors · 5 windows · 80 m²

Attached (placement sugar)

A one-bedroom flat — 2 rooms, 28 m² — with no hand-computed coordinates for its openings or furniture. It exercises the placement sugar together: a strip laying rooms out end to end, doors and windows attached to a wall by position (on <wall> at <pos>, so they can never be reported "off wall"), a door that opens toward a named room (swing into), and furniture anchored inside a room (in <room> anchor … inset …).

SOURCE / .ARCH
Living 16.0 m² Bedroom 12.0 m² N 02 m
2 rooms · 2 doors · 2 windows · 28 m²

Furnished Flat (the drawn symbol catalogue)

7 rooms, 90.7 m², 6 doors, 6 windows on an 8.4 × 10.8 m footprint — and twenty-six of the thirty-two catalogued furniture kinds, which is what it is here for. Every other example draws a fixture or two in passing; this one exercises all five symbol domains at once: a fitted kitchen run with an island and a dashed overhead cabinet, a plumbed bathroom, two furnished bedrooms, a lounge and dining zone, and a utility room with a washer beside a dryer (the same box, told apart by the chords across its drum).

Two things to read in the source rather than the drawing. Not one piece carries a label — a drawn symbol ignores it, so the only text here comes from the rooms. And most carry no size either: against wall <id> … in <room> takes the catalogued footprint and derives the rotation from the wall, so the whole kitchen, bathroom and both beds are written without a hand-computed number. offset is where a piece's centre lands along the wall run, which is why a fitted run reads as a sequence of centres rather than corners. arch validate --strict is clean.

SOURCE / .ARCH
Living / Dining 28.0 m² Kitchen 12.9 m² Utility 6.1 m² Hall 10.1 m² Bedroom 1 14.4 m² Bedroom 2 11.2 m² Bath 8.0 m² 8600 11000 ROOM SCHEDULE NO. NAME AREA (m²) 01 Living / Dining 28.00 02 Kitchen 12.92 03 Utility 6.12 04 Hall 10.08 05 Bedroom 1 14.40 06 Bedroom 2 11.20 07 Bath 8.00 TOTAL 90.72 N 01 m PROJECTFurnished FlatDRAWN BYArchLangDATE2026-08-26SCALE1:50
7 rooms · 6 doors · 6 windows · 90.72 m²

Suburban Bungalow (orientation, and doors that are not hinged)

A single-storey house — 8 rooms, 102 m², 6 doors, 7 windows at scale 1:100 — on a plot that fronts the street on the south, in the southern hemisphere, and the whole layout follows from that one declared fact. site { street south hemisphere south } (site and orientation) draws nothing; it names five directions on arch describe --json --select sitestreet (S), back (N), equator_side (N), sunrise_side (E), sunset_side (W). Here back and equator_side are the same side, which is why the house turns away from the road: the living room and both bedrooms take the north facade, and the service band — entry, hall, bath, laundry, kitchen — is stacked along the street. Delete Bedroom 2's north window and arch lint says so, through the one advisory rule that reads a site, W_ROOM_NOT_EQUATOR_FACING. These are drafting heuristics for an aspect, not a daylight measurement: there is no sun model, no latitude and no date anywhere in ArchLang.

The other half is the door kinds. Three of the six doors are not hinged, each where a builder would actually put one: a sliding garden door onto the deck, a pocket door to the bath so no leaf lands in a 1500 mm corridor, and a bifold to the laundry. slide right on the pocket is load-bearing, not cosmetic — it aims the panel at the 2200 mm of solid wall between its jamb and the laundry door, where slide left would give it 500 mm against the 850 mm it needs and raise W_POCKET_RUN. A non-hinged leaf sweeps nothing, so only the two bedroom doors carry a swing arc, and describe().doors[].kind appears on exactly the three that are not the default.

SOURCE / .ARCH
Living / Dining 28.8 m² Bedroom 1 14.4 m² Bedroom 2 14.4 m² Kitchen 11.1 m² Hall 13.5 m² Bath 6.2 m² Laundry 4.8 m² Entry 8.8 m² 3400 600 5600 1000 1600 3000 2800 200 2000 1000 3000 12200 6100 1200 1400 4800 1500 2200 8700 300 1400 2200 2000 900 1600 1400 1600 800 3000 2800 200 2000 1000 3000 12200 1900 1200 2100 900 2600 4800 1500 2200 8700 100 200 ROOM SCHEDULE NO. NAME AREA (m²) 01 Living / Dining 28.80 02 Bedroom 1 14.40 03 Bedroom 2 14.40 04 Kitchen 11.10 05 Hall 13.50 06 Bath 6.16 07 Laundry 4.84 08 Entry 8.80 TOTAL 102.00 N 02 m PROJECTSuburban BungalowDRAWN BYArchCanvasDATE2026-08-13SCALE1:100
8 rooms · 6 doors · 7 windows · 102 m²

Courtyard House

A 16 × 11.5 m single-storey house whose rooms ring an open middle — 11 rooms, 163 m², 10 doors, 15 windows at scale 1:100.

The first thing to understand about the courtyard is that it is not a room. Nothing is declared inside it: it is the hole the building wraps around, open to the sky, and calling it a room would put 21 m² of weather into the floor schedule. It is enclosed by a single three-segment partition, and everything that reads the plan — the schedule, describe().totals, the circulation flood-fill — simply sees no floor there. The courtyard is also the shape that breaks the naive way of answering which way does this window look? The window on the courtyard's west wall has the gallery's floor to its west and open air to its east, so it looks east, not west; ArchLang answers by probing one wall thickness off each face of the window's own host segment and taking the side no room occupies, which is exact here and on a sloped facade alike. Read it back with arch describe --json --select windows.

The wings are zones — living 67.75 m² over 4 rooms, private 65.5 m² over 4, service 29.75 m² over 3. A zone has zero geometry: delete the wrappers and the drawing is byte-identical. Membership is declared, never inferred from where a room happens to sit, which is why the schedule can carry a subtotal per wing that no amount of looking at the drawing could have derived. The gallery is one polygon room — a U wrapping three sides of the courtyard, so the schedule lists one corridor rather than three — and because a U's centroid falls outside it, its name is pinned by hand in the south arm.

SOURCE / .ARCH
Living 19.3 m² Entry 12.3 m² Dining 12.3 m² Gallery 24.0 m² Bedroom 1 16.5 m² Bedroom 2 16.5 m² Bedroom 3 15.0 m² Study 17.5 m² Kitchen 12.3 m² Bathroom 8.8 m² Utility 8.8 m² 2100 1600 3900 1600 3650 1600 1850 3500 1500 500 3500 2000 1500 3500 16300 1400 1000 300 800 1950 1400 4950 3500 2500 1000 1500 3000 11800 5150 2000 2950 1600 2000 1400 1200 3500 1500 500 3500 2000 1500 3500 16300 1450 900 2250 600 1900 600 4100 3500 2500 1000 1500 3000 11800 100 150 200 300 ROOM SCHEDULE NO. NAME AREA (m²) Living wing 01 Living 19.25 02 Entry 12.25 03 Dining 12.25 04 Gallery 24.00 SUBTOTAL 67.75 Private wing 05 Bedroom 1 16.50 06 Bedroom 2 16.50 07 Bedroom 3 15.00 08 Study 17.50 SUBTOTAL 65.50 Service wing 09 Kitchen 12.25 10 Bathroom 8.75 11 Utility 8.75 SUBTOTAL 29.75 TOTAL 163.00 LEGEND poche wc basin bathtub kitchen_sink counter stove fridge bed wardrobe sofa table bench desk bookcase washer planter N 02 m PROJECTCourtyard HouseDRAWN BYArchLangDATE2026-08-16SCALE1:100
11 rooms · 10 doors · 15 windows · 163 m²

Townhouse (three storeys)

A 5.5 × 11 m terrace house written as three level blocks, paper A3 portrait at scale 1:50. Each storey is 4 rooms and 55.64 m² and becomes its own page — ground (Hall, Living, Cloakroom, Kitchen/Dining), first (Landing, Bedroom 1, Bathroom, Bedroom 2), second (Landing, Study, Shower room, Main bedroom). arch compile writes townhouse.L1.svg, townhouse.L2.svg and townhouse.L3.svg; the widget below shows page

  1. Everything outside the blocks — units, grid, paper, scale, dims auto — is stated once, because one building is issued on one sheet at one scale.

The stair is one object written three times. Ids are unique within a level, so the same id=st on all three storeys is not a clash — it is the declaration that these are one shaft, and it is what makes the upper floors legal: they have no front door of their own, and lint still reads the first-floor landing as reached from outside because describe().vertical connects it to the storey below. Change one storey's id and you get W_STAIR_UNMATCHED rather than a silently disconnected floor. dir is not decoration either: the flight runs along its footprint's long axis and dir up is entered at that axis's larger-coordinate end, which is also what the navigation grid reads — a stair obstructs circulation everywhere except its entry edge, and that is why the ground-floor flight stops 1.15 m short of the back wall. One flight-length further south, the only route from the front door to the kitchen measured 300 mm on the nav grid against a 700 minimum, and lint refused the plan with W_PATH_TOO_NARROW.

SOURCE / .ARCH
Media UP Hall 14.0 m² Living 14.7 m² Cloakroom 7.7 m² Kitchen/Dining 19.2 m² 750 1600 1400 1200 550 3200 2000 5500 4600 2400 3700 11000 950 1600 1300 1000 650 3200 2000 5500 100 200 300 N 01 m PROJECTThree-storey TerraceDRAWN BYArchLangDATE2026-08-16SCALE1:50LEVEL1 — Ground floor
4 rooms · 4 doors · 2 windows · 55.64 m²

Two-storey house

A compact house written as two level blocks3 rooms and 56 m² on the ground floor, paper A3 at scale 1:50. It compiles to two sheets (two-storey.L1.svg, two-storey.L2.svg), each with its own dimension chains and a title block stamped LEVEL 1 — Ground floor / LEVEL 2 — First floor. The settings and the lets sit outside the levels and apply to both: one building, one sheet spec, one scale. It is the smaller sibling of the townhouse above — the two-page version of the same idea, without the stack of wet rooms.

SOURCE / .ARCH
UP Hall 15.4 m² Living 20.9 m² Kitchen 19.7 m² 700 1000 6500 2200 5800 8200 3600 3400 7200 4200 1800 2200 2200 5800 8200 4800 1200 1200 3600 3400 7200 100 200 N 01 m PROJECTTwo-storey houseDRAWN BYArchLangDATE2026-07-26SCALE1:50LEVEL1 — Ground floor
3 rooms · 3 doors · 2 windows · 56 m²

Public buildings

Museum (a real sheet, at a real scale)

A ~100 × 60 m single-level museum — 14 rooms, 6000 m², 7 doors, 9 windows — and the large-building flagship. Everything above is a dwelling, where sizing every annotation as a fraction of the drawing happens to look right; at 100 m it does not, and room labels come out metres tall. So this plan declares a sheet: paper A1 landscape + scale 1:200, which makes every annotation a fixed size on that sheet — 3.5 mm room labels and 0.5 mm wall lines whatever the building measures. It also drives dims auto all (the GB/T three-chain exterior dimensioning), a column grid written with for, and fixture rows placed by against wall <id> offset … so no coordinate is hand-computed.

SOURCE / .ARCH
Gallery 1 676.0 m² Gallery 2 676.0 m² Gallery 3 676.0 m² Store 308.0 m² Offices 264.0 m² Concourse 600.0 m² Gallery 4 840.0 m² Entrance Hall 504.0 m² Gallery 5 616.0 m² Lobby 168.0 m² WC Women 100.0 m² WC Men 100.0 m² Plant 80.0 m² Cafe 392.0 m² 13150 4000 21000 2000 17000 4000 39150 26000 4000 18000 4000 18000 6000 2000 8000 14000 100300 11650 3000 30000 3000 12650 14000 12000 6000 10000 10000 8000 60300 11150 4000 22000 4000 22000 4000 21400 1200 10550 26000 4000 18000 4000 18000 6000 2000 8000 14000 100300 18650 3000 21500 4000 13150 14000 12000 6000 10000 10000 8000 60300 200 300 N 05 m PROJECTCity MuseumDRAWN BYArchLangDATE2026-07-26SCALE1:200
14 rooms · 7 doors · 9 windows · 6000 m²

Harbour Aquarium (curves)

A 60 × 40 m public aquarium — 8 rooms, 2061.06 m², 3 doors, 6 windows, A2 at 1:200 — and the curved-geometry flagship. Everything above is rectilinear; an aquarium is the building type that is not. Its centrepiece is a cylindrical tank you walk around, written as a circular room (room circle at (cx,cy) radius R, an exact 201.06 m² = πR²) inside a drum wall made of two arc edges, and its public frontage turns the south-east corner as a quarter circle of R12000 instead of mitring it.

Two things to read off the drawing. The curved faces are true arcs — SVG A commands, native DXF ARC entities — so the rotunda never looks faceted however far you zoom in. And because a linear dimension chain cannot describe an arc, dims auto dimensions the round things the way GB/T 50104 does: an R leader per distinct arc and a φ call-out across the circular room, while the three exterior chains stay on the straight facades. Both rotunda doors sit on the curve — on rotunda at 25% walks the wall by run length, so an arc contributes its arc length rather than its chord — and their leaves swing off the tangent at the doorway.

SOURCE / .ARCH
1 2 3 4 A B C D Ocean Rotunda 201.1 m² Reef Gallery 336.0 m² Kelp Forest 336.0 m² Filtration 108.0 m² Concourse 480.0 m² Entrance Foyer 200.0 m² Shop 200.0 m² Cafe 200.0 m² 28950 2400 28950 21000 18000 21000 60300 12650 3000 24650 22000 8000 10000 40300 8650 3000 37000 3000 8650 21000 18000 21000 60300 12650 3000 24650 22000 8000 10000 40300 R12000 R8000 φ16000 200 300 ROOM SCHEDULE NO. NAME AREA (m²) 01 Ocean Rotunda 201.06 02 Reef Gallery 336.00 03 Kelp Forest 336.00 04 Filtration 108.00 05 Concourse 480.00 06 Entrance Foyer 200.00 07 Shop 200.00 08 Cafe 200.00 TOTAL 2061.06 N 05 m SCALE1:200
8 rooms · 3 doors · 6 windows · 2061.06 m²

Reading Room Library (sheet tables)

A 50 × 32 m public library around a circular reading room — 14 rooms, 1545.06 m², 8 doors, 16 windows, paper A2 landscape at scale 1:200, split into three zones: public (9 rooms, 948.06 m²), stacks (2 rooms, 374.5 m²) and staff (3 rooms, 222.5 m²).

The reading room is a drum inscribed in the 16 × 16 m central bay — a room circle of exactly 201.06 m² inside a wall of arc edges — so it is tangent to all four bay walls and every tangent point is a threshold; the four corner spandrels it leaves belong to no room and carry no schedule row. The circle is written as eight arcs rather than the two semicircles the shape needs, deliberately: the analysis grid behind describe --json's circulation rasterises a wall between its vertices, so two semicircles lay a phantom chord straight across the room and report the walk to it at five times its true length. Eight keeps every chord inside the face it stands for, and the drawing is identical either way — every face is a true arc, at any zoom.

The sheet is the other half. schedule rooms and legend fill the margin and are fully derived, nothing to configure: the legend lists one row per wall hatch material actually used and one per placed fixture category that has a plan symbol, and the schedule's rows and total are the same numbers arch describe --json reports. At the foot of the file, dim radius <wallId> segment <n> and dim diameter <roomId> take both geometry and text from the element they name, so R8000 and the centre are never retyped.

SOURCE / .ARCH
1 2 3 4 5 A B C D E F UP Entrance Hall 128.0 m² Reading Room 201.1 m² Children's Library 246.5 m² West Aisle 51.0 m² Cafe 159.5 m² East Aisle 51.0 m² WC Lobby 51.0 m² WC Women 30.0 m² WC Men 30.0 m² Open Stacks 246.5 m² Reference Stacks 128.0 m² Staff Workroom 110.5 m² Cafe Kitchen 87.0 m² Plant Room 25.0 m² R8000 φ16000 4150 4000 2000 4000 4500 3000 2300 2400 2300 3000 3900 1200 4800 1200 7550 17000 16000 11000 6000 50300 4650 3000 7500 2000 5000 4000 6150 14500 3000 6500 3000 5000 32300 4150 4000 2000 4000 5500 3000 5000 3000 6000 4000 9650 17000 16000 11000 6000 50300 9850 1600 1100 1200 5400 3000 10150 14500 3000 6500 3000 5000 32300 R8000 φ16000 200 300 ROOM SCHEDULE NO. NAME AREA (m²) Public 01 Entrance Hall 128.00 02 Reading Room 201.06 03 Children's Library 246.50 04 West Aisle 51.00 05 Cafe 159.50 06 East Aisle 51.00 07 WC Lobby 51.00 08 WC Women 30.00 09 WC Men 30.00 SUBTOTAL 948.06 Stacks 10 Open Stacks 246.50 11 Reference Stacks 128.00 SUBTOTAL 374.50 Staff 12 Staff Workroom 110.50 13 Cafe Kitchen 87.00 14 Plant Room 25.00 SUBTOTAL 222.50 TOTAL 1545.06 LEGEND concrete poche wc basin kitchen_sink counter stove fridge sofa table desk shelf plant N 05 m PROJECTReading Room LibraryDRAWN BYArchLangDATE2026-08-16SCALE1:200
14 rooms · 8 doors · 16 windows · 1545.06 m²

Transit Hall

A 90 × 40 m metro concourse — 12 rooms, 3600 m², 7 doors, 19 windows, A2 at 1:200 — and the big-public-building example. One fact organises the whole plan: a transit hall is two buildings that share a roof. The unpaid side is street, and anyone may stand in it; the paid side is platform, and the only way across is the gate line. So the drawing is a single 300 mm partition running the full 90 m width, with nine openings punched in it by a for loop — eight 800 mm gates and one 1200 mm wide aisle. Nothing else joins the two halves.

That split is declared, never inferred from position: paid is 1260 m² over 1 room, unpaid 1948 m² over 5, and back-of-house 80 m² over 2, so "how much unpaid floor is there" is a read rather than a sum — while the SVG is byte-identical without the zone wrappers. The four retail units are one strip, not four hand-placed rooms: each unit's offset is the running sum of the ones before it, so changing a shop's depth moves every unit below it and nothing else. Escalators and a lift are vertical shafts drawn with their chevrons and UP/DN arrows; on a single-storey plan they still obstruct circulation, and W_STAIR_UNMATCHED is a multi-storey question that never fires here.

SOURCE / .ARCH
1 2 3 4 5 6 7 8 A B C D DN UP Kiosk 1 78.0 m² Kiosk 2 78.0 m² Kiosk 3 78.0 m² Kiosk 4 78.0 m² Paid Concourse 1260.0 m² Unpaid Concourse 1664.0 m² Lobby 104.0 m² WC Women 70.0 m² WC Men 70.0 m² Accessible WC 40.0 m² Staff Room 40.0 m² Control Room 40.0 m² 15200 6000 3000 6000 3000 6000 4000 4000 4000 6000 3000 6000 3000 6000 15200 12000 12000 12000 12000 12000 12000 18000 90400 5700 3000 7000 3000 3500 3000 3500 3000 3500 3000 2200 14000 13000 13000 40400 12200 6000 14000 6000 14000 6000 14000 6000 12200 12000 12000 12000 12000 12000 12000 18000 90400 5700 3000 8400 1200 5800 1200 8150 1500 3150 1200 1100 14000 13000 13000 40400 200 300 400 ROOM SCHEDULE NO. NAME AREA (m²) Paid 01 Paid Concourse 1260.00 SUBTOTAL 1260.00 Unpaid 02 Unpaid Concourse 1664.00 03 Lobby 104.00 04 WC Women 70.00 05 WC Men 70.00 06 Accessible WC 40.00 SUBTOTAL 1948.00 Back of house 07 Staff Room 40.00 08 Control Room 40.00 SUBTOTAL 80.00 (no zone) 09 Kiosk 1 78.00 10 Kiosk 2 78.00 11 Kiosk 3 78.00 12 Kiosk 4 78.00 SUBTOTAL 312.00 TOTAL 3600.00 N 05 m PROJECTMetro Interchange — concourse levelDRAWN BYArchLangDATE2026-08-16SCALE1:200
12 rooms · 7 doors · 19 windows · 3600 m²

Clinic Wing

An outpatient clinic — 13 rooms, 294.12 m², 11 doors, 13 windows at scale 1:100 — whose six consulting rooms are one component placed six times. Every consulting room in a clinic is the same room; drawn the usual way that is twenty-four statements to keep in step by hand. Here it is written once and instantiated: each place consult(…) as c1 … is an addressable instance of exactly 16.2 m².

Three things follow. Namespacing — ids inside the component become <instance>.<id>, so the six rooms are c1.mainc6.main and the plan can address exactly one of them: furniture … in c2.main puts an ECG trolley in the second room and nowhere else, and arch describe --room c2.main reads it back. Mirroring — the north row is placed as drawn and the south row with mirror y, a real reflection about the instance's own origin, so the corridor wall lands on the corridor for both rows and all six doors face the same way; because a reflection moves the origin to the far edge, a mirrored 4500-deep unit is placed at the far y. One side wall — each instance carries its left wall and its corridor wall only, an L rather than a box, so at 3600 centres no two partitions ever coincide. The rest of the wing is ordinary: a 2400 corridor with a dim clear proving 2300 mm of it is actually clear floor, pocket doors on the consulting rooms so no leaf ever sweeps into a corridor patients queue in, and a sliding door wide enough for a trolley into treatment. The plan is clean under arch lint --profile accessibility-advisory as well as the default ruleset.

SOURCE / .ARCH
Seating Seating Seating Seating Seating Seating ECG Waiting 62.1 m² Reception 20.3 m² Entrance 20.3 m² Corridor 40.3 m² Treatment 27.0 m² Staff Room 13.5 m² Accessible WC 13.5 m² Consult 1 16.2 m² Consult 2 16.2 m² Consult 3 16.2 m² Consult 4 16.2 m² Consult 5 16.2 m² Consult 6 16.2 m² 2300 clear 1600 1500 2850 1800 2550 1200 2400 1200 2400 1200 2100 1200 1950 900 1150 4500 4500 3600 3600 3600 3000 3000 26000 1900 2400 7300 4500 2400 4500 11600 3100 3000 4200 1200 2400 1200 2400 1200 3300 1800 2200 4500 4500 3600 3600 3600 3000 3000 26000 1750 1200 8650 4500 2400 4500 11600 100 200 ROOM SCHEDULE NO. NAME AREA (m²) Public 01 Waiting 62.10 02 Reception 20.25 03 Entrance 20.25 SUBTOTAL 102.60 Clinical 04 Corridor 40.32 05 Treatment 27.00 06 Staff Room 13.50 07 Accessible WC 13.50 08 Consult 1 16.20 09 Consult 2 16.20 10 Consult 3 16.20 11 Consult 4 16.20 12 Consult 5 16.20 13 Consult 6 16.20 SUBTOTAL 191.52 TOTAL 294.12 LEGEND poche wc basin kitchen_sink counter couch table desk plant N 02 m PROJECTOutpatient clinic wingDRAWN BYArchLangDATE2026-08-16SCALE1:100
13 rooms · 11 doors · 13 windows · 294.12 m²

Geometry & experiments

Two polygonal rooms2 rooms, 153 m² at scale 1:100: an L-shaped gallery wrapping a trapezoid lobby, so the building has an angled south-west facade. room polygon (x,y) … replaces at + size with the room's own ring, and everything downstream follows the ring rather than a bounding box — the gallery reports its exact 132 m² (its box would claim 168), the two rooms read as adjacent across the boundary they actually share, and the label sits at the polygon's centroid (the lobby pins its own with label "…" at (x,y)). The entrance door is hosted on the angled wall the ordinary way, and dims auto all measures the chain off the rooms' vertex coordinates.

SOURCE / .ARCH
Gallery 132.0 m² Lobby 21.0 m² 6000 6000 12300 8000 1000 5000 14300 8450 3000 850 6000 6000 12300 200 300 N 02 m PROJECTPolygon roomsDRAWN BYArchLangSCALE1:100
2 rooms · 2 doors · 1 windows · 153 m²

Hexagon Pavilion

Six trapezoidal galleries ringing a circular rotunda — 7 rooms, 122.79 m² on a 15 × 12 m hexagonal footprint. Every other example is built from rectangles, because that is what a floor plan usually is; this one is not rectangular anywhere, and it exists to show that polygon rooms, circular rooms and arc wall edges compose.

The hexagon is not regular, and that is the point. A regular hexagon of circumradius R carries four of its vertices at an irrational offset no grid can express, so its sloped facades never measure a round anything — set one out at R = 7500 on a 50 mm grid and each nominal 7500 edge comes back 7504. A drawing that calls that 7500 is lying, and one that calls it 7504 looks like a mistake. So this shell is built on a 3-4-5 triangle instead: every sloped facade steps 4500 across and 6000 down, which is exactly 7500, and every vertex lands on the grid. The drum in the middle is one wall of two semicircular arcs on a centreline of radius 3000 — the inner hexagon's inradius, so it is tangent to all six galleries' inner edges, which is what lets the rotunda be room circle … radius 3000 (exactly 28.27 m² = πR²) and counts each gallery as adjacent to it. The six cased openings are positioned on drum at <pct>, which walks the wall by arc length, so 8.333 % is 30° — square onto the middle of a gallery. Its palette comes from a single colour with theme from "#2f6f4e".

SOURCE / .ARCH
Rotunda 28.3 m² Reading 16.9 m² Studio 13.5 m² Tea Room 16.9 m² Store 16.9 m² Entrance 13.5 m² Gallery 16.9 m² φ6000 7500 7500 15000 12300 R3000 φ6000 N 02 m PROJECTHexagon PavilionDRAWN BYArchLangDATE2026-08-16SCALE1:50
7 rooms · 1 doors · 5 windows · 122.79 m²

Terrace Row

Four terrace dwellings generated from one component, placed and mirrored16 rooms, 199.8 m², 16 doors, 18 windows across 22.2 × 9.6 m. A terrace is the same plan four times, so it is written once: component unit(w, d, gable) in its own coordinates from (0,0), then four place statements, alternating mirror x.

mirror x reflects about the instance's own origin, so a mirrored unit is placed at its far x edge. Alternating it is what makes a terrace a terrace: u1 and u2 meet local-x=w to local-x=w, so their bathrooms and kitchen runs back onto one shared party wall, and u2 and u3 meet local-x=0 to local-x=0. The consequence is that the row's two free gables are both the local x=0 wall — which is why gable is 1 for the end units and 0 for the middle two, and why the if inside the component puts a side window on that wall and nowhere else. The offsets are arithmetic rather than typing (widths is an array and the placements are a running sum of it), the 600 mm stagger is one coordinate, and three of the four room names are pinned with label "…" at (x,y) written in the component's coordinates — a pinned label is a point like any other, so place carries it through the frame and the mirrored units get the mirrored position for free. theme blueprint is a named theme base: a whole cyanotype palette from one word.

SOURCE / .ARCH
Bed 12.8 m² Bath 8.8 m² Hall 9.7 m² Living 17.3 m² Bed 12.8 m² Bath 8.8 m² Hall 9.7 m² Living 17.3 m² Bed 15.2 m² Bath 8.8 m² Hall 10.8 m² Living 19.2 m² Bed 12.8 m² Bath 8.8 m² Hall 9.7 m² Living 17.3 m² 22450 9725 N 05 m PROJECTFour-unit terraceDRAWN BYArchLangDATE2026-08-16
16 rooms · 16 doors · 18 windows · 199.8 m²

Scripting & composition

Relational (right-of / below)

4 rooms, 60 m² at scale 1:100, positioned relative to one another with right-of / below, align and gap — resolved to absolute coordinates by deterministic arithmetic in topological order, not an optimizer (see relational placement).

SOURCE / .ARCH
Living 20.0 m² Kitchen 12.0 m² Bedroom 17.5 m² Bath 10.5 m² 8200 N 02 m PROJECTRelational Layout DemoDRAWN BYArchCanvasDATE2026-06-26SCALE1:100
4 rooms · 1 doors · 1 windows · 60 m²

Parametric (let + for)

3 rooms, 60 m², 3 doors, 3 windows — a row of repeated units generated from let bindings, a value-function, an array, a scoped set, a for loop and string interpolation. It is the demonstration that scripting expands at compile time into a fixed, deterministic drawing: there is no runtime, no clock and no randomness, so the row you see is exactly what the loop produced.

SOURCE / .ARCH
Kitchen Kitchen Kitchen Studio A 20.0 m² Studio B 20.0 m² Studio C 20.0 m² 20 m² each 3 units N 02 m SCALE1:100
3 rooms · 3 doors · 3 windows · 60 m²

Accessible metadata

2 rooms, 24 m² — the smallest plan that carries accTitle and accDescr, which supply the SVG <title>/<desc> emitted by arch compile --accessible. They are metadata only: the default output is byte-identical without the flag. Omit them and the description is derived from describe()'s caption instead.

SOURCE / .ARCH
Living 14.0 m² Bedroom 10.0 m² N 01 m
2 rooms · 1 doors · 1 windows · 24 m²

Style

Themed (blueprint + brick)

2 rooms, 24 m² with a custom theme { … } block and a brick wall material (hatch) — the same geometry, restyled. Nothing about a theme touches geometry, which is why the playground's theme selector can restyle any plan on this page. See theming and materials.

SOURCE / .ARCH
Living 12.0 m² Bedroom 12.0 m² 6250 N 01 m SCALE1:100
2 rooms · 1 doors · 2 windows · 24 m²

Materials (the whole hatch palette)

A 16 × 8 m maker-space — 4 rooms, 128 m², 5 doors, 6 windows, paper A3 landscape at scale 1:50 — whose walls carry the entire wall-material palette, one per side. Poché is not decoration: on a real drawing the hatch inside a wall is the specification, and ArchLang spells that as one optional clause on wall: material poche|concrete|brick|insulation|tile|none [scale <n>] [angle <deg>].

All six appear here, each on the element a builder would actually detail that way and each on a wall long enough to read: 300 mm concrete on the two long facades (the thickest thing in the building, because that is what carries the roof), 230 mm brick on the east gable with scale 1.5 angle 90 so the courses run along the wall instead of across it, a 200 mm insulation leaf drawn as its own wall so the leaf rather than the assembly carries the hatch, tile on the two WC partitions, none on the glazed office screen (deliberately empty rather than defaulted), and the default poché on the two service partitions. The sheet is what makes it readable, and it is the second thing this file is for: at 1:50 a 100 mm partition draws 2 mm wide and a 300 mm facade 6 mm; halve that to 1:100 and they become 1 mm and 3 mm — the walls still look right and the hatch inside them is gone. A material sampler has to be issued at a scale where the poché survives, so the scale is written down rather than left to the auto-fit. The legend beside it is derived: one swatch per material actually used and one per fixture category actually placed, growing a row on its own if you add a seventh.

SOURCE / .ARCH
Racking Racking Workshop 96.0 m² Office 12.0 m² Store 11.2 m² WC 8.8 m² 1900 2400 1900 1000 9015 12000 4000 16215 3250 1800 3250 3000 2800 2200 8300 900 2400 1600 2400 1600 2400 4915 12000 4000 16215 850 1600 4300 600 950 3000 2800 2200 8300 100 150 200 230 300 ROOM SCHEDULE NO. NAME AREA (m²) 01 Workshop 96.00 02 Office 12.00 03 Store 11.20 04 WC 8.80 TOTAL 128.00 LEGEND brick x1.5 @90° concrete insulation none poche tile wc basin sink counter table desk office_chair rug N 01 m PROJECTMaker-space workshopDRAWN BYArchLangDATE2026-08-16SCALE1:50
4 rooms · 5 doors · 6 windows · 128 m²