~/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.
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
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
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.
Feb 2024
First version: an API and web front end for Bluewater Maribago.
Oct 2024
Rebuilt from scratch on Clean Architecture, with a Blazor Server + Fluent UI back office for employees, attendance, forms and pay.
Nov 2024
Payroll engine, reports and employee import — and the first demos to HR.
Dec 2024
Barcode time clock, meal credits and CSV report exports.
Sep 2025
A complete REST API for every HR module, paving the way for native apps.
Oct 2025
.NET MAUI desktop app: slide-in editors, CSV imports, dashboards and charts.
Mar 2026
Deductions, payroll submission and download, and silent MSIX auto-updates for Windows.
May 2026
Service-charge uploads; smarter undertime and absence rules around leave and holidays.
Sep 2026
Multi-property tenancy recovery, night-shift timesheets and meals.
Oct 2026
Employee mobile app for Android and iOS.
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.