Skip to content
Bagtyyarfull-stack engineer

MyORL: ENT clinic platform

Ongoing

Bilingual website for a private ENT clinic in Athens, live and serving patients. Next.js 16, a Strapi 5 CMS the staff run themselves, and Meilisearch.

  • Next.js 16
  • Strapi 5
  • Meilisearch
  • PostgreSQL 18
  • Docker
  • Railway

Outcome

Live in production. Clinic staff edit the Greek and Russian content themselves.

Context

A private ENT (ear, nose, throat) surgical clinic in Athens needed a modern web presence: a bilingual (Greek/Russian) site with a condition encyclopedia, service and price pages, video content, and appointment booking. Non-technical staff maintain it after handover.

Decisions

  • Frontend: Next.js 16 App Router + React 19 + Tailwind CSS v4, bilingual routing (Greek/Russian), server components for fast first paint on clinic Wi-Fi and mobile data.
  • CMS: Strapi 5 + PostgreSQL 18 so clinic staff edit encyclopedia entries, prices, and videos without touching code.
  • Search: Meilisearch for instant, typo-tolerant search across conditions and treatments, because patients rarely know the exact medical spelling.
  • Migration: Custom extraction tooling (myorl-migrate) to pull content out of the legacy MODX site into structured Strapi content types.
  • Infrastructure: Docker Compose + Caddy locally; production deployed on Railway (frontend, Strapi, Postgres, and Meilisearch as separate services).
  • Testing: Vitest + React Testing Library for components, Playwright for end-to-end flows including booking.

Visit the live site · Public repository

Milestones

  1. Inception and MODX migration tooling

    Done

    Audited the old MODX site and wrote tools to move its content into Strapi.

    Completed Apr 2026

  2. Strapi 5 CMS and content model

    Done

    Strapi 5 + PostgreSQL content types for pages, encyclopedia entries, services, prices, and media.

    Completed Apr 2026

  3. Bilingual frontend with Meilisearch

    Done

    Greek/Russian Next.js frontend on Tailwind v4 tokens; full-site typo-tolerant search with bulk corpus seed, Strapi webhook reindexing, and bilingual synonym dictionaries.

    Completed May 2026

  4. Production launch on Railway

    Done

    Docker builds, ISR with per-locale sitemaps, security headers (CSP/HSTS), and production routing fixes; site live and serving patients.

    Completed May 2026

  5. Client fixes and handover

    Done

    Worked through the clinic's requirements list, published 23 Greek pages, and handed content editing to clinic staff.

    Completed Jun 2026

  6. Relaunch

    Done

    Relaunched at myorl.up.railway.app after the original hosting lapsed.

    Completed Oct 2026

Decision records

Strapi as the CMS, behind one gateway

Staff edit content in Strapi. The frontend reads it through one gateway, so CMS changes don't break pages.

Full-site search via Meilisearch

Meilisearch indexes the bilingual encyclopedia and service pages; Strapi webhooks keep the index in sync on every content change.

Redirects for old URLs

Legacy MODX URLs resolve through a dedicated Strapi content type instead of hard-coded redirect tables.

Relaunch at myorl.up.railway.app

Site restored on a new Railway project after the original deployment lapsed.

Production hardening for launch

CSP and HSTS security headers, per-locale sitemap and static params, ISR on the home route, production routing fixes for slug pages, and mobile search and tab repairs ahead of go-live.

Search corpus seed and Strapi webhook lifecycle

Loaded all content into Meilisearch. Strapi now reindexes a page whenever staff edit, unpublish or delete it, and Greek and Russian synonym lists improve matches.