Architecture
Application Layer
The main product is a Next.js 16 application using the App Router. The UI is built with Material UI and uses a console-style layout intended to feel closer to a cloud platform control plane than a generic CRUD dashboard.
The current route model includes:
/for the platform landing experience./applicationsfor application-level context./catalogfor self-service offerings./catalog/azure-storagefor the storage account workflow./resourcesfor provisioned inventory./resources/[name]for resource inspection and deletion.
Experience Layer
The current user-facing direction is application-centric. Instead of exposing infrastructure objects directly, the portal is moving toward a model where a developer sees an environment composed of capabilities such as:
- Compute
- Networking
- Storage
- Databases
- Operational status
This avoids requiring every user to understand Crossplane resource vocabulary.
Today, that direction is embodied most concretely in the Azure Storage workflow, where platform rules and provider constraints are expressed through a guided form rather than through direct YAML authoring.
Platform Layer
Behind the UI, platform interactions are brokered through API routes. Those routes use the Kubernetes client to communicate with Crossplane-managed resources and custom objects.
The main storage lifecycle runs through the generic Crossplane resource route:
GET /api/crossplane/resourcesfor inventory and single-resource reads.POST /api/crossplane/resourcesfor managed resource creation.DELETE /api/crossplane/resourcesfor deletion.
The Azure Storage workflow submits a storage.azure.upbound.io/v1beta1 Account object through that API layer.
The current implementation is intentionally simple, but it also means the management AKS cluster is acting as both the reconciliation plane and the only durable home for dynamically created desired state. The target direction is to separate those concerns by persisting desired state outside Kubernetes, observing Azure independently of Crossplane health, and projecting a drift-aware read model into the UI. For the detailed plan, see Disaster Recovery And Drift Management.
Development Mode
For local UI iteration, API routes can return mocked development responses when the backing cluster is unavailable. That keeps product work moving even when a Kubernetes environment is offline.
In development mode, the resource API can:
- return an empty resource list,
- return a synthetic storage account record for detail pages,
- accept create requests and return a generated fake name,
- accept delete requests without requiring cluster access.
This allows most product work on catalog, resources, and details flows to proceed without blocking on AKS or Crossplane availability.
Kubernetes And Deployment Layer
The repository also includes Kubernetes manifests and Azure deployment scripts that support a live AKS-based environment:
- Crossplane installation and provider configuration.
- IDP application deployment manifests.
- Internet-facing ingress configuration for the hosted portal.
- Example Crossplane manifests for smoke testing, including Azure Storage.
Documentation Layer
Public-facing documentation is served separately through Docusaurus in the nested docs workspace and deployed to GitHub Pages.