Missing something?
A brand that isn't here, an on-dark cut that doesn't exist, a lockup you need in a different shape — ask Szymon on Slack or send a mail. Say where you need it.
Already on the list — 19 products the registry knows about but has no artwork for:
Bottom Sheet, ByeGL, Cairo lint, Cairo LS, Cairo profiler, Chat SDK, Elixir Language Tour, expo-live-activity, gpu-video, KMP Maps, KMP Sharing, Maat, RAG, React Native Paradise, Shine, Starknet Foundry, Starknet SDK for JVM languages, State of React Native, Wallet
API
293 assets across 35 brands over plain HTTP, no auth.
List logos
GET /logos returns the full JSON index. Filter with brand (alias product), type (full / symbol / horizontal / vertical / wordmark), theme (on-light / on-dark / universal), mono, format, and width — adding a width flips every url to a sized PNG.
/logos?brand=reanimated/logos?type=symbol&theme=on-dark/logos?width=300One logo
GET /logo/<brand> picks the best match for the same filters and serves the file — the original SVG untouched, or a PNG when width or format=png is given. Pin an exact file with file=.
/logo/reanimated?theme=on-dark/logo/typegpu?type=symbol&width=512/logo/fishjam?file=fishjam-full-on-dark.svg&format=png&width=1024Raw files
Every asset is also a plain static file.
/logos/products/reanimated/reanimated-full-on-dark.svgBrand colors
Every brand carries a colors array of #RRGGBB, most characteristic first — on GET /logos (under brands) and on GET /api/brands. Values are read out of the artwork at build time; a brand overrides them by setting colors in its meta.json. Pure white and black are omitted, so a black-and-white mark reports an empty array. ZIP bundles carry the same values in COLORS.txt.
/api/brandsPalettes
GET /api/colors returns the palettes the Colors page lists, in the same order: Software Mansion first, then each product. Every section has a slug, name, count, and colors of { name, hex }. Pick one with section, the same slug the product's logos use where it has them. These are the hand-kept design palettes, not the per-brand colors above, which are read out of each product's artwork.
/api/colors/api/colors?section=fishjamZIP bundles
POST /logos/zip with { ids, format, width } answers with the archive in one response (up to 300 ids). For bigger bundles use the job API the gallery uses: POST /api/downloads (same body, up to 1000 ids) returns { id }; poll GET /api/downloads/<id> until state: "done", then fetch GET /api/downloads/<id>/file. Finished bundles expire after 15 minutes.
curl -X POST -H 'Content-Type: application/json' -d '{"ids":["reanimated","typegpu/typegpu-symbol-color-universal.svg"],"format":"png","width":512}' --output logos.zip https://brand.swmansion.com/logos/zipOG images
GET /og renders an on-brand social card from URL params — compose one visually in the studio and copy its URL. Full parameter reference lives in the repo README.
/og?title=Hello&bg=navy&logo=1Stability
Asset ids (<brand>/<file>) are permanent: renames leave an alias behind, so an id that ever worked keeps working. The JSON index also lists brands with no artwork yet (missing: true).