Qonflate
← All work

Gourmet's International Srl — The WineHunter, Merano WineFestival

The WineHunter estate

Nine public properties for one client, grown one at a time since 2022 — festival and event sites, a brand site, a company site, an award catalogue, a members' club, producer showcases and now an app — seven of them reading from one platform and all of them run as one system.

Status
Live in production
Role
Design, engineering and operations, as the sole engineer
Period
2022 – ongoing
Stack
NestJS · Prisma · PostgreSQL · RedisNext.jsWordPress · PHP 8.3AstroExpo · React Native
  • 9public properties
  • 52,836products in the catalogue
  • 24EU languages on the e-label
  • 4servers

The situation

The WineHunter is the award and guide behind the Merano WineFestival, run by Gourmet’s International in South Tyrol. Over the years its public face had grown into a set of separate properties: a festival site with exhibitors, programme and partners; a brand site; a members’ club for buyers; award listings; producer showcases. Each held its own copy of the facts. A producer’s name lived in five places, and so did every mistake.

The brief was to make them one thing without making them one site.

How it grew

  • 2022 — The first jobs: the exhibitor pages and the year’s templates on the festival website, and the lists behind them.
  • 2023 — Hosting and system administration move to Qonflate. The idea of one platform behind all the sites is written up for an innovation-funding application.
  • 2024 — The FarmFood Festival’s webshop and online registration, and the first award catalogue, on CouchDB.
  • 2025 — More event sites for the same client, each a separate WordPress with its own copy of the facts — the year that made the platform necessary.
  • 2026 — The platform, built from May. By September the award catalogue, the festival’s plugin, the brand site, the buyers’ club, the producer showcases and e-labels, the company site and Wine&Siena read from it or run beside it; the app follows for November.

What was built

The platform. An API-first source of truth on NestJS, Prisma and PostgreSQL, with Redis for caching and queues: producers, products, evaluations, events, participations, CRM, memberships, invoicing, masterclasses. 138 data models across 322 migrations and 68 API modules, with a Next.js back-office that is also the producer’s own area. Every other property reads from here, and nothing writes anywhere else.

The award catalogue. A public Next.js site with its own PostgreSQL, fed by a versioned projection of the platform: a journal of changes, tombstones for withdrawals, and a nightly reconcile that compares both sides in full. 52,836 products; 52,906 URLs in the sitemaps.

The festival site. WordPress, kept, because the editorial team knows it — with a custom plugin that publishes exhibitors, programme, masterclasses, hotels and partner walls live from the platform. The exhibitor page carries 490 exhibitors and roughly 6,400 images. It is served from a static cache in 0.11 seconds with no PHP in the path, and 6,700 of its 6,748 asset references come from a CDN that was introduced with three WordPress filters and no template edits.

The members’ club. A framework-free PHP 8.3 application that renders every page itself and talks to the platform server-to-server. It stores no member data, and no key ever reaches a browser. Trilingual, with a calendar export of each member’s appointments.

Producer showcases and the EU e-label. An Astro application on a second host: one page per producer, one passport per product, and — on a separate domain — the legal e-label in 24 EU languages. That page ships no script, no cookie and no outward link, and its URL is derived from the platform’s own identifier, so a code printed on glass outlives any database behind it.

Wine&Siena. The Siena event’s WordPress site, re-themed from scratch — no page builder, no jQuery, no external fonts — with its exhibitor list read live from the platform.

The company site. Gourmet’s International’s own site: WordPress brought from 5.1 to 7.1 in one go, the theme made its own, three languages without the plugins that used to carry them.

The companion app. Expo and React Native: one binary for visitors, consumers, buyers and producers, offline-first, in build for the festival in November 2026.

How it holds together

Three rules do most of the work.

Enforcement lives at the lowest layer. A constraint in the database, then a generated type, then a schema, then a service guard, then the interface. A rule that lives only in a form is a rule the next surface will break.

Public URLs are permanent. Paths are primary keys. Rows are never deleted; a rename keeps the old path as a redirect; a withdrawn product answers 410 with a page that explains itself. Nothing is ever reissued.

Absence is never treated as deletion. A feed that stops answering does not empty a page. Every surface keeps serving its last good state, flags the gap and counts it in its health endpoint, so an outage upstream reads as a warning downstream rather than as a blank.

Operations

Four servers, Docker and Caddy, deploys that migrate from the new image while the old one is still serving, backups on timers, and a health endpoint on every property that reports the version that actually shipped. Analytics moved to one self-hosted, cookieless Matomo for the whole estate and was verified from outside: no cookie leaves, and Do Not Track is honoured at the level of the raw rows.