<f/>
Work

Foral

Design & build

Foral keeps a private landowner's holding on record in one place: every plot, its official property records, its documents, the purchases and sales behind it, the deadlines attached to it, and the people involved in each.

The map is the front page. Plots are drawn by hand straight over aerial photography, and each area is measured from that drawing every time the screen loads instead of being typed in once and left to go stale.

Nothing runs on a timer. Expired documents, overdue tasks, mismatches and approaching deadlines are all worked out at the moment you open the screen, so what you are looking at is never yesterday's answer.

What it covers

Who uses it
Owner, manager, accountant, heirs
How plots are recorded
Drawn by hand over aerial photos
Kept for each plot
Records, documents, sales, crops, deadlines
Where it runs
The client's own server
Status
First version signed off by the client

Surfaces

Web, on a computer or a phone.

Highlights

The map is the front page

Plots are drawn by hand over aerial photography, and the map is the first thing you see rather than a tab off to one side.

Everyone sees only theirs

Who may see or change which plot is decided on the server for every single action across the four kinds of user, never just hidden from the screen.

Nothing waits for a job

Expiries, overdue tasks, mismatches and deadlines are worked out as the page loads, so there is no nightly job quietly falling behind.

Areas measured, not typed

A plot's area comes from its shape on the map every time it is shown. There is no figure in a box that can disagree with the drawing.

The paperwork of owning land

Official property records and tax values, documents kept behind a login, purchases and sales, a field book of crops season by season, and a calendar of what falls due.

Sign-in built in-house

Passwords are stored scrambled beyond recovery and sessions are held in the database, with everything arriving from the outside checked before it is trusted.

Built with

  • TypeScript
  • Next.js 16 App Router
  • React 19
  • Tailwind v4 and shadcn/ui
  • PostgreSQL 17 with PostGIS
  • Drizzle ORM
  • MapLibre GL with terra-draw
  • argon2id on database-row sessions
  • Docker on one bare-metal host
Work