January — August 2026 · engineering case study

From one hotel to a distributed hospitality system.

QRelia began as software for one hotel, then kept changing the meaning of “the system” until it included tenants, subscriptions, live kitchen state, QR continuity and a Raspberry Pi edge appliance with its own renderer.

6 Git histories883+ commit checkpoints74 retained EF migration files across the reconstructed historiessoftware + edge hardware
Current QRelia Ambient Device with a full-colour LCD showing a live new order
Current edge applianceCloud state made visible in the room.

The story in one sentence

Every expansion introduced a new failure domain. Each failure domain forced the next architecture.

A menu bug is local. A SignalR bug can lose operational time. A tenant-scoping bug can cross a customer boundary. A provisioning bug can strand a physical device at a venue. A renderer that monopolises a Raspberry Pi can make a beautiful screen while starving the order system behind it.

247Le Pommier standalone commits
305QRelia SaaS checkpoints
295OLED-era device commits
36LCD-era device commits
Six histories, one product story.SaaS grew beside the live standalone product before absorbing production.
Le Pommier standalone
QRelia SaaS
qreliadevice
qrelia-ambient-device
LCD prototypes → production

The important chronology: SaaS did not begin after standalone ended. It was built in parallel, then absorbed production.

Prologue · 18 January 2026

It starts with a table, not a platform.

There is no multi-tenant abstraction yet. No hardware appliance. No subscription engine. There is a hotel workflow that needs to work in the real world.

The first retained Le Pommier repository begins on 18 January. Admin is added immediately. Receiver follows the same day. Within a week the data model already contains Areas, Menus, MenuItems and Orders; shortly afterwards it learns about Locations, URLs and QR entry points.

That is a clue to the product from the beginning: the unit of work is not “a web page”. It is a physical place — a room, table, area or location — mapped into software. Hospitality is full of state that looks trivial until service begins. A menu can exist but not be available now. An item can belong to several menus. A guest can be at one table while the available menu is controlled by an area schedule.

QRelia and Le Pommier team together at the hotel
Le Pommier is the production setting in which the original system is shaped. The project begins with a venue problem, not a SaaS hypothesis.
Three surfaces survive every rewriteGuest · Receiver · Admin

The names and boundaries change, but that operational triangle remains the skeleton of QRelia.

Chapter 1 · January to February

The first live loop.

The first architectural breakthrough is not QR generation. It is the moment an order becomes a live event instead of a database row waiting to be noticed.

In early February, Receiver becomes the place where timing starts to matter. A customer can place an order correctly and the database can persist it correctly, yet the operational system still fails if staff do not see it quickly enough. On 5 February SignalR enters the codebase. Two days later real-time updates reach Admin too.

Pattern #1Events for speed. Reconciliation for truth.

SignalR carries immediacy. The database and HTTP API remain authoritative. The later physical device keeps the same rule: react instantly to events, then reconcile active orders over REST after startup or reconnect.

The venue teaches the data model

February becomes a sequence of domain lessons. Modifiers become groups, options, descriptions, active state and relationships. Availability becomes time-aware. Wine needs distinct handling. Cancelled orders affect totals. Sales telemetry needs both sold count and last-sold time. Bestsellers need date ranges. Revenue makes more sense by area than as one number.

The abstractions are earned rather than invented in advance. By 20 February the dashboard is live, SignalR is stable enough to be infrastructure, and the system is reporting operational performance rather than merely accepting orders.

Chapter 2 · April

The application discovers rules.

A live hospitality product quickly learns that the simple version of almost every rule is wrong.

Modifier groups are the clearest example. Production needs required groups, minimum and maximum selections, single versus multiple choice, descriptions, active state and visual control. On 5 April the migration history records the shift to production multi-select modifiers and the change then propagates across Admin, Customer and ordering logic.

Availability follows the same path. One slot per day is enough until a venue needs breakfast, closes, then reopens for dinner. In late April the model expands to multiple availability windows.

Then the system begins to explain itself

On 24 April audit data appears. It starts with who, when, type and action; within hours it gains platform, tenant/context and full-name metadata. By 30 April it also carries a message plus previous and new state. Auditing is what happens when a tool becomes an operational system whose changes need provenance.

48 retained standalone migrationsNot database paperwork: a fossil record of the product learning hospitality one constraint at a time.
Chapter 3 · 1 March onward

Build the future without stopping production.

The most important chronological fact is easy to miss: QRelia SaaS starts on 1 March while the standalone hotel system is still evolving in production.

This creates two simultaneous problems. The first codebase must keep working for a real venue. The second must remove the assumption that there is only one venue. Features continue to be invented in standalone through spring and early summer, then synchronised into SaaS. It is a fork-and-absorb transformation, not a clean rewrite weekend.

Pattern #2TenantId is not just another column. It changes what a bug is allowed to touch.

In a single-venue application, an unscoped query is a data bug. In multi-tenant SaaS, the same query can become a boundary violation. Middleware, services, identity, background actions, provisioning, analytics and administration all have to agree on context.

Chapter 4 · April to June

A product becomes a platform.

Once tenant isolation exists, the next questions are no longer about ordering alone. Who can create a tenant? How does it pay? How is it branded? How does support see it? How does hardware belong to it?

Stripe arrives in April alongside Receiver and super-admin work. Subscription recovery and lifecycle work continue through the month. Two-factor authentication lands in May. Device ordering gains its own schema, status and pricing. Activity audit becomes a SaaS concern. Last-login telemetry appears. By the end of May, QReliaAdmin has a tenant dashboard.

On 28 April the SaaS repository re-baselines its EF migration history. The new baseline does not mean menus, orders or modifiers were invented that day; the standalone history proves they existed months earlier. It marks a platform consolidation point — a new database history for the multi-tenant product.

Branding stops being hard-coded

June pushes QRelia further from its single-venue origin. Venue-controlled themes arrive. Ambient device profiles appear. QReliaAdmin gains tenant operations. QR Print Studio becomes a production tool. Device provisioning becomes a cloud loop: a physical unit can be claimed, identified and controlled as an object belonging to a tenant.

The boundary has movedOrdering is still the centre of gravity. It is no longer the system boundary.

QRelia now has a control plane, tenant model, billing, identity, audit, QR production tooling and a device domain.

QRelia venue dashboard
QRelia guest ordering menuQRelia Receiver with a live order
By August the same domain state is expressed through very different interfaces: management, guest ordering and live operations.
Chapter 5 · 11 March to June

The software leaves the browser.

Eleven days after the SaaS repository begins, another experiment starts: what if an order could change the room itself?

The first qreliadevice repository starts on 11 March. Early hardware work contains backup scripts, LED tests, competing animation files and hardware experiments. The original runtime uses an SSD1306 OLED for local status; by late March animation has become its own subsystem.

The device immediately inherits Receiver’s operational problem: it cannot merely know that an order exists eventually. It has to react now. A dense SignalR stabilisation sprint in May gives the edge device live order events while keeping REST reconciliation as the recovery path.

The edge constraintA physical light can be wrong in a way a web page cannot: everyone in the room can see the stale state.

By 8 May the addressable-light work has moved far beyond status LEDs. The animation engine targets a 144-pixel WS281x/WS2815-compatible strip with a large catalogue of effects. The conceptual split becomes clear: the display explains the device; the strip communicates state and atmosphere to the room; the cloud remains the source of operational truth.

Chapter 6 · June to August

A prototype learns to survive.

The dedicated qrelia-ambient-device repository begins on 7 June. The change is less about more animation and more about turning a Raspberry Pi project into an appliance that can live at a venue.

A production edge device cannot assume SSH. It cannot assume the correct Wi-Fi remains configured. It cannot assume the cloud is reachable at boot. It cannot assume the last process exited cleanly. It needs local identity, a recovery path and enough observability to explain whether it is alive.

01Boot decision

Choose live or setup flow without two renderers fighting for the device.

02Setup mode

Venue Wi-Fi selection, setup code/PIN and local recovery.

03Network watchdog

Connectivity can fail without taking order identity with it.

04Reset handling

A physical recovery path remains available even when the cloud is not.

05Tenant runtime

Cloud identity, heartbeat, SignalR, REST reconciliation and ambient strip.

06Display runtime

Presentation can fail or evolve without owning authoritative order state.

Performance becomes a scheduling problem

The OLED generation discovers a less obvious constraint: visual work can starve operational work. A 144-pixel strip, display refresh, SignalR, heartbeat and showroom animation all compete for CPU time on a small Raspberry Pi. Cooperative rendering and controlled frame rates become correctness tools, not cosmetic polish.

Chapter 7 · July

The migration cannot break the printed world.

By July the SaaS platform is ready to absorb Le Pommier. But a web migration has a physical constraint: QR codes have already been printed and placed in a hotel.

The standalone system therefore becomes a compatibility layer. Customer, Admin and Receiver traffic can redirect into QRelia. More importantly, legacy PlaceOrder URLs carrying AreaId and LocationId are translated into a QRelia legacy route so existing printed QR codes continue to resolve to the correct physical context.

Cutover ruleThe cleanest migration is not the one with the fewest old paths. It is the one the guest never notices.

The handover happens while the domain is still getting richer. Waiting estimates land in standalone on 20 July and in SaaS the next day. Area availability and booking/social actions follow. Preparation stations arrive. QR ordering gets a grace period. Course-aware service is released at the end of the month.

Hospitality state becomes coordination state

Courses show how far the model has moved from “submit basket”. The system now reasons about guests, starters, mains, when each course is served and how the Receiver changes the order lifecycle as service progresses. Waiting time is first-class operational state. Kitchen analytics distinguish what was actually prepared. Weather data is matched against orders for analysis and forecasting.

Chapter 8 · 23 August

A 480×320 screen becomes a systems problem.

The first LCD repository lasts one day and five commits. Replacing a 128×64 OLED with a 480×320 SPI display changes the physics of the runtime.

The prototype preserves the cloud contract — setup AP, venue Wi-Fi, setup code/PIN, persistent identity, heartbeat, SignalR and REST reconciliation — but rewrites the local presentation contract. It also enforces single-renderer ownership so setup and live mode cannot fight over the screen.

From 28 August the production LCD history becomes a concentrated performance investigation: 28 MHz, 31 MHz and 32 MHz SPI variants; Raspberry Pi 3 tuning; direct-framebuffer experiments; damage refresh; strip-mirror generations; custom boot presentation; showroom persistence and reboot fixes.

Full-plane refresh

One visible change can still trigger a whole-screen transfer across SPI.

Damage-band refresh

Identify dirty horizontal bands and move only the changed regions.

Embedded lessonOptimise the constrained bus, not the most visible line of application code.

Separating the renderer from the tenant process lets display transfer strategy evolve without owning cloud state, order truth or the ambient strip.

Chapter 9 · 28–31 August

Truth is a rendering requirement.

By the final August iteration, performance is no longer the only LCD problem. The display can be smooth and still be wrong.

A Wi-Fi failure screen that says the setup portal is ready when setup is not actually active is false system state. A reset screen that continues to show normal live-service footer badges is misleading. A device that has finished starting but still says “runtime starting” erodes operator trust. The 31 August truthful-status work treats wording as part of state-machine correctness.

Pattern #3The tenant runtime decides what is true; the renderer decides how to draw it.

qrelia-tenant.service owns cloud identity, heartbeat, SignalR, reconciliation, active orders, device mode and the physical strip. qrelia-lcd.service consumes local state and owns the high-frequency 480×320 renderer.

Urgency becomes part of the UI contract

Active-order presentation is rebuilt around operational priority. Stale orders outrank Pending; Pending outranks lower-urgency states. If several active orders exist, the list scrolls rather than silently hiding work. When a new order arrives over SignalR, the renderer must invalidate its current selection immediately.

QRelia Ambient Device showing explicit live operational status
The current device makes the architecture visible: explicit operational status in the centre, ambient output around it, and cloud/network state exposed locally.
Chapter 10 · 31 August

What QRelia has become.

At the end of August, the easiest way to misunderstand QRelia is to name only one of its interfaces.

It is not just the guest menu because the same order flows through Receiver, analytics, preparation logic and a device. It is not just Admin because tenant identity, subscriptions and provisioning sit above it. It is not just the Raspberry Pi because the hardware is an edge projection of cloud state. It is not just a SaaS database because printed QR codes and physical locations are part of the routing model.

Technically the system now spans Razor Pages applications, EF Core and SQL Server, ASP.NET Identity, SignalR, Stripe, PDF/QR generation, multi-tenant middleware, analytics and reporting, device provisioning, Python edge runtimes, systemd supervision, Wi-Fi captive setup, addressable LEDs and a custom 480×320 framebuffer renderer.

01

Physical context is first-class.

Areas, locations and QR codes appear near the beginning and remain central. Hospitality starts from the place where service happens.

02

Events are acceleration, not authority.

SignalR makes the system immediate. Reconciliation makes it reliable. Event delivery and state authority are different concerns.

03

Boundaries get stricter as the system grows.

Single venue becomes TenantId-scoped SaaS. A monolithic device becomes separated cloud/order and display processes.

04

The interface must tell the truth.

Dashboard counts, Receiver cards, LEDs and LCD footers are projections of state. Once staff act on them, presentation correctness is operational correctness.

05

Backwards compatibility includes the room.

Printed QR codes, physical wiring and installed devices cannot be upgraded with the same assumptions as a browser bundle.

Epilogue

The real transformation.

The headline is simple: one hotel became a SaaS platform, and a small OLED experiment became a polished LCD edge appliance. The more important transformation is underneath.

In January the engineering question is whether a guest can place an order and staff can see it. In February: can all three surfaces stay in sync? In April: can the domain express the rules a venue actually uses? In spring SaaS: can every request respect a tenant boundary? In June hardware: can an appliance recover without a developer beside it? In July: can production move platforms without invalidating the physical QR layer? In August LCD: can a high-frequency renderer remain beautiful, fast and truthful without stealing resources from the system it represents?

The most important thing QRelia built was not a menu, a dashboard or a device. It built a chain of trustworthy state from a physical table to the cloud and back into the room.

That is the point at which QRelia stops looking like a QR-ordering project with extras. It looks like a hospitality system.

Source note

How this story was reconstructed.

The chronology is anchored in repository evidence rather than retrospective invention. It combines Git histories for luxasscze/LePommier, luxasscze/LePommierSaaS, luxasscze/qreliadevice, luxasscze/qrelia-ambient-device, luxasscze/qrelia-lcd and luxasscze/qrelia-device-lcd, together with retained EF migrations, patch artefacts, service/configuration files and current source.

Commit counts are development-history counts, not semantic releases. Generic checkpoint messages are not assigned invented meanings. Where a patch or migration proves a change existed but not an exact deployment time, the chronology stays conservative. The standalone and SaaS timelines intentionally overlap.

48 retained standalone migrations26 retained SaaS migrations after the April re-baseline31 Aug 2026 reconstruction cut-off

The architecture is live

See the system the story produced.

Explore the guest journey, Receiver, venue intelligence and the current Ambient Device — or discuss how QRelia would map onto your own rooms, tables and service areas.