Prime Radiant: Building a catalog for all expanders
Expander Exchange: An NSX software catalog
A core part of the NSX Ecosystem consists of expanders, software units designed to generate code for a specific functionality.
In this ecosystem, a complete application can be assembled by combining multiple expanders. Some are delivered directly by the core development team, while others are built and extended through community-driven contributions.
As with any highly extensible platform, finding the right plugin or library to solve your specific engineering problem can quickly become a challenge.
To solve this problem, Prime Radiant allows you to collect data and documentation of every expansion resource in your factory. The Expander Exchange is an integrated software catalog within Prime Radiant that aggregates all documentation related to expanders.
In this article, we highlight the main features of the Expander Exchange.
Categorization with labels
Labels (or tags) offer a straightforward, expressive way to categorize expanders. They capture both functional features and technical dependencies, allowing developers to filter the ecosystem from multiple perspectives. For instance, an expander implementing row-level security might carry both the postgres (underlying technology) and authorization (functional domain) labels.

Integrated documentation
Traditionally, documentation lives inside the code repository of an application, library, or plugin. The docs remain close to the source code, making it easy for developers to update them in the same commit or pull request.
However, for the users of that documentation, this approach has some disadvantages. Reading and navigating through in-repo markdown files limits us to the user interface of our hosting platform (like GitHub or GitLab) or our local markdown renderers.
An alternative solution uses a separate documentation website (similar to foundation.stars-end.net), but this has a higher chance of outdated documentation, as documentation and code are split over multiple places.
The Expander Exchange solves this problem by providing a unified portal that reads documentation directly from source repositories while offering:
- An easy way to consult the CHANGELOG.md
- A concise, high-level description of each resource to quickly understand what an expander does.
- A built-in markdown renderer to view all source doc files.
- A generated expander structure file that lists the available options and shows which layer/technology implementations the resource provides.
Native markdown rendering was previously unsupported within the core Angular stack. This feature has now been implemented and released as an open community resource.
You can explore its full capabilities by viewing its own documentation rendered live on the Exchange!

Semantic Search with embeddings (experimental)
This feature is still experimental.
Most search bars give you a simple text match (e.g. "row level security" won't match "row-level-security").
More advanced search implementations might trim special characters and spaces or match on an equal stem (e.g. "car"
and "cars" are the same thing).
The Expander Exchange goes one step further by utilizing text embeddings. For each expander, the labels, description and docs are gathered and "embedded". An embedding service will extract the semantic meaning from this input, and enable a smarter search experience. Thanks to embedding models that are trained on millions or billions of words, a search for "how to hide a column" will now match with an expander containing, for example, the description "display columns".
The improved search should make it easier to find other resources in your factory that solve your problem.
Curious about how embeddings work? You can experiment with semantic search on an interactive playground:
Navigating expander dependencies
Expansion resources are typically composed of other expansion resources.
A highly modular structure splits expanders by layer or technology to improve the composability of a certain feature (i.e. only the required expanders for a layer and technology will be activated).
These relations are all managed in the root pom.xml of a resource.
For a resource user, it might be a challenge to know which resource to use in their project. The bundle and beam concept groups resources in a single unit for each "capability". (e.g. one resource for search, one resource for data operations, etc.)
The Expander Exchange will group resources on this level, but at the same time provide insight into every child resource.
By navigating the expansionResourceDependencies, you can easily find the corresponding bundle of a resource or vice versa, see all child resources of a bundle.

More than just documentation
The Expander Exchange is not just a static documentation site, but is built to be a true developer portal. By integrating documentation with other data, such as usage metrics and measures, it becomes more than a plain markdown renderer.
- Measures: How much artifacts will be expanded by this resource? Which part of the stack will this resource modify or extend? Should I worry about conflicts with my own customisations?
- Usage tracking: Which other applications use this resource? Can they help me when implementing this resource? Did they extend this resource? If you are struggling with a new expander, you can immediately find internal projects that are already using it to see how they configured it.
By consolidating documentation, usage metrics and codebase measures into a single view, finding the right expander has been made much easier.







