Case study · Senior project · Full-stack developer & analyst
HorPlug — Smart Dormitory Management System
A cross-platform Flutter application that lets landlords and tenants run an entire dormitory from one app.
- Timeframe
- 2025 — senior project (ongoing)
- Team & role
- Team of 4 · my role: analyst + full-stack developer
Context
Small dormitory owners in Chiang Mai still run their buildings on paper: handwritten meter readings, LINE messages for repairs, and cash or manual bank transfers. Mistakes in a single meter reading turn into a billing dispute at the end of every month.
Problem
- Billing is manual: readings, rates, and late fees are recalculated by hand for every room.
- Payments arrive as chat screenshots, so reconciliation depends on the landlord's memory.
- Tenant requests are scattered across personal chats with no status or history.
Approach
01
Requirement gathering with real landlords
Interviewed dormitory owners and tenants, mapped the current month-end process as an as-is flow, and wrote user stories with acceptance criteria before any UI was drawn.
02
Data model first
Designed normalised tables for buildings, rooms, contracts, tenants, meter readings, invoices, and payments, so an invoice can always be traced back to the exact reading that produced it.
03
Automated invoicing and PromptPay
Invoices are generated from readings and contract rates, then rendered as a PromptPay QR that already carries the exact amount, removing typing mistakes on the tenant's side.
04
Realtime chat and notifications
Landlord–tenant conversations live next to the room record, so a repair request keeps its context and status instead of disappearing in a personal chat.
Architecture & stack
- Flutter (Dart) single codebase for Android, iOS and web.
- Supabase Postgres with row-level security separating landlord and tenant access.
- Realtime subscriptions for chat and invoice status updates.
- PromptPay QR payload generated client-side from the invoice total.
- Flutter
- Dart
- Supabase
- PromptPay API
- Realtime chat
Outcome
- Month-end billing moves from a manual spreadsheet routine to a few taps per building.
- Every charge is auditable: reading → invoice → payment are linked records.
What I learned
- Domain rules (proration, deposits, late fees) are where most of the complexity hides — they belong in the analysis phase, not in the UI.
- Row-level security is far safer than filtering by user id in application code.