Projects

Four things I've built. Two are estimating tools I use in my own work, one was an experiment in how fast a website can be, and one is the site you're reading.

Kwest — Earthworks Takeoff

In development

Desktop application · Kotlin/Compose shell, Rust kernel

Earthworks measurement for tendering. It digitises contours from PDF drawings, builds a triangulated surface from them, and computes cut and fill volumes against a design surface — the numbers that go into a tender.

The interesting part is the split. The interface is Compose Desktop in Kotlin, but every piece of geometry lives in a Rust kernel loaded in-process through Java's Foreign Function & Memory API. Kotlin never holds a point or a triangle, only opaque handles — so hit-testing, snapping and volume calculation all happen in one place, in a language suited to it. The 3D viewport is a separate Rust-owned window reading kernel memory directly.

Working on it has been an education in measuring before optimising. A slow canvas turned out to be anti-aliasing rather than architecture; a slow render turned out to be re-parsing the PDF page on every frame. Both would have been the wrong thing to rewrite.

  • Rust
  • Kotlin
  • Compose Desktop
  • Panama FFM
  • wgpu
  • SQLite
  • pdfium

kubitKarl — Bill of Quantities

In development

Desktop application · Kotlin, Compose Desktop

A single-user tool for preparing bills of quantities, built for the way Australian quantity surveying actually works, to replace the commercial package I had been using.

Almost every design decision comes back to money being exact. Rates and quantities are BigDecimal from end to end — never floating point — stored as decimal strings and parsed back on load. Rounding is half-up and happens in exactly one place, so a printed line always foots: the quantity shown times the rate shown equals the amount shown. Billing quantities round up, which is a domain rule rather than a mathematical one.

Structurally it's three modules with dependencies pointing strictly inward, and the innermost one has no framework in it at all — no UI, no database, no I/O. That makes the part that computes the money testable on its own, which is the part I most want to be right.

  • Kotlin
  • Compose Desktop
  • SQLDelight
  • SQLite

Ironbark Civil & Concreting

Demonstration

Marketing site · Astro, Cloudflare

A complete marketing site for a civil and concreting contractor — a fictional one. The business doesn't exist; the build was an exercise in seeing how fast a content site can be made, and it's kept out of search results deliberately so it can't mislead anyone.

The target was perfect Lighthouse scores on a throttled mobile connection, and a budget to keep them there: a cap on page weight, on requests, and effectively zero JavaScript on content pages. The budget runs in CI, so busting it fails the build rather than being discovered later. The initial page shipped at a few kilobytes over the wire.

Behind it: a git-based CMS so the "client" could edit their own pages, and two Cloudflare Workers — one handling CMS authentication, one taking the contact form, checking a Turnstile token and sending the enquiry on. The form's bot protection loads only when someone actually starts typing, which is what keeps the contact page inside the budget.

  • Astro
  • Tailwind
  • Cloudflare Workers
  • Turnstile
  • Lighthouse CI

karloneill.com

Live

Web application · Rust

This site. A single compiled Rust binary that renders every page on the server — no JavaScript framework, no build step, nothing to install on the machine that runs it.

Axum handles routing, Askama compiles the HTML templates into the binary so a mistake in a template fails the build rather than a request, and sqlx talks to PostgreSQL with migrations that apply themselves at startup. It runs as a supervisor-managed process behind nginx on a DigitalOcean droplet, and deploys by pushing to a branch.

The colophon goes into how it's put together, and there's a small live demonstration of the database path if you want to poke at it.

  • Rust
  • Axum
  • Askama
  • sqlx
  • PostgreSQL
  • nginx