Case study · Public interest / housing and mobility
Where can I lawfully sleep tonight? One question, answered with its sources attached
- Node.js
- JavaScript
- MapLibre
- Cloudflare Pages
- GitHub Actions
✓ Verified Review“The load-bearing decision in FreeCamps is that unknown is rendered as unknown. Every New South Wales council page says so, because the state keeps no register of local laws - and 1,334 rest areas are held back because their publisher never set a licence. A site that always has a confident answer is the one that gets somebody moved on at midnight.”
Pages, each built from a pinned official snapshot
Legal claims, each with a source, a quote and a date
Rest areas withheld because the licence does not permit republishing
Runtime and build dependencies
The challenge
Overnight-stay law differs by state and by council, is published in incompatible formats by dozens of agencies, and is easy to over-read. A reader acting on a wrong answer is moved on at midnight or fined. The people who most need the answer are the least able to absorb either.
What we built
A dependency-free static generator over pinned official snapshots, with every legal claim gated on provenance: source URL from an official-domain allowlist, exact quote, retrieval date and re-verification deadline, enforced in the build rather than in review.
- A claims register: 86 legal statements, each with an official source, exact quote, retrieval date and re-verification deadline
- Fail-closed licensing - an unrecognised or missing licence makes a snapshot unpublishable
- Per-jurisdiction template modules, because the law differs in kind and a shared template would blur it
- Composed place titles from a field-entered source, with collisions resolved against the whole set
- Zero runtime dependencies: Node builtins only, MapLibre and fonts vendored, no CDN at build or run time
- One launch flag driving the robots meta, robots.txt, the X-Robots-Tag header and the llms.txt notice
The stack
A Node generator with no package dependencies at all; MapLibre and font subsets vendored; per-jurisdiction template modules so one state's rule is never written in another state's voice; a fail-closed licence allowlist over every snapshot; a monthly refresh that opens a pull request only when the data actually changed; and one boolean controlling the robots meta, robots.txt, the header and the llms.txt notice.
The outcome
The live site carries 2,759 pages across Queensland, New South Wales, Western Australia and the remaining states and territories, plus national showers and libraries directories. 1,334 rest areas in the Northern Territory, South Australia, Victoria and Tasmania are deliberately not shown: their publisher set no licence, the allowlist fails closed, and the pages say so rather than quietly omitting them. Every NSW council page reads unknown, because New South Wales keeps no register of council local laws and inventing a confident answer would be the most damaging thing the site could do.
Where it went next
The site is built to run for years on close to no attention: it builds only from committed snapshots, so a government API outage can delay a refresh but never break a deploy, and the monthly refresh asserts row counts because a zero-row success is the classic silent failure. There are no accounts, no user content and no comments - the product principle and the maintenance principle are the same one.
This case study describes a live product designed and built by National Digital. Figures are counted from the shipped build. The site publishes legal information, not legal advice, and on-ground signage overrides every published page.
Key Takeaways
Engineering a legal-information site that stays correct unattended
- Legal claims are gated by the build, not by reviewer discipline: 86 claims, each with source, quote, date and deadline.Critical
The claim gate fails the build on a missing source, an off-allowlist domain or a quote that no longer matches, and the template helper throws if a page renders an unverified claim as fact. Staleness is reported rather than fatal, and the retrieval date is printed on the page.
- Licensing fails closed, so an unlicensed snapshot is unpublishable rather than accidentally published.Critical
An allowlist names the licences that permit republishing. 1,334 rest areas across four jurisdictions are held because their publisher set no licence string, and the pages name the gap. Everything downstream is still built and tested, so restoring them is one field in a snapshot.
- Each jurisdiction gets its own template, because the law differs in kind and a shared one would blur it.Critical
Queensland publishes a rule permitting a stop of up to 20 hours unless signed otherwise; New South Wales guidance says the opposite in as many words. A reader given one state's framing for another's law is being told the wrong thing confidently, so the page mechanics are shared and the prose is not.
- Zero dependencies is a maintenance decision with a security dividend, not minimalism for its own sake.Important
The generator uses Node builtins only and vendors MapLibre and the fonts, so there is no dependency queue to service, no CDN to trust and no framework migration waiting. The site is judged by what breaks when nobody is watching, and who then has to fix it.
- Refresh is a reviewed pull request that asserts row counts, never an autonomous write.Important
A monthly workflow pulls each source, asserts its key is present and unique and that the row count is plausible, rebuilds, and opens a pull request only when the data actually changed. A zero-row success is the classic silent failure in this class of system, so it is checked rather than trusted.
FreeCamps publishes Australian overnight-stay law as 2,759 static pages built from pinned official snapshots. Legal claims carry their source, quote and date and are gated in the build; unlicensed data is withheld rather than republished; and unknown is always rendered as unknown.
Questions decision-makers ask about this build
How do you stop a legal-information site from drifting out of date?
What happens when a government publisher forgets to set a licence?
Why not one parameterised template for every state?
How does the site handle a question the records cannot answer?
Why build with no dependencies at all?
Is there any user data to protect?
What's next
Claims you have to stand behind?
FreeCamps holds every legal statement to a source, a quote and a date, and fails the build when one drifts. If your product makes claims someone will act on, see how we approach platform engineering and data analysis and insight platforms, part of our wider custom software development work.