Client platform
CMS San Luis Clínica
Bilingual marketing site plus a headless CRM admin for a surgical clinic, delivered as one Angular monorepo on AWS.
- Angular 19
- TypeScript
- SSG prerender
- i18n
- AWS Amplify
- Amazon Cognito
- AWS CDK
- Structured data
Overview
A production engagement for a surgical clinic: a bilingual public site and the admin application the clinic uses to run it. Both live in one Angular monorepo with the infrastructure defined in CDK, and both ship to separate hosted apps from the same build specification. The client edits their own content; nothing about a routine page change requires a developer.
Problem
A clinic site is a trust document before it is a marketing one. It has to state exactly which services are licensed, publish what regulation requires it to publish, work in two languages, and load on a phone connection, while staying editable by non-developers who should never see a deploy pipeline. The unglamorous half of the problem is that a site like this fails quietly: a placeholder that reads like real copy, a phone number nobody dials, or an address in the wrong city ships to production and to search engines without anything erroring.
Solution
A content-driven Angular front end backed by a headless admin, prerendered so every page is a static document at the edge. Services and specialties are modeled as content collections rather than hardcoded pages, so the catalogue grew from a handful of pages to dozens across both locales without touching component code. The admin application was reorganised around how the clinic actually thinks about its work rather than around the data model, and given the recovery paths it had been missing, including password reset and a first-sign-in flow that previously hung forever.
Architecture
One repository holds the public site, the admin application, and the CDK stack. Two hosted applications build from a single shared specification, each selecting its own root, which is the piece that had silently broken every admin deploy for a week: an app-level build configuration is overridden by the repository-level one, so declaring only a single app leaves the other building the wrong directory. Auth is Cognito with a least-privilege editor role for scripted content work: read, write, and publish, with no delete and no access to leads. Public pages carry bilingual metadata and clinic structured data so search engines and assistants resolve the right entity.
Key decisions
Prerender everything public, because the fastest page is one that was already rendered. Model content as collections so the client owns the catalogue. Keep the admin palette on the clinic’s own brand rather than a generic template blue, contrast-verified. Ship drag-to-reorder with the arrow buttons kept as the keyboard and touch path, and deliberately leave it off the one nested view where a child drag would move its parent. Verify factual content against the primary registry rather than against whatever the previous version of the site said.
Challenges
The instructive bugs were about verification, not code. Published structured data named a city roughly 400 km from the clinic, with a matching area code, which is exactly the kind of wrong value that looks finished and so never gets flagged. Two independent sources agreed on a dead phone number because both were downstream of the same stale record, which is a reminder that corroboration is not correctness. And a redaction pass over a document reported a confident zero because it was verified with the same pattern that performed it, so the check confirmed its own assumption; the fix is to verify with a method independent of the logic being checked.
Outcome
A live bilingual presence with dozens of prerendered routes, a working admin the client operates without help, and the regulatory publishing requirement met. Included here for the delivery it demonstrates: client communication, factual verification against primary sources, and finding the failure that produces no error message.