Topology icon packs are portable stencil libraries for ChartForgeX topology diagrams. A pack can be handwritten, generated by a product adapter, or imported from a vendor/community SVG source. The recommended generated layout keeps manifests readable and assets editable:
my-vendor-pack/
LICENSE
SOURCE.md
_reports/
import-report.json
networking/
manifest.json
svg/
firewall.svg
switch.svg
previews/
firewall.png
switch.png
manifest.json is the contract ChartForgeX loads. svg/*.svg is the source artwork the renderer uses after the manifest is loaded. previews/*.png is optional picker/gallery artwork and should be treated as generated output. A host can ship only a manifest with inline SVG for small custom packs, but sidecar SVG files are preferred for large vendor packs because reviews stay readable and designers can edit artwork without touching JSON.
Manifest Artwork
Use artwork.svgPath for pack-local SVG sidecars and artwork.previewPath for optional thumbnails:
{
"schema": "chartforgex.topology.iconPack",
"version": 1,
"id": "acme-network",
"label": "Acme Network",
"vendor": "Acme",
"metadata": {
"source.url": "https://example.com/acme-icons",
"source.revision": "2026.05.09",
"source.license": "MIT"
},
"icons": [
{
"id": "firewall",
"label": "Acme Firewall",
"nodeKind": "Gateway",
"shape": "Firewall",
"symbol": "FW",
"color": "#D92D20",
"category": "Network",
"artwork": {
"svgViewBox": "0 0 48 48",
"svgPath": "svg/firewall.svg",
"previewPath": "previews/firewall.png"
},
"tags": [ "firewall", "security", "gateway" ]
}
]
}
Asset paths are intentionally relative to the manifest directory. Do not use absolute paths, parent-directory traversal, file URLs, or remote URLs for sidecar artwork. ChartForgeX validates paths before resolving them and loads sidecar SVGs through the same SVG sanitizer used by the importer.
Curated Packs
The repository ships first-party curated packs under assets/topology-icons/ using the same auditable layout. For curated packs, svg/*.svg is the authored source of truth. After changing SVG artwork, use the .NET icon-import tool to refresh derived PNG previews and validation reports:
dotnet run --project .\ChartForgeX.Tools.IconImport\ChartForgeX.Tools.IconImport.csproj -c Release -- --refresh-pack .\assets\topology-icons\chartforgex-ad-network-premium --preview-size 128
chartforgex-ad-network-premiumcovers richer AD/network diagrams: Forest, Domain, Child Domain, Domain Controller, Read-Only Domain Controller, Global Catalog, FSMO roles, AD Site, AD Site Link, Site Link Bridge, Subnet, Bridgehead Server, Replication Connection, KCC, GPO, OU, Trust, DNS Zone, DNS Record, Certificate Authority, Certificate Template, ADFS, LAPS, users, privileged/disabled users, security/distribution/dynamic groups, computers, server computers, domain-joined devices, contacts, service accounts, MSA/gMSA/dMSA, foreign security principals, containers, printers, shares, password settings objects, BitLocker recovery keys, service connection points, AdminSDHolder, schema classes, and Sites and Services.backupcovers generic backup and recovery roles such as backup server, proxy, repository, scale-out repository, hardened repository, recovery lab, backup manager, mount server, and WAN accelerator.network-securitycovers generic network security roles such as firewall, switch, access point, security manager, log analyzer, VPN, SD-WAN, authenticator, MFA token, WAF, mail security, endpoint detection, sandbox, SIEM, cloud security, and security fabric.cloud-productivitycovers generic cloud productivity roles such as tenant, cloud identity, conditional access, mail service, content sites, team collaboration, cloud drive, governance, threat protection, device management, low-code platform, subscription, resource group, secret vault, private endpoint, private circuit, and security analytics.network-infrastructurecovers device-like physical infrastructure roles such as rack switch, core switch, layer 3 switch, PoE switch, edge router, branch router, wireless AP, mesh AP, firewall appliance, load balancer appliance, VPN gateway, patch panel, fiber uplink, and SFP transceiver.chartforgex-geo-incidents-world-eventscovers map, route, hazard, incident, response, intelligence-feed, monitoring, and logistics roles for situational-awareness charts.chartforgex-charts-analyticscovers visualization, analytics, KPI, dashboard, report, threshold, anomaly, comparison, and drilldown roles.chartforgex-topology-networkcovers generic topology, connectivity, link, datacenter, service, and edge infrastructure roles.chartforgex-security-risk-certificatescovers identity, access, certificate, trust, finding, incident, exposure, compliance, evidence, and forensics roles.chartforgex-data-ownership-intelligencecovers datasets, internet intelligence, ownership, entities, correlation, evidence, reporting, integration, and governance roles.chartforgex-people-org-workflowcovers people, roles, org structure, lifecycle, goals, approvals, workflow, collaboration, and HR data roles.chartforgex-identity-directorycovers directory structures, principals, sites, directory services, access, authentication, certificates, and protocol-flow roles.chartforgex-microsoft-365-collaborationcovers generic Microsoft 365-style tenant, messaging, productivity, compliance, integration, and lifecycle-governance roles without vendor logos.
Each curated pack keeps manifest.json, svg/*.svg, generated previews/*.png, SOURCE.md, LICENSE, and _reports/refresh-report.json beside each other. Vendor or product names should only be used for truly branded or imported packs with explicit provenance and license notes; generic first-party artwork should stay under neutral pack ids.
Imported vendor packs are kept under their own provenance folder beside first-party packs. assets/topology-icons/tabler-icons/tabler-icons-outline contains 5,093 MIT-licensed Tabler Icons outline SVGs imported from @tabler/icons 3.44.0, with SOURCE.md, LICENSE, and _reports/import-report.json kept next to the manifest.
Import Tool
ChartForgeX.Tools.IconImport converts a folder tree of SVG files into ChartForgeX-compatible packs. It is tooling only; SkiaSharp and Svg.Skia are not runtime dependencies of ChartForgeX.
dotnet run --project .\ChartForgeX.Tools.IconImport\ChartForgeX.Tools.IconImport.csproj -c Release -- `
--source C:\Source\VendorStencils `
--output .\assets\topology-icons\vendor-stencils `
--source-url https://example.com/vendor/stencils `
--source-revision 2026.05.09 `
--source-license MIT `
--source-license-url https://example.com/vendor/stencils/LICENSE `
--source-license-path LICENSE `
--vendor Vendor `
--pack-id-prefix vendor-stencils `
--pack-label-prefix "Vendor Stencils" `
--generate-png `
--preview-size 128
The importer:
- creates one generated pack per top-level source category that contains SVG files
- writes sanitized
svg/*.svgsidecars instead of embedding large SVG strings in JSON - optionally writes
previews/*.pngthumbnails for stencil browsers and picker UIs - records pack-level provenance such as source URL, source revision, license, and license URL
- records icon-level provenance such as source path, source file name, and detected viewBox
- skips unsafe SVGs rather than importing scriptable or externally dependent artwork
- writes
SOURCE.mdand_reports/import-report.jsonso an asset PR can be audited later without placing non-manifest JSON beside pack manifests
Use --help to print the current command-line options.
Review Checklist
For a generated vendor pack PR, verify:
- the upstream source revision is pinned
- the source license is copied or clearly linked
- vendor/product names are used only when the artwork is truly branded or imported from a licensed/provenance-tracked source
- generic original artwork uses neutral pack ids and labels instead of vendor/product names
- generated manifests do not contain local machine paths
- generated manifests use
artwork.svgPathinstead of large inlineartwork.svgpayloads svg/*.svgfiles are sanitized, pack-local, and reviewablepreviews/*.pngfiles are generated artifacts, not runtime requirements- ChartForgeX core builds without adding asset-conversion dependencies
Useful checks:
git diff --check
rg -n '"svg"\s*:' assets\topology-icons\vendor-stencils
rg -n "C:\\|AppData|Temp" assets\topology-icons\vendor-stencils
dotnet build .\ChartForgeX\ChartForgeX.csproj -c Release --no-restore -p:UseSharedCompilation=false -m:1 -nr:false
dotnet build .\ChartForgeX.Tools.IconImport\ChartForgeX.Tools.IconImport.csproj -c Release --no-restore -p:UseSharedCompilation=false -m:1 -nr:false