Personal project2026
Crystal Ski Rental
A reservation system for a ski rental with four stores — customer booking, staff front desk and admin, built like a real client project.
- Type
- Personal project
- Role
- Solo — requirements, design, full-stack development
- Period
- 2026 · in progress
- customer, store staff, admin
- 3 roles
- seeded reservations across 4 stores
- 1,000
- Playwright tests on their own database
- E2E
Why I built it
Most portfolio projects are todo apps. I wanted one that behaves like real client work: a written brief and requirements first, then a plan delivered as a sequence of reviewable commits, and finally an honest document listing what a real rental would still need before taking customers.
Crystal Ski Rental is a (fictional) ski rental with four stores in Slovak resorts.
What it does
Customers find skis available for their dates, see the price with a length-of-rental discount, book, cancel, and rate both the rental and the ski model.
Store staff run the front desk — pickups, returns and no-shows — and manage their store’s fleet and customer accounts. A manager can only change skis in their own store.
Admins own the catalogue, prices, stores and staff accounts.
Interesting parts
Demo data that never goes stale
The seed is a committed snapshot: 4 stores with 100 pairs of skis each, 27 models, 100 customers and 1,000 reservations from three months back to three months ahead. Nothing in it is dated — every date is an offset from the day of seeding, so the demo always looks current.
The data is also scripted: the demo customer has a rental with a locked rating, one returned today whose rating is still editable, a family booking coming up and one cancelled — so every screen has something meaningful to show.
Seed data people can read
Seed files refer to each other the way people do — stores by slug, models by “Brand Model”, accounts by e-mail — instead of opaque IDs. A generator rewrites them deterministically, and the seeder validates everything before writing a single row.
Tested like production
Unit tests run in Vitest, and Playwright end-to-end tests run against their own database, so they never collide with local development data.