Selected work

The work we can show, written up honestly.

Kiaanlab is a young studio. We do not fill this page with borrowed logos or invented results. Client case studies appear here as engagements complete and clients agree to be named. Until then, the one project we can describe in full detail is the one you are looking at.

Case study 01, our own project

kiaanlab.com: building and running our own site the way we build for clients

This site is not a template. We designed, built and operate it ourselves, with the same stack and the same habits we bring to client work. It is the most direct evidence we can offer of how we work.

  • Python and Django
  • PostgreSQL
  • Redis and Celery
  • HTMX and Alpine.js
  • Tailwind CSS
  • Docker
  • GitHub Actions
  • nginx

The problem

A new studio has no client list to point at. We needed a site that explains what we do in plain terms, takes enquiries reliably, and can be found in search, without pretending to a track record we do not have yet.

It also had to be cheap to run and safe to change, because the same small team that builds it also has to keep it online.

What we built

  • A Django application on PostgreSQL, with Redis for caching and rate limits and Celery for background work such as sending email.
  • Server-rendered pages with HTMX, Alpine.js and Tailwind CSS. The scripts are served from our own domain, not from a third-party network.
  • A services catalogue, a blog with scheduled publishing, industry pages, and a contact form that stores each enquiry and notifies us by email.
  • Structured data, canonical addresses, a sitemap and unique titles and descriptions on every page, checked by automated tests.
  • Our own first-party visit statistics in place of a third-party tracker.

How it is run

  • Every change goes through automated checks: more than 380 tests, a linter and a format check. A change that fails does not ship.
  • A change that passes is built into a container image and deployed to production automatically, with no manual steps on the server.
  • The database is backed up every night, and the restore has been tested, not assumed.
  • The contact form is protected by rate limits, a hidden trap field, a blocklist of throwaway email domains, spam scoring and duplicate detection, without making real visitors solve a puzzle.
  • Server errors are emailed to us, logs and disk use are capped, dependencies are audited for known vulnerabilities, and the site is checked from outside on a schedule.

What went wrong, and what we changed

  • A template comment written across several lines showed up as visible text on every page for about an hour. We fixed it and added a test that fails if template syntax ever reaches a visitor.
  • Background tasks were not being loaded by the application, so the contact form returned an error instead of saving the enquiry. We found it in our own review, fixed the cause, and now queue tasks only after the enquiry is safely stored.
  • A deployment of a second application on the same server removed this site's routing for about two minutes. Both deployments now restore it automatically.
  • A responsive heading size reset its line height, so long titles overlapped. We replaced one-off sizes with a single type scale used across the whole site.

The outcome

The site is live, deploys itself on every approved change, and has an audited search setup. It is too new to report traffic or enquiry numbers, so we do not quote any. When there are real figures, they will be added here.

What every client case study will include

01

The problem

The business context and constraint that made this worth solving, not just the feature request.

02

The architecture

The real technical decisions, including the ones that turned out to be wrong and what we changed.

03

The outcome

What shipped, what it's measured against, and what we'd do differently next time.

Client write-ups will follow the same format. Until then, see the process we follow and the services behind it.

Tell us what you're building.

Have a product idea, business problem, or system that needs improvement? Tell us a little about it and we'll start from there.

Discuss a similar project