Awesome-omni-skill icons

SeekSaaS icon system guide covering @workspace/custom-icons package with Icons and AiIcons components

install
source · Clone the upstream repo
git clone https://github.com/diegosouzapw/awesome-omni-skill
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/diegosouzapw/awesome-omni-skill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/development/icons" ~/.claude/skills/diegosouzapw-awesome-omni-skill-icons && rm -rf "$T"
manifest: skills/development/icons/SKILL.md
source content

SeekSaaS Icons Guide

Overview

SeekSaaS provides a comprehensive icon system through the

@workspace/custom-icons
package. This package includes:

  • Icons: General-purpose icons for frameworks, tools, and platforms
  • AiIcons: AI-specific icons for AI providers and tools

Package Structure

packages/custom-icons/
├── src/
│   ├── index.tsx              # Main exports
│   ├── custom/                # General icons
│   │   └── index.tsx         # Icons object (100+ icons)
│   └── ai-icons/              # AI-specific icons
│       └── index.tsx         # AiIcons object
├── package.json
└── tsconfig.json

Installation

The package is already available in the monorepo. Import it into your feature or web app:

# Already available via workspace protocol
pnpm add @workspace/custom-icons

Usage

Basic Import

import { Icons } from "@workspace/custom-icons";
import { AiIcons } from "@workspace/custom-icons/ai-icons";

Using Icons

import { Icons } from "@workspace/custom-icons";

export function MyComponent() {
  return (
    <div>
      <Icons.react size={24} />
      <Icons.nextJS size={24} />
      <Icons.gitHub size={24} />
      <Icons.lucide size={24} />
    </div>
  );
}

Using AiIcons

import { AiIcons } from "@workspace/custom-icons/ai-icons";

export function AIComponent() {
  return (
    <div>
      <AiIcons.openai size={24} />
      <AiIcons.claude size={24} />
      <AiIcons.cursor size={24} />
    </div>
  );
}

Custom Props

Most icons accept SVG props:

<Icons.react 
  size={48}
  className="text-blue-500"
  onClick={() => console.log("clicked")}
/>

<AiIcons.cursor 
  width={64}
  height={64}
  style={{ color: "#000" }}
/>

Icons Collection

Framework Icons

IconNameUsage
Icons.nextJS
Next.js
Icons.nuxt
Nuxt.js
Icons.svelteKit
SvelteKit
Icons.solidStart
SolidStart
Icons.react
React
Icons.vue
Vue.js
Icons.astro
Astro
Icons.remix
Remix
Icons.reactRouter
React Router
Icons.expo
Expo
Icons.hono
Hono
Icons.fastify
Fastify
Icons.express
Express
Icons.elysia
Elysia
Icons.node
Node.js

Database & ORM Icons

IconNameUsage
Icons.prisma
Prisma
Icons.drizzle
Drizzle ORM
Icons.tanstack
TanStack

Tooling Icons

IconNameUsage
Icons.biomejs
Biome
Icons.turborepo
Turborepo
Icons.pnpm
pnpm
Icons.yarn
Yarn
Icons.npm
npm
Icons.vite
Vite
Icons.vercel
Vercel

UI Framework Icons

IconNameUsage
Icons.shadcn
shadcn/ui
Icons.radix
Radix UI
Icons.tailwind
Tailwind CSS
Icons.tailark
TailArk
Icons.magicui
Magic UI

Auth & Payment Icons

IconNameUsage
Icons.betterAuth
Better Auth
Icons.stripe
Stripe
Icons.paypal
PayPal
Icons.alipay
Alipay
Icons.wechatpay
WeChat Pay

Cloud & Deployment Icons

IconNameUsage
Icons.cloudflare
Cloudflare
Icons.aws
AWS
Icons.docker
Docker

Social Icons

IconNameUsage
Icons.gitHub
GitHub
Icons.x
Twitter/X
Icons.linkedIn
LinkedIn
Icons.vk
VK
Icons.discord
Discord
Icons.youtube
YouTube
Icons.google
Google
Icons.apple
Apple

Language Icons

IconNameUsage
Icons.ts
TypeScript
Icons.javascript
JavaScript
Icons.css
CSS
Icons.json
JSON
Icons.bash
Bash

Animation Icons

IconNameUsage
Icons.motion
Framer Motion

Documentation Icons

IconNameUsage
Icons.fumadocs
Fumadocs
Icons.book
Generic book
Icons.aria
ARIA

Other Icons

IconNameUsage
Icons.lucide
Lucide
Icons.v0
v0
Icons.creem
Creem
Icons.nitro
Nitro
Icons.inlang
inlang
Icons.i18next
i18next

AiIcons Collection

AI IDEs & Editors

IconNameUsage
AiIcons.cursor
Cursor IDE
AiIcons.vscode
VS Code
AiIcons.copilot
GitHub Copilot
AiIcons.zed
Zed Editor
AiIcons.windsurf
WindSurf

AI Providers

IconNameUsage
AiIcons.openai
OpenAI (ChatGPT)
AiIcons.claude
Claude (Anthropic)
AiIcons.gemini
Gemini (Google)
AiIcons.deepseek
DeepSeek
AiIcons.xai
xAI (Grok)

AI Concepts

IconNameUsage
AiIcons.vibe
Vibe coding
AiIcons.mcp
MCP (Model Context Protocol)

OpenCode

IconNameUsage
AiIcons.opencode
OpenCode

Using with Tailwind CSS

Combine icons with Tailwind CSS classes:

import { Icons } from "@workspace/custom-icons";

export function IconButton({ icon, label }: { icon: keyof typeof Icons; label: string }) {
  const IconComponent = Icons[icon];

  return (
    <button className="flex items-center gap-2 px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600 transition-colors">
      <IconComponent size={20} />
      <span>{label}</span>
    </button>
  );
}

Color Customization

// Using className for colors
<Icons.react className="text-blue-500" size={32} />
<Icons.gitHub className="text-gray-900 dark:text-white" size={24} />

// Using style prop
<Icons.nextJS style={{ color: "#000000" }} size={32} />

Size Customization

<Icons.lucide size={16} />  // Small
<Icons.lucide size={24} />  // Medium (default)
<Icons.lucide size={32} />  // Large
<Icons.lucide size={48} />  // Extra large

Creating New Icons

Adding to Icons Object

Edit

packages/custom-icons/src/custom/index.tsx
:

import { SiNewTool } from "react-icons/si";

export const Icons = {
  // ... existing icons
  newTool: SiNewTool,
};

Adding to AiIcons Object

Edit

packages/custom-icons/src/ai-icons/index.tsx
:

import { SiNewAI } from "react-icons/si";

export const AiIcons = {
  // ... existing icons
  newAI: (props: SVGProps<SVGSVGElement>) => (
    <svg {...props}>
      <path d="..." fill="currentColor" />
    </svg>
  ),
};

Creating Custom SVG Icons

import { cn } from "@workspace/ui/lib/utils";
import type { SVGProps } from "react";

export const Icons = {
  customIcon: ({ className, ...props }: SVGProps<SVGSVGElement>) => (
    <svg
      viewBox="0 0 24 24"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn("size-4", className)}
      {...props}
    >
      <path d="M12 2L2 7l10 5 10-5-10-5z" fill="currentColor" />
      <path d="M2 17l10 5 10-5" stroke="currentColor" strokeWidth={2} />
      <path d="M2 12l10 5 10-5" stroke="currentColor" strokeWidth={2} />
    </svg>
  ),
};

Icon Size Reference

Use consistent sizes across the application:

SizeUsageExample
16Small (labels, badges)
<Icons.icon size={16} />
20Buttons, small UI
<Icons.icon size={20} />
24Standard (most common)
<Icons.icon size={24} />
32Cards, sections
<Icons.icon size={32} />
48Hero sections
<Icons.icon size={48} />
64Feature highlights
<Icons.icon size={64} />

Accessibility

Icons should be accessible when used meaningfully:

// Decorative icons (screen reader can skip)
<Icons.gitHub aria-hidden="true" />

// Interactive icons (with label)
<button aria-label="GitHub">
  <Icons.gitHub size={24} />
</button>

// Informational icons (with description)
<div role="img" aria-label="Status: Online" aria-description="Green checkmark indicating system is operational">
  <Icons.checkCircle className="text-green-500" size={24} />
</div>

Performance Tips

Tree Shaking

The icons are exported as an object, so importing the entire module is efficient. For best results:

// Good - import what you need
import { Icons } from "@workspace/custom-icons";
const { react, vue } = Icons;

// Avoid - this still works but imports more
import * as AllIcons from "@workspace/custom-icons";

Memoization for Frequently Used Icons

import { memo } from "react";
import { Icons } from "@workspace/custom-icons";

const ReactIcon = memo(Icons.react);
const VueIcon = memo(Icons.vue);

export function IconGrid() {
  return (
    <div className="grid grid-cols-4 gap-4">
      <ReactIcon size={32} />
      <VueIcon size={32} />
    </div>
  );
}

Common Patterns

Icon Button

import { Icons } from "@workspace/custom-icons";
import { Button } from "@workspace/ui/components/ui/button";
import { cn } from "@workspace/ui/lib/utils";

interface IconButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
  icon: keyof typeof Icons;
  variant?: "default" | "ghost" | "outline";
  size?: "sm" | "md" | "lg";
}

export function IconButton({ icon, variant = "default", size = "md", className, ...props }: IconButtonProps) {
  const IconComponent = Icons[icon];
  const sizeMap = { sm: 16, md: 20, lg: 24 };

  return (
    <Button variant={variant} size="icon" className={cn("h-9 w-9", className)} {...props}>
      <IconComponent size={sizeMap[size]} />
    </Button>
  );
}

Icon Badge

import { Icons } from "@workspace/custom-icons";

export function IconBadge({ icon, label, color }: { icon: keyof typeof Icons; label: string; color: string }) {
  const IconComponent = Icons[icon];

  return (
    <span className={cn("inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs font-medium", color)}>
      <IconComponent size={14} />
      {label}
    </span>
  );
}

Icon Card

import { Icons } from "@workspace/custom-icons";

export function TechCard({ name, icon, description }: { name: string; icon: keyof typeof Icons; description: string }) {
  const IconComponent = Icons[icon];

  return (
    <div className="p-4 border rounded-lg hover:shadow-lg transition-shadow">
      <IconComponent size={48} className="mb-3 text-blue-500" />
      <h3 className="font-semibold">{name}</h3>
      <p className="text-sm text-muted-foreground">{description}</p>
    </div>
  );
}

TypeScript Support

Full TypeScript support with type inference:

import { Icons, AiIcons } from "@workspace/custom-icons";

// Type-safe icon access
const iconName: keyof typeof Icons = "react";
const aiIconName: keyof typeof AiIcons = "claude";

// These will be typed correctly
const Icon = Icons[iconName];
const AiIcon = AiIcons[aiIconName];

Dependencies

{
  "dependencies": {
    "@workspace/ui": "workspace:*",
    "class-variance-authority": "^0.7.1",
    "react-icons": "^5.5.0"
  }
}
  • react-icons: Provides the underlying icon components (Feather, Font Awesome, etc.)
  • @workspace/ui: For utility functions like
    cn()
    for class name merging

Resources