# Catalog & source generator
> How the source generator turns vendored SVGs into 1,555 typed components at build time.
Source: https://shellicons.shellui.dev/docs/reference/catalog-source-generator
The typed icon components you use (`` and friends) aren't hand-written — they're emitted by a Roslyn source generator at every build. This page explains how it works and what to touch if you're contributing to the repo.
## Two source packs
```
catalog/
├── lucide/ <- vendored, refreshed by scripts/sync-lucide.ps1
│ └── icons/
│ ├── chevron-right.svg
│ ├── chevron-right.json (Lucide metadata)
│ └── ...
└── custom/ <- repo-owned, hand-authored
└── icons/
├── house-filled.svg (optional — none by default)
└── ...
```
Both feed the same generator. Both produce components in the same `ShellIcons.Icons` namespace. Consumers can't tell an icon from Lucide apart from an icon from custom.
## The generator pipeline
1. `ShellIcons.Blazor.csproj` marks `catalog/lucide/icons/*.svg` and `catalog/custom/icons/*.svg` as ``.
2. `ShellIcons.Generator` reads them via `context.AdditionalTextsProvider`.
3. For each SVG:
- `SvgParser.ExtractInner` strips the outer `