The Self-Service CD app is a Module Federation widget built on the Candescent CDX extensibility platform. It runs embedded inside the Candescent Online Banking (OLB) shell — the member never leaves their banking portal. This page covers the SDK packages, project setup, local development workflow, and how the widget is deployed and loaded by Candescent OLB at runtime.
How the Widget Loads at Runtime
Candescent OLB is the Module Federation host. Our widget is the remote. When the member clicks the CD tile, OLB fetches ourremoteEntry.js bundle from our CDN and mounts the widget inline — no page navigation, no redirect.
remoteEntry.js URL in their Candescent admin portal once during onboarding. After that, every deploy we push to our CDN is picked up automatically.
SDK Packages
Use exact versions — mismatches break the widget at runtime inside OLB.| Package | Version | Purpose |
|---|---|---|
@cdx-extensions/di-sdk | 1.1.2 | Core SDK — PlatformSDK, hooks, types |
@cdx-extensions/di-sdk-web | 2.1.2 | Web-specific SDK surface |
@cdx-extensions/di-sdk-types | 1.1.2 | TypeScript types for SDK interfaces |
@cdx-extensions/widget-template-web | 1.1.2 | Widget project template and bootstrap wiring |
Shared Host Dependencies (must match OLB exactly)
| Package | Version |
|---|---|
react | 18.2.0 |
react-dom | 18.2.0 |
react-router-dom | ^6.12.1 |
@mui/material | 7.3.4 |
@mui/icons-material | 7.3.4 |
@mui/system | 7.3.3 |
@emotion/react | 11.11.1 |
@emotion/styled | 11.11.0 |
axios | 1.14.0 |
Do not bump these versions without coordinating with the Candescent platform team. Version mismatches with the OLB host app cause runtime crashes. Do not add new runtime dependencies without prior approval.
Project Setup
Prerequisites
| Tool | Version |
|---|---|
| Node.js | 18 LTS or 20 LTS |
| npm | 9+ |
| Nx | optional (use npx nx otherwise) |
Install
Configure .npmrc
Copy the template and add your Candescent registry credentials before installing:
The Three SDK Hooks
Everything the widget needs from Candescent flows through three hooks on thePlatformSDK singleton.
1. useUserContext() — Member Identity
2. getHttpClient() — Secure API Calls
3. useBranding() — FI Theme
Widget Scaffold
module-federation.config.ts
Main Widget Component
Environment Files
Local Development
Testing in OLB (Sandbox)
To test the widget embedded in a real Candescent OLB sandbox instance:Build & Deploy
dist/ output to your CDN. The remoteEntry.js URL is what the FI registers in Candescent admin.
Environments
| Environment | CDN Path | OLB Instance |
|---|---|---|
| Dev / local | localhost:4200 (ngrok for OLB testing) | Candescent sandbox |
| QAL / Staging | https://cdn.nuevesolutions.com/cd-widget/qal/remoteEntry.js | Candescent QAL |
| Production | https://cdn.nuevesolutions.com/cd-widget/prod/remoteEntry.js | Candescent production |
FI Onboarding Checklist
Steps the FI (bank / credit union) and Nueve complete together before the widget goes live.| # | Step | Owner |
|---|---|---|
| 1 | Sign Candescent DevEx partner agreement | Candescent rep |
| 2 | Receive sandbox credentials and @cdx-extensions registry access | Candescent rep |
| 3 | FI registers widget remote URL in Candescent admin portal | FI / Bank IT |
| 4 | Confirm fiId value and banking core mapping | Nueve + FI |
| 5 | Configure FI app configuration JSON (feature flags, labels, limits) | Nueve |
| 6 | End-to-end test in Candescent sandbox with real member account | Nueve + FI |
| 7 | FI approves UX and disclosure text | FI compliance |
| 8 | Deploy production bundle to CDN, FI updates admin portal URL | Nueve |
| 9 | Smoke test in production with test member account | Nueve + FI |
Troubleshooting
| Issue | Likely Cause | Fix |
|---|---|---|
| Widget shows blank in OLB | remoteEntry.js URL not reachable or CORS blocked | Confirm URL is publicly accessible, check CORS headers |
useUserContext() returns null | Running outside OLB without standalone={true} | Set standalone={true} for local dev, or test via OLB sandbox |
| React version mismatch error at runtime | Widget React version differs from OLB host | Pin react to 18.2.0 exactly |
| MUI component looks different in OLB | ThemeProvider wrapping widget when embedded | Remove ThemeProvider when standalone !== true |
| API call returns 401 in production | OLB session expired | OLB handles re-auth — widget remounts automatically |
Dependency conflict on npm install | Package version outside pinned list | Revert to the approved version or request Candescent approval |
