---
type: CaseStudy
title: 'FreeCamps: Where You Can Lawfully Stay, Traced to the Source'
description: 'How National Digital built freecamps.au: 2,759 pages of Australian overnight-stay law, every legal claim carrying its source, quote and date.'
resource: https://nationaldigital.com.au/case-studies/freecamps/
tags:
  - static site generation
  - open government data integration
  - data provenance engineering
  - zero dependency architecture
  - Open data
timestamp: '2026-09-02T00:00:00.000Z'
language: en-AU
publisher: National Digital
author: Cameron Young
authorRole: CEO
datePublished: '2026-09-02'
dateModified: '2026-09-02'
canonical: https://nationaldigital.com.au/case-studies/freecamps/
---

_Home — Recent Work — FreeCamps: Where You Can Lawfully Stay, Traced to the Source_

# FreeCamps: Where You Can Lawfully Stay, Traced to the Source

*Case study · Public interest / housing and mobility*

## Where can I lawfully sleep tonight? One question, answered with its sources attached

**At a glance**

- Industry: Public interest / housing and mobility
- Engagement type: In-house product
- First release: 2026
- Team: National Digital engineering team

[Digital Product Development](/digital-product-development) · [Platform Engineering](/platform-engineering)

### 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 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.

**Workstreams:**
- 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 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.

**The stack:** Node.js, JavaScript, MapLibre, Cloudflare Pages, GitHub Actions

_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._

## Architecture

- **Delivery** — Static HTML, maps as enhancement
- **Generator** — Node builtins, zero dependencies
- **Claims register** — Source, quote, date, deadline
- **Pinned snapshots** — One source per jurisdiction
- **Gates & refresh** — Fail-closed licensing, monthly PR

- **2,759** — Pages, each built from a pinned official snapshot
- **86** — Legal claims, each with a source, a quote and a date
- **1,334** — Rest areas withheld because the licence does not permit republishing
- **0** — Runtime and build dependencies

> 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.

— Cameron Young, CEO at National Digital

- Verified review

*Key Takeaways*

## Engineering a legal-information site that stays correct unattended

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.

- **Legal claims are gated by the build, not by reviewer discipline: 86 claims, each with source, quote, date and deadline.** 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. _Critical_
- **Licensing fails closed, so an unlicensed snapshot is unpublishable rather than accidentally published.** 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. _Critical_
- **Each jurisdiction gets its own template, because the law differs in kind and a shared one would blur it.** 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. _Critical_
- **Zero dependencies is a maintenance decision with a security dividend, not minimalism for its own sake.** 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. _Important_
- **Refresh is a reviewed pull request that asserts row counts, never an autonomous write.** 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. _Important_

## Questions decision-makers ask about this build

### How do you stop a legal-information site from drifting out of date?

Every legal statement lives in a claims register with the official source URL, the exact quote, the date it was retrieved and a deadline to re-verify it. A build gate fails on a source outside the official-domain allowlist or a quote that no longer matches, and the helper that renders a claim throws if the claim has not been verified. Staleness past a deadline is reported rather than fatal, and the retrieval date is printed on the page, so a reader can always see how old the answer is.

### What happens when a government publisher forgets to set a licence?

The data is not published. An allowlist names the licences that permit republishing and it fails closed, so an unrecognised or missing licence string makes a snapshot unpublishable. That is the live case for 1,334 rest areas across the Northern Territory, South Australia, Victoria and Tasmania, and those pages name the omission rather than quietly showing a shorter list. Everything downstream is still built and tested, so the day the publisher sets a licence it is a one-field change.

### Why not one parameterised template for every state?

Because the law is different in kind, not just in its values. Queensland publishes a rule that permits a stop of up to 20 hours unless signed otherwise. New South Wales driver-fatigue guidance says you must not camp in rest areas. Western Australia records no 24-hour stay at 1,622 of 1,673 stopping places. A shared template would quietly encourage writing one state's rule in another state's voice, so the page mechanics are shared and the prose is not.

### How does the site handle a question the records cannot answer?

It says unknown, and unknown is never rendered as permission. All 113 New South Wales council pages read unknown because the state keeps no register of council local laws. They are still published, because one thing is verifiable state-wide, and that claim is bounded in the same breath everywhere it appears - a test fails the build if the bounding sentence is removed, since it is the easiest claim on the site to over-read.

### Why build with no dependencies at all?

The design goal is to run for years on close to no attention, so every choice is judged by what breaks when nobody is watching. No dependencies means no upgrade queue, no supply-chain surface and no framework migration; MapLibre and the font subsets are vendored, so there is no CDN in the critical path either. The site also builds only from committed snapshots, which means a government API outage can delay a refresh but can never break a deploy.

### Is there any user data to protect?

None. There are no accounts, no user content and no comments, so there is nothing to moderate, no personal information held and no abuse surface. That is the same decision as the product principle - the site publishes rules rather than crowd-sourced spots - which is why the maintenance argument and the editorial argument point the same way.

## More of our work

- [Public Trails: Lawful Access, Computed from Official Records](/case-studies/public-trails/) — Spatial data
- [Surgery Waits: Comparable Hospital Waiting Times](/case-studies/surgery-waits/) — Health data
- [how2vote.au: A Provably Neutral Voting Tool](/case-studies/how2vote/) — Civic technology

*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](/platform-engineering) and [data analysis and insight platforms](/ai-automation/data-analysis-and-insights), part of our wider [custom software development](/digital-product-development) work.

## Want a platform like this for your business?

Tell us what you're building. We'll come back within one business day with what we'd do first and what it would take.

- [Book a call](https://calendly.com/cameron-at-national-digital/discovery)
- Email: enquiries@nationaldigital.com.au
- Phone: 1300 800 855

## Related

**Parent:**
- [Real platforms, in production.](/okf/case-studies.md)

**Related:**
- [NRMA Parks & Resorts: WordPress to Contentful Migration](/okf/case-studies/nrma-parks-and-resorts.md)
- [Luxico & Staylonger: One Property Management Platform](/okf/case-studies/luxico.md)
- [MyStrengths: Student Assessment Platform](/okf/case-studies/mystrengths.md)
- [Gratofy: Custom E-commerce Marketplace](/okf/case-studies/gratofy.md)
- [Micro-X: Operator and Passenger Interfaces for Imaging Hardware](/okf/case-studies/micro-x.md)
- [how2vote.au: A Provably Neutral Voting Tool](/okf/case-studies/how2vote.md)
- [Surgery Waits: Comparable Hospital Waiting Times](/okf/case-studies/surgery-waits.md)
- [Public Trails: Lawful Access, Computed from Official Records](/okf/case-studies/public-trails.md)
- [Booking systems built around your operation.](/okf/booking-systems.md)
- [Custom software, built by senior engineers.](/okf/custom-software.md)
- [AI that survives contact with production.](/okf/ai-automation-services.md)
