Plotlay Open the app →

Guide 8 · design codes

Rule pack format

A guide for councils, estate developers, body corporates, consultants and anyone who wants a set of planning or design rules checked against a Plotlay project. Version 1, 14 October 2026.

Reference only. Rules are simplified from published sources and may be out of date or incomplete. Verify with the current code and your council, certifier or relevant authority before relying on them.

What a pack is

A rule pack is a list of checks Plotlay runs against a drawn project: a setback, a height, a site coverage, a fence height, a door width. Each check reports one of:

Result Meaning
PASS Meets the rule.
WARN Passes but is close to the limit (inside its warn band), or is just outside it but within the rule's tolerance.
FAIL Does not meet the rule.
UNKNOWN Not measured yet, or depends on a fact nobody has entered. UNKNOWN is never a pass.

Plotlay ships packs for the Australian states, New Zealand, England, Ireland, the US, Canada and accessibility. Anyone can write their own as JSON, YAML or CSV and import it into a project (Design codes, Import a pack), or have an AI agent connected to Plotlay build one from a document.

A project keeps a copy of each pack it uses, at its version. A later check gives the same answer until someone chooses a newer version.

A small example

{
  "id": "seaview-estate",
  "name": "Seaview Estate design guidelines",
  "kind": "template",
  "jurisdiction": "Seaview Estate",
  "version": "2026.1",
  "published": "2026-03-01",
  "source": "Seaview Estate Design Guidelines, March 2026",
  "source_url": "https://example.org/seaview-guidelines.pdf",
  "disclaimer": "The developer's design approval is still needed.",
  "rules": [
    { "id": "front-setback", "title": "House front setback", "ref": "4.1",
      "each": "dwellings", "metric": "front_setback_mm", "op": ">=", "limit": 6000, "unit": "mm",
      "tolerance": 200, "note": "Porches may sit 1.5 m forward of the building line." },
    { "id": "fence", "title": "Front fence height", "ref": "6.2",
      "each": "fences", "where": { "front": true }, "metric": "height_mm", "op": "<=", "limit": 1200, "unit": "mm" },
    { "id": "colours", "title": "Roof and wall colours", "ref": "5.3",
      "each": "site", "op": "check", "note": "From the approved palette only." }
  ]
}

Pack fields

Field Required What it is
id yes for sharing Short id: lower case letters, digits and dashes. The same id at a new version is an update.
name yes What the pack is.
kind no code (a design code or council document), template (your own checks, not an official code), practice (common practice). Reports say when a pack is a template.
jurisdiction yes for sharing NSW, VIC, NZ, GB-ENG, US, or your own name for it.
version yes for sharing Any text: 2026.1, 3. Projects pin to it.
published no The date of the source document.
instrument, instrument_version no The document and the version or amendment the rules come from.
source, source_url yes for sharing The document and a link to it.
disclaimer no Shown with the pack and on reports. Plotlay adds the reference-only line.
short no A short name put before each clause reference on reports (R-Codes 5.1.2).
params no Facts a person enters per project, below.
indicative no true for guidance only (building code notes, accessibility basics).
rules yes The checks.

Rule fields

Field What it is
id Short id, unique in the pack.
title Plain words: "House front setback".
ref The clause, standard or table: cl 3.10(3), Table B, B2-1.
source_url A link to the clause, if the source has one. Otherwise the pack's link is used.
each What the rule applies to: site, dwellings, structures, fences, rooms, openings, driveways, crossovers, trees, roofs, earthworks.
where Which of those: { "role": "outbuilding" }, { "room_type": "bedroom" }, { "kind": "door" }, { "front": true }, { "status": "proposed" }, { "layer": "Stage 2" }. A list means any of.
metric What is measured (the table below).
op <= < >= > == != between (limit [min, max]) in (limit [a, b]) exists check.
limit The figure, in unit. Leave it out (or null) in a template still to be filled in: the rule reports UNKNOWN.
limit_from A limit that depends on a project fact or a site figure (below).
applies_if The rule applies only in some cases (below).
unit mm, m², %, °, or none. Lengths are millimetres.
warn_within A pass this close to the limit is WARN.
warn_within_pct The same, as a percentage of the limit.
tolerance A value this far outside the limit is WARN, not FAIL: 6000 with tolerance 200 accepts 5800.
note What the rule says in plain words, its exceptions, and anything the check simplifies.

op: "check" is for what a drawing can't measure (overlooking, overshadowing, materials, waterproofing). It is listed once, as UNKNOWN, for someone to check by hand. Put the figures in the note.

What can be measured

each Metrics
site site_area_m2, lot_width_mm (the street frontage), coverage_pct (roofed area as % of the site), roofed_m2, soft_m2, soft_pct, landscaped_pct, pos_m2, pos_largest_m2, pos_min_dim_mm (private open space marked on the plan), car_spaces (a project fact)
dwellings front_setback_mm, min_side_setback_mm, rear_setback_mm, floor_area_m2 (footprint), and the project facts building_height_mm, wall_height_mm, storeys, gfa_m2
structures carports, verandahs, sheds and pergolas (role: carport, verandah, outbuilding): floor_area_m2, post_height_mm, roof_height_mm, roof_pitch_deg, front_setback_mm, min_side_setback_mm, width_mm, length_mm, boundary_length_mm, forward_of_building_line, attached
fences height_mm, length_mm, front
rooms floor_area_m2, min_dim_mm, ceiling_height_mm (when measured or set), room_type (bedroom, bathroom, wc, laundry, kitchen, living, study, hall, garage, storage, other), wet
openings doors and windows: kind (door or window), width_mm (as drawn), clear_width_mm (set in the Inspector), height_mm, sill_mm, room, external
driveways width_mm, width_at_boundary_mm, gradient_pct, centreline_angle_deg
trees, roofs, earthworks see list_rule_packs on the connector

Only a height someone measured or entered counts: drawing defaults never pass a rule.

Facts the drawing doesn't hold: params and limit_from

Declare what a person must enter for the project:

"params": [
  { "id": "wa_r_code", "label": "R-Code density", "type": "select", "options": ["R20", "R30", "R40"] },
  { "id": "zoning_front_setback_mm", "label": "Front setback in your zoning code", "type": "number", "unit": "mm", "help": "From your local zoning code" }
]

Then a rule's limit can come from it:

applies_if limits a rule to some cases: { "param": "nsw_zone", "in": ["R1", "R2"] }, { "metric": "site.site_area_m2", "between": [450, 100000] }, { "param": "storeys", "op": ">=", "value": 2 }.

Until a fact is entered, its rules report UNKNOWN and say which fact they need. The common facts building_height_mm, wall_height_mm, storeys, gfa_m2 and car_spaces are shared by every pack.

YAML

The same fields:

id: seaview-estate
name: Seaview Estate design guidelines
version: "2026.1"
source_url: https://example.org/seaview-guidelines.pdf
rules:
  - id: front-setback
    title: House front setback
    ref: "4.1"
    each: dwellings
    metric: front_setback_mm
    op: ">="
    limit: 6000
    unit: mm
    tolerance: 200

Quote operators (">=") and versions ("2026.1").

CSV

One rule per row. Pack details go on # key: value lines above the header:

# id: seaview-estate
# name: Seaview Estate design guidelines
# version: 2026.1
# source_url: https://example.org/seaview-guidelines.pdf
id,title,ref,each,where,metric,op,limit,unit,tolerance,note
front-setback,House front setback,4.1,dwellings,,front_setback_mm,>=,6000,mm,200,
fence,Front fence height,6.2,fences,front=true,height_mm,<=,1200,mm,,
colours,Roof and wall colours,5.3,site,,,check,,,,From the approved palette only.

where: role=outbuilding;status=proposed. limit: 3000, 2..10 for between, a|b for in. limit_from, applies_if and params: JSON in the cell, with quotes doubled.

Versions and updates

Rules an AI agent enters

An agent connected to Plotlay can build a pack from a document it has read (create_rule_pack, update_rule_pack, import_rules). Each rule it enters is marked "needs review" until a person confirms it in the app (Design codes, Rules, Confirm). Until then, reports say: "Includes rules entered by an AI agent and not yet reviewed."

Good practice for authors