ClientHealing Through Authenticity
RoleSole engineer
StackAngular (replatforming to Astro) · AWS Lambda · SES
StatusLive
Healing Through Authenticity
Narrative pending Jason's input — problem framing and outcome below are placeholders. "What was built" and "Stack" are factual, pulled directly from the project.
The problem, as stated
Placeholder: the constraints as the client (Dr. Stephanie Rudd, therapy practice) described them.
Why off-the-shelf would've fallen short
Placeholder: the specific gap a template/site-builder would've left open, including why staying inside the AWS BAA's compliant-service boundary mattered even for a marketing site.
What was built
A hand-built Angular 21 single-page marketing site (standalone components, no NgModules) with six routes: home, dynamic therapist profiles, testimonials, services, a resource "toolbox," and contact. The only dynamic piece is the contact form, which posts to a purpose-built AWS Lambda (Node 20, AWS SDK v3) that relays the message through Amazon SES. The whole account this runs under operates under a signed AWS Business Associate Agreement, so even that small serverless piece stays on HIPAA-eligible AWS services rather than a convenient third-party form tool that wouldn't be covered. Deployed to S3 behind CloudFront, with a CloudFront Function handling pretty-URL rewriting for the SPA's client-side routes, and a GitHub Actions pipeline that enforces branches stay rebased on main before merge.
Now replatforming to Astro
Angular was chosen here out of familiarity, not fit — the app was already prerendering every route to static HTML at build time (no SSR server runs in prod), with only a mobile nav toggle and the contact form needing any client-side JS. That's exactly the shape Astro is built for, and it's the same tooling this portfolio site runs on. A rebuild is underway: the six routes are being ported into an Astro app built alongside the existing Angular one in the same repo, with the Lambda/SES contact pipeline left untouched and the CloudFront routing simplified once Astro's per-route static output replaces the SPA fallback. Still in progress — the Angular version above remains what's live in production.
Outcome
Placeholder: what shipped and what it changed for the practice.
Full stack
Angular 21, Angular Material, TypeScript. AWS Lambda (Node 20) + SES for the contact form. S3 + CloudFront + a CloudFront Function, provisioned with Terraform. GitHub Actions CI/CD. Jest for unit tests, Playwright for functional and visual-regression end-to-end tests across desktop and mobile viewports.