Skip to content
adrian.llamido
All work

~/bluewater · case study · sole engineer · 2024 — present

Bluewater

HR, timekeeping and payroll for six resorts and hotels in the Philippines.

I designed and built Bluewater end to end as its sole engineer: a back office for HR and payroll staff, a barcode time clock at the staff entrance, a Windows desktop app and a mobile app that puts schedules, hours and payslips in every employee's pocket.

Client
Bluewater Resorts & Almont Hotels
Role
Sole engineer — architecture, development, deployment and support
Timeline
Feb 2024 — today
Platform
.NET 8 & 10 · Blazor · .NET MAUI · SQL Server
resorts & hotels on one platform
6
apps: back office, time clock, desktop, mobile
4
domain aggregates in the core model
29
computed fields on every payslip
56
commits, 99% of them mine
650+
pull requests merged
240+

01~/the-challenge

Resort hours don’t fit a spreadsheet.

Resort work doesn't fit nine-to-five. Staff rotate across morning, afternoon and night shifts, work through rest days and public holidays — and under Philippine labour rules, each of those hours is paid differently.

Add government contributions (SSS, PhilHealth and Pag-IBIG, each with employee and employer shares), service-charge sharing, meal credits, allowances and union dues — then multiply by six properties, each running its own roster and its own payroll cut-off.

Bluewater gives HR one place to run all of it: from the barcode scan at the staff entrance to the payslip at the end of the cut-off.

Six properties, one platform

  • Bluewater Maribago01
  • Bluewater Panglao02
  • Bluewater Sumilon03
  • Almont Inland Hotel04
  • Almont City Hotel05
  • Almont Beach Resort06

02~/what-i-built

Four apps, one source of truth.

HR staff, payroll staff and every employee touch Bluewater differently, so each gets an app shaped for their job — all running on the same domain model and the same rules.

01

Back office

Blazor Server · Fluent UI

Where HR manages people, schedules, timesheets, forms and payroll — with filters by department and cost centre.

02

Time clock

Blazor · barcode kiosk

A kiosk at the staff entrance: scan an ID to check in or out, or to redeem a meal credit.

03

Desktop app

.NET MAUI · Windows

A native app for payroll staff with dashboards, bulk CSV imports, payroll submission and silent MSIX auto-updates.

04

Employee app

.NET MAUI · Android & iOS

Self-service for every employee: today's shift, hours worked, the week ahead, timesheets, payslips and company news.

The time clock at the staff entrance: scan to clock in or out, or to redeem a meal.
The employee app: today’s shift, hours so far, the week ahead and the latest payslip.

Screens recreated with fictional names and figures — the production system holds real employee data.

03~/inside-the-platform

Everything between the first punch and the payslip.

# People

Employee records with the full organisation — divisions, departments, sections, positions, levels and employee types — plus cost-centre charging, bulk CSV import and export, and filters for separated staff.

# Time

A shift library and weekly schedules with CSV import, timesheets that understand night shifts and missing punches, work-hour corrections and alerts when punches don't match the schedule.

# Forms & leave

Overtime, undertime, failure-to-log, leave with leave credits, deductions and other earnings — filed, approved and fed straight into payroll.

# Payroll

Semi-monthly payroll covering SSS, PhilHealth and Pag-IBIG, night differential, rest-day and holiday premiums, service charge, allowances, union dues, lates and undertime.

# Meals

Meal credits redeemed with a barcode scan, with per-employee and per-period summaries.

# Reporting

Payroll exports, journal-voucher (JV) and FTE reports for finance, and Excel or CSV downloads wherever HR needs them.

# Self-service

A mobile app that answers the questions HR hears most: When am I working? How many hours have I logged? Where's my payslip?

# Operations

Per-property tenancy, MSIX auto-updates for Windows clients, in-app release notes and one-tap diagnostic log export.

04~/the-hard-part

Every hour has its own price.

A night-shift hour on a regular holiday that runs into overtime isn’t the same as a Tuesday morning hour. Bluewater classifies every hour from the timesheet against the schedule, the holiday calendar and approved forms — then resolves 56 fields per employee, per cut-off.

Premium pay

  • Overtime
  • Night differential
  • Night differential × overtime
  • Rest day & rest-day overtime
  • Special holidays — regular, overtime, night
  • Regular holidays — regular, overtime, night

Contributions

  • SSS — employee & employer
  • PhilHealth — employee & employer
  • Pag-IBIG — employee & employer

Adjustments

  • Lates, undertime & overbreak
  • Absences & leave
  • Service charge
  • COLA & allowances
  • Union dues
  • Refunds & underpayments
A semi-monthly payslip. Fictional figures.

05~/how-its-built

Clean Architecture, because payroll can’t be wrong.

The rules that decide someone’s pay live in one framework-free core. Every app — web, desktop, mobile, kiosk — goes through the same use cases, so a rule fixed once is fixed everywhere.

Blazor apps

Back office

Blazor Server · Fluent UI

Time clock

Blazor · barcode kiosk

Native apps

Desktop app

.NET MAUI · Windows

Employee app

.NET MAUI · Android & iOS

REST API

ASP.NET Core · FastEndpoints · Swagger

Use cases

MediatR commands & queries · validation · explicit results

Domain core

29 aggregates · domain events · specifications · no framework dependencies

Infrastructure

EF Core · SQL Server / SQLite · ASP.NET Identity · MailKit · ClosedXML · CsvHelper

Dependencies point inward — the core knows nothing about UI, database or transport.Tests: unit · integration · functional

Clean Architecture & DDD

A framework-free core of 29 aggregates — employees, shifts, schedules, timesheets, payroll and more — with domain events and specifications. Infrastructure plugs in from the outside.

Use cases as commands & queries

Every feature is a MediatR command or query with explicit results, so the Blazor apps, the REST API and the tests all exercise exactly the same logic.

One API, many clients

A FastEndpoints REST API with Swagger, ASP.NET Identity and JWT serves the native apps; the Blazor apps run the same use cases in-process.

Tested where it matters

Unit, integration and functional test projects (xUnit) cover the domain, the use cases and the API — with particular attention to attendance and payroll rules.

Shipped continuously

240+ pull requests, a self-updating Windows client delivered via MSIX/AppInstaller, and in-app release notes so staff always know what changed.

Data in, data out

Robust CSV and Excel pipelines (CsvHelper, ClosedXML) for employees, schedules, leaves, deductions and service charge — because HR lives in spreadsheets.

  • C#
  • ASP.NET Core
  • Blazor Server
  • Fluent UI
  • .NET MAUI
  • FastEndpoints
  • MediatR
  • EF Core
  • SQL Server
  • xUnit

06~/timeline

Grown steadily, one release at a time.

Bluewater grew alongside the people using it — each release shaped by what HR and payroll staff needed next.

  1. Feb 2024

    First version: an API and web front end for Bluewater Maribago.

  2. Oct 2024

    Rebuilt from scratch on Clean Architecture, with a Blazor Server + Fluent UI back office for employees, attendance, forms and pay.

  3. Nov 2024

    Payroll engine, reports and employee import — and the first demos to HR.

  4. Dec 2024

    Barcode time clock, meal credits and CSV report exports.

  5. Sep 2025

    A complete REST API for every HR module, paving the way for native apps.

  6. Oct 2025

    .NET MAUI desktop app: slide-in editors, CSV imports, dashboards and charts.

  7. Mar 2026

    Deductions, payroll submission and download, and silent MSIX auto-updates for Windows.

  8. May 2026

    Service-charge uploads; smarter undertime and absence rules around leave and holidays.

  9. Sep 2026

    Multi-property tenancy recovery, night-shift timesheets and meals.

  10. Oct 2026

    Employee mobile app for Android and iOS.

  11. Nov 2026

    FTE and journal-voucher (JV) reports for finance.

Private codebase

Want the full tour? I’m happy to walk you through the code.

Bluewater runs on real employee and payroll data, so the repository is private. Get in touch and I’ll show you the architecture, the payroll engine and how it ships.