Feature Specification: Applications Catalog
Created: 2026-09-22
Status: Implemented
Input: Reconstructed from the code at 0bf4ecd36 (core/applications-catalog.nix, core/checks/applications-catalog.nix, core/lib/data-model.nix), commit 8f22117c6 (rename of the data-model catalog to components), and api/specification.md.
User Scenarios & Testing (mandatory)
User Story 1 - Show the applications an operator can use (Priority: P1)
A front-end shows the applications of a deployment with a name, a
description, a link to the project and an icon. It gets these from one
catalog that core builds, and does not keep its own list.
Why this priority: without the catalog, each front-end keeps a copy of the names and artwork, and the copies go out of date when a component is added.
Independent Test: build the applications-catalog package. The index
share/fediversity/components.json has one entry per configurable
component, and every icon that an entry names is in the output.
Acceptance Scenarios:
- Given a component with
configurable = true, When the catalog is built, Then the index has an entry for it withtitle,description,homepage,optional,configurable,uiSubdomainandicon. - Given a supporting component that has a UI subdomain, When the catalog is built, Then the index has an entry for it, so the operator can find its UI.
- Given a component that is not
configurableand has no UI subdomain, When the catalog is built, Then the index has no entry for it.
User Story 2 - Take the facts from the project itself (Priority: P2)
The description, the homepage and the icon of an application come from the
package of the component and from the source of that project. When the
source of the package has no icon, the icon comes from another repository of
the same project, pinned with npins. The repository does not store copies of
them.
Independent Test: change the description in the metadata of a package in a test module. The catalog entry shows the new description.
Edge Cases
- A component has no icon. Its entry has
icon = null, and the catalog still builds. - A front-end folds extra components into the group. The catalog includes them when they match the membership rule.
- The index names no component. The check fails.
Requirements (mandatory)
Functional Requirements
- FR-001: The catalog MUST have an entry for each component that is
configurableor has a UI subdomain, and for no other component. - FR-002: Each entry MUST have
title,description,homepage,optional,configurable,uiSubdomainandicon. - FR-003: The catalog MUST take the metadata from the package of the component and the icon from the source of the project, or from another repository of the project that
npinspins when that source has no icon. - FR-004: Each icon that an entry names MUST be in the catalog output.
- FR-005: The catalog MUST accept the extra modules of a front-end, the same as the data model.
Key Entities
- Catalog index:
share/fediversity/components.json, keyed by component name. - Catalog entry: how one component is shown.
- Icon: an SVG file from the source of the project.
Success Criteria (mandatory)
Measurable Outcomes
- SC-001: A new operator-facing component shows in the catalog with no change to the catalog code.
- SC-002: The
applications-catalogcheck passes.
Assumptions
apiserves the catalog and its icons. This specification describes only whatcorebuilds.
Known Deviations
None.