← All projects

DSE-Mriya

Internal · PWAInternal product

An internal PWA for the heavy-equipment department: an operator logs plan and actuals from the field in a minute, the manager sees it all in numbers and exports to Excel. Built for my own department's need.

Role
Product, design and code — one person
Purpose
For a real need in my own heavy-equipment department
Where
Mriya Resort & SPA — vineyards and land work
Stack
Next.js 16 · React 19 · TypeScript 5.9 · PostgreSQL 17 + Prisma 7 · Tailwind 4 · PWA
Highlights
Offline form cache · PIN login · add-to-home-screen · Excel export
Timeline
Apr 2026 · internal product · deployed via Dokploy

Why it exists

The heavy-equipment department at Mriya Resort & SPA runs dozens of jobs a day: operators spray, cultivate and mulch the vineyards, and occasionally take on land work on the side — planting grape seedlings and preparing plots. Reporting used to be verbal and on paper — who did what and where, how much got done, how long each machine ran — almost impossible to turn into numbers.

I run this department and built a tool for my own pain: a simple app where an operator logs plan and actuals from their phone in the field in under a minute, and I, as the manager, see the whole picture in numbers and export it to Excel. Designed, styled and coded solo.

Plan in the morning, actuals in the evening

The workflow mirrors the real day. In the morning the operator opens the app, picks a location, a machine and the plots, and sets the plan and the start-of-shift engine hours. In the evening they come back and close the actuals in three fields: how much was done, end-of-shift engine hours, notes. No extra screens — everything is large and built for a thumb.

Login is a short PIN, no usernames or passwords — faster in the field. Forms are cached offline, so poor signal among the vineyards doesn't stop a report — data syncs the moment there's a network.

The manager sees it all in numbers

The whole point of the project. The dashboard shows a summary for the period: hectares and rows worked (plan vs actual) and the engine hours each machine ran. Below it are the breakdowns I used to total up by hand.

  • By operator — who did how much and logged what hours
  • By machine — the load on each tractor
  • By job type — where the hectares and rows went
  • Periods: week, month, quarter, year, or a custom range
Dashboard: hectares, rows, engine hours and breakdowns by operator, machine and job type.

Journal and Excel export

Every record lands in a filterable journal — by operator, machine and dates — so it's easy to pull up the history for any plot or person. One button exports the journal to Excel: a ready table for payroll, work orders and reporting upwards, with no manual re-typing.

Journal: filters by operator, machine and dates + Excel export.

Under the hood

A small but real app: one Next.js codebase serves both the operator PWA and the admin panel. Built simple and reliable — to work in the field and need no babysitting.

  • Next.js 16 (App Router) · React 19 · TypeScript 5.9
  • PostgreSQL 17 + Prisma 7
  • Tailwind 4 + custom shadcn-style components, charts on Recharts
  • PWA via @ducanh2912/next-pwa: add-to-home-screen, offline form cache
  • PIN login with bcrypt and rate limiting, cookie sessions
  • Excel export with exceljs; deployed via Dokploy with automatic TLS

A working day — in one window

The entire operator journey — from login to a closed shift — fits into a few simple, thumb-friendly screens.

Login by name and PIN — no usernames or passwords.
‘Today’: plan and actuals for the day, completion progress.
Day plan: location, machine, plots, engine hours.
Evening report: actuals, engine hours, notes — works offline.
Contact

Let's
talk.

Looking for a role in product / AI / operations — remote or relocation.

Open to new opportunities. Happy to walk you through my experience in detail, show you the projects, and share access to the code.

Open to remote / relocation / business trips