TopoViewer Studio
Support status: Beta Preview
This example uses one bundle in Studio, a documentation page, and Grafana without changing object IDs. The graph below renders that bundle. For a walkthrough that starts in hosted Studio without a repository checkout, use First Project.
Try The Authoring Loop
For this folder-based walkthrough, follow Run Studio locally, then start Studio from the repository root:
npm run studio:dev
In a browser that supports directory selection, open Project menu, choose Open folder, and select:
packages/topoviewer/content/examples/integration/studio-portable-bundle
Studio opens one YAML-first workbench: project source on the left, the selected YAML document in one shared editor, and the real TopoViewer preview beside it. Use Source, Split, and Preview to change presentation without changing the project. Split defaults to one-quarter source and three-quarters preview.
Open Object drawer under Authoring to place an object. Selecting an object opens preview-local Properties for its topology and appearance. Clicking empty preview opens canvas, grid, interaction, and layer settings. Telemetry rules opens the Mapper drawer, which stays open while you inspect other topology objects.
Select edge-a, change its Visible label in Properties, then select
topology.yaml in project source to inspect the committed source and undo the
change. Open Telemetry rules > Coverage, paste this into Sample JSON,
then choose Analyze samples:
[
{
"metric": "topoviewer_link_up",
"value": 0,
"labels": {
"source_id": "studio-portable-consumer",
"link_id": "edge-a-core-b"
}
}
]
Coverage should show one resolved sample and an object link to edge-a-core-b.
Join keys belong inside labels; putting them at the top level leaves the
target unresolved. Coverage checks the binding, not runtime state coloring.
Use the Grafana consumer with actual data frames to check the rule's down
style. The topology ID and link ID do not change with runtime state.
Use Appearance in the header to choose System, Light, or Dark. System follows the operating system. Theme-owned canvas and grid colors follow that choice; explicit project colors remain unchanged.
Use archive import when folder access is unavailable
If someone has exported this bundle as .tvstudio, use Project menu >
Open archive. If you only have the YAML files, create a project and replace
its topology and stylesheet in the source editor, applying each. Create a
first mapper rule to make mapper.yaml available, then replace its source
with this bundle's mapper and Apply. Follow the
draft and save rules
before exporting a verified archive for future imports.
Publish The Documentation
Open Export project > Documentation, choose MkDocs or Static HTML, and export the documentation bundle. Its README explains where to put the YAML and embed snippet. See Export for the bundle contents and deployment steps.
Inspect the canonical mapper
version: 1
identity:
sourceId: studio-portable-consumer
sourceIdLabel: source_id
rules:
- id: link-health
metric: topoviewer_link_up
select: link
join: link_id
value: up
states:
down: "==0"
style:
down:
lineColor: "#d32f2f"
Package It For Grafana
In Studio, open Export project > Grafana. The readiness check confirms that
mapper.yaml is present and valid before Export Grafana bundle becomes
available. Studio then emits the mounted-bundle layout:
studio-portable-consumer/
studio-portable-consumer.topo.tv.yaml
studio-portable-consumer.style.tv.yaml
studio-portable-consumer.mapper.tv.yaml
manifest.json
Grafana receives runtime data frames and applies mapper overlays, but it does not own a different topology. Tests compile this canonical bundle through both the core renderer and the Grafana runtime model to detect semantic drift.
Reuse The Pattern
Keep one directory as the canonical bundle owner. Make authoring tools read and write those files, make docs embed them, and make operational packaging rename or wrap them without changing graph identity. Add a source-specific converter before the bundle when inventory comes from Kubernetes, NetBox, Infrahub, or an internal API; do not put source normalization inside each render surface.