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

  1. 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.

  2. 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.

  3. 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.

  4. 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.