Skip to content

R5.1 · Run the Dashboard BFF as a standalone service, not the shell's route handlers ​

ThemeR5 · Technology stack
DomainApplication and platform architecture
StatusProposed
Needs client validationYes
ReinforcesR3.1 — the same boundary, expressed as a runtime selection
Anchored inThe ADS technology stack table · the experience map's runtime section · the options deck's single-BFF topology · assessment finding D-06
Open questionsTakes a position on 19; depends on 14
DeliverablesD2.1 · D3.1

Concern ​

Two client documents name two different runtimes for the same component, and the gap between them is a build against a promotion.

The ADS puts the BFF inside the web application. Its technology table lists the backend as "Next.js route handlers, Node.js — REST endpoints, server actions", and the new Dashboard Shell component is described as the BFF experience: serving the shell and MFEs, session lifecycle, CIAM and Unleash, delegating cross-domain calls.

The estate already runs one that is not that. The experience map documents di-dashboard-services — Fastify, registered in APIM DEV, already serving /api/v1/insurance, /api/v1/investments and /api/v1/wealth-investor, paired with the di-dashboard Next.js micro-frontend — as part of an estate that "already powers ~80% of the target UI." The options deck draws the same thing: its single-BFF topology is "di-dashboard-services, Fastify, behind APIM with Redis."

Open question 19 records the ambiguity as a validation item. What makes it a stack decision rather than a fact-finding one is that the two are not equivalent implementations of a component. They differ on what can call it, what can govern it, and what it fails and deploys with.

Recommendation ​

Make the standalone service the Dashboard BFF. The shell keeps route handlers for what belongs to the shell — the auth callback, session, feature-flag evaluation, its own rendering. Everything composed moves behind a registered API.

Four consequences follow, in order of weight.

It is an API the gateway can see. Route handlers inside the shell are not a registered APIM product; they are paths on a Next.js application. The fan-out to thirteen hard dependencies begins at this hop, which makes it the one that most needs a gateway in front of it — and the controls R4.1 argues the mediation layer must carry, rate limiting and quota among them, have nothing to attach to on the route-handler path.

It can be called by something that is not a browser.R3.1 reduces at the runtime level to exactly this: route handlers are reachable only through the Next.js application, so the 56.6% of authentications that are mobile arrive later as a second build rather than as a second caller.

Shell and aggregation fail separately and ship separately. Finding D-06 already calls the BFF an unmitigated single point of failure with no bulkheading between BU call paths. Sharing a process and a release train with the shell adds the shell's failure modes and the shell's cadence on top of that, and makes the options deck's first concern — "one bad BFF release breaks all six LOBs for all customers" — strictly worse, because the release surface now includes every front-end change.

It is the cheaper path. The service exists and is wired. The experience map lists six known gaps between DEV and PROD: two are ordinary promotion work (the PROD gateway URL, front-end Key Vault registrations), two are configuration debt (Unleash not wired into the BFF, Wealth Investor in DEV pointing at Wealth UAT), and two are identity — the stripped x-federated-id header and the unimplemented gb-core-authx exchange. Under R1.1's navigation-first scope, those two are not launch-path promotion work; they return when the portal aggregates protected BU data. The remaining four are a punch list, not a design.

What it changes ​

It turns open question 19 into a decision. It is currently filed as validation — is di-dashboard-services the ADS's Dashboard BFF, a predecessor or a parallel effort? — and the honest answer may be "a parallel effort". That does not make the question go away; it makes it a choice between two running things, and this page supplies the criterion.

It changes what WS 3 prices. A promotion with a six-item punch list and a build of a new aggregation tier are different line items with different risk. The roadmap cannot carry both.

It names one runtime in D2.1. The application and platform architecture section has to state a single answer here, and today the material supports two.

What we are not recommending ​

Dropping Next.js. It stays the shell — SSR, routing, the MFE host, the web session. The recommendation is about which process serves composed data, not about the framework.

Moving to per-LOB micro-BFFs now. The options deck's Conway's Law concern asks for a written sunset date or migration trigger for the single-BFF pattern, and that is open question 18's to settle. A standalone service makes that migration easier; it does not pre-empt it.

Rewriting di-dashboard-services. Fastify is a choice already made by a team already running it. Nothing in the material argues against it, and re-litigating a working runtime is how a promotion turns back into a build.

Dependencies and open questions ​

  • Open question 19 — which component is the MVP's Dashboard BFF. This is a question for the delivery team, and it should be asked before the ADS is re-issued against the assessment's conditions.
  • Open question 14 — the named owner for the shared runtime. A standalone service needs an owner, an on-call rotation and a release process more visibly than a route handler does, which is an argument for settling both together rather than a cost of this one.
  • The six DEV-to-PROD gaps in the experience map, with dates. They are the promotion plan, and two of them are identity work this recommendation does not cover.

Internal working knowledge base — not for external distribution.