- {/* Left Column: Icon Info and Author */}
@@ -287,7 +460,7 @@ export function IconDetails({ icon, iconData, authorData }: IconDetailsProps) {
{authorName ? authorName.slice(0, 2).toUpperCase() : "??"}
- {authorData.html_url ? (
+ {authorData.html_url && (
{authorName}
- ) : (
+ )}
+ {!authorData.html_url && (
{authorName}
)}
@@ -348,11 +522,15 @@ export function IconDetails({ icon, iconData, authorData }: IconDetailsProps) {
Available in{" "}
- {availableFormats.length > 1
- ? `${availableFormats.length} formats (${availableFormats.map((f) => f.toUpperCase()).join(", ")})`
- : `${availableFormats[0].toUpperCase()} format`}{" "}
+ {availableFormats.length > 1 && (
+ `${availableFormats.length} formats (${availableFormats.map((f) => f.toUpperCase()).join(", ")})`
+ )}
+ {availableFormats.length === 1 && (
+ `${availableFormats[0].toUpperCase()} format`
+ )}{" "}
with a base format of {iconData.base.toUpperCase()}.
{iconData.colors && " Includes both light and dark theme variants for better integration with different UI designs."}
+ {iconData.wordmark && " Wordmark variants are also available for enhanced branding options."}
Use the {icon} icon in your web applications, dashboards, or documentation to enhance visual communication and user
@@ -365,7 +543,6 @@ export function IconDetails({ icon, iconData, authorData }: IconDetailsProps) {
- {/* Middle Column: Icon variants */}
@@ -373,37 +550,61 @@ export function IconDetails({ icon, iconData, authorData }: IconDetailsProps) {
Click on any icon to copy its URL to your clipboard
- {!iconData.colors ? (
-
- {availableFormats.map((format) => renderVariant(format, icon))}
-
- ) : (
-
-
-
-
- Light theme
-
-
- {availableFormats.map((format) => renderVariant(format, icon, "light"))}
-
-
-
-
-
- Dark theme
-
-
- {availableFormats.map((format) => renderVariant(format, icon, "dark"))}
-
-
-
- )}
+
+ }
+ />
+
+ {iconData.colors && (
+ <>
+ }
+ />
+
+ }
+ />
+ >
+ )}
+
+ {iconData.wordmark && (
+
+ )}
+
- {/* Right Column: Technical details */}
@@ -445,6 +646,28 @@ export function IconDetails({ icon, iconData, authorData }: IconDetailsProps) {
)}
+ {iconData.wordmark && (
+
+
Wordmark variants
+
+ {iconData.wordmark.light && (
+
+
+ Light:
+ {iconData.wordmark.light}
+
+ )}
+ {iconData.wordmark.dark && (
+
+
+ Dark:
+ {iconData.wordmark.dark}
+
+ )}
+
+
+ )}
+
Source
diff --git a/web/src/constants.ts b/web/src/constants.ts
index fbeef827..3f845c4e 100644
--- a/web/src/constants.ts
+++ b/web/src/constants.ts
@@ -1,4 +1,4 @@
-export const BASE_URL = "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons"
+export const BASE_URL = "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@feat/text-icons"
export const REPO_PATH = "https://github.com/homarr-labs/dashboard-icons"
// TODO: Change back before merge
export const METADATA_URL = "https://raw.githubusercontent.com/homarr-labs/dashboard-icons/refs/heads/feat/text-icons/metadata.json"
diff --git a/web/src/lib/isvg.ts b/web/src/lib/isvg.ts
new file mode 100644
index 00000000..e4788ada
--- /dev/null
+++ b/web/src/lib/isvg.ts
@@ -0,0 +1,3568 @@
+import type { iSVG } from '@/types/svg';
+
+export const svgs: iSVG[] = [
+ {
+ title: 'Windsurf',
+ category: ['Software', 'AI'],
+ route: '/library/windsurf-logo.svg',
+ url: 'https://codeium.com/windsurf'
+ },
+ {
+ title: 'daisyUI',
+ category: 'Library',
+ route: '/library/daisyui.svg',
+ url: 'https://daisyui.com/'
+ },
+ {
+ title: 'PayPal',
+ category: 'Payment',
+ route: '/library/paypal.svg',
+ wordmark: '/library/paypal-wordmark.svg',
+ url: 'https://paypal.com'
+ },
+ {
+ title: 'Google Drive',
+ category: 'Google',
+ route: '/library/drive.svg',
+ url: 'https://www.google.com/drive/'
+ },
+ {
+ title: 'Milanote',
+ category: 'Software',
+ route: {
+ light: '/library/milanote-light.svg',
+ dark: '/library/milanote-dark.svg'
+ },
+ wordmark: {
+ light: '/library/milanote-wordmark-light.svg',
+ dark: '/library/milanote-wordmark-dark.svg'
+ },
+ url: 'https://milanote.com'
+ },
+
+ {
+ title: 'Together AI',
+ category: 'AI',
+ route: {
+ light: '/library/togetherai_light.svg',
+ dark: '/library/togetherai_dark.svg'
+ },
+ url: 'https://www.together.ai/'
+ },
+ {
+ title: 'Suno',
+ category: 'AI',
+ route: '/library/suno.svg',
+ wordmark: {
+ light: '/library/suno_wordmark_light.svg',
+ dark: '/library/suno_wordmark_dark.svg'
+ },
+ url: 'https://suno.com/'
+ },
+ {
+ title: 'Groq',
+ category: 'AI',
+ route: '/library/groq.svg',
+ wordmark: {
+ light: '/library/groq_wordmark_light.svg',
+ dark: '/library/groq_wordmark_dark.svg'
+ },
+ url: 'https://groq.com/'
+ },
+ {
+ title: 'Cohere',
+ category: 'AI',
+ route: '/library/cohere.svg',
+ wordmark: '/library/cohere_wordmark.svg',
+ url: 'https://cohere.com/'
+ },
+ {
+ title: 'Ollama',
+ category: 'AI',
+ route: {
+ light: '/library/ollama_light.svg',
+ dark: '/library/ollama_dark.svg'
+ },
+ url: 'https://www.ollama.com/'
+ },
+ {
+ title: 'Cisco',
+ category: 'Software',
+ route: {
+ light: '/library/cisco_light.svg',
+ dark: '/library/cisco_dark.svg'
+ },
+ url: 'https://www.cisco.com/'
+ },
+ {
+ title: 'Animate',
+ category: ['Software', 'Design'],
+ route: '/library/animate.svg',
+ url: 'https://www.adobe.com/products/animate'
+ },
+ {
+ title: 'Apollo.io',
+ category: 'Software',
+ route: '/library/apollo.io.svg',
+ url: 'https://www.apollo.io/'
+ },
+ {
+ title: 'Blender',
+ category: ['Software', 'Design'],
+ route: '/library/blender.svg',
+ url: 'https://blender.org/',
+ brandUrl: 'https://www.blender.org/about/logo/'
+ },
+ {
+ title: 'Lua',
+ category: 'Language',
+ route: '/library/lua.svg',
+ url: 'https://lua.org/'
+ },
+ {
+ title: 'Mercado Pago',
+ category: 'Payment',
+ route: '/library/mercado-pago.svg',
+ wordmark: '/library/mercado-pago-wordmark.svg',
+ url: 'https://www.mercadopago.com/developers/'
+ },
+ {
+ title: 'Basewell',
+ category: ['AI', 'Software'],
+ route: '/library/basewell.svg',
+ url: 'https://www.basewell.com/'
+ },
+ {
+ title: 'ahooks',
+ category: 'Library',
+ route: '/library/ahooks.svg',
+ wordmark: {
+ light: '/library/ahooks-wordmark-light.svg',
+ dark: '/library/ahooks-wordmark-dark.svg'
+ },
+ url: 'https://ahooks.js.org/'
+ },
+ {
+ title: 'Discord',
+ category: 'Software',
+ route: '/library/discord.svg',
+ url: 'https://discord.com/',
+ brandUrl: 'https://discord.com/branding'
+ },
+ {
+ title: 'Aliexpress',
+ category: 'Software',
+ route: '/library/aliexpress-icon.svg',
+ wordmark: '/library/aliexpress-logo.svg',
+ url: 'https://aliexpress.com/'
+ },
+ {
+ title: 'Preact',
+ category: 'Library',
+ route: '/library/preact.svg',
+ url: 'https://preactjs.com/'
+ },
+ {
+ title: 'React',
+ category: 'Library',
+ route: {
+ light: '/library/react_light.svg',
+ dark: '/library/react_dark.svg'
+ },
+ wordmark: {
+ light: '/library/react_wordmark_light.svg',
+ dark: '/library/react_wordmark_dark.svg'
+ },
+ url: 'https://react.dev/'
+ },
+ {
+ title: 'Svelte',
+ category: 'Library',
+ route: '/library/svelte.svg',
+ url: 'https://svelte.dev/'
+ },
+ {
+ title: 'Vue',
+ category: 'Framework',
+ route: '/library/vue.svg',
+ url: 'https://vuejs.org/'
+ },
+ {
+ title: 'Vuetify',
+ category: 'Library',
+ route: '/library/vuetify.svg',
+ url: 'https://vuetifyjs.com/',
+ brandUrl: 'https://vuetifyjs.com/en/resources/brand-kit/'
+ },
+ {
+ title: 'Nuxt',
+ category: 'Framework',
+ route: '/library/nuxt.svg',
+ url: 'https://nuxtjs.org/',
+ brandUrl: 'https://nuxt.com/design-kit'
+ },
+ {
+ title: 'Visual Studio Code',
+ category: 'Software',
+ route: '/library/vscode.svg',
+ url: 'https://code.visualstudio.com/',
+ brandUrl: 'https://code.visualstudio.com/brand'
+ },
+ {
+ title: 'Ton',
+ category: 'Crypto',
+ route: '/library/ton.svg',
+ url: 'https://ton.org/'
+ },
+ {
+ title: 'Locofy',
+ category: 'AI',
+ route: '/library/locofy.svg',
+ url: 'https://www.locofy.ai/'
+ },
+ {
+ title: 'Runway',
+ category: 'AI',
+ route: '/library/runway.svg',
+ url: 'https://runwayml.com/'
+ },
+ {
+ title: 'Yarn',
+ category: 'Software',
+ route: '/library/yarn.svg',
+ url: 'https://yarnpkg.com/'
+ },
+ {
+ title: 'JWT',
+ category: ['Library', 'Authentication'],
+ route: '/library/jwt.svg',
+ url: 'https://jwt.io/'
+ },
+ {
+ title: 'Strapi',
+ category: 'CMS',
+ route: '/library/strapi.svg',
+ url: 'https://strapi.io/',
+ brandUrl: 'https://handbook.strapi.io/strapi-brand-book-2022'
+ },
+ {
+ title: 'Figma',
+ category: 'Design',
+ route: '/library/figma.svg',
+ url: 'https://www.figma.com/',
+ brandUrl: 'https://www.figma.com/using-the-figma-brand/'
+ },
+ {
+ title: 'Spotify',
+ category: 'Music',
+ route: '/library/spotify.svg',
+ wordmark: '/library/spotify_wordmark.svg',
+ url: 'https://www.spotify.com/'
+ },
+ {
+ title: 'WorkOS',
+ category: ['Software', 'Authentication'],
+ route: {
+ light: '/library/workos.svg',
+ dark: '/library/workos-light.svg'
+ },
+ url: 'https://workos.com/'
+ },
+ {
+ title: 'Whop',
+ category: 'Marketplace',
+ route: {
+ light: '/library/whop.svg',
+ dark: '/library/whop-light.svg'
+ },
+ url: 'https://whop.com/'
+ },
+ {
+ title: 'Postman',
+ category: 'Software',
+ route: '/library/postman.svg',
+ url: 'https://www.getpostman.com/'
+ },
+ {
+ title: 'Discord.js',
+ category: 'Library',
+ route: '/library/djs.svg',
+ url: 'https://discord.js.org/'
+ },
+ {
+ title: 'OpenSea',
+ category: 'Crypto',
+ route: '/library/opensea.svg',
+ url: 'https://opensea.io/'
+ },
+ {
+ title: 'Algolia',
+ category: 'Library',
+ route: '/library/algolia.svg',
+ url: 'https://www.algolia.com/'
+ },
+ {
+ title: 'Bootstrap',
+ category: 'Framework',
+ route: '/library/bootstrap.svg',
+ url: 'https://getbootstrap.com/',
+ brandUrl: 'https://getbootstrap.com/docs/4.0/about/brand/'
+ },
+ {
+ title: 'Facebook',
+ category: 'Social',
+ route: '/library/facebook.svg',
+ url: 'https://www.facebook.com/',
+ brandUrl: 'https://about.meta.com/brand/resources/facebook/logo/'
+ },
+ {
+ title: 'Twitter',
+ category: 'Social',
+ route: '/library/twitter.svg',
+ url: 'https://twitter.com/'
+ },
+ {
+ title: 'Esbuild',
+ category: 'Compiler',
+ route: '/library/esbuild.svg',
+ url: 'https://esbuild.github.io/'
+ },
+ {
+ title: 'Deno',
+ category: 'Library',
+ route: {
+ light: '/library/deno.svg',
+ dark: '/library/deno_dark.svg'
+ },
+ wordmark: {
+ light: '/library/deno_wordmark.svg',
+ dark: '/library/deno_wordmark_dark.svg'
+ },
+ brandUrl: 'https://deno.com/brand',
+ url: 'https://deno.com/'
+ },
+ {
+ title: 'Gatsby',
+ category: 'Framework',
+ route: '/library/gatsby.svg',
+ url: 'https://www.gatsbyjs.org/'
+ },
+ {
+ title: 'NPM',
+ category: 'Software',
+ route: '/library/npm.svg',
+ url: 'https://www.npmjs.com/'
+ },
+ {
+ title: 'Nuget',
+ category: 'Software',
+ route: '/library/nuget.svg',
+ url: 'https://www.nuget.org/'
+ },
+ {
+ title: 'Homebrew',
+ category: 'Software',
+ route: '/library/homebrew.svg',
+ url: 'https://brew.sh/'
+ },
+ {
+ title: 'Sublime Text',
+ category: 'Software',
+ route: '/library/sublimetext.svg',
+ url: 'https://www.sublimetext.com/'
+ },
+ {
+ title: 'Turborepo',
+ category: ['Library', 'Vercel', 'Monorepo'],
+ route: '/library/turborepo.svg',
+ url: 'https://turborepo.org/'
+ },
+ {
+ title: 'Tailwind CSS',
+ category: 'Framework',
+ route: '/library/tailwindcss.svg',
+ wordmark: {
+ light: '/library/tailwindcss-wordmark.svg',
+ dark: '/library/tailwindcss-wordmark-dark.svg'
+ },
+ brandUrl: 'https://tailwindcss.com/brand',
+ url: 'https://tailwindcss.com/'
+ },
+ {
+ title: 'Styled Components',
+ category: 'Library',
+ route: '/library/styledcomponents.svg',
+ url: 'https://styled-components.com/'
+ },
+ {
+ title: 'Angular',
+ category: 'Framework',
+ route: '/library/angular.svg',
+ url: 'https://angular.dev/',
+ brandUrl: 'https://angular.dev/press-kit'
+ },
+ {
+ title: 'Blitz',
+ category: 'Framework',
+ route: '/library/blitzjs.svg',
+ url: 'https://blitzjs.com/'
+ },
+ {
+ title: 'Lit',
+ category: 'Library',
+ route: '/library/lit.svg',
+ url: 'https://lit.dev/'
+ },
+ {
+ title: 'Atom',
+ category: 'Software',
+ route: '/library/atom.svg',
+ url: 'https://atom.io/'
+ },
+ {
+ title: 'YouTube',
+ category: ['Google', 'Social'],
+ route: '/library/youtube.svg',
+ wordmark: '/library/youtube-wordmark.svg',
+ url: 'https://www.youtube.com/'
+ },
+ {
+ title: 'Astro',
+ category: 'Framework',
+ route: {
+ light: '/library/astro.svg',
+ dark: '/library/astro_dark.svg'
+ },
+ url: 'https://astro.build/',
+ brandUrl: 'https://astro.build/press/'
+ },
+ {
+ title: 'Google',
+ category: 'Google',
+ route: '/library/google.svg',
+ wordmark: '/library/google-wordmark.svg',
+ url: 'https://www.google.com/'
+ },
+ {
+ title: 'Framer',
+ category: 'Software',
+ route: {
+ light: '/library/framer.svg',
+ dark: '/library/framer_dark.svg'
+ },
+ url: 'https://framer.com/'
+ },
+ {
+ title: 'Netflix',
+ category: 'Entertainment',
+ route: '/library/netflix.svg',
+ url: 'https://www.netflix.com/',
+ brandUrl: 'https://brand.netflix.com/en/assets/logos'
+ },
+ {
+ title: 'Firefox',
+ category: 'Browser',
+ route: '/library/firefox.svg',
+ url: 'https://www.mozilla.org/en-US/firefox/',
+ brandUrl: 'https://mozilla.design/firefox/'
+ },
+ {
+ title: 'LinkedIn',
+ category: 'Social',
+ route: '/library/linkedin.svg',
+ url: 'https://www.linkedin.com/',
+ brandUrl: 'https://brand.linkedin.com/'
+ },
+ {
+ title: 'Telegram',
+ category: 'Social',
+ route: '/library/telegram.svg',
+ url: 'https://web.telegram.org/'
+ },
+ {
+ title: 'WhatsApp',
+ category: 'Social',
+ route: '/library/whatsapp.svg',
+ url: 'https://web.whatsapp.com/'
+ },
+ {
+ title: 'Headless UI',
+ category: 'Library',
+ route: '/library/headlessui.svg',
+ url: 'https://headlessui.dev/'
+ },
+ {
+ title: 'Kotlin',
+ category: 'Language',
+ route: '/library/kotlin.svg',
+ url: 'https://kotlinlang.org/'
+ },
+ {
+ title: 'Storybook',
+ category: 'Software',
+ route: '/library/storybook.svg',
+ url: 'https://storybook.js.org/'
+ },
+ {
+ title: 'Netlify',
+ category: 'Hosting',
+ route: '/library/netlify.svg',
+ url: 'https://www.netlify.com/'
+ },
+ {
+ title: 'Solidjs',
+ category: 'Framework',
+ route: '/library/solidjs.svg',
+ url: 'https://www.solidjs.com/'
+ },
+ {
+ title: 'MongoDB',
+ category: 'Database',
+ route: '/library/mongodb.svg',
+ wordmark: '/library/mongodb-wordmark.svg',
+ url: 'https://www.mongodb.com/',
+ brandUrl: 'https://www.mongodb.com/company/newsroom/brand-resources'
+ },
+ {
+ title: 'Moon',
+ category: 'Framework',
+ route: '/library/moon.svg',
+ url: 'https://moonjs.org/'
+ },
+ {
+ title: 'Payload CMS',
+ category: 'CMS',
+ route: {
+ light: '/library/payload.svg',
+ dark: '/library/payload_dark.svg'
+ },
+ url: 'https://payloadcms.com'
+ },
+ {
+ title: 'Fly',
+ category: 'Hosting',
+ route: '/library/fly.svg',
+ url: 'https://fly.io',
+ brandUrl: 'https://fly.io/docs/about/brand/'
+ },
+ {
+ title: 'LearnThis',
+ category: 'Education',
+ route: '/library/learnthis.svg',
+ url: 'https://learnthisacademy.com'
+ },
+ {
+ title: 'Visual Studio',
+ category: 'Software',
+ route: '/library/visual-studio.svg',
+ url: 'https://visualstudio.microsoft.com'
+ },
+ {
+ title: 'Chakra UI',
+ category: 'Library',
+ route: '/library/chakra-ui.svg',
+ url: 'https://chakra-ui.com'
+ },
+ {
+ title: 'Express.js',
+ category: 'Framework',
+ route: {
+ light: '/library/expressjs.svg',
+ dark: '/library/expressjs_dark.svg'
+ },
+ url: 'https://expressjs.com'
+ },
+ {
+ title: 'Fastify',
+ category: 'Framework',
+ route: {
+ light: '/library/fastify.svg',
+ dark: '/library/fastify_dark.svg'
+ },
+ url: 'https://www.fastify.io'
+ },
+ {
+ title: 'JavaScript',
+ category: 'Language',
+ route: '/library/javascript.svg',
+ url: 'https://developer.mozilla.org/docs/Web/JavaScript'
+ },
+ {
+ title: 'jQuery',
+ category: 'Library',
+ route: {
+ light: '/library/jquery.svg',
+ dark: '/library/jquery_dark.svg'
+ },
+ url: 'https://jquery.com'
+ },
+ {
+ title: 'Rapid API',
+ category: 'Software',
+ route: '/library/rapidapi.svg',
+ url: 'https://rapidapi.com'
+ },
+ {
+ title: 'TypeScript',
+ category: 'Language',
+ route: '/library/typescript.svg',
+ url: 'https://www.typescriptlang.org'
+ },
+ {
+ title: 'Bun',
+ category: 'Library',
+ route: '/library/bun.svg',
+ url: 'https://bun.sh',
+ brandUrl: 'https://bun.sh/press-kit'
+ },
+ {
+ title: 'BuildShip',
+ category: 'AI',
+ route: '/library/buildship.svg',
+ url: 'https://buildship.com/'
+ },
+ {
+ title: 'Twilio',
+ category: ['Software', 'Authentication'],
+ route: '/library/twilio.svg',
+ url: 'https://twilio.com'
+ },
+ {
+ title: 'Arc',
+ category: 'Social',
+ route: {
+ light: '/library/arc.svg',
+ dark: '/library/arc_dark.svg'
+ },
+ url: 'https://arc.dev'
+ },
+ {
+ title: 'Arc',
+ category: 'Software',
+ route: {
+ light: '/library/arc_fintech_light.svg',
+ dark: '/library/arc_fintech_dark.svg'
+ },
+ url: 'https://arc.tech'
+ },
+ {
+ title: 'Qwik',
+ category: 'Framework',
+ route: '/library/qwik.svg',
+ url: 'https://qwik.builder.io/'
+ },
+ {
+ title: 'Coinbase',
+ category: 'Crypto',
+ route: '/library/coinbase.svg',
+ wordmark: {
+ light: '/library/coinbase-wordmark-light.svg',
+ dark: '/library/coinbase-wordmark-dark.svg'
+ },
+ url: 'https://www.coinbase.com/'
+ },
+ {
+ title: 'Authy',
+ category: ['Software', 'Authentication'],
+ route: '/library/authy.svg',
+ url: 'https://authy.com/'
+ },
+ {
+ title: 'NestJS',
+ category: 'Framework',
+ route: '/library/nestjs.svg',
+ url: 'https://nestjs.com/'
+ },
+ {
+ title: 'GitHub Copilot',
+ category: 'Software',
+ route: {
+ light: '/library/copilot.svg',
+ dark: '/library/copilot_dark.svg'
+ },
+ url: 'https://github.com/features/copilot'
+ },
+ {
+ title: 'Railway',
+ category: 'Software',
+ route: {
+ light: '/library/railway.svg',
+ dark: '/library/railway_dark.svg'
+ },
+ url: 'https://railway.app/'
+ },
+ {
+ title: 'Docusaurus',
+ category: 'Software',
+ route: '/library/docusaurus.svg',
+ url: 'https://docusaurus.io/'
+ },
+ {
+ title: 'Twitch',
+ category: 'Entertainment',
+ route: '/library/twitch.svg',
+ url: 'https://twitch.tv'
+ },
+ {
+ title: 'GoDaddy',
+ category: 'Hosting',
+ route: {
+ light: '/library/godaddy.svg',
+ dark: '/library/godaddy_dark.svg'
+ },
+ url: 'https://www.godaddy.com/'
+ },
+ {
+ title: 'Udemy',
+ category: 'Education',
+ route: {
+ light: '/library/udemy.svg',
+ dark: '/library/udemy_dark.svg'
+ },
+ url: 'https://www.udemy.com/'
+ },
+ {
+ title: 'GraphQL',
+ category: 'Language',
+ route: '/library/graphql.svg',
+ url: 'https://graphql.org/'
+ },
+ {
+ title: 'Grok',
+ category: 'AI',
+ route: {
+ light: '/library/grok-light.svg',
+ dark: '/library/grok-dark.svg'
+ },
+ wordmark: {
+ light: '/library/grok-wordmark-light.svg',
+ dark: '/library/grok-wordmark-dark.svg'
+ },
+ url: 'https://grok.com/'
+ },
+ {
+ title: 'GitLab',
+ category: 'Software',
+ route: '/library/gitlab.svg',
+ url: 'https://gitlab.com/'
+ },
+ {
+ title: 'Prisma',
+ category: 'Software',
+ route: {
+ light: '/library/prisma.svg',
+ dark: '/library/prisma_dark.svg'
+ },
+ url: 'https://prisma.io/'
+ },
+ {
+ title: 'Go',
+ category: 'Language',
+ route: {
+ light: '/library/golang.svg',
+ dark: '/library/golang_dark.svg'
+ },
+ url: 'https://go.dev/'
+ },
+ {
+ title: 'Platzi',
+ category: 'Education',
+ route: '/library/platzi.svg',
+ url: 'https://platzi.com/'
+ },
+ {
+ title: 'Coursera',
+ category: 'Education',
+ route: '/library/coursera.svg',
+ url: 'https://www.coursera.org/'
+ },
+ {
+ title: 'Udacity',
+ category: 'Education',
+ route: '/library/udacity.svg',
+ url: 'https://www.udacity.com/'
+ },
+ {
+ title: 'Kubernetes',
+ category: 'Software',
+ route: '/library/kubernetes.svg',
+ url: 'https://kubernetes.io/'
+ },
+ {
+ title: 'Docker',
+ category: 'Software',
+ route: '/library/docker.svg',
+ url: 'https://www.docker.com/',
+ brandUrl: 'https://www.docker.com/company/newsroom/media-resources/'
+ },
+ {
+ title: 'Amazon Web Services',
+ category: 'Software',
+ route: {
+ light: '/library/aws_light.svg',
+ dark: '/library/aws_dark.svg'
+ },
+ url: 'https://aws.amazon.com/'
+ },
+ {
+ title: 'Microsoft Azure',
+ category: 'Software',
+ route: '/library/azure.svg',
+ url: 'https://azure.microsoft.com/'
+ },
+ {
+ title: 'Heroku',
+ category: 'Software',
+ route: '/library/heroku.svg',
+ url: 'https://www.heroku.com/'
+ },
+ {
+ title: 'JetBrains',
+ category: 'Software',
+ route: '/library/jetbrains.svg',
+ url: 'https://www.jetbrains.com/',
+ brandUrl: 'https://www.jetbrains.com/company/brand/'
+ },
+ {
+ title: 'JetBrains Rider',
+ category: 'Software',
+ route: '/library/rider.svg',
+ url: 'https://www.jetbrains.com/rider/'
+ },
+ {
+ title: 'PlanetScale',
+ category: 'Database',
+ route: {
+ light: '/library/planetscale.svg',
+ dark: '/library/planetscale_dark.svg'
+ },
+ url: 'https://planetscale.com/'
+ },
+ {
+ title: 'Playwright',
+ category: 'Framework',
+ route: '/library/playwright.svg',
+ url: 'https://playwright.dev/'
+ },
+ {
+ title: 'Atlassian',
+ category: 'Software',
+ route: '/library/atlassian.svg',
+ url: 'https://www.atlassian.com/'
+ },
+ {
+ title: 'Discourse',
+ category: 'Software',
+ route: '/library/discourse.svg',
+ url: 'https://discourse.org/'
+ },
+ {
+ title: 'Ember',
+ category: 'Framework',
+ route: '/library/ember.svg',
+ url: 'https://emberjs.com/'
+ },
+ {
+ title: 'Expo',
+ category: 'Software',
+ route: '/library/expo.svg',
+ url: 'https://expo.dev/'
+ },
+ {
+ title: 'Flutter',
+ category: 'Framework',
+ route: '/library/flutter.svg',
+ url: 'https://flutter.dev/',
+ brandUrl: 'https://flutter.dev/brand'
+ },
+ {
+ title: 'Auth0',
+ category: ['Library', 'Authentication'],
+ route: '/library/auth0.svg',
+ url: 'https://auth0.com/'
+ },
+ {
+ title: 'Fresh',
+ category: 'Framework',
+ route: '/library/fresh.svg',
+ url: 'https://fresh.deno.dev/'
+ },
+ {
+ title: 'Git',
+ category: 'Software',
+ route: '/library/git.svg',
+ url: 'https://git-scm.com/'
+ },
+ {
+ title: 'Hostgator',
+ category: 'Hosting',
+ route: '/library/hostgator.svg',
+ url: 'https://www.hostgator.com/'
+ },
+ {
+ title: 'IntelliJ IDEA',
+ category: 'Software',
+ route: '/library/intellijidea.svg',
+ url: 'https://www.jetbrains.com/idea/'
+ },
+ {
+ title: 'Jasmine',
+ category: 'Framework',
+ route: '/library/jasmine.svg',
+ url: 'https://jasmine.github.io/'
+ },
+ {
+ title: 'Java',
+ category: 'Language',
+ route: '/library/java.svg',
+ url: 'https://www.java.com/'
+ },
+ {
+ title: 'Jest',
+ category: 'Framework',
+ route: '/library/jest.svg',
+ url: 'https://jestjs.io/'
+ },
+ {
+ title: 'JetBrains',
+ category: 'Software',
+ route: '/library/jetbrainsSolid.svg',
+ url: 'https://www.jetbrains.com/'
+ },
+ {
+ title: 'KrakenJS',
+ category: 'Framework',
+ route: '/library/krakenjs.svg',
+ url: 'https://krakenjs.com/'
+ },
+ {
+ title: 'Laravel',
+ category: 'Framework',
+ route: '/library/laravel.svg',
+ url: 'https://laravel.com/'
+ },
+ {
+ title: 'MariaDB',
+ category: 'Database',
+ route: '/library/mariadb.svg',
+ url: 'https://mariadb.org/'
+ },
+ {
+ title: 'Material UI',
+ category: 'Framework',
+ route: '/library/materialui.svg',
+ url: 'https://mui.com/'
+ },
+ {
+ title: 'MySQL',
+ category: 'Database',
+ route: '/library/mysql.svg',
+ url: 'https://www.mysql.com/'
+ },
+ {
+ title: 'Parcel',
+ category: 'Compiler',
+ route: '/library/parcel.svg',
+ url: 'https://parceljs.org/'
+ },
+ {
+ title: 'PM2',
+ category: 'Framework',
+ route: '/library/pm2.svg',
+ url: 'https://pm2.io/'
+ },
+ {
+ title: 'PostgreSQL',
+ category: 'Database',
+ route: '/library/postgresql.svg',
+ url: 'https://www.postgresql.org/'
+ },
+ {
+ title: 'React Query',
+ category: 'Framework',
+ route: '/library/reactquery.svg',
+ url: 'https://tanstack.com/query/v4'
+ },
+ {
+ title: 'Devto',
+ category: 'Community',
+ route: {
+ light: '/library/devto-light.svg',
+ dark: '/library/devto-dark.svg'
+ },
+ url: 'https://dev.to/'
+ },
+ {
+ title: 'Redis',
+ category: 'Database',
+ route: '/library/redis.svg',
+ url: 'https://redis.io/'
+ },
+ {
+ title: 'RedwoodJS',
+ category: 'Framework',
+ route: '/library/redwoodjs.svg',
+ url: 'https://redwoodjs.com/'
+ },
+ {
+ title: 'Ruby',
+ category: 'Language',
+ route: '/library/ruby.svg',
+ url: 'https://www.ruby-lang.org/'
+ },
+ {
+ title: 'Scala',
+ category: 'Language',
+ route: '/library/scala.svg',
+ url: 'https://www.scala-lang.org/'
+ },
+ {
+ title: 'Sequelize',
+ category: 'Framework',
+ route: '/library/sequelize.svg',
+ url: 'https://sequelize.org/'
+ },
+ {
+ title: 'Spinnaker',
+ category: 'Software',
+ route: '/library/spinnaker.svg',
+ url: 'https://spinnaker.io/'
+ },
+ {
+ title: 'SQLite',
+ category: 'Database',
+ route: '/library/sqlite.svg',
+ url: 'https://www.sqlite.org/'
+ },
+ {
+ title: 'Swagger',
+ category: 'Software',
+ route: '/library/swagger.svg',
+ url: 'https://swagger.io/'
+ },
+ {
+ title: 'Swift',
+ category: 'Language',
+ route: '/library/swift.svg',
+ url: 'https://swift.org/'
+ },
+ {
+ title: 'TypeORM',
+ category: 'Database',
+ route: '/library/typeorm.svg',
+ url: 'https://typeorm.io/'
+ },
+ {
+ title: 'Unity',
+ category: 'Software',
+ route: {
+ light: '/library/unity.svg',
+ dark: '/library/unity_dark.svg'
+ },
+ url: 'https://unity.com/'
+ },
+ {
+ title: 'Vim',
+ category: 'Software',
+ route: '/library/vim.svg',
+ url: 'https://www.vim.org/'
+ },
+ {
+ title: 'Pocketbase',
+ category: 'Database',
+ route: '/library/pocket-base.svg',
+ url: 'https://pocketbase.io/'
+ },
+ {
+ title: 'OpenBootcamp',
+ category: 'Education',
+ route: '/library/openbootcamp.svg',
+ url: 'https://open-bootcamp.com/'
+ },
+ {
+ title: 'Digital Ocean',
+ category: 'Software',
+ route: '/library/digitalocean.svg',
+ url: 'https://www.digitalocean.com/'
+ },
+ {
+ title: 'Disney+',
+ category: 'Entertainment',
+ route: '/library/disneyplus.svg',
+ url: 'https://www.disneyplus.com/'
+ },
+ {
+ title: 'React Router',
+ category: 'Library',
+ route: '/library/reactrouter.svg',
+ url: 'https://reactrouter.com/en/main'
+ },
+ {
+ title: 'AMP',
+ category: 'Library',
+ route: '/library/amp.svg',
+ url: 'https://amp.dev/'
+ },
+ {
+ title: 'Developer Student Club',
+ category: 'Community',
+ route: '/library/gdsc.svg',
+ url: 'https://gdsc.community.dev/'
+ },
+ {
+ title: 'Brave Browser',
+ category: 'Browser',
+ route: '/library/brave.svg',
+ url: 'https://brave.com/',
+ brandUrl: 'https://brave.com/brave-branding-assets/'
+ },
+ {
+ title: 'Eclipse IDE',
+ category: 'Software',
+ route: '/library/eclipse.svg',
+ url: 'https://www.eclipse.org/'
+ },
+ {
+ title: 'Three.js',
+ category: 'Library',
+ route: {
+ light: '/library/threejs-light.svg',
+ dark: '/library/threejs-dark.svg'
+ },
+ url: 'https://threejs.org/'
+ },
+ {
+ title: 'HTML5',
+ category: 'Language',
+ route: '/library/html5.svg',
+ url: 'https://es.wikipedia.org/wiki/HTML5'
+ },
+ {
+ title: 'CSS (New)',
+ category: 'Language',
+ route: '/library/css.svg',
+ url: 'https://es.wikipedia.org/wiki/CSS'
+ },
+ {
+ title: 'CSS',
+ category: 'Language',
+ route: '/library/css_old.svg',
+ url: 'https://es.wikipedia.org/wiki/CSS'
+ },
+ {
+ title: 'midudev',
+ category: 'Community',
+ route: '/library/midudev.svg',
+ url: 'https://midu.dev'
+ },
+ {
+ title: 'Apple',
+ category: 'Software',
+ route: {
+ light: '/library/apple.svg',
+ dark: '/library/apple_dark.svg'
+ },
+ url: 'https://www.apple.com'
+ },
+ {
+ title: 'Windows',
+ category: 'Software',
+ route: '/library/windows.svg',
+ url: 'https://www.microsoft.com/windows'
+ },
+ {
+ title: 'Python',
+ category: 'Language',
+ route: '/library/python.svg',
+ url: 'https://www.python.org/'
+ },
+ {
+ title: 'Solidity',
+ category: 'Language',
+ route: '/library/solidity.svg',
+ url: 'https://soliditylang.org/'
+ },
+ {
+ title: 'Turbopack',
+ category: 'Software',
+ route: '/library/turbopack.svg',
+ url: 'https://turbo.build/'
+ },
+ {
+ title: 'Builder',
+ category: 'CMS',
+ route: '/library/builder.svg',
+ url: 'https://builder.io/'
+ },
+ {
+ title: 'Babel',
+ category: 'Compiler',
+ route: '/library/babel.svg',
+ url: 'https://babeljs.io/'
+ },
+ {
+ title: 'Surrealdb',
+ category: 'Database',
+ route: '/library/surrealdb.svg',
+ url: 'https://surrealdb.com/'
+ },
+ {
+ title: 'Jetbrains Space',
+ category: 'Software',
+ route: '/library/jetbrains-space.svg',
+ url: 'https://www.jetbrains.com/space/'
+ },
+ {
+ title: 'Stimulus',
+ category: 'Framework',
+ route: '/library/stimulus.svg',
+ url: 'https://stimulus.hotwired.dev/'
+ },
+ {
+ title: 'WindiCSS',
+ category: 'Framework',
+ route: '/library/windicss.svg',
+ url: 'https://windicss.org/'
+ },
+ {
+ title: 'Mastodon',
+ category: 'Social',
+ route: '/library/mastodon.svg',
+ url: 'https://joinmastodon.org/'
+ },
+ {
+ title: 'Upstash',
+ category: 'Database',
+ route: '/library/upstash.svg',
+ url: 'https://upstash.com/',
+ brandUrl: 'https://upstash.com/brand'
+ },
+ {
+ title: 'Storyblok',
+ category: 'CMS',
+ route: '/library/storyblok.svg',
+ url: 'https://www.storyblok.com/'
+ },
+ {
+ title: 'Cloudflare Workers',
+ category: 'Software',
+ route: '/library/cloudflare-workers.svg',
+ url: 'https://workers.cloudflare.com/'
+ },
+ {
+ title: 'Cloudflare',
+ category: 'Software',
+ route: '/library/cloudflare.svg',
+ url: 'https://www.cloudflare.com/'
+ },
+ {
+ title: 'Bing',
+ category: 'Browser',
+ route: '/library/bing.svg',
+ url: 'https://www.bing.com/'
+ },
+ {
+ title: 'Cloudinary',
+ category: 'Software',
+ route: '/library/cloudinary.svg',
+ url: 'https://cloudinary.com/'
+ },
+ {
+ title: 'Dart',
+ category: 'Language',
+ route: '/library/dart.svg',
+ url: 'https://dart.dev/'
+ },
+ {
+ title: 'hCaptcha',
+ category: 'Software',
+ route: '/library/hcaptcha.svg',
+ url: 'https://www.hcaptcha.com/'
+ },
+ {
+ title: 'Appwrite',
+ category: 'Software',
+ route: '/library/appwrite.svg',
+ url: 'https://appwrite.io/'
+ },
+ {
+ title: 'Loom',
+ category: 'Software',
+ route: '/library/loom.svg',
+ url: 'https://www.loom.com/'
+ },
+ {
+ title: 'Hulu',
+ category: 'Entertainment',
+ route: {
+ light: '/library/hulu.svg',
+ dark: '/library/hulu-dark.svg'
+ },
+ url: 'https://www.hulu.com/'
+ },
+ {
+ title: 'Stackblitz',
+ category: 'Software',
+ route: '/library/stackblitz.svg',
+ url: 'https://stackblitz.com/'
+ },
+ {
+ title: 'Binance',
+ category: 'Crypto',
+ route: '/library/binance.svg',
+ url: 'https://binance.com/'
+ },
+ {
+ title: 'Messenger',
+ category: 'Social',
+ route: '/library/messenger.svg',
+ url: 'https://www.messenger.com/'
+ },
+ {
+ title: 'NHost',
+ category: 'Hosting',
+ route: '/library/nhost.svg',
+ url: 'https://nhost.io/'
+ },
+ {
+ title: 'Medusa',
+ category: 'Software',
+ route: '/library/medusa.svg',
+ url: 'https://medusajs.com/'
+ },
+ {
+ title: 'WordPress',
+ category: ['Software', 'CMS'],
+ route: '/library/wordpress.svg',
+ url: 'https://wordpress.org/',
+ brandUrl: 'https://wordpress.org/about/logos/'
+ },
+ {
+ title: 'Microsoft',
+ category: 'Software',
+ route: '/library/microsoft.svg',
+ url: 'https://www.microsoft.com/'
+ },
+ {
+ title: 'Elementor',
+ category: 'Software',
+ route: '/library/elementor.svg',
+ url: 'https://elementor.com/'
+ },
+ {
+ title: 'Kick',
+ category: 'Entertainment',
+ route: {
+ light: '/library/kick-light.svg',
+ dark: '/library/kick-dark.svg'
+ },
+ url: 'https://kick.com/'
+ },
+ {
+ title: 'Prime video',
+ category: 'Entertainment',
+ route: '/library/prime-video.svg',
+ url: 'https://primevideo.com/'
+ },
+ {
+ title: 'Chrome',
+ category: 'Browser',
+ route: '/library/chrome.svg',
+ url: 'https://chrome.com/'
+ },
+ {
+ title: 'RxJS',
+ category: 'Library',
+ route: '/library/rxjs.svg',
+ url: 'https://rxjs.dev/'
+ },
+ {
+ title: 'Electron',
+ category: 'Library',
+ route: '/library/electron.svg',
+ url: 'https://www.electronjs.org'
+ },
+ {
+ title: 'Redux',
+ category: 'Library',
+ route: '/library/redux.svg',
+ url: 'https://redux.js.org/'
+ },
+ {
+ title: 'Trust Wallet',
+ category: 'Crypto',
+ route: '/library/trust.svg',
+ url: 'https://trustwallet.com/'
+ },
+ {
+ title: 'Php',
+ category: 'Language',
+ route: {
+ light: '/library/php.svg',
+ dark: '/library/php_dark.svg'
+ },
+ url: 'https://www.php.net/'
+ },
+ {
+ title: 'Hugo',
+ category: 'Framework',
+ route: '/library/hugo.svg',
+ url: 'https://gohugo.io/'
+ },
+ {
+ title: 'Sass',
+ category: 'Language',
+ route: '/library/sass.svg',
+ url: 'https://sass-lang.com/'
+ },
+ {
+ title: 'Arc',
+ category: 'Browser',
+ route: '/library/arc_browser.svg',
+ url: 'https://arc.net/'
+ },
+ {
+ title: 'Pinia',
+ category: 'Library',
+ route: '/library/pinia.svg',
+ url: 'https://pinia.vuejs.org/'
+ },
+ {
+ title: 'Neon',
+ category: 'Database',
+ route: '/library/neon.svg',
+ url: 'https://neon.tech/'
+ },
+ {
+ title: 'Infojobs',
+ category: 'Social',
+ route: '/library/infojobs-logo.svg',
+ url: 'https://www.infojobs.net/'
+ },
+ {
+ title: 'Linear',
+ category: 'Software',
+ route: '/library/linear.svg',
+ url: 'https://linear.app/'
+ },
+ {
+ title: 'Tor',
+ category: 'Browser',
+ route: '/library/tor.svg',
+ url: 'https://www.torproject.org/'
+ },
+ {
+ title: 'Codesandbox',
+ category: 'Software',
+ route: '/library/codesandbox-square.svg',
+ url: 'https://codesandbox.io/'
+ },
+ {
+ title: 'Skype',
+ category: 'Social',
+ route: '/library/skype.svg',
+ url: 'https://www.skype.com/'
+ },
+ {
+ title: 'Tauri',
+ category: 'Library',
+ route: '/library/tauri.svg',
+ url: 'https://tauri.app/'
+ },
+ {
+ title: 'WebKit',
+ category: 'Software',
+ route: '/library/webkit.svg',
+ url: 'https://webkit.org/'
+ },
+ {
+ title: 'DuckDuckGo',
+ category: ['Software', 'Browser'],
+ route: '/library/duckduckgo.svg',
+ wordmark: '/library/duckduckgo-wordmark.svg',
+ url: 'https://duckduckgo.com/'
+ },
+
+ {
+ title: 'Obsidian',
+ category: 'Software',
+ route: '/library/obsidian.svg',
+ url: 'https://obsidian.md/',
+ brandUrl: 'https://obsidian.md/brand'
+ },
+ {
+ title: 'Zod',
+ category: 'Library',
+ route: '/library/zod.svg',
+ url: 'https://zod.dev/'
+ },
+ {
+ title: 'Valibot',
+ category: 'Library',
+ route: '/library/valibot.svg',
+ wordmark: {
+ light: '/library/valibot-wordmark-light.svg',
+ dark: '/library/valibot-wordmark-dark.svg'
+ },
+ url: 'https://valibot.dev'
+ },
+ {
+ title: 'Dreamweaver',
+ category: 'Software',
+ route: '/library/dw.svg',
+ url: 'https://www.adobe.com/products/dreamweaver.html'
+ },
+ {
+ title: 'OpenAI',
+ category: 'AI',
+ route: {
+ light: '/library/openai.svg',
+ dark: '/library/openai_dark.svg'
+ },
+ wordmark: {
+ light: '/library/openai_wordmark_light.svg',
+ dark: '/library/openai_wordmark_dark.svg'
+ },
+ url: 'https://openai.com/',
+ brandUrl: 'https://openai.com/brand/'
+ },
+ {
+ title: 'Threads',
+ category: 'Social',
+ route: {
+ light: '/library/threads.svg',
+ dark: '/library/threads_dark.svg'
+ },
+ url: 'https://threads.net/'
+ },
+ {
+ title: 'Instagram',
+ category: 'Social',
+ route: {
+ light: '/library/instagram.svg',
+ dark: '/library/instagram_dark.svg'
+ },
+ url: 'https://www.instagram.com/',
+ brandUrl: 'https://about.instagram.com/brand'
+ },
+ {
+ title: 'VueUse',
+ category: 'Library',
+ route: '/library/vueuse.svg',
+ url: 'https://vueuse.org/'
+ },
+ {
+ title: 'Microsoft SQL Server ',
+ category: 'Database',
+ route: '/library/sql-server.svg',
+ url: 'https://www.microsoft.com/en-us/sql-server/'
+ },
+ {
+ title: 'Hono',
+ category: 'Framework',
+ route: '/library/hono.svg',
+ url: 'https://hono.dev/'
+ },
+ {
+ title: 'Million',
+ category: 'Library',
+ route: '/library/million.svg',
+ url: 'https://million.dev/'
+ },
+ {
+ title: 'PandaCSS',
+ category: 'Library',
+ route: '/library/pandacss.svg',
+ url: 'https://panda-css.com/'
+ },
+ {
+ title: 'Pulumi',
+ category: 'Software',
+ route: '/library/pulumi.svg',
+ url: 'https://www.pulumi.com/'
+ },
+ {
+ title: 'FastAPI',
+ category: 'Framework',
+ route: '/library/fastapi.svg',
+ url: 'https://fastapi.tiangolo.com/'
+ },
+ {
+ title: 'Codium',
+ category: 'AI',
+ route: '/library/codium.svg',
+ url: 'https://www.codium.ai/'
+ },
+ {
+ title: 'Crossplane',
+ category: 'Framework',
+ route: '/library/crossplane.svg',
+ url: 'https://crossplane.io/'
+ },
+ {
+ title: 'Volta',
+ category: 'Software',
+ route: {
+ light: '/library/volta-dark.svg',
+ dark: '/library/volta-light.svg'
+ },
+ url: 'https://volta.net/'
+ },
+ {
+ title: 'Typesense',
+ category: 'Software',
+ route: '/library/typesense.svg',
+ url: 'https://typesense.org/'
+ },
+ {
+ title: 'Bitcoin',
+ category: 'Crypto',
+ route: '/library/btc.svg',
+ url: 'https://bitcoin.org/'
+ },
+ {
+ title: 'Ethereum',
+ category: 'Crypto',
+ route: '/library/eth.svg',
+ url: 'https://ethereum.org/'
+ },
+ {
+ title: 'Solana',
+ category: 'Crypto',
+ route: '/library/sol.svg',
+ url: 'https://solana.com/'
+ },
+ {
+ title: 'Dogecoin',
+ category: 'Crypto',
+ route: '/library/doge.svg',
+ url: 'https://dogecoin.com/'
+ },
+ {
+ title: 'XRP',
+ category: 'Crypto',
+ route: '/library/xrp.svg',
+ url: 'https://xrpl.org/'
+ },
+ {
+ title: 'BNB',
+ category: 'Crypto',
+ route: '/library/bnb.svg',
+ url: 'https://www.bnbchain.org/'
+ },
+ {
+ title: 'Link',
+ category: 'Crypto',
+ route: '/library/link.svg',
+ wordmark: {
+ light: '/library/link-wordmark-light.svg',
+ dark: '/library/link-wordmark-dark.svg'
+ },
+ url: 'https://chain.link/'
+ },
+ {
+ title: 'Polygon',
+ category: 'Crypto',
+ route: '/library/matic.svg',
+ url: 'https://polygon.technology/'
+ },
+ {
+ title: 'Algorand',
+ category: 'Crypto',
+ route: '/library/algorand.svg',
+ url: 'https://algorand.org/'
+ },
+ {
+ title: 'Tether',
+ category: 'Crypto',
+ route: '/library/tether.svg',
+ url: 'https://tether.to/'
+ },
+ {
+ title: 'X (formerly Twitter)',
+ category: 'Social',
+ route: {
+ light: '/library/x.svg',
+ dark: '/library/x_dark.svg'
+ },
+ url: 'https://x.com',
+ brandUrl: 'https://about.x.com/en/who-we-are/brand-toolkit'
+ },
+ {
+ title: 'Adobe',
+ category: 'Design',
+ route: '/library/adobe.svg',
+ url: 'https://www.adobe.com/'
+ },
+ {
+ title: 'After Effects',
+ category: 'Design',
+ route: '/library/after-effects.svg',
+ url: 'https://www.adobe.com/products/aftereffects'
+ },
+ {
+ title: 'Canva',
+ category: 'Design',
+ route: '/library/canva.svg',
+ url: 'https://www.canva.com/'
+ },
+ {
+ title: 'Illustrator',
+ category: 'Design',
+ route: '/library/illustrator.svg',
+ url: 'https://www.adobe.com/products/illustrator'
+ },
+ {
+ title: 'InDesign',
+ category: 'Design',
+ route: '/library/indesign.svg',
+ url: 'https://www.adobe.com/products/indesign'
+ },
+ {
+ title: 'Lightroom',
+ category: 'Design',
+ route: '/library/lightroom.svg',
+ url: 'https://www.adobe.com/products/photoshop-lightroom'
+ },
+ {
+ title: 'Photoshop',
+ category: 'Design',
+ route: '/library/photoshop.svg',
+ url: 'https://www.adobe.com/products/photoshop'
+ },
+ {
+ title: 'Premiere',
+ category: 'Design',
+ route: '/library/premiere.svg',
+ url: 'https://www.adobe.com/products/premiere'
+ },
+ {
+ title: 'VK',
+ category: 'Social',
+ route: '/library/vk.svg',
+ url: 'https://vk.com'
+ },
+ {
+ title: 'Hoppscotch',
+ category: 'Software',
+ route: '/library/hoppscotch.svg',
+ url: 'https://hoppscotch.com',
+ brandUrl: 'https://hoppscotch.com/brand'
+ },
+ {
+ title: 'Opera',
+ category: 'Browser',
+ route: '/library/opera.svg',
+ url: 'https://www.opera.com',
+ brandUrl: 'https://brand.opera.com/'
+ },
+ {
+ title: 'Salesforce',
+ category: 'Software',
+ route: '/library/salesforce.svg',
+ url: 'https://www.salesforce.com',
+ brandUrl: 'https://brand.salesforce.com/'
+ },
+ {
+ title: 'Unreal Engine',
+ category: 'Software',
+ route: {
+ light: '/library/unreal_engine.svg',
+ dark: '/library/unreal_engine_dark.svg'
+ },
+ url: 'https://www.unrealengine.com/'
+ },
+ {
+ title: 'Godot Engine',
+ category: 'Software',
+ route: '/library/godot_engine.svg',
+ url: 'https://godotengine.org/'
+ },
+ {
+ title: 'Datadog',
+ category: 'Software',
+ route: '/library/datadog.svg',
+ url: 'https://www.datadoghq.com/'
+ },
+ {
+ title: 'Tron',
+ category: 'Crypto',
+ route: '/library/tron.svg',
+ url: 'https://tron.network/'
+ },
+ {
+ title: 'Randevum',
+ category: 'Software',
+ route: '/library/randevum.svg',
+ url: 'https://www.randevum.co'
+ },
+ {
+ title: 'Chromium',
+ category: 'Browser',
+ route: '/library/chromium.svg',
+ url: 'https://www.chromium.org'
+ },
+ {
+ title: 'Edge',
+ category: 'Browser',
+ route: '/library/edge.svg',
+ url: 'https://www.microsoft.com/en-us/edge'
+ },
+ {
+ title: 'Safari',
+ category: 'Browser',
+ route: '/library/safari.svg',
+ url: 'https://www.apple.com/safari'
+ },
+ {
+ title: 'Vivaldi',
+ category: 'Browser',
+ route: '/library/vivaldi.svg',
+ url: 'https://vivaldi.com'
+ },
+ {
+ title: 'Beacon',
+ category: 'Software',
+ route: '/library/Beacon-Logo.svg',
+ url: 'https://www.beacon.com'
+ },
+ {
+ title: 'Affinity Designer',
+ category: 'Design',
+ route: '/library/affinity_designer.svg',
+ url: 'https://affinity.serif.com/en-us/designer/'
+ },
+ {
+ title: 'Affinity Photo',
+ category: 'Software',
+ route: '/library/affinity_photo.svg',
+ url: 'https://affinity.serif.com/en-us/photo/'
+ },
+ {
+ title: 'Affinity Publisher',
+ category: 'Software',
+ route: '/library/affinity_publisher.svg',
+ url: 'https://affinity.serif.com/en-us/publisher/'
+ },
+ {
+ title: 'Roblox',
+ category: 'Software',
+ route: {
+ dark: '/library/roblox.svg',
+ light: '/library/roblox_light.svg'
+ },
+ url: 'https://www.roblox.com/'
+ },
+ {
+ title: 'Stately.ai',
+ category: 'Software',
+ route: {
+ light: '/library/stately.svg',
+ dark: '/library/stately_dark.svg'
+ },
+ url: 'https://stately.ai/'
+ },
+ {
+ title: 'XState',
+ category: 'Library',
+ route: {
+ light: '/library/xstate.svg',
+ dark: '/library/xstate_dark.svg'
+ },
+ url: 'https://github.com/statelyai/xstate'
+ },
+ {
+ title: 'Hashnode',
+ category: 'Social',
+ route: '/library/hashnode.svg',
+ url: 'https://hashnode.com'
+ },
+ {
+ title: 'Rowy',
+ category: 'CMS',
+ route: '/library/rowy.svg',
+ url: 'https://www.rowy.io/'
+ },
+ {
+ title: 'Cal.com',
+ category: 'Software',
+ route: {
+ light: '/library/cal.svg',
+ dark: '/library/cal_dark.svg'
+ },
+ url: 'https://cal.com',
+ brandUrl: 'https://design.cal.com/'
+ },
+ {
+ title: 'Calendly',
+ category: 'Software',
+ route: '/library/calendly.svg',
+ url: 'https://calendly.com/'
+ },
+ {
+ title: 'Mintlify',
+ category: 'Software',
+ route: '/library/mintlify.svg',
+ url: 'https://mintlify.com/'
+ },
+ {
+ title: 'Patreon',
+ category: 'Social',
+ route: {
+ light: '/library/patreon.svg',
+ dark: '/library/patreon_dark.svg'
+ },
+ url: 'https://www.patreon.com/'
+ },
+ {
+ title: 'Peerlist',
+ category: 'Social',
+ route: '/library/peerlist.svg',
+ url: 'https://www.peerlist.io/'
+ },
+ {
+ title: 'Product Hunt',
+ category: 'Software',
+ route: '/library/producthunt.svg',
+ url: 'https://www.producthunt.com/'
+ },
+ {
+ title: 'Remotion',
+ category: 'Framework',
+ route: '/library/remotion.svg',
+ url: 'https://www.remotion.dev/'
+ },
+ {
+ title: 'Warp',
+ category: 'Software',
+ route: '/library/warp.svg',
+ url: 'https://www.warp.dev/'
+ },
+ {
+ title: 'SST',
+ category: 'Framework',
+ route: '/library/sst.svg',
+ url: 'https://sst.dev/'
+ },
+ {
+ title: 'Documenso',
+ category: 'Software',
+ route: {
+ light: '/library/documenso.svg',
+ dark: '/library/documenso_dark.svg'
+ },
+ url: 'https://documenso.com'
+ },
+ {
+ title: 'Bash',
+ category: 'Language',
+ route: {
+ light: '/library/bash.svg',
+ dark: '/library/bash_dark.svg'
+ },
+ url: 'https://www.gnu.org/software/bash/'
+ },
+ {
+ title: 'C',
+ category: 'Language',
+ route: '/library/c.svg',
+ url: 'https://en.wikipedia.org/wiki/C_(programming_language)'
+ },
+ {
+ title: 'C++',
+ category: 'Language',
+ route: '/library/c-plusplus.svg',
+ url: 'https://en.wikipedia.org/wiki/C%2B%2B'
+ },
+ {
+ title: 'Cobol',
+ category: 'Language',
+ route: '/library/cobol.svg',
+ url: 'https://en.wikipedia.org/wiki/COBOL'
+ },
+ {
+ title: 'Fortran',
+ category: 'Language',
+ route: '/library/fortran.svg',
+ url: 'https://fortran-lang.org/'
+ },
+ {
+ title: 'Haskell',
+ category: 'Language',
+ route: '/library/haskell.svg',
+ url: 'https://www.haskell.org/'
+ },
+ {
+ title: 'matlab',
+ category: 'Language',
+ route: '/library/matlab.svg',
+ url: 'https://www.mathworks.com/products/matlab.html'
+ },
+ {
+ title: 'R',
+ category: 'Language',
+ route: {
+ light: '/library/r.svg',
+ dark: '/library/r_dark.svg'
+ },
+ url: 'https://www.r-project.org/'
+ },
+ {
+ title: 'Rust',
+ category: 'Language',
+ route: {
+ light: '/library/rust.svg',
+ dark: '/library/rust_dark.svg'
+ },
+ url: 'https://www.rust-lang.org/'
+ },
+ {
+ title: 'Zig',
+ category: 'Language',
+ route: '/library/zig.svg',
+ url: 'https://ziglang.org/'
+ },
+ {
+ title: 'Instatus',
+ category: 'Software',
+ route: {
+ light: '/library/instatus.svg',
+ dark: '/library/instatus_dark.svg'
+ },
+ url: 'https://instatus.com'
+ },
+ {
+ title: 'Front',
+ category: 'Software',
+ route: '/library/front.svg',
+ url: 'https://front.com'
+ },
+ {
+ title: 'Monero',
+ category: 'Crypto',
+ route: '/library/monero.svg',
+ url: 'https://www.getmonero.org/'
+ },
+ {
+ title: 'Axiom',
+ category: 'Software',
+ route: {
+ dark: '/library/axiom-dark.svg',
+ light: '/library/axiom-light.svg'
+ },
+ wordmark: {
+ light: '/library/axiom-wordmark-light.svg',
+ dark: '/library/axiom-wordmark-dark.svg'
+ },
+ url: 'https://axiom.co/'
+ },
+ {
+ title: 'Django',
+ category: 'Framework',
+ route: '/library/django.svg',
+ url: 'https://www.djangoproject.com/',
+ brandUrl: 'https://www.djangoproject.com/community/logos/'
+ },
+ {
+ title: 'Zeabur',
+ category: 'Hosting',
+ route: {
+ light: '/library/zeabur-light.svg',
+ dark: '/library/zeabur-dark.svg'
+ },
+ wordmark: {
+ light: '/library/zeabur_wordmark_light.svg',
+ dark: '/library/zeabur_wordmark_dark.svg'
+ },
+ url: 'https://zeabur.com/'
+ },
+ {
+ title: 'MetaMask',
+ category: 'Crypto',
+ route: '/library/metamask.svg',
+ url: 'https://metamask.io/'
+ },
+ {
+ title: 'shadcn/ui',
+ category: 'Library',
+ route: {
+ light: '/library/shadcn-ui.svg',
+ dark: '/library/shadcn-ui_dark.svg'
+ },
+ url: 'https://ui.shadcn.com/'
+ },
+ {
+ title: 'putio',
+ category: 'Software',
+ route: '/library/putio.svg',
+ url: 'https://put.io/'
+ },
+ {
+ title: 'Pinterest',
+ category: 'Social',
+ route: '/library/pinterest.svg',
+ url: 'https://pinterest.com/'
+ },
+ {
+ title: 'Reflex',
+ category: 'Software',
+ route: {
+ light: '/library/reflex-dark.svg',
+ dark: '/library/reflex-light.svg'
+ },
+ url: 'https://reflex.dev/'
+ },
+ {
+ title: 'Stripe',
+ category: ['Software', 'Payment'],
+ route: '/library/stripe.svg',
+ url: 'https://stripe.com/'
+ },
+ {
+ title: 'Linux',
+ category: 'Software',
+ route: '/library/linux.svg',
+ url: 'https://www.linux.org/'
+ },
+ {
+ title: 'XD',
+ category: 'Design',
+ route: '/library/adobe-xd.svg',
+ url: 'https://www.adobe.com/products/xd'
+ },
+ {
+ title: 'Axure',
+ category: 'Design',
+ route: '/library/axure.svg',
+ url: 'https://www.axure.com/'
+ },
+ {
+ title: 'Penpot',
+ category: 'Design',
+ route: {
+ light: '/library/penpot.svg',
+ dark: '/library/penpot_dark.svg'
+ },
+ url: 'https://penpot.app/'
+ },
+ {
+ title: 'Sketch',
+ category: 'Design',
+ route: {
+ light: '/library/sketch_light.svg',
+ dark: '/library/sketch.svg'
+ },
+ url: 'https://www.sketch.com/'
+ },
+ {
+ title: 'Gimp',
+ category: 'Design',
+ route: '/library/gimp.svg',
+ url: 'https://www.gimp.org/'
+ },
+ {
+ title: 'Ubuntu',
+ category: 'Software',
+ route: '/library/ubuntu.svg',
+ url: 'https://ubuntu.com/',
+ brandUrl: 'https://design.ubuntu.com/brand'
+ },
+ {
+ title: 'Cypress',
+ category: 'Framework',
+ route: '/library/cypress.svg',
+ url: 'https://www.cypress.io/'
+ },
+ {
+ title: 'Reddit',
+ category: 'Social',
+ route: '/library/reddit.svg',
+ url: 'https://www.reddit.com/',
+ brandUrl: 'https://redditinc.com/brand'
+ },
+ {
+ title: 'JetBrains WebStorm',
+ category: 'Software',
+ route: '/library/webstorm.svg',
+ url: 'https://www.jetbrains.com/webstorm/'
+ },
+ {
+ title: 'JetBrains PyCharm',
+ category: 'Software',
+ route: '/library/pycharm.svg',
+ url: 'https://www.jetbrains.com/pycharm/'
+ },
+ {
+ title: 'JetBrains Fleet',
+ category: 'Software',
+ route: '/library/fleet.svg',
+ url: 'https://www.jetbrains.com/fleet/'
+ },
+ {
+ title: 'JetBrains RubyMine',
+ category: 'Software',
+ route: '/library/rubymine.svg',
+ url: 'https://www.jetbrains.com/ruby/'
+ },
+ {
+ title: 'JetBrains PhpStorm',
+ category: 'Software',
+ route: '/library/phpstorm.svg',
+ url: 'https://www.jetbrains.com/phpstorm/'
+ },
+ {
+ title: 'Monkeytype',
+ category: 'Software',
+ route: '/library/monkeytype.svg',
+ wordmark: {
+ dark: '/library/monkeytype-wordmark-dark.svg',
+ light: '/library/monkeytype-wordmark-light.svg'
+ },
+ url: 'https://monkeytype.com/'
+ },
+ {
+ title: 'PyCharm',
+ category: 'Software',
+ route: '/library/pycharm.svg',
+ url: 'https://www.jetbrains.com/pycharm/'
+ },
+ {
+ title: 'Shopify',
+ category: 'CMS',
+ route: '/library/shopify.svg',
+ wordmark: {
+ dark: '/library/shopify-wordmark-dark.svg',
+ light: '/library/shopify-wordmark-light.svg'
+ },
+ url: 'https://www.shopify.com',
+ brandUrl: 'https://www.shopify.com/brand-assets'
+ },
+ {
+ title: 'Webflow',
+ category: 'CMS',
+ route: '/library/webflow.svg',
+ wordmark: {
+ dark: '/library/webflow-wordmark-dark.svg',
+ light: '/library/webflow-wordmark-light.svg'
+ },
+ url: 'https://www.webflow.com',
+ brandUrl: 'https://brand-at.webflow.io/resources'
+ },
+ {
+ title: 'Sanity',
+ category: 'CMS',
+ route: '/library/sanity.svg',
+ url: 'https://www.sanity.io'
+ },
+ {
+ title: 'sky',
+ category: 'Entertainment',
+ route: '/library/sky.svg',
+ url: 'https://www.sky.com'
+ },
+ {
+ title: 'Airbnb',
+ category: 'Software',
+ route: '/library/airbnb.svg',
+ wordmark: '/library/airbnb-wordmark.svg',
+ url: 'https://www.airbnb.com'
+ },
+ {
+ title: 'Uber',
+ category: 'Software',
+ route: {
+ light: '/library/uber_light.svg',
+ dark: '/library/uber_dark.svg'
+ },
+ url: 'https://www.uber.com',
+ brandUrl: 'https://brand.uber.com/'
+ },
+ {
+ title: 'Gmail',
+ category: ['Google', 'Software'],
+ route: '/library/gmail.svg',
+ url: 'https://www.gmail.com'
+ },
+ {
+ title: 'Outlook',
+ category: 'Software',
+ route: '/library/outlook.svg',
+ url: 'https://www.outlook.com'
+ },
+ {
+ title: 'Slack',
+ category: 'Software',
+ route: '/library/slack.svg',
+ wordmark: '/library/slack-wordmark.svg',
+ url: 'https://www.slack.com'
+ },
+ {
+ title: 'Snapchat',
+ category: 'Software',
+ route: '/library/snapchat.svg',
+ url: 'https://www.snapchat.com'
+ },
+ {
+ title: 'Ebay',
+ category: 'Software',
+ route: '/library/ebay.svg',
+ url: 'https://www.ebay.com'
+ },
+ {
+ title: 'IBM',
+ category: 'Software',
+ route: '/library/ibm.svg',
+ url: 'https://www.ibm.com'
+ },
+ {
+ title: 'TrustPilot',
+ category: 'Software',
+ route: '/library/trustpilot.svg',
+ url: 'https://www.trustpilot.com'
+ },
+ {
+ title: 'Raycast',
+ category: 'Software',
+ route: '/library/raycast.svg',
+ wordmark: {
+ light: '/library/raycast-wordmark-light.svg',
+ dark: '/library/raycast-wordmark-dark.svg'
+ },
+ url: 'https://raycast.com/'
+ },
+ {
+ title: 'Hack The Box',
+ category: 'Cybersecurity',
+ route: '/library/hack-the-box.svg',
+ wordmark: {
+ light: '/library/hack-the-box-wordmark-light.svg',
+ dark: '/library/hack-the-box-wordmark-dark.svg'
+ },
+ url: 'https://www.hackthebox.com/'
+ },
+ {
+ title: 'Procure',
+ category: 'Marketplace',
+ route: '/library/procure.svg',
+ url: 'https://procure.biz/'
+ },
+ {
+ title: 'Julia',
+ category: 'Language',
+ route: '/library/julia.svg',
+ url: 'https://julialang.org/'
+ },
+ {
+ title: 'SWC',
+ category: 'Compiler',
+ route: '/library/swc.svg',
+ url: 'https://swc.rs/'
+ },
+ {
+ title: 'PlayStation',
+ category: 'Software',
+ route: '/library/playstation.svg',
+ url: 'https://www.playstation.com/'
+ },
+ {
+ title: 'Xbox',
+ category: 'Software',
+ route: '/library/xbox.svg',
+ url: 'https://www.xbox.com/'
+ },
+ {
+ title: 'Cody',
+ category: 'AI',
+ route: '/library/cody.svg',
+ url: 'https://about.sourcegraph.com/'
+ },
+ {
+ title: 'Sourcegraph',
+ category: 'AI',
+ route: '/library/sourcegraph.svg',
+ url: 'https://about.sourcegraph.com/'
+ },
+ {
+ title: 'Perplexity AI',
+ category: 'AI',
+ route: '/library/perplexity.svg',
+ wordmark: {
+ light: '/library/perplexity_wordmark_light.svg',
+ dark: '/library/perplexity_wordmark_dark.svg'
+ },
+ url: 'https://perplexity.ai/'
+ },
+ {
+ title: 'Spring',
+ category: 'Framework',
+ route: '/library/spring.svg',
+ url: 'https://spring.io/'
+ },
+ {
+ title: 'Directus',
+ category: 'CMS',
+ route: '/library/directus.svg',
+ url: 'https://directus.io/'
+ },
+ {
+ title: 'Pnpm',
+ category: 'Software',
+ route: {
+ light: '/library/pnpm.svg',
+ dark: '/library/pnpm_dark.svg'
+ },
+ wordmark: {
+ light: '/library/pnpm_wordmark_light.svg',
+ dark: '/library/pnpm_wordmark_dark.svg'
+ },
+ url: 'https://pnpm.io/'
+ },
+ {
+ title: 'Emacs',
+ category: 'Software',
+ route: '/library/emacs.svg',
+ url: 'https://www.gnu.org/software/emacs/'
+ },
+ {
+ title: 'Svgl',
+ category: 'Library',
+ route: '/library/svgl.svg',
+ url: 'https://svgl.app'
+ },
+ {
+ title: 'Google Idx',
+ category: ['Software', 'Google'],
+ route: '/library/google-idx.svg',
+ url: 'https://idx.dev/'
+ },
+ {
+ title: 'Remix',
+ category: 'Framework',
+ route: {
+ light: '/library/remix_light.svg',
+ dark: '/library/remix_dark.svg'
+ },
+ url: 'https://remix.run/'
+ },
+ {
+ title: 'Steam',
+ category: 'Software',
+ route: '/library/steam.svg',
+ url: 'https://store.steampowered.com/'
+ },
+ {
+ title: 'Tabby',
+ category: 'Software',
+ route: '/library/tabby.svg',
+ url: 'https://tabby.sh/'
+ },
+ {
+ title: '1Password',
+ category: 'Software',
+ route: {
+ light: '/library/1password-light.svg',
+ dark: '/library/1password-dark.svg'
+ },
+ url: 'https://1password.com'
+ },
+ {
+ title: 'Flask',
+ category: 'Framework',
+ route: {
+ light: '/library/flask-light.svg',
+ dark: '/library/flask-dark.svg'
+ },
+ wordmark: {
+ light: '/library/flask-wordmark-light.svg',
+ dark: '/library/flask-wordmark-dark.svg'
+ },
+ url: 'https://flask.palletsprojects.com/'
+ },
+ {
+ title: 'Alacritty',
+ category: 'Software',
+ route: '/library/alacritty.svg',
+ url: 'https://alacritty.org'
+ },
+ {
+ title: 'Qt',
+ category: 'Software',
+ route: '/library/qt.svg',
+ url: 'https://www.qt.io/'
+ },
+ {
+ title: 'Bitwarden',
+ category: ['Software', 'Authentication'],
+ route: '/library/bitwarden.svg',
+ url: 'https://bitwarden.com/',
+ brandUrl: 'https://bitwarden.com/brand/'
+ },
+ {
+ title: 'Voicemod',
+ category: 'Entertainment',
+ route: {
+ light: '/library/voicemod_light.svg',
+ dark: '/library/voicemod_dark.svg'
+ },
+ url: 'https://voicemod.net/'
+ },
+ {
+ title: 'Neovim',
+ category: 'Software',
+ route: '/library/neovim.svg',
+ url: 'https://neovim.io/'
+ },
+ {
+ title: 'Pitch',
+ category: 'Design',
+ route: '/library/pitch.svg',
+ url: 'https://pitch.com'
+ },
+ {
+ title: 'Biomejs',
+ category: 'Compiler',
+ route: '/library/biomejs.svg',
+ url: 'https://biomejs.dev/'
+ },
+ {
+ title: 'Gradio',
+ category: 'Software',
+ route: '/library/gradio.svg',
+ url: 'https://www.gradio.app/'
+ },
+ {
+ title: 'Meta',
+ category: 'Social',
+ route: '/library/meta.svg',
+ url: 'https://about.meta.com/es/',
+ brandUrl: 'https://about.meta.com/brand/resources/'
+ },
+ {
+ title: 'Stability AI',
+ category: 'AI',
+ route: '/library/stability-ai.svg',
+ url: 'https://stability.ai/'
+ },
+ {
+ title: 'Google PaLM',
+ category: ['AI', 'Google'],
+ route: '/library/google-palm.svg',
+ url: 'https://ai.google/discover/palm2/'
+ },
+ {
+ title: 'Android',
+ category: 'Software',
+ route: '/library/android-icon.svg',
+ url: 'https://www.android.com/'
+ },
+ {
+ title: 'Sentry',
+ category: 'Software',
+ route: '/library/sentry.svg',
+ url: 'https://sentry.io/',
+ brandUrl: 'https://sentry.io/branding/'
+ },
+ {
+ title: 'Grafana',
+ category: 'Software',
+ route: '/library/grafana.svg',
+ url: 'https://grafana.com/'
+ },
+ {
+ title: 'Notion',
+ category: 'Software',
+ route: '/library/notion.svg',
+ url: 'https://notion.so/'
+ },
+ {
+ title: 'Litecoin',
+ category: 'Crypto',
+ route: '/library/litecoin.svg',
+ url: 'https://litecoin.org/'
+ },
+ {
+ title: 'ElysiaJS',
+ category: 'Framework',
+ route: '/library/elysiajs.svg',
+ url: 'https://elysiajs.com/'
+ },
+ {
+ title: 'TensorFlow',
+ category: 'Library',
+ route: '/library/tensorflow.svg',
+ url: 'https://www.tensorflow.org/'
+ },
+ {
+ title: 'Midday',
+ category: 'AI',
+ route: '/library/midday.svg',
+ url: 'https://midday.ai/'
+ },
+ {
+ title: 'C#',
+ category: 'Language',
+ route: '/library/csharp.svg',
+ url: 'https://dotnet.microsoft.com/languages/csharp'
+ },
+ {
+ title: 'Replicate',
+ category: 'AI',
+ route: {
+ light: '/library/replicate_light.svg',
+ dark: '/library/replicate_dark.svg'
+ },
+ wordmark: {
+ light: '/library/replicate-wordmark_light.svg',
+ dark: '/library/replicate-wordmark_dark.svg'
+ },
+ url: 'https://replicate.com/'
+ },
+ {
+ title: 'Markdown',
+ category: 'Language',
+ route: {
+ light: '/library/markdown-light.svg',
+ dark: '/library/markdown-dark.svg'
+ },
+ url: 'https://www.markdownguide.org/'
+ },
+ {
+ title: 'Radix UI',
+ category: 'Library',
+ route: {
+ light: '/library/radix-ui_light.svg',
+ dark: '/library/radix-ui_dark.svg'
+ },
+ url: 'https://www.radix-ui.com/'
+ },
+ {
+ title: 'Web.dev',
+ category: 'Education',
+ route: '/library/webdev.svg',
+ url: 'https://web.dev/'
+ },
+ {
+ title: 'SWR',
+ category: 'Library',
+ route: {
+ light: '/library/swr-light.svg',
+ dark: '/library/swr-dark.svg'
+ },
+ url: 'https://swr.vercel.app/'
+ },
+ {
+ title: 'Refine',
+ category: 'Framework',
+ route: {
+ light: '/library/refine_dark.svg',
+ dark: '/library/refine_light.svg'
+ },
+ url: 'https://refine.dev/'
+ },
+ {
+ title: 'Youtube Music',
+ category: ['Google', 'Music'],
+ route: '/library/youtube_music.svg',
+ wordmark: {
+ light: '/library/youtube_music_wordmark_light.svg',
+ dark: '/library/youtube_music_wordmark_dark.svg'
+ },
+ url: 'https://music.youtube.com/'
+ },
+ {
+ title: 'TIDAL',
+ category: 'Music',
+ route: {
+ light: '/library/tidal_light.svg',
+ dark: '/library/tidal_dark.svg'
+ },
+ wordmark: {
+ light: '/library/tidal_wordmark_light.svg',
+ dark: '/library/tidal_wordmark_dark.svg'
+ },
+ url: 'https://tidal.com/'
+ },
+ {
+ title: 'OBS',
+ category: 'Software',
+ route: '/library/obs.svg',
+ url: 'https://obsproject.com/'
+ },
+ {
+ title: 'Stack Overflow',
+ category: 'Software',
+ route: '/library/stackoverflow.svg',
+ wordmark: '/library/stackoverflow_wordmark.svg',
+ url: 'https://stackoverflow.com/',
+ brandUrl: 'https://stackoverflow.design/brand/'
+ },
+ {
+ title: 'TikTok',
+ category: 'Social',
+ route: '/library/tiktok.svg',
+ url: 'https://www.tiktok.com/'
+ },
+ {
+ title: 'Ngrok',
+ category: 'Software',
+ route: {
+ dark: '/library/ngrok-dark.svg',
+ light: '/library/ngrok-light.svg'
+ },
+ url: 'https://ngrok.com'
+ },
+ {
+ title: 'Lemon Squeezy',
+ category: 'Software',
+ route: '/library/lemonsqueezy.svg',
+ url: 'https://www.lemonsqueezy.com'
+ },
+ {
+ title: 'Asana',
+ category: 'Software',
+ route: '/library/asana-logo.svg',
+ wordmark: {
+ dark: '/library/asana-wordmark-dark.svg',
+ light: '/library/asana-wordmark-light.svg'
+ },
+ url: 'https://asana.com'
+ },
+ {
+ title: 'UpLeveled',
+ category: 'Education',
+ route: '/library/upleveled.svg',
+ wordmark: '/library/upleveled-wordmark.svg',
+ url: 'https://upleveled.io/'
+ },
+ {
+ title: 'Zoom',
+ category: 'Software',
+ route: '/library/zoom.svg',
+ url: 'https://zoom.us/'
+ },
+ {
+ title: 'Tina',
+ category: 'CMS',
+ route: '/library/tina.svg',
+ wordmark: '/library/tina_wordmark.svg',
+ url: 'https://tina.io/'
+ },
+ {
+ title: 'Next.js',
+ category: ['Framework', 'Vercel'],
+ route: '/library/nextjs_icon_dark.svg',
+ wordmark: {
+ light: '/library/nextjs_logo_light.svg',
+ dark: '/library/nextjs_logo_dark.svg'
+ },
+ url: 'https://nextjs.org/'
+ },
+ {
+ title: 'Mistral AI',
+ category: 'AI',
+ route: '/library/mistral-ai_logo.svg',
+ wordmark: '/library/mistral-ai_wordmark.svg',
+ url: 'https://mistral.ai/'
+ },
+ {
+ title: 'Hugging Face',
+ category: 'AI',
+ route: '/library/hugging_face.svg',
+ url: 'https://huggingface.co/',
+ brandUrl: 'https://huggingface.co/brand'
+ },
+ {
+ title: 'Node.js',
+ category: 'Library',
+ route: '/library/nodejs.svg',
+ url: 'https://nodejs.org/',
+ brandUrl: 'https://nodejs.org/en/about/branding'
+ },
+ {
+ title: 'Raindrop.io',
+ category: 'Software',
+ route: '/library/raindrop.svg',
+ url: 'https://raindrop.io/'
+ },
+ {
+ title: 'Microsoft Todo',
+ category: 'Software',
+ route: '/library/microsoft-todo.svg',
+ url: 'https://to-do.office.com/'
+ },
+ {
+ title: 'Supabase',
+ category: 'Database',
+ route: '/library/supabase.svg',
+ url: 'https://supabase.com/',
+ wordmark: {
+ light: '/library/supabase_wordmark_light.svg',
+ dark: '/library/supabase_wordmark_dark.svg'
+ },
+ brandUrl: 'https://supabase.com/brand-assets'
+ },
+ {
+ title: 'Gleam',
+ category: 'Language',
+ route: '/library/gleam.svg',
+ url: 'https://gleam.run/'
+ },
+ {
+ title: 'Flowbite',
+ category: 'Framework',
+ route: '/library/flowbite.svg',
+ url: 'https://flowbite.com/'
+ },
+ {
+ title: 'Hume AI',
+ category: 'AI',
+ route: '/library/hume-ai.svg',
+ url: 'https://hume.ai/'
+ },
+ {
+ title: 'Resend',
+ category: 'Software',
+ url: 'https://resend.com/',
+ route: {
+ light: '/library/resend-icon-black.svg',
+ dark: '/library/resend-icon-white.svg'
+ },
+ wordmark: {
+ light: '/library/resend-wordmark-black.svg',
+ dark: '/library/resend-wordmark-white.svg'
+ },
+ brandUrl: 'https://resend.com/brand'
+ },
+ {
+ title: 'Layers',
+ category: 'Design',
+ route: {
+ light: '/library/layers_light.svg',
+ dark: '/library/layers_dark.svg'
+ },
+ url: 'https://layers.to/'
+ },
+ {
+ title: 'Exome',
+ category: 'Library',
+ route: '/library/exome.svg',
+ url: 'https://exome.dev/'
+ },
+ {
+ title: 'Poper',
+ category: 'AI',
+ route: '/library/poper.svg',
+ url: 'https://www.poper.ai'
+ },
+ {
+ title: 'Dub',
+ category: 'Software',
+ route: {
+ light: '/library/dub.svg',
+ dark: '/library/dub_dark_logo.svg'
+ },
+ wordmark: {
+ light: '/library/dub_light_wordmark.svg',
+ dark: '/library/dub_dark_wordmark.svg'
+ },
+ url: 'https://dub.co',
+ brandUrl: 'https://dub.co/brand'
+ },
+ {
+ title: 'Turso',
+ category: ['Database', 'Software'],
+ route: {
+ light: '/library/turso-light.svg',
+ dark: '/library/turso-dark.svg'
+ },
+ wordmark: {
+ light: '/library/turso-wordmark-light.svg',
+ dark: '/library/turso-wordmark-dark.svg'
+ },
+ url: 'https://turso.tech'
+ },
+ {
+ title: 'RelaGit',
+ category: 'Software',
+ route: {
+ light: '/library/relagit-icon-light.svg',
+ dark: '/library/relagit-icon-dark.svg'
+ },
+ wordmark: {
+ light: '/library/relagit-wordmark-light.svg',
+ dark: '/library/relagit-wordmark-dark.svg'
+ },
+ url: 'https://rela.dev'
+ },
+ {
+ title: 'T3 Stack',
+ category: 'Framework',
+ route: {
+ light: '/library/t3-dark.svg',
+ dark: '/library/t3-light.svg'
+ },
+ url: 'https://create.t3.gg/'
+ },
+ {
+ title: 'Apple Music',
+ category: 'Music',
+ route: '/library/apple-music-icon.svg',
+ wordmark: {
+ light: '/library/apple-music-wordmark-light.svg',
+ dark: '/library/apple-music-wordmark-dark.svg'
+ },
+ url: 'https://music.apple.com/'
+ },
+ {
+ title: 'YGeeker',
+ category: 'Software',
+ route: '/library/ygeeker.svg',
+ url: 'https://www.ygeeker.com'
+ },
+ {
+ title: 'PostCSS',
+ category: 'Compiler',
+ route: '/library/postcss.svg',
+ wordmark: '/library/postcss_wordmark.svg',
+ url: 'https://postcss.org/'
+ },
+ {
+ title: 'SVG',
+ category: ['Language', 'Design'],
+ route: '/library/svg.svg',
+ wordmark: '/library/svg_wordmark.svg',
+ url: 'https://www.w3.org/TR/SVG/'
+ },
+ {
+ title: 'Todoist',
+ category: 'Software',
+ route: '/library/todoist.svg',
+ wordmark: '/library/todoist-wordmark.svg',
+ url: 'https://todoist.com/'
+ },
+ {
+ title: 'Apidog',
+ category: 'Software',
+ route: '/library/apidog.svg',
+ url: 'https://apidog.com/'
+ },
+ {
+ title: 'Chart.js',
+ category: 'Library',
+ route: '/library/chartjs.svg',
+ url: 'https://www.chartjs.org/'
+ },
+ {
+ title: 'JSON Schema',
+ category: 'Library',
+ route: '/library/json-schema.svg',
+ url: 'https://json-schema.org/'
+ },
+ {
+ title: 'v0',
+ category: 'Vercel',
+ route: {
+ light: '/library/v0_light.svg',
+ dark: '/library/v0_dark.svg'
+ },
+ url: 'https://v0.dev/'
+ },
+ {
+ title: 'Bento',
+ category: 'Software',
+ route: '/library/bento.svg',
+ url: 'https://bento.me/home'
+ },
+ {
+ title: 'Firebase',
+ category: ['Hosting', 'Google'],
+ route: '/library/firebase.svg',
+ wordmark: '/library/firebase-wordmark.svg',
+ url: 'https://firebase.google.com/'
+ },
+ {
+ title: 'Prettier',
+ category: 'Library',
+ route: {
+ light: '/library/prettier-icon-light.svg',
+ dark: '/library/prettier-icon-dark.svg'
+ },
+ url: 'https://prettier.io/'
+ },
+ {
+ title: 'Leap Wallet',
+ category: ['Crypto', 'Software', 'Payment'],
+ route: '/library/leap-wallet.svg',
+ wordmark: {
+ light: '/library/leap-wallet-wordmark-light.svg',
+ dark: '/library/leap-wallet-wordmark-dark.svg'
+ },
+ url: 'https://leapwallet.io/'
+ },
+ {
+ title: 'Nx',
+ category: ['Devtool', 'Monorepo'],
+ route: {
+ light: '/library/nx_light.svg',
+ dark: '/library/nx_dark.svg'
+ },
+ url: 'https://nx.dev'
+ },
+ {
+ title: 'Google Colaboratory',
+ category: ['Google', 'Software'],
+ route: '/library/Google_Colaboratory.svg',
+ url: 'https://colab.research.google.com/'
+ },
+ {
+ title: 'Raspberry PI',
+ category: ['Hardware', 'Software'],
+ route: '/library/raspberry_pi.svg',
+ url: 'https://www.raspberrypi.com/'
+ },
+ {
+ title: 'Vite',
+ category: ['Devtool', 'VoidZero'],
+ route: '/library/vitejs.svg',
+ url: 'https://vitejs.dev'
+ },
+ {
+ title: 'Vitest',
+ category: ['Framework', 'VoidZero'],
+ route: '/library/vitest.svg',
+ url: 'https://vitest.dev/'
+ },
+ {
+ title: 'Oxc',
+ category: ['Devtool', 'VoidZero'],
+ route: '/library/oxc.svg',
+ url: 'https://oxc.rs/'
+ },
+ {
+ title: 'Rolldown',
+ category: ['Compiler', 'VoidZero'],
+ route: '/library/rolldown.svg',
+ url: 'https://rolldown.rs/'
+ },
+ {
+ title: 'ManzDev',
+ category: ['Community'],
+ route: '/library/manzdev.svg',
+ url: 'https://manz.dev/'
+ },
+ {
+ title: 'Afordin',
+ category: ['Community'],
+ route: {
+ light: '/library/afordin-light.svg',
+ dark: '/library/afordin-dark.svg'
+ },
+ url: 'https://github.com/Afordin'
+ },
+ {
+ title: 'MediaWiki',
+ category: ['Software', 'CMS'],
+ route: '/library/mediawiki.svg',
+ wordmark: {
+ light: '/library/mediawiki-wordmark-light.svg',
+ dark: '/library/mediawiki-wordmark-dark.svg'
+ },
+ url: 'https://www.mediawiki.org/'
+ },
+ {
+ title: 'Carrd',
+ category: ['Social'],
+ route: '/library/carrd.svg',
+ url: 'https://carrd.co/'
+ },
+ {
+ title: 'Claude AI',
+ category: 'AI',
+ route: '/library/claude-ai-icon.svg',
+ wordmark: {
+ light: '/library/claude-ai-wordmark-icon_light.svg',
+ dark: '/library/claude-ai-wordmark-icon_dark.svg'
+ },
+ url: 'https://claude.ai/'
+ },
+ {
+ title: 'UnoCSS',
+ category: 'Devtool',
+ route: '/library/unocss.svg',
+ url: 'https://unocss.dev/'
+ },
+ {
+ title: 'tRPC',
+ category: 'Framework',
+ route: '/library/trpc.svg',
+ wordmark: {
+ light: '/library/trpc_wordmark_light.svg',
+ dark: 'library/trpc_wordmark_dark.svg'
+ },
+ url: 'https://trpc.io/'
+ },
+ {
+ title: 'Bluesky',
+ category: 'Social',
+ route: '/library/bluesky.svg',
+ url: 'https://blueskyweb.xyz/'
+ },
+ {
+ title: 'Drizzle ORM',
+ category: ['Library', 'Database'],
+ route: {
+ light: '/library/drizzle-orm_light.svg',
+ dark: '/library/drizzle-orm_dark.svg'
+ },
+ url: 'https://orm.drizzle.team/'
+ },
+ {
+ title: 'daily.dev',
+ category: ['Social', 'Community'],
+ route: {
+ light: '/library/daily-dev-ligth.svg',
+ dark: '/library/daily-dev-dark.svg'
+ },
+ url: 'https://daily.dev/'
+ },
+ {
+ title: 'Polars',
+ category: 'Library',
+ route: '/library/polars-logo.svg',
+ url: 'https://pola.rs/'
+ },
+ {
+ title: 'Zed',
+ category: 'Software',
+ route: {
+ light: '/library/zed-logo.svg',
+ dark: '/library/zed-logo_dark.svg'
+ },
+ url: 'https://zed.dev/'
+ },
+ {
+ title: 'Polar',
+ category: 'Software',
+ route: {
+ light: '/library/polar-sh_light.svg',
+ dark: '/library/polar-sh_dark.svg'
+ },
+ url: 'https://polar.sh/'
+ },
+ {
+ title: 'bolt',
+ category: 'Devtool',
+ route: {
+ light: '/library/bolt-new.svg',
+ dark: '/library/bolt-new_dark.svg'
+ },
+ url: 'https://bolt.new/'
+ },
+ {
+ title: 'JSON',
+ category: 'Language',
+ route: '/library/json.svg',
+ url: 'https://json.org/'
+ },
+ {
+ title: 'nuqs',
+ category: 'Library',
+ route: {
+ light: '/library/nuqs.svg',
+ dark: '/library/nuqs_dark.svg'
+ },
+ wordmark: {
+ light: '/library/nuqs-wordmark.svg',
+ dark: '/library/nuqs-wordmark_dark.svg'
+ },
+ url: 'https://nuqs.47ng.com/'
+ },
+ {
+ title: 'SoundCloud',
+ category: 'Music',
+ route: {
+ light: '/library/soundcloud-logo.svg',
+ dark: '/library/soundcloud-logo_dark.svg'
+ },
+ wordmark: {
+ light: '/library/soundcloud-wordmark.svg',
+ dark: 'library/soundcloud-wordmark_dark.svg'
+ },
+ url: 'https://soundcloud.com/'
+ },
+ {
+ title: 'Clerk',
+ category: ['Software', 'Authentication'],
+ route: {
+ light: '/library/clerk-light.svg',
+ dark: '/library/clerk-dark.svg'
+ },
+ url: 'https://clerk.com/'
+ },
+ {
+ title: 'Mermaid',
+ category: ['Library'],
+ route: {
+ light: '/library/mermaid-logo-light.svg',
+ dark: '/library/mermaid-logo-dark.svg'
+ },
+ url: 'https://mermaid.js.org/'
+ },
+ {
+ title: 'Home Assistant',
+ category: ['IoT', 'Software'],
+ route: '/library/home-assistant.svg',
+ wordmark: {
+ light: '/library/home-assistant-wordmark.svg',
+ dark: '/library/home-assistant-wordmark-dark.svg'
+ },
+ url: 'https://github.com/home-assistant/assets/tree/master/logo'
+ },
+ {
+ title: 'UXAnaRangel',
+ category: ['Community'],
+ route: {
+ light: '/library/uxanarangel-light.svg',
+ dark: '/library/uxanarangel-dark.svg'
+ },
+ url: 'https://uxanarangel.com/'
+ },
+ {
+ title: 'UXCorpRangel',
+ category: ['Community'],
+ route: {
+ light: '/library/uxcorprangel-light.svg',
+ dark: '/library/uxcorprangel-dark.svg'
+ },
+ url: 'https://github.com/UXCorpRangel/'
+ },
+ {
+ title: 'PostHog',
+ category: 'Devtool',
+ route: '/library/posthog.svg',
+ wordmark: {
+ light: '/library/posthog-wordmark.svg',
+ dark: '/library/posthog-wordmark_dark.svg'
+ },
+ url: 'https://posthog.com/',
+ brandUrl: 'https://posthog.com/handbook/company/brand-assets'
+ },
+ {
+ title: 'PowerToys',
+ category: 'Software',
+ route: '/library/powertoys.svg',
+ url: 'https://learn.microsoft.com/en-us/windows/powertoys/'
+ },
+ {
+ title: 'Lottielab',
+ category: 'Design',
+ route: '/library/lottielab.svg',
+ url: 'https://www.lottielab.com/'
+ },
+ {
+ title: 'TanStack',
+ category: ['Software', 'Library'],
+ route: '/library/tanstack.svg',
+ url: 'https://tanstack.com/'
+ },
+ {
+ title: 'TypeGPU',
+ category: ['Software', 'Library'],
+ route: {
+ light: '/library/typegpu-light.svg',
+ dark: '/library/typegpu-dark.svg'
+ },
+ wordmark: {
+ light: '/library/typegpu-wordmark-light.svg',
+ dark: '/library/typegpu-wordmark-dark.svg'
+ },
+ url: 'https://typegpu.com'
+ },
+ {
+ title: 'dotenv',
+ category: ['Config', 'Library', 'Devtool'],
+ route: '/library/dotenv.svg',
+ url: 'https://github.com/motdotla/dotenv'
+ },
+ {
+ title: 'dotenvx',
+ category: ['Secrets', 'Config', 'Devtool'],
+ route: '/library/dotenvx.svg',
+ url: 'https://dotenvx.com'
+ },
+ {
+ title: 'Motion',
+ category: 'Library',
+ route: {
+ light: '/library/motion.svg',
+ dark: '/library/motion_dark.svg'
+ },
+ url: 'https://motion.dev/'
+ },
+ {
+ title: 'Keycloak',
+ category: 'Authentication',
+ route: '/library/keycloak.svg',
+ url: 'https://keycloak.org'
+ },
+ {
+ title: 'DeepSeek',
+ category: 'AI',
+ route: '/library/deepseek.svg',
+ wordmark: '/library/deepseek_wordmark.svg',
+ url: 'https://deepseek.com/'
+ },
+ {
+ title: 'Shiki',
+ category: 'Library',
+ route: '/library/shiki.svg',
+ url: 'https://shiki.style/'
+ },
+ {
+ title: 'Dropbox',
+ category: ['Hosting', 'Software'],
+ route: '/library/dropbox.svg',
+ wordmark: {
+ light: '/library/dropbox_wordmark.svg',
+ dark: '/library/dropbox_wordmark_dark.svg'
+ },
+ url: 'https://www.dropbox.com/',
+ brandUrl: 'https://brand.dropbox.com/'
+ },
+ {
+ title: 'Open WebUI',
+ category: ['AI', 'Software'],
+ route: '/library/openwebui.svg',
+ url: 'https://openwebui.com/'
+ },
+ {
+ title: 'Base UI',
+ category: 'Library',
+ route: {
+ light: '/library/base-ui.svg',
+ dark: '/library/base-ui-dark.svg'
+ },
+ url: 'https://base-ui.com/'
+ },
+ {
+ title: 'Vercel',
+ category: ['Hosting', 'Vercel'],
+ route: {
+ light: '/library/vercel.svg',
+ dark: '/library/vercel_dark.svg'
+ },
+ wordmark: {
+ light: '/library/vercel_wordmark.svg',
+ dark: '/library/vercel_wordmark_dark.svg'
+ },
+ brandUrl: 'https://vercel.com/geist/brands',
+ url: 'https://vercel.com/'
+ },
+ {
+ title: 'Socket.io',
+ category: 'Software',
+ route: {
+ dark: '/library/socketio-dark.svg',
+ light: '/library/socketio-light.svg'
+ },
+ url: 'https://socket.io/'
+ },
+ {
+ title: 'Ant Design',
+ category: 'Library',
+ route: '/library/ant-design-dark-theme.svg',
+ url: 'https://ant.design/'
+ },
+ {
+ title: 'VSCodium',
+ category: 'Software',
+ route: '/library/vscodium.svg',
+ url: 'https://vscodium.com/'
+ },
+ {
+ title: 'Zen Browser',
+ category: 'Browser',
+ route: {
+ light: '/library/zen-browser-light.svg',
+ dark: '/library/zen-browser-dark.svg'
+ },
+ wordmark: {
+ light: '/library/zen-browser-wordmark-light.svg',
+ dark: '/library/zen-browser-wordmark-dark.svg'
+ },
+ url: 'https://zen-browser.app/'
+ },
+ {
+ title: 'Gemini',
+ category: ['Google', 'AI'],
+ route: '/library/gemini.svg',
+ wordmark: '/library/gemini_wordmark.svg',
+ url: 'https://gemini.google.com/'
+ },
+ {
+ title: 'xAI (Grok)',
+ category: ['AI'],
+ route: {
+ light: '/library/xai_light.svg',
+ dark: '/library/xai_dark.svg'
+ },
+ url: 'https://grok.com/'
+ },
+ {
+ title: 'Qwen',
+ category: ['AI'],
+ route: {
+ light: '/library/qwen_light.svg',
+ dark: '/library/qwen_dark.svg'
+ },
+ url: 'https://chat.qwenlm.ai/'
+ },
+ {
+ title: 'Inflection AI',
+ category: 'AI',
+ route: {
+ light: '/library/inflectionai_light.svg',
+ dark: '/library/inflectionai_dark.svg'
+ },
+ wordmark: {
+ light: '/library/inflectionai_wordmark_light.svg',
+ dark: '/library/inflectionai_wordmark_dark.svg'
+ },
+ url: 'https://inflection.ai/'
+ },
+ {
+ title: 'D3.js',
+ category: 'Library',
+ route: '/library/D3.svg',
+ url: 'https://d3js.org/'
+ },
+ {
+ title: 'Anthropic',
+ category: 'AI',
+ route: {
+ light: '/library/anthropic_black.svg',
+ dark: '/library/anthropic_white.svg'
+ },
+ wordmark: {
+ light: '/library/anthropic_black_wordmark.svg',
+ dark: '/library/anthropic_white_wordmark.svg'
+ },
+ url: 'https://www.anthropic.com/'
+ },
+ {
+ title: 'Replit',
+ category: 'Software',
+ route: '/library/replit.svg',
+ wordmark: {
+ light: '/library/replit-wordmark-light.svg',
+ dark: '/library/replit-wordmark-dark.svg'
+ },
+ url: 'https://replit.com/',
+ brandUrl: 'https://replit.com/brandkit'
+ },
+ {
+ title: 'Magic UI',
+ category: 'Library',
+ route: '/library/magicui.svg',
+ url: 'https://magicui.design/'
+ },
+ {
+ title: 'Web Components',
+ category: 'Library',
+ route: '/library/webcomponents.svg',
+ url: 'https://www.webcomponents.org/'
+ },
+ {
+ title: 'Designali',
+ category: ['Software', 'Design'],
+ route: '/library/designali.svg',
+ url: 'https://designali.in'
+ },
+ {
+ title: 'CurseForge',
+ category: ['Marketplace', 'Community'],
+ route: {
+ light: '/library/curseforge.svg',
+ dark: '/library/curseforge-dark.svg'
+ },
+ wordmark: {
+ light: '/library/curseforge-wordmark.svg',
+ dark: '/library/curseforge-wordmark-dark.svg'
+ },
+ url: 'https://curseforge.com/',
+ brandUrl:
+ 'https://www.figma.com/file/YYn36CxVpcT6aPKDXIH9JG/CurseForge-Brandbook?type=design&node-id=0-1&t=dvC0gPtyP36PQdsi-0'
+ },
+ {
+ title: 'Cursor',
+ category: ['Software'],
+ route: {
+ light: '/library/cursor_light.svg',
+ dark: '/library/cursor_dark.svg'
+ },
+ wordmark: {
+ light: '/library/cursor_wordmark_light.svg',
+ dark: '/library/cursor_wordmark_dark.svg'
+ },
+ url: 'https://www.cursor.com'
+ },
+ {
+ title: 'Ghostty',
+ category: ['Software'],
+ route: '/library/ghostty.svg',
+ wordmark: {
+ dark: '/library/ghostty_wordmark_dark.svg',
+ light: '/library/ghostty_wordmark_light.svg'
+ },
+ url: 'https://ghostty.org/'
+ },
+ {
+ title: 'Better Auth',
+ category: ['Authentication', 'Library'],
+ route: {
+ light: '/library/better-auth_light.svg',
+ dark: '/library/better-auth_dark.svg'
+ },
+ wordmark: {
+ dark: '/library/better-auth_wordmark_dark.svg',
+ light: '/library/better-auth_wordmark_light.svg'
+ },
+ url: 'https://www.better-auth.com/'
+ },
+ {
+ title: 'Buy Me a Coffee',
+ category: ['Software'],
+ route: '/library/bmc.svg',
+ brandUrl: 'https://buymeacoffee.com/brand',
+ url: 'https://buymeacoffee.com/'
+ },
+ {
+ title: 'GitHub',
+ category: 'Software',
+ route: {
+ light: '/library/github_light.svg',
+ dark: '/library/github_dark.svg'
+ },
+ wordmark: {
+ light: '/library/github_wordmark_light.svg',
+ dark: '/library/github_wordmark_dark.svg'
+ },
+ url: 'https://github.com/',
+ brandUrl: 'https://brand.github.com/'
+ },
+ {
+ title: 'Firebase Studio',
+ category: ['AI', 'Google'],
+ route: '/library/firebase-studio.svg',
+ url: 'https://firebase.studio/'
+ },
+ {
+ title: 'HeroUI',
+ category: 'Library',
+ route: {
+ light: '/library/heroui_black.svg',
+ dark: '/library/heroui_light.svg'
+ },
+ url: 'https://www.heroui.com/'
+ }
+];
\ No newline at end of file
diff --git a/web/src/scripts/README.md b/web/src/scripts/README.md
new file mode 100644
index 00000000..f3ed7123
--- /dev/null
+++ b/web/src/scripts/README.md
@@ -0,0 +1,39 @@
+# Icon Management Scripts
+
+This directory contains scripts for managing the dashboard icons.
+
+## Scripts
+
+### `merge-icons.ts`
+
+This script merges data from `src/lib/isvg.ts` into the metadata.json file located at the repository root. It adds wordmark information to existing icons and creates new entries for icons that don't exist yet.
+
+#### Usage
+
+```bash
+# Using the npm script
+npm run merge-icons
+
+# Or with pnpm
+pnpm merge-icons
+```
+
+### `download-icons.ts`
+
+This script downloads icons from the [svgl](https://github.com/pheralb/svgl) repository to the `svg` folder. It skips existing icons (except for wordmark icons which are always downloaded).
+
+#### Usage
+
+```bash
+# Using the npm script
+npm run download-icons
+
+# Or with pnpm
+pnpm download-icons
+```
+
+## Notes
+
+- The `merge-icons.ts` script will add new icons to the metadata.json file with the author set to "ajnart" and a timestamp of "2025-04-20T12:00:00Z".
+- The `download-icons.ts` script will create the `svg` directory if it doesn't exist.
+- Both scripts log their progress to the console.
\ No newline at end of file
diff --git a/web/src/scripts/cleanup-icons.ts b/web/src/scripts/cleanup-icons.ts
new file mode 100644
index 00000000..cf9a5b9a
--- /dev/null
+++ b/web/src/scripts/cleanup-icons.ts
@@ -0,0 +1,121 @@
+#!/usr/bin/env bun
+import fs from 'node:fs';
+import path from 'node:path';
+
+// Define the file paths - this script is in /web/src/scripts
+const SCRIPT_DIR = path.dirname(new URL(import.meta.url).pathname);
+const METADATA_PATH = path.join(SCRIPT_DIR, '../../../metadata.json');
+const SVG_DIR = path.join(SCRIPT_DIR, '../../../svg');
+
+interface MetadataItem {
+ base: string;
+ aliases: string[];
+ categories: string[];
+ update: {
+ timestamp: string;
+ author: {
+ id: number | string;
+ name: string;
+ };
+ };
+ wordmark?: string | {
+ light: string;
+ dark: string;
+ };
+ colors?: {
+ dark: string;
+ light: string;
+ };
+}
+
+interface Metadata {
+ [key: string]: MetadataItem;
+}
+
+// Function to normalize a name by removing light/dark suffixes and replacing underscores
+function normalizeName(name: string): string {
+ return name.replace(/_/g, '-').replace(/-(light|dark)(-wordmark)?$/i, '$2');
+}
+
+// Function to collect all valid icon names from metadata
+function collectValidIconNames(metadata: Metadata): Set {
+ const validNames = new Set();
+
+ for (const [key, data] of Object.entries(metadata)) {
+ // Add the main key (icon name)
+ validNames.add(key.replace(/_/g, '-'));
+
+ // Add wordmark if it exists
+ if (data.wordmark) {
+ if (typeof data.wordmark === 'string') {
+ validNames.add(data.wordmark.replace(/_/g, '-'));
+ } else {
+ if (data.wordmark.light) validNames.add(data.wordmark.light.replace(/_/g, '-'));
+ if (data.wordmark.dark) validNames.add(data.wordmark.dark.replace(/_/g, '-'));
+ }
+ }
+
+ // Add colors if they exist
+ if (data.colors) {
+ if (data.colors.light) validNames.add(data.colors.light.replace(/_/g, '-'));
+ if (data.colors.dark) validNames.add(data.colors.dark.replace(/_/g, '-'));
+ }
+ }
+
+ return validNames;
+}
+
+async function main() {
+ console.log('Starting cleanup of unused SVG files...');
+
+ try {
+ // Read and parse metadata.json
+ console.log(`Reading metadata from ${METADATA_PATH}`);
+ const metadataContent = await fs.promises.readFile(METADATA_PATH, 'utf8');
+ const metadata: Metadata = JSON.parse(metadataContent);
+
+ // Collect all valid icon names
+ const validIconNames = collectValidIconNames(metadata);
+ console.log(`Found ${validIconNames.size} valid icon names in metadata`);
+
+ // Read all SVG files in the directory
+ const svgFiles = await fs.promises.readdir(SVG_DIR);
+ console.log(`Found ${svgFiles.length} SVG files in directory`);
+
+ // Files to delete
+ const filesToDelete: string[] = [];
+
+ // Check each SVG file
+ for (const file of svgFiles) {
+ if (!file.endsWith('.svg')) continue;
+
+ // Get the base name without extension
+ const baseName = file.replace('.svg', '');
+
+ // Convert any underscores to hyphens for comparison with metadata
+ const normalizedBaseName = baseName.replace(/_/g, '-');
+
+ // If not in valid names, mark for deletion
+ if (!validIconNames.has(normalizedBaseName)) {
+ filesToDelete.push(file);
+ }
+ }
+
+ // Delete unused files
+ console.log(`Found ${filesToDelete.length} unused SVG files to delete`);
+ for (const file of filesToDelete) {
+ const filePath = path.join(SVG_DIR, file);
+ await fs.promises.unlink(filePath);
+ console.log(`Deleted: ${file}`);
+ }
+
+ console.log('Cleanup completed successfully!');
+ console.log(`Deleted ${filesToDelete.length} unused SVG files`);
+
+ } catch (error) {
+ console.error('Error during cleanup:', error);
+ process.exit(1);
+ }
+}
+
+main();
\ No newline at end of file
diff --git a/web/src/scripts/download-icons.ts b/web/src/scripts/download-icons.ts
new file mode 100644
index 00000000..b2b13ac9
--- /dev/null
+++ b/web/src/scripts/download-icons.ts
@@ -0,0 +1,274 @@
+import fs from 'node:fs';
+import https from 'node:https';
+import path from 'node:path';
+
+// Import the SVG data
+// eslint-disable-next-line @typescript-eslint/no-var-requires
+const { svgs } = require('../lib/isvg') as { svgs: ISVG[] };
+
+// Define the ISVG interface
+interface ISVG {
+ title: string;
+ category: string | string[];
+ route: string | {
+ light?: string;
+ dark?: string;
+ };
+ wordmark?: string | {
+ light?: string;
+ dark?: string;
+ };
+ url?: string;
+ brandUrl?: string;
+}
+
+// Base URL for GitHub raw content
+const BASE_URL = 'https://raw.githubusercontent.com/pheralb/svgl/refs/heads/main/static';
+// Target directory (relative to the script location)
+const TARGET_DIR = path.join(__dirname, '../../..', 'svg');
+
+// Create the target directory if it doesn't exist
+if (!fs.existsSync(TARGET_DIR)) {
+ fs.mkdirSync(TARGET_DIR, { recursive: true });
+ console.log(`Created target directory: ${TARGET_DIR}`);
+}
+
+// Get a list of existing files in the target directory
+const existingFiles = fs.readdirSync(TARGET_DIR);
+console.log(`Found ${existingFiles.length} existing files in ${TARGET_DIR}`);
+
+// Helper function to download a file
+async function downloadFile(url: string, destPath: string): Promise {
+ return new Promise((resolve, reject) => {
+ const fileStream = fs.createWriteStream(destPath);
+ https.get(url, (response) => {
+ if (response.statusCode !== 200) {
+ fs.unlinkSync(destPath); // Remove the file if download failed
+ reject(new Error(`Failed to download ${url}: ${response.statusCode}`));
+ return;
+ }
+
+ response.pipe(fileStream);
+
+ fileStream.on('finish', () => {
+ fileStream.close();
+ resolve();
+ });
+
+ fileStream.on('error', (err) => {
+ fs.unlinkSync(destPath); // Remove the file if there was an error
+ reject(err);
+ });
+ }).on('error', (err) => {
+ fs.unlinkSync(destPath); // Remove the file if there was an error
+ reject(err);
+ });
+ });
+}
+
+// Helper function to get base icon name from route
+function getBaseIconName(route: string): string {
+ // Extract basename, remove -icon/-logo, replace underscores with hyphens
+ const filename = path.basename(route, '.svg')
+ .replace(/(-icon|-logo)$/g, '')
+ .replace(/_/g, '-');
+
+ // Remove light/dark suffixes to get the base name
+ return filename.replace(/-(light|dark)$/i, '');
+}
+
+// Map to store icon keys to their base names
+const iconKeyMap = new Map();
+
+// First pass to build the icon key map
+function buildIconKeyMap() {
+ for (const svg of svgs) {
+ let routePath: string;
+
+ if (typeof svg.route === 'string') {
+ routePath = svg.route;
+ } else if (svg.route.light) {
+ routePath = svg.route.light;
+ } else if (svg.route.dark) {
+ routePath = svg.route.dark || '';
+ } else {
+ routePath = '';
+ }
+
+ const baseIconName = getBaseIconName(routePath);
+ iconKeyMap.set(svg.title, baseIconName);
+ }
+}
+
+// Build the key map before processing
+buildIconKeyMap();
+
+// Helper function to check if a file already exists
+function fileExists(filename: string): boolean {
+ return existingFiles.includes(filename);
+}
+
+// Format URL correctly by joining BASE_URL with the route path
+function getFullUrl(route: string): string {
+ // Remove leading slash if present
+ const cleanRoute = route.startsWith('/') ? route.substring(1) : route;
+ return `${BASE_URL}/${cleanRoute}`;
+}
+
+// Process each SVG icon
+async function processIcons() {
+ let downloadCount = 0;
+ let skipCount = 0;
+ const failedDownloads: string[] = [];
+
+ for (const svg of svgs) {
+ try {
+ // Get base name for this icon
+ const baseIconName = iconKeyMap.get(svg.title) || '';
+
+ // Process the main route
+ if (typeof svg.route === 'string') {
+ // Simple string route - use base name
+ const filename = `${baseIconName}.svg`;
+ if (!fileExists(filename)) {
+ const url = getFullUrl(svg.route);
+ const destPath = path.join(TARGET_DIR, filename);
+
+ try {
+ await downloadFile(url, destPath);
+ console.log(`Downloaded: ${filename} (from ${path.basename(svg.route)})`);
+ downloadCount++;
+ } catch (error: unknown) {
+ const errorMessage = error instanceof Error ? error.message : String(error);
+ console.error(`Error downloading ${filename}: ${errorMessage}`);
+ failedDownloads.push(filename);
+ }
+ } else {
+ console.log(`Skipping existing file: ${filename}`);
+ skipCount++;
+ }
+ } else if (typeof svg.route === 'object') {
+ // Object with light/dark variants
+ if (svg.route.light) {
+ const filename = `${baseIconName}-light.svg`;
+ if (!fileExists(filename)) {
+ const url = getFullUrl(svg.route.light);
+ const destPath = path.join(TARGET_DIR, filename);
+
+ try {
+ await downloadFile(url, destPath);
+ console.log(`Downloaded: ${filename} (from ${path.basename(svg.route.light)})`);
+ downloadCount++;
+ } catch (error: unknown) {
+ const errorMessage = error instanceof Error ? error.message : String(error);
+ console.error(`Error downloading ${filename}: ${errorMessage}`);
+ failedDownloads.push(filename);
+ }
+ } else {
+ console.log(`Skipping existing file: ${filename}`);
+ skipCount++;
+ }
+ }
+
+ if (svg.route.dark) {
+ const filename = `${baseIconName}-dark.svg`;
+ if (!fileExists(filename)) {
+ const url = getFullUrl(svg.route.dark);
+ const destPath = path.join(TARGET_DIR, filename);
+
+ try {
+ await downloadFile(url, destPath);
+ console.log(`Downloaded: ${filename} (from ${path.basename(svg.route.dark)})`);
+ downloadCount++;
+ } catch (error: unknown) {
+ const errorMessage = error instanceof Error ? error.message : String(error);
+ console.error(`Error downloading ${filename}: ${errorMessage}`);
+ failedDownloads.push(filename);
+ }
+ } else {
+ console.log(`Skipping existing file: ${filename}`);
+ skipCount++;
+ }
+ }
+ }
+
+ // Process wordmark if present
+ if (svg.wordmark) {
+ if (typeof svg.wordmark === 'string') {
+ // Simple string wordmark
+ const filename = `${baseIconName}-wordmark.svg`;
+
+ // Download even if it exists because we want all wordmarks
+ const url = getFullUrl(svg.wordmark);
+ const destPath = path.join(TARGET_DIR, filename);
+
+ try {
+ await downloadFile(url, destPath);
+ console.log(`Downloaded wordmark: ${filename} (from ${path.basename(svg.wordmark)})`);
+ downloadCount++;
+ } catch (error: unknown) {
+ const errorMessage = error instanceof Error ? error.message : String(error);
+ console.error(`Error downloading wordmark ${filename}: ${errorMessage}`);
+ failedDownloads.push(filename);
+ }
+ } else if (typeof svg.wordmark === 'object') {
+ // Object with light/dark variants
+ if (svg.wordmark.light) {
+ const filename = `${baseIconName}-wordmark-light.svg`;
+
+ // Download even if it exists because we want all wordmarks
+ const url = getFullUrl(svg.wordmark.light);
+ const destPath = path.join(TARGET_DIR, filename);
+
+ try {
+ await downloadFile(url, destPath);
+ console.log(`Downloaded wordmark: ${filename} (from ${path.basename(svg.wordmark.light)})`);
+ downloadCount++;
+ } catch (error: unknown) {
+ const errorMessage = error instanceof Error ? error.message : String(error);
+ console.error(`Error downloading wordmark ${filename}: ${errorMessage}`);
+ failedDownloads.push(filename);
+ }
+ }
+
+ if (svg.wordmark.dark) {
+ const filename = `${baseIconName}-wordmark-dark.svg`;
+
+ // Download even if it exists because we want all wordmarks
+ const url = getFullUrl(svg.wordmark.dark);
+ const destPath = path.join(TARGET_DIR, filename);
+
+ try {
+ await downloadFile(url, destPath);
+ console.log(`Downloaded wordmark: ${filename} (from ${path.basename(svg.wordmark.dark)})`);
+ downloadCount++;
+ } catch (error: unknown) {
+ const errorMessage = error instanceof Error ? error.message : String(error);
+ console.error(`Error downloading wordmark ${filename}: ${errorMessage}`);
+ failedDownloads.push(filename);
+ }
+ }
+ }
+ }
+ } catch (error: unknown) {
+ const errorMessage = error instanceof Error ? error.message : String(error);
+ console.error(`Error processing ${svg.title}: ${errorMessage}`);
+ }
+ }
+
+ console.log('\nSummary:');
+ console.log(`Total icons processed: ${svgs.length}`);
+ console.log(`Downloaded: ${downloadCount}`);
+ console.log(`Skipped: ${skipCount}`);
+
+ if (failedDownloads.length > 0) {
+ console.log(`Failed downloads: ${failedDownloads.length}`);
+ console.log(`Failed files: ${failedDownloads.join(', ')}`);
+ }
+}
+
+// Run the script
+processIcons().catch(error => {
+ console.error('Error:', error);
+ process.exit(1);
+});
\ No newline at end of file
diff --git a/web/src/scripts/merge-icons.ts b/web/src/scripts/merge-icons.ts
new file mode 100644
index 00000000..2a0afd2a
--- /dev/null
+++ b/web/src/scripts/merge-icons.ts
@@ -0,0 +1,190 @@
+import fs from 'node:fs';
+import path from 'node:path';
+
+// Define the types
+interface ISVG {
+ title: string;
+ category: string | string[];
+ route: string | {
+ light?: string;
+ dark?: string;
+ };
+ wordmark?: string | {
+ light?: string;
+ dark?: string;
+ };
+ url?: string;
+ brandUrl?: string;
+}
+
+interface MetadataItem {
+ base: string;
+ aliases: string[];
+ categories: string[];
+ update: {
+ timestamp: string;
+ author: {
+ id: string;
+ name: string;
+ };
+ };
+ wordmark?: string | {
+ light: string;
+ dark: string;
+ };
+ colors?: {
+ dark: string;
+ light: string;
+ };
+}
+
+interface Metadata {
+ [key: string]: MetadataItem;
+}
+
+// Import the SVG data
+// eslint-disable-next-line @typescript-eslint/no-var-requires
+const { svgs } = require('../lib/isvg') as { svgs: ISVG[] };
+
+// Path to the metadata file (relative to the current script)
+const metadataPath = path.join(__dirname, '../../..', 'metadata.json');
+
+// Read existing metadata
+let metadata: Metadata = {};
+try {
+ const metadataContent = fs.readFileSync(metadataPath, 'utf8');
+ metadata = JSON.parse(metadataContent);
+} catch (error) {
+ console.error('Error reading metadata file:', error);
+ process.exit(1);
+}
+
+// The author details
+const author = {
+ id: 49837342,
+ name: "ajnart"
+};
+
+// The timestamp
+const timestamp = "2025-04-25T12:00:00Z";
+
+// Helper function to convert the author ID to string, since that's the expected type
+function getAuthorWithStringId(authorObj: { id: number | string; name: string }): { id: string; name: string } {
+ return {
+ ...authorObj,
+ id: String(authorObj.id)
+ };
+}
+
+// Convert iSVG format to metadata format
+for (const svg of svgs) {
+ // Extract the key from the route path
+ let routePath: string;
+
+ if (typeof svg.route === 'string') {
+ routePath = svg.route;
+ } else if (svg.route.light) {
+ routePath = svg.route.light;
+ } else if (svg.route.dark) {
+ routePath = svg.route.dark || '';
+ } else {
+ routePath = '';
+ }
+
+ // Get the filename without extension and remove suffixes
+ // Also replace underscores with hyphens
+ let key = path.basename(routePath, '.svg')
+ .replace(/(-icon|-logo)$/g, '')
+ .replace(/_/g, '-');
+
+ // Remove -light or -dark suffixes for the base key
+ key = key.replace(/-(light|dark)$/i, '');
+
+ // Check if the icon already exists
+ if (metadata[key]) {
+ console.log(`Icon "${svg.title}" already exists in metadata as "${key}"`);
+
+ // Update the existing entry with wordmark if it doesn't have one
+ if (svg.wordmark && !metadata[key].wordmark) {
+ console.log(`Adding wordmark to existing icon "${key}"`);
+
+ if (typeof svg.wordmark === 'string') {
+ // Instead of using the original wordmark name, use standardized naming
+ metadata[key].wordmark = `${key}-wordmark`;
+ } else if (typeof svg.wordmark === 'object') {
+ // Object with light/dark variants - use standardized naming
+ metadata[key].wordmark = {
+ light: svg.wordmark.light ? `${key}-wordmark-light` : '',
+ dark: svg.wordmark.dark ? `${key}-wordmark-dark` : ''
+ };
+ }
+
+ // Update the timestamp and author
+ metadata[key].update = {
+ timestamp,
+ author: getAuthorWithStringId(author)
+ };
+ }
+
+ // If route contains light/dark values, update colors with standardized naming
+ if (typeof svg.route === 'object' && (svg.route.light || svg.route.dark)) {
+ if (!metadata[key].colors) {
+ metadata[key].colors = {
+ dark: svg.route.dark ? `${key}-dark` : '',
+ light: svg.route.light ? `${key}-light` : ''
+ };
+ }
+ }
+ } else {
+ // Create a new metadata entry
+ const newEntry: MetadataItem = {
+ base: "svg", // Assuming SVG format
+ aliases: [],
+ categories: [],
+ update: {
+ timestamp,
+ author: getAuthorWithStringId(author)
+ }
+ };
+
+ // Handle categories
+ if (Array.isArray(svg.category)) {
+ newEntry.categories = svg.category;
+ } else if (typeof svg.category === 'string') {
+ newEntry.categories = [svg.category];
+ }
+
+ // Handle wordmark if present with standardized naming
+ if (svg.wordmark) {
+ if (typeof svg.wordmark === 'string') {
+ newEntry.wordmark = `${key}-wordmark`;
+ } else if (typeof svg.wordmark === 'object') {
+ newEntry.wordmark = {
+ light: svg.wordmark.light ? `${key}-wordmark-light` : '',
+ dark: svg.wordmark.dark ? `${key}-wordmark-dark` : ''
+ };
+ }
+ }
+
+ // Handle colors from route with standardized naming
+ if (typeof svg.route === 'object' && (svg.route.light || svg.route.dark)) {
+ newEntry.colors = {
+ dark: svg.route.dark ? `${key}-dark` : '',
+ light: svg.route.light ? `${key}-light` : ''
+ };
+ }
+
+ // Add to metadata
+ metadata[key] = newEntry;
+ console.log(`Added new icon "${svg.title}" as "${key}"`);
+ }
+}
+
+// Write the updated metadata back to the file
+try {
+ fs.writeFileSync(metadataPath, JSON.stringify(metadata, null, 4));
+ console.log(`Successfully updated metadata file at ${metadataPath}`);
+} catch (error) {
+ console.error('Error writing metadata file:', error);
+ process.exit(1);
+}
\ No newline at end of file
diff --git a/web/src/types/icons.ts b/web/src/types/icons.ts
index c16de1ea..6671eead 100644
--- a/web/src/types/icons.ts
+++ b/web/src/types/icons.ts
@@ -13,12 +13,18 @@ export type IconColors = {
light?: string
}
+export type IconWordmarkColors = {
+ dark?: string
+ light?: string
+}
+
export type Icon = {
base: string | "svg" | "png" | "webp"
aliases: string[]
categories: string[]
update: IconUpdate
colors?: IconColors
+ wordmark?: IconWordmarkColors
}
export type IconFile = {
diff --git a/web/src/types/svg.ts b/web/src/types/svg.ts
new file mode 100644
index 00000000..5bf52ee4
--- /dev/null
+++ b/web/src/types/svg.ts
@@ -0,0 +1,14 @@
+export type iSVG = {
+ title: string
+ category: string | string[]
+ route: string | {
+ light?: string
+ dark?: string
+ }
+ wordmark?: string | {
+ light?: string
+ dark?: string
+ }
+ url?: string
+ brandUrl?: string
+}
\ No newline at end of file