CASE STUDY

EngiiCore — Multi-Tenant Angular Platform Rebuild

Engii-Soft's frontend was frozen on Angular 12 — about ten major versions behind — while the domain logic underneath it kept growing. Rather than patch the old system, I architected and bootstrapped a new platform from scratch: same domain logic, new architecture, current framework.

Context

Built on Angular 22 with standalone components and signals, Angular Material, a Connect/gRPC-Web service layer, MSAL auth, and multi-tenancy resolved from hostname at bootstrap.

Scope

This is a large, active, multi-tenant platform, not a demo:

  • Dozens of feature areas, with hundreds of components and services
  • A large set of .proto files generating typed Connect-ES clients
  • Extensive internal documentation, including developer/architecture docs
  • A full suite of CI/CD workflows
  • A custom set of ESLint rules enforcing the architecture
  • Four tiers of automated tests — unit, component, end-to-end, and a novel wire-compat tier — with broad coverage across the codebase

What I built and own

  • The repository structure and core architecture — routing, and the multi-tenant bootstrap that resolves the tenant from hostname before auth and gRPC initialize.
  • The gRPC/Connect service layer: typed fetch()/mutate() wrappers that centralize loading state and success/error handling, plus the buf-driven proto generation pipeline. A lint rule enforces that no code calls gRPC directly outside this layer.
  • The foundation of a generic component library — including the original calendar subsystem — and the reuse pattern the team builds on. A lint rule enforces adoption of the generics over one-off components.
  • The original theming and design-token system: multiple themes built on a shared foundation-token layer, with hardcoded styles banned by lint.
  • The formatting/i18n layer (Danish/English parity) and the large majority of the developer-facing architecture documentation.
  • The testing infrastructure across all four tiers, including a wire-compat tier I built specifically to catch protobuf wire-format drift when dependencies update — and I personally wrote the large majority of the test suite.
  • The CI/CD workflows, and a full GitHub organization overhaul: replaced an "everyone is admin" setup with scoped permissions and enforced 2FA, added branch protection, and migrated project tracking from Jira into GitHub Projects (boards, sprints, and reporting views).
  • A custom set of ESLint rules that encode the architecture as enforceable convention rather than documentation nobody reads — examples include rules banning direct gRPC calls outside the service layer, requiring standalone components, and preferring the generic table component over bespoke ones.
  • The guard wiring that decides what each route and feature area gates on.

Built by the team, not by me alone

This is a team codebase, not a solo project. I architected the frontend, set its conventions, and lead the frontend team building on it — I didn't build all of it myself, and it's stronger for that.

Want to see actual code?

Nothing above links out — EngiiCore is a live commercial platform, so the codebase itself isn't public. For a fully open example of the same kind of architecture (Angular, real-time data, server-side rendering, a structured component/service layer, and a full test suite), see WiseWatt, a solo capstone project I built from scratch that scored full marks.

View WiseWatt on GitHub