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