• Er. GSK

    • Home
    • Projects
    • About
    • Resume
    • Contact
Projects
M

Mentcape

B2B2C
live

Therapy and coaching SaaS, my step up from junior to senior.

Full-stack engineer2022 – 2026Core team, with a senior mentorAuribises TechnologiesHealth / coaching SaaS
mentcape.com (DE)
My role at AuribisesClient product. Source is private.
On this page
  • Overview
  • Tech stack
  • Responsibilities
  • Challenges
  • Reflections

Overview

My first product owned end-to-end, over about four years. A platform where therapists run paid coaching programs for patients. I learned cloud functions and system design here through close design review with a senior engineer, then carried those patterns into every backend I built afterward.


Tech stack

Angular
Firebase Functions
Node.js
pdfmake
The skills behind this

Responsibilities

  • Delivered every customer-facing document and message accurately in both German and English by building a single multilingual document engine, eliminating divergent per-language templates.
  • Owned a 50-plus module Angular administration application alongside the document and communications backend.
  • Built the communications backend, comprising bilingual transactional email, calendar invitations, and text-to-speech for lesson content.
  • Established the backend conventions, namely centralised configuration, traceable logging, and deployment-free configuration, that became the foundation for the backends I built afterward.
  • Sharpened my system-design judgement through close design review with a senior engineer and carried those patterns into later work.

I owned the admin app (50+ modules) and the document and communications backend: PDF invoices, multilingual email, calendar invites, and text-to-speech. The core payments integration was a senior teammate's, and a lot of my early growth came from his design reviews.


Engineering challenges

01Sending every document and message in two languages

Problem. The platform served German and English users, and every touchpoint had to come out right in both: invoices, session confirmations, reminders, password resets, as email and as PDF. Doing that with a copy-pasted template per language would have been a nightmare to keep in sync.

Approach. I built one PDF service for the invoices and an email system with shared layout pieces, then put the wording behind a small translation layer so a new language is mostly a data change rather than new code. Subjects, body text, and the bits in between all resolve from the same place. Calendar invites and a text-to-speech feature for lesson content went through the same backend.

Outcome. Every customer-facing document and email shipped correctly in both languages from one set of templates, instead of two copies that slowly drift apart.

02Building the backend foundation I reused everywhere after

Problem. This was my first real backend, not just CRUD. The hard part wasn't any single feature; it was setting up patterns, config, logging, structure, how triggers fire, that would survive four years of changes and that I could take to later projects, all while learning the platform as I went.

Approach. I settled on a few habits that stuck: collection names and config kept in one place instead of scattered through the code, tagged logging so I could trace a single job, a reusable PDF service, and config I could change without a deploy. None of it was designed up front. It came out of reviewing each decision with a senior engineer who kept asking why, which is how I learned to weigh trade-offs out loud.

Outcome. The same structure became the starting point for my later backends on Hero and Coupaso, so the lessons compounded instead of being thrown away.


What I'd do differently

  • The oldest part of this codebase is one very large functions file I never went back to break up. The newer code is split sensibly, and I'd give the legacy the same treatment.
  • Adding a new language is mostly a data change, but not entirely; a few strings still live in code. I'd move the last hard-coded bits behind the translation layer so a new locale is pure configuration.

Interested in this kind of work? Get in touch


More projects

View all

Finlo

Multi-tenant parking and transport SaaS with a stats engine.

SUT1 Replay Server

Real-time telemetry decoder (Swinburne capstone, HD 90/100).

APK Guardian

ML-based Android malware detection, full-stack.

OBE Platform

Accreditation attainment tracker (bachelor's capstone).

On this page

  • Overview
  • Tech stack
  • Responsibilities
  • Challenges
  • Reflections