Search engine for open-source SVG icons. Aggregates multiple icon libraries into a single searchable catalog with platform-specific identifiers for iOS, Android, React, Vue, and Svelte.
Live: icons.pureadmin.io
8 aggregated sets, ~39k icons total. Styles use a unified canonical vocabulary (outline, filled, thin, light, regular, bold, rounded, sharp, duotone, color, brands). Native source-library names are preserved per-set in const.icon_set.native_style_names.
| Set | Icons | Styles | Sizes | License |
|---|---|---|---|---|
| FluentUI System Icons | ~5400 | outline, filled, color, light | 16, 20, 24, 28, 32, 48 | MIT |
| Font Awesome Free | ~2850 | filled, outline, brands | scalable | CC BY 4.0 / MIT |
| Heroicons | ~650 | outline, filled | 16, 20, 24 | MIT |
| Lucide | ~1500 | outline | scalable | ISC |
| Material Symbols | ~10800 | filled, outline, rounded, sharp, duotone | scalable | Apache 2.0 |
| Phosphor Icons | ~9000 | thin, light, regular, bold, filled, duotone | scalable | MIT |
| Remix Icon | ~3000 | outline, filled | scalable | Apache 2.0 |
| Tabler Icons | ~5800 | outline, filled | scalable | MIT |
See icons.pureadmin.io/docs/icon-sets for the live list with per-set notes, color methods, and source links.
All endpoints return JSON. No authentication required (except maintenance).
# Search icons
curl 'https://icons.pureadmin.io/api/icons/search?q=calendar&limit=5'
# Filter by icon set and style
curl 'https://icons.pureadmin.io/api/icons/search?q=arrow&set=heroicons&style=outline'
# Get icon detail
curl 'https://icons.pureadmin.io/api/icons/5403'
# List all icon sets
curl 'https://icons.pureadmin.io/api/icon-sets'
# Plain text format (token-efficient for AI)
curl 'https://icons.pureadmin.io/api/icons/search?q=pen&format=text'Endpoints:
GET /api/icons/search— search with filters (q, set, size, style, limit, format)GET /api/icons/:id— icon detail with filenames, identifiers, categories, phrasesGET /api/icon-sets— all sets with styles, sizes, color methods, icon countGET /api/health— health checkGET /icons/:set/:style/:filename— SVG file servingPOST /api/maintenance/:task— sync, clean, cube (requires X-API-Key)POST /api/maintenance/sync/:icon_set— sync a specific icon set
Docs: icons.pureadmin.io/docs/api · llms.txt
The icon detail modal includes a Download Designer for generating customized icon exports:
- Colors — apply any color preset (built-in or custom) to the icon and background
- Padding — adjustable gap around the icon (0–40%)
- Rounded corners — adjustable radius (0–50%, where 50% = circle)
- PNG ZIP — export at multiple sizes (32–1024px + custom) as a ZIP with manifest.json and readme.txt
- SVG export — single SVG with colors, padding, and rounded background baked in
- Import settings — restore all settings from a previous manifest.json
Ideal for generating app icons, favicons, or presentation-ready icon assets.
{
"mcpServers": {
"icons": {
"command": "npx",
"args": ["-y", "@keenmate/pure-admin-icons-mcp"]
}
}
}Provides 5 tools: get_usage_guide, search_icons, get_icon_detail, get_icon_svg, list_icon_sets. Source: ../pure-admin-icons-mcp.
- Phoenix 1.8 + LiveView 1.1
- Tailwind CSS v4 + DaisyUI
- PostgreSQL with full-text search + trigram matching
- Quantum scheduler (daily sync at 3 AM)
- Bandit HTTP server
- Sync adapters —
lib/pure_admin_icons/sync/adapters/— one module per icon set implementing thePureAdminIcons.Sync.Adapterbehaviour (download, parse, move, cleanup) - Formatter modules —
lib/pure_admin_icons/icon_sets/— one module per icon set implementing thePureAdminIcons.IconSets.Formatterbehaviour (React/Vue/Svelte/CSS class identifiers and packages) - Database layer —
lib/database/— auto-generated bydb-genfrom PostgreSQL stored procedures (runmake db-gento regenerate) - Presets —
priv/preview_presets.json— single source of truth for built-in color presets, loaded at compile time and shared between server and JS viaPresetManager - Vendor JS —
priv/static/assets/vendor/— floating-ui (popovers), JSZip (PNG ZIP export), loaded via<script defer>in root layout
Adding a new icon set requires:
- New file in
lib/pure_admin_icons/sync/adapters/ - New file in
lib/pure_admin_icons/icon_sets/ - Both registered in their respective
@adapters/@formattersmaps - DB row in
const.icon_set(see docs/ for details)
See docs/ for internal documentation on presets, Copy/Import CSS, and per-set platform prefs.
UI strings are pulled from public.translation via public.get_group_translations(lang, 'frontend', 'text', tenant) and cached per-locale in :persistent_term. English defaults live in lib/pure_admin_icons/translations.ex as @defaults and are used as fallback when the DB has no row for a key/locale.
import PureAdminIcons.Translations, only: [t: 1, t: 2]
t("common.buttons.copy") # => "Copy"
t("iconSearch.messages.resultsRange",
%{from: 1, to: 30, total: 392}) # => "Showing 1-30 of 392 icons"[domain].[specifier].[identifier]
- domain — page / feature, or
commonfor shared strings (iconSearch,iconSets,iconDetail,docsIndex,apiDocs,mcpDocs,llmsDocs,stats,syncDiscrepancies,nav,common) - specifier — string kind (
labels,headers,tableHeaders,placeholders,buttons,tooltips,messages,empty,links,pagination,platforms,periods,filters,cards) - identifier — camelCase (
iconSet,browseIcons,copyCss)
Interpolation uses %{param} placeholders — applied by Translations.interpolate/2 after DB lookup.
Per request, PureAdminIconsWeb.Plugs.Locale picks the locale in this order:
?lang=xxquery param (explicit opt-in)Accept-Languageheader's first acceptable tagdefault_localefrom config (default"en")
Only whitelisted tags in config :pure_admin_icons, :supported_locales are honored; everything else falls back to default.
LiveView processes inherit the resolved locale via the live_session :default, on_mount: {Plugs.Locale, :default} hook in the router, which reads the value stashed in the session by the plug.
- Add rows to
public.translationwith(language_code, data_group='frontend', data_object_code=<full key>, context='text', value=<translated>). See../pure-admin-icons-database/upsert_frontend_translations.sqlfor the template / canonical source of all frontend translations. - Refresh the mat view:
SELECT internal.refresh_translation_cache(); - Append the language code to
config :pure_admin_icons, :supported_locales. - Drop the in-app cache:
PureAdminIcons.Translations.DbProvider.refresh().
- Call
t("domain.specifier.identifier")in your template. - Add an English row to
@defaultsinlib/pure_admin_icons/translations.ex(fallback when DB has no translation). - Insert the same row into
public.translationforen— and any other active language. - Refresh both the mat view and the in-app cache.
Use the SP writers (public.create_translation, public.update_translation, public.delete_translation, public.copy_translations) — they handle normalization, auditing, and automatic mat-view refresh. After any out-of-band change, call PureAdminIcons.Translations.DbProvider.refresh() to drop the in-app cache.
mix setup # Install deps, build assets
iex -S mix phx.server # Start dev server at localhost:4020
mix test # Run tests
mix format # Format code
make db-gen # Regenerate DB context from stored proceduresdocker build -t pure-admin-icons:latest .
docker run -p 8888:8888 \
-e SECRET_KEY_BASE=$(mix phx.gen.secret) \
-e DB_USERNAME=... -e DB_PASSWORD=... \
-e DB_HOSTNAME=... -e DB_DATABASE=pure_admin_icons \
-e PHX_HOST=icons.pureadmin.io \
pure-admin-icons:latestApplication code: MIT. Icon SVGs retain their original licenses (see icon set table above).
Built by KeenMate.