ziecina.dev
← All projects
In productionReal client2026 – present

Stajnia Lauden

A production web app that runs the daily work of a horse boarding stable with 60+ boxes.

Role
Everything: requirements, UX, backend, frontend, deploy
Users
Owners (admins), staff, trainers, horse owners, lessees
Devices
Phones, tablets, wall-mounted screens
Links
stajnialauden.pl ↗Code is private

The problem

A stable with 60+ boxes, its staff and many horse owners. Every request (“extra hay for box 12”, “turn him out at 10 tomorrow”) went through social media messengers and memory. Billing for extra services was done by hand at the end of the month.

My role

Everything: requirements gathering with the owner, UX, backend, frontend, deployment and support. I met the client regularly, turned feedback into small iterations and shipped frequent production releases.

What I built

One app for five roles

Admin, staff, trainer, horse owner and lessee. Each role sees only what it needs, with role-based access control enforced on the API.

Service orders

Horse owners order one-off or subscription services for today or tomorrow. Staff see them on a live task board and accept, complete or cancel them.

Feeding and turnout instructions

Owners pick from a catalogue of ready-made messages. Staff see today's plan per box, and staff can change times for today only.

Billing

Monthly boarding, camera and lease fees, one-off and subscription services, net/gross VAT per box (horses billed to a company), and separate cash and bank-transfer balances. Prices are frozen on each order, so later catalogue changes never rewrite history.

Scheduled jobs

Daily tasks from subscriptions, monthly charges and payment reminders.

Web Push notifications

With an icon badge counter for staff and owners, working even when the app is closed.

Designed for real users

Many users are older people, so the UI follows strict rules: text is at least 18 px, buttons and other touch targets are at least 48 px, and a status is always written out, never shown by colour alone. Feed rooms and paddock exits have wall-mounted screens that show today's plan without anyone touching them.

Engineering

  • REST API in NestJS + Prisma/PostgreSQL with email verification, password reset and secure photo uploads.
  • 130+ unit and 100+ end-to-end tests (Jest, Supertest), covering access rules (“a lessee can't see another lessee's fees”).
  • CI/CD with GitHub Actions → Docker Compose on a VPS, with Caddy for automatic HTTPS, a database backup before every deploy and data-safe migrations.
  • A decision log: every significant change is written down with the reason behind it and the options that were rejected.

Key decision

React Native (Expo)Installable PWA

A PWA instead of a native app

I started with a React Native (Expo) app. After watching how the owner actually used her phone, we switched to a single installable web app. It's one codebase for every device, needs no app store, and updates instantly. That was the right call, and I'd make it again.

Screens

Screenshots from the demo environment. Names, e-mails, horse names and amounts are blurred.

Staff task board with numbered boxes and open tasks
Staff · task board on a tablet
Wall-mounted feed-room screen with breakfast, lunch and dinner changes per box
Feed room · wall screen with today's feeding changes
Horse owner's home screen with stable announcements, leases and boxes
Horse owner · boxes and announcements
Ordering a one-off service from the catalogue
Horse owner · ordering a service
Admin list of users with roles and balances
Admin · users and balances
Billing view for one client with balances and payment history
Admin · billing for one client
Next projectBuild Budget →