EleonwoodHospitality Growth TechnologiesNew project
← All work
Hospitality · Greece

Minotavros

A production web app that replaced phone calls, group chats and spreadsheets for a short-stay apartment operator in Greece. Front desk, maintenance, housekeeping, hosts and guests all work from the same live picture of every room.

minotavros.xyz
The maintenance dashboard with status counters: pending, in progress, needs technician, material shortage, painting, CapEx and completed.
Maintenance dashboard — production system, sample names and codes02

At a glance

Challenge
Hundreds of apartments across a city, run from phone calls, group chats and spreadsheets.
What we built
One live system for 369 rooms: maintenance, the room board, housekeeping checks, reports and an AI assistant.
Outcome
96%
of 1,628 maintenance issues resolved
1,565 closed, and none of the rest simply forgotten.
Platform
minotavros.xyz
Scope
Design and full-stack build, 15 modules, 7 roles
Scale
369 rooms, one live picture
Status
Live, in daily use
Year
2026

The brief

rooms tracked across 50+ properties
369
maintenance issues logged
1,628
of issues resolved (1,565)
96%
faster housekeeping room checks, as reported by the operator
10×

Hundreds of apartments, scattered across a city, run from chat threads.

A hotel has one building and one front desk. This operator has hundreds of apartments in dozens of buildings, each with its own key locker, cleaning rota and quirks. Before Minotavros, the state of a room lived in someone's head or in a message nobody could find again.

Now every fault, every clean, every locker code and every inspection goes through one app, in Greek and English. Seven roles each land where their work is, and each sees only what it needs.

There is no server to patch. The client talks to Firestore directly under strict rules, and anything privileged or third-party runs in Cloud Functions. Serverless, real-time, and cheap to run.

The approach

  1. Maintenance that says why a job is stuck

    Most trackers stop at open and closed. Here a job that cannot move says what it is waiting for — a technician, materials, painting or capital spend — so a manager can act on the blocker instead of chasing the maintainer. Every job has an owner, a priority from SOS to low, tags and photos. Front desk logs a fault from one form: picking a property fills in the address and floor, and a duplicate check warns if the same fault is already open.

  2. A room board three teams share

    Each room is a card that moves through a fixed sequence: unchecked, cleaned, locker ready, ready. Housekeeping, the locker check and the final inspection are separate steps owned by different people, and the colour shows how far the room has got. Today's schedule is imported from the PMS, the key-locker number and code sit on every card, and open maintenance issues surface on the room they affect. Housekeeping accounts can be locked to one property group.

  3. Hestia: the morning plan in three clicks

    The property management system exports Excel. Housekeeping needs paper. Hestia parses the export, works out arrivals, departures, stays and which long stays are due a mid-stay refresh, then produces an editable preview and a PDF per team. The PMS has no usable API, so Hestia tolerates renamed columns and odd room names, and matches every row against the room registry. Imperfect integration shipped beats perfect integration planned.

  4. Numbers management can act on

    Because every action goes through the app, reporting comes for free. The reports answer operational questions: which trade do we need to book, which building costs the most, is the backlog growing. Weekly created versus completed, technician and material needs rolled up from blocked jobs, a printable report per building, and tabs for room status, cleaning completion and staff activity.

  5. When a stay goes wrong, the recovery is tracked too

    Fixing the tap is half the job. The other half is what the guest remembers. Three modules close that loop. Staff issue a compensation voucher in one dialog, tied to the original booking and a reason, with a unique code, an expiry date and a bilingual PDF. At the end of every shift the host files a structured report instead of a long chat message. And reviews exported from the booking channels are imported, de-duplicated and matched to reservations, so a score lands on the room and the stay it belongs to, next to that room's maintenance history.

What kept going wrong

Every module answers something that kept going wrong.

  • A fault was reported by phone, then forgottenso every job now has an owner, a priority and a reason it is waiting: technician, materials, painting or capital spend.
  • Front desk could not tell whether a room was ready before a guest arrivedso housekeeping, locker and inspection each move the room one colour forward. Green means ready, with no phone call needed.
  • Daily housekeeping plans were typed by hand from PMS exports every morningso Hestia takes the Excel export and returns arrivals, departures, stays and mid-stay refreshes as a printable PDF per team.
  • Guests had no channel besides calling, and staff had no way to show progressso guests report a fault with a photo, follow its status and read their check-in instructions.
  • Management had no numbers: which buildings break most, which trades are needed, how fast jobs closeso there are trends, priority and status splits, technician and material needs, per-building analysis and staff activity.
  • Supplies, linen, compensation vouchers and deep cleans each lived in a separate spreadsheetso each is now a module behind the same login, and each role sees only what it needs.

Once staff were logging in every day, each side process that lived in a spreadsheet became a module: deep cleaning, biological cleaning, storage and linen, compensation vouchers, guest review analytics, host shift reports, a manuals library. They share the same properties, rooms, users and permissions — enforced twice, by routes in the client and by Firestore security rules on the server.

Screens · 01Jobs in progressEvery open job sorted by what is blocking it, not just by whether it is done.
The issue list showing property, room, issue type, priority and status for jobs in progress.
Jobs in progress
The issue list showing property, room, issue type, priority and status for jobs in progress.
02Front deskA fault logged from one form. Picking a property fills in the address and floor, and a duplicate check warns if it is already open.
The front desk dashboard with a create-issue form and tabs for recent issues, my issues and complete history.
Front desk
The front desk dashboard with a create-issue form and tabs for recent issues, my issues and complete history.
03The room boardUsed in Greek by the on-site teams. Green means ready; locker codes are masked here.
A grid of room cards coloured green for ready and red for occupied, each showing locker number, masked code and action buttons.
The room board
A grid of room cards coloured green for ready and red for occupied, each showing locker number, masked code and action buttons.
04The legendIt sits on the page itself, so a new team member can read the board on day one.
The room status legend and counters: total, unchecked, cleaning, locker ready, ready, check-in, long-term, out of order, in-house and vacant.
The legend
The room status legend and counters: total, unchecked, cleaning, locker ready, ready, check-in, long-term, out of order, in-house and vacant.
05HestiaStep one of three: drop in the PMS export, in one, two or three files to match how it was exported.
The Hestia upload step with a drag and drop area for the PMS Excel export and a choice of one, two or three files.
Hestia
The Hestia upload step with a drag and drop area for the PMS Excel export and a choice of one, two or three files.
06TrendsCreated versus completed per week shows at a glance whether the team is keeping up.
A weekly trend chart of created versus completed issues with status and priority donut charts.
Trends
A weekly trend chart of created versus completed issues with status and priority donut charts.
07ReportsTechnician and material needs rolled up from blocked jobs: which trade to book next.
The reports and analytics page with totals and a technician needs breakdown by trade.
Reports
The reports and analytics page with totals and a technician needs breakdown by trade.
08AI assistant with voiceAnswers “what checks out today?” from live data, takes voice input, reads answers back, and understands Greek typed in Latin characters.
The AI assistant drawer offering help with locker codes, room status, maintenance issues and property info.
AI assistant with voice
The AI assistant drawer offering help with locker codes, room status, maintenance issues and property info.
09Storage and linenSpare parts with restock and usage transactions and low-stock flags, plus a linen ledger per property.
The storage inventory with item cards showing category and quantity, zero-stock items in red.
Storage and linen
The storage inventory with item cards showing category and quantity, zero-stock items in red.
10Compensation vouchersIssuing one ties it to the original booking and a reason, so complaints can be counted by cause. 197 issued and 46 redeemed so far.
The new voucher dialog with guest details, previous booking and voucher reason fields.
Compensation vouchers
The new voucher dialog with guest details, previous booking and voucher reason fields.
11Host shift reportsFixed sections, so reports can be compared day to day. More than 500 are on file; the entries shown are sample text.
A daily shift report with sections for operations, guest feedback, staff, maintenance, suggestions and online reviews.
Host shift reports
A daily shift report with sections for operations, guest feedback, staff, maintenance, suggestions and online reviews.
12Reviews and feedbackScore by channel, per room and per property, for the last twelve months: which rooms drag the average down, and whether a fix changed anything.
Review analytics with totals, average score, a score-by-channel bar chart and a score distribution donut.
Reviews and feedback
Review analytics with totals, average score, a score-by-channel bar chart and a score distribution donut.
13AdminAccounts are created through a Cloud Function, so adding a user never signs the admin out.
The admin dashboard with system totals and a user management table.
Admin
The admin dashboard with system totals and a user management table.

By the numbers

Figures from the production system, September 2026.

Under the hood

  • 7 user roles, 29 staff accounts
  • 15 feature modules

Result

1,565 of the 1,628 issues logged are closed, and a housekeeping room check now takes about a tenth of the time it used to.

The 63 still open each have an owner and a stated blocker, so none of them is simply forgotten, which was the original complaint. The inspector taps a card on the board instead of phoning the office, and front desk sees the room turn green as it happens. The morning plan is generated, not typed. And 197 vouchers, 139 deep-clean requests and more than 500 shift reports now live in one place with a history, instead of in separate spreadsheets and chat threads. Modelling the blocker, not just the state, did more for throughput than any dashboard: with “needs technician” and “material shortage” as first-class statuses, the manager's to-do list writes itself. And the app kept changing while staff used it every day — from JavaScript to TypeScript, from single-file dashboards to feature modules, one file at a time, with no big-bang rewrite.

Stack
React 19, TypeScript, Firebase, Gemini
Something like this

Still running the rooms on phone calls, group chats and spreadsheets?

We reply within one working day.