
Custom Software
Star Skate & Scooter
A staff-facing mobile PWA for Star Skate & Scooter that lets counter and field staff start and end skate and scooter rentals in one tap, with live timers, automatic Birr pricing, and offline operation when park Wi‑Fi is unreliable.
Recreation & Leisure
- React 19, TanStack Start, Bun, SQLite (Drizzle ORM), IndexedDB, Tailwind CSS
Challenge
Star Skate & Scooter runs two rental lines — prepaid skate packages and per-minute scooter rides — across multiple staff at an outdoor park. Tracking sessions on paper or memory led to missed overtime charges, slow checkout at busy periods, and no single view of daily revenue. Staff also needed something that worked on phones when connectivity dropped.
Solution
We built an offline-first PWA installed on staff phones. PIN login gates three roles (Admin, Skate, Scooter) so each team only sees and controls their rentals. Skate sessions use a prepaid countdown (default 200 Br / 60 min) with explicit overtime handling; scooters bill per minute (default 8 Br/min) against a live fleet board of 6 units. A background sync layer pushes local IndexedDB changes to a central SQLite server so multiple devices stay aligned.
Result
The system supports bulk group skate starts (up to 30 sessions per tap), browser notifications when package time expires, and a same-day revenue dashboard broken down by rental type and location. Confirm operational impact with the client before publishing numbers.
Key features
- One-tap session control — Large touch targets to start/end skate or scooter rentals; live elapsed or countdown timers with automatic Birr totals at checkout.
- Offline-first PWA — IndexedDB local store with service worker; sessions continue without network; push/pull sync to server when back online.
- Role-based staff auth — PIN login for Admin, Skate, and Scooter roles; each role sees only relevant sessions and actions.
- Skate package + overtime workflow — Prepaid countdown, “Time’s Up” alerts, and staff choice to end at package price or start overtime billing (default 5 Br/min).
- Bulk group skate start — Start up to 30 skate sessions under one group label in a single action for school trips and events.
- Operations dashboard — Today’s revenue, active session count, running total, breakdown by skate vs scooter and by location, plus recent session history.
Live site preview
Outcomes
~1 week
Delivery time
TBA
Client satisfaction
Technical approach
Client-side IndexedDB (idb) holds sessions, scooters, settings, and staff for instant reads/writes at the counter. A lightweight sync loop pushes unsynced records to a Bun server and pulls server updates, resolving multi-device use without blocking the UI. Server persistence uses Drizzle ORM over SQLite (bun:sqlite), containerized via Docker with a persistent volume for the database. TanStack Start provides SSR and API routes in one codebase; the app is installable as a standalone PWA on iOS and Android.
What's next
TBD — possible additions: exportable daily reports, SMS receipts for scooter customers (phone number is already captured), and multi-location support beyond the single default site.
Project details
- Client
- Abdurahman Nesredin
- Service
- Custom Software
- Timeline
- ~1 week
- Stack
- React 19, TanStack Start, Bun, SQLite (Drizzle ORM), IndexedDB, Tailwind CSS

