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; that decides whether it is a re-export or a drawing job.
These 20 products are known to the registry but have no artwork yet, so there is no need to report them — they are already on the list:
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, SimCam, Starknet Foundry, Starknet SDK for JVM languages, State of React Native, Wallet
API
Everything the gallery does is plain HTTP — 292 assets across 34 brands, no auth. Use it from CI, a website, a script. Copy any example below.
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 — the most cacheable URL there is, ideal for embedding.
/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. They are read out of the artwork at build time, so they cannot drift from the files; a brand that needs an approved palette instead sets colors in its meta.json and that wins. Pure white and black are omitted — every mark ships an on-light and an on-dark cut, so those two are theme ink, not brand colour, and a black-and-white mark correctly reports an empty array. ZIP bundles carry the same values in COLORS.txt.
/api/brandsZIP 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 — published OG images depend on that. The JSON index also lists brands with no artwork yet (missing: true), so gaps are visible programmatically.