Skip to content
Back to work

Nova Medicals

A dead WordPress site replaced with an Arabic-first medical website

The Nova Medicals home page, showing the clinic exterior behind an Arabic headline
Status
Live
Role
Solo developer, from the blueprint to the DNS cutover
Client
Nova International Medical Complex, Jeddah
Timeline
August 2026 – September 2026
Stack
Next.js, React, TypeScript, Tailwind CSS, next-intl, Zod, MDX, Resend, Motion, sharp, Schema.org, Technical SEO, Accessibility (WCAG), Internationalisation, Arabic RTL layout, Vercel

Nova International Medical Complex is a 24/7 medical complex in Jeddah. Its old WordPress site had stopped working, taking years of indexed pages down with it. I rebuilt the site on Next.js, recovered the lost URLs from web archives, and moved the domain over in a planned cutover.

Highlights

  • Recovered 74 legacy URLs from Wayback Machine sitemaps and mapped them page for page, with a script that checks all 74 against production after every deploy.
  • Built the site Arabic-first with the locale in a cookie, so both languages serve from one URL and the layout mirrors through logical CSS properties alone.
  • Content lives as Zod-validated JSON and MDX, and any record still flagged as a placeholder fails the production build instead of reaching a patient.
  • Social cards render at build time from a dedicated route tree, laying out Arabic text right to left with the brand's own typography.
  • Took the site from four axe violations to zero, and caught a pause-control failure on the auto-scrolling rows that no automated tool reported.
98
Lighthouse, booking page — Measured on production, 6 September 2026
100
Accessibility, best practices, SEO — On every page measured
0
Cumulative layout shift
74
Legacy URLs recovered
5 weeks
Build to launch — 136 commits, 4 August to 6 September 2026

The problem

The complex had a WordPress site that had stopped serving. Patients searching for the clinic by name landed on nothing, and years of indexed pages, departments, doctors, articles, were returning errors.

Nothing could be exported from the old installation. The only record of what those URLs had been was in the Wayback Machine.

The audience reads Arabic first. A site translated into Arabic as an afterthought would have been the wrong product, however good the English version looked.

The approach

I wrote the blueprint before any code: the sitemap, the design tokens, the performance budget, and what each page had to accomplish. It stayed the reference for five weeks and is still in the repository.

Arabic came first in the architecture, not just the copy. The locale lives in a cookie so both languages share one URL, and every spacing utility is logical, so the layout mirrors instead of being re-laid out.

Content became data. Departments, doctors, insurers and vacancies are JSON records validated by Zod; articles are MDX. Pages render records, so a typo cannot exist in one language only.

I reconstructed the old URL map from archived sitemaps and wrote a script that asserts every redirect against the live site, so a deploy that breaks one is caught the same day.

Results

The site launched on 6 September 2026 with a written cutover runbook and a rollback plan. All 74 legacy URLs resolve to their new pages.

Lighthouse on production reached 98 on the booking page and 95 on department and article pages, with 100 for accessibility, best practices and SEO on every page measured, and no layout shift anywhere.

Twenty-five types of structured data describe the clinic to search engines, covering the complex itself, its physicians, its procedures and its job postings.

Performance was won back one cause at a time

The first production measurement was not good enough, so I measured again after each fix rather than changing several things at once and hoping.

  • The logo was a 114 KB PNG. Serving a 660-pixel WebP brought it to roughly 16 KB on a phone.
  • Hero slides two to five were deferred until after hydration; only the first one blocks the largest paint.
  • Google Tag Manager was costing five to ten points until it was moved to load last.
  • The home page listed twenty-eight doctors; trimming it to eight cut the DOM from 1,482 nodes to 1,204.

An automated pass is a floor, not a certificate

Automated testing took the site from four accessibility violations to zero. That was the starting point of the audit, not the end of it.

Reading the results by hand found an auto-scrolling row with no way to stop it, which fails a WCAG criterion that no scanner flagged, and two contrast problems the scanner had only marked as uncertain. The client later chose to remove the motion toggle, and that remains a recorded, accepted gap rather than a quiet one.

Medical content that cannot quietly be wrong

A placeholder on a restaurant site is embarrassing. A placeholder on a doctor's page is a patient reading an invented credential, so the build refuses to ship one.

Every one of the twenty-six physician records was rebuilt from an actual CV after an audit found templated biographies attached to real, named doctors. The aggregate rating was also removed, deliberately, to stay within Google's review-snippet policy.

What I would carry forward

  • Measuring after every single change is slower than batching fixes, and it is the only way to know which change actually paid.
  • The checks worth writing are the ones that run without being remembered. The redirect script and the placeholder gate both catch problems on a day when nobody is looking for them.

Screens