diff --git a/apps/web/next.config.mjs b/apps/web/next.config.mjs
index ef0a97c..93355f1 100644
--- a/apps/web/next.config.mjs
+++ b/apps/web/next.config.mjs
@@ -9,6 +9,7 @@ const config = {
remotePatterns: [
{ protocol: "https", hostname: "pbs.twimg.com" },
{ protocol: "https", hostname: "abs.twimg.com" },
+ { protocol: "https", hostname: "r2.better-t-stack.dev" },
],
},
outputFileTracingExcludes: {
diff --git a/apps/web/public/icon/better-auth.svg b/apps/web/public/icon/better-auth.svg
deleted file mode 100644
index 6d00383..0000000
--- a/apps/web/public/icon/better-auth.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/apps/web/public/icon/biome.svg b/apps/web/public/icon/biome.svg
deleted file mode 100644
index 05fa79c..0000000
--- a/apps/web/public/icon/biome.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
diff --git a/apps/web/public/icon/bun.svg b/apps/web/public/icon/bun.svg
deleted file mode 100644
index 02a55d5..0000000
--- a/apps/web/public/icon/bun.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/apps/web/public/icon/convex.svg b/apps/web/public/icon/convex.svg
deleted file mode 100644
index 8622c4c..0000000
--- a/apps/web/public/icon/convex.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-
diff --git a/apps/web/public/icon/docker.svg b/apps/web/public/icon/docker.svg
deleted file mode 100644
index 2e0703d..0000000
--- a/apps/web/public/icon/docker.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
diff --git a/apps/web/public/icon/drizzle-light.svg b/apps/web/public/icon/drizzle-light.svg
deleted file mode 100644
index 1d7ced1..0000000
--- a/apps/web/public/icon/drizzle-light.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/apps/web/public/icon/drizzle.svg b/apps/web/public/icon/drizzle.svg
deleted file mode 100644
index 8596582..0000000
--- a/apps/web/public/icon/drizzle.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/apps/web/public/icon/elysia.svg b/apps/web/public/icon/elysia.svg
deleted file mode 100644
index 0497dcc..0000000
--- a/apps/web/public/icon/elysia.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/apps/web/public/icon/expo.svg b/apps/web/public/icon/expo.svg
deleted file mode 100644
index 07df455..0000000
--- a/apps/web/public/icon/expo.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
diff --git a/apps/web/public/icon/express-light.svg b/apps/web/public/icon/express-light.svg
deleted file mode 100644
index 4dc0362..0000000
--- a/apps/web/public/icon/express-light.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/apps/web/public/icon/express.svg b/apps/web/public/icon/express.svg
deleted file mode 100644
index 0ee1e44..0000000
--- a/apps/web/public/icon/express.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/apps/web/public/icon/fastify.svg b/apps/web/public/icon/fastify.svg
deleted file mode 100644
index 51728e5..0000000
--- a/apps/web/public/icon/fastify.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
diff --git a/apps/web/public/icon/git.svg b/apps/web/public/icon/git.svg
deleted file mode 100644
index 4e5fe8e..0000000
--- a/apps/web/public/icon/git.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
diff --git a/apps/web/public/icon/hono.svg b/apps/web/public/icon/hono.svg
deleted file mode 100644
index 9fffa74..0000000
--- a/apps/web/public/icon/hono.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/apps/web/public/icon/mongodb.svg b/apps/web/public/icon/mongodb.svg
deleted file mode 100644
index 5999461..0000000
--- a/apps/web/public/icon/mongodb.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/apps/web/public/icon/mongoose.svg b/apps/web/public/icon/mongoose.svg
deleted file mode 100644
index f84bcc2..0000000
--- a/apps/web/public/icon/mongoose.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
diff --git a/apps/web/public/icon/mysql.svg b/apps/web/public/icon/mysql.svg
deleted file mode 100644
index cafe01c..0000000
--- a/apps/web/public/icon/mysql.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
diff --git a/apps/web/public/icon/neon.svg b/apps/web/public/icon/neon.svg
deleted file mode 100644
index ddc31f9..0000000
--- a/apps/web/public/icon/neon.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/apps/web/public/icon/nextjs.svg b/apps/web/public/icon/nextjs.svg
deleted file mode 100644
index e2da0ad..0000000
--- a/apps/web/public/icon/nextjs.svg
+++ /dev/null
@@ -1,20 +0,0 @@
-
diff --git a/apps/web/public/icon/node.svg b/apps/web/public/icon/node.svg
deleted file mode 100644
index d92d02b..0000000
--- a/apps/web/public/icon/node.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/apps/web/public/icon/nuxt.svg b/apps/web/public/icon/nuxt.svg
deleted file mode 100644
index 81b2e6f..0000000
--- a/apps/web/public/icon/nuxt.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/apps/web/public/icon/orpc.svg b/apps/web/public/icon/orpc.svg
deleted file mode 100644
index 74e4801..0000000
--- a/apps/web/public/icon/orpc.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
diff --git a/apps/web/public/icon/pnpm.svg b/apps/web/public/icon/pnpm.svg
deleted file mode 100644
index 18b08ef..0000000
--- a/apps/web/public/icon/pnpm.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/apps/web/public/icon/postgres.svg b/apps/web/public/icon/postgres.svg
deleted file mode 100644
index 916884c..0000000
--- a/apps/web/public/icon/postgres.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/apps/web/public/icon/prisma-light.svg b/apps/web/public/icon/prisma-light.svg
deleted file mode 100644
index 3210efa..0000000
--- a/apps/web/public/icon/prisma-light.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/apps/web/public/icon/prisma.svg b/apps/web/public/icon/prisma.svg
deleted file mode 100644
index ceffb2f..0000000
--- a/apps/web/public/icon/prisma.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/apps/web/public/icon/react-router.svg b/apps/web/public/icon/react-router.svg
deleted file mode 100644
index 7782575..0000000
--- a/apps/web/public/icon/react-router.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-
diff --git a/apps/web/public/icon/solid.svg b/apps/web/public/icon/solid.svg
deleted file mode 100644
index dd92ac8..0000000
--- a/apps/web/public/icon/solid.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/apps/web/public/icon/sqlite.svg b/apps/web/public/icon/sqlite.svg
deleted file mode 100644
index 7e21294..0000000
--- a/apps/web/public/icon/sqlite.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-
diff --git a/apps/web/public/icon/starlight.svg b/apps/web/public/icon/starlight.svg
deleted file mode 100644
index 1d9c277..0000000
--- a/apps/web/public/icon/starlight.svg
+++ /dev/null
@@ -1,18 +0,0 @@
-
diff --git a/apps/web/public/icon/supabase.svg b/apps/web/public/icon/supabase.svg
deleted file mode 100644
index 574f67e..0000000
--- a/apps/web/public/icon/supabase.svg
+++ /dev/null
@@ -1,15 +0,0 @@
-
diff --git a/apps/web/public/icon/svelte.svg b/apps/web/public/icon/svelte.svg
deleted file mode 100644
index 2c0cd42..0000000
--- a/apps/web/public/icon/svelte.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/apps/web/public/icon/tanstack.svg b/apps/web/public/icon/tanstack.svg
deleted file mode 100644
index 2216a59..0000000
--- a/apps/web/public/icon/tanstack.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/apps/web/public/icon/tauri.svg b/apps/web/public/icon/tauri.svg
deleted file mode 100644
index e054c5c..0000000
--- a/apps/web/public/icon/tauri.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/apps/web/public/icon/trpc.svg b/apps/web/public/icon/trpc.svg
deleted file mode 100644
index 150908c..0000000
--- a/apps/web/public/icon/trpc.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/apps/web/public/icon/turborepo.svg b/apps/web/public/icon/turborepo.svg
deleted file mode 100644
index 0cebcb4..0000000
--- a/apps/web/public/icon/turborepo.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/apps/web/public/icon/turso.svg b/apps/web/public/icon/turso.svg
deleted file mode 100644
index 67939d7..0000000
--- a/apps/web/public/icon/turso.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/apps/web/public/icon/ultracite.svg b/apps/web/public/icon/ultracite.svg
deleted file mode 100644
index bc64ca7..0000000
--- a/apps/web/public/icon/ultracite.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-
diff --git a/apps/web/public/icon/workers.svg b/apps/web/public/icon/workers.svg
deleted file mode 100644
index 0eb6672..0000000
--- a/apps/web/public/icon/workers.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/apps/web/public/image.jpg b/apps/web/public/image.jpg
deleted file mode 100644
index 4435c7d..0000000
Binary files a/apps/web/public/image.jpg and /dev/null differ
diff --git a/apps/web/src/app/(home)/_components/FeatureCard.tsx b/apps/web/src/app/(home)/_components/FeatureCard.tsx
index 0b62826..4fc1f08 100644
--- a/apps/web/src/app/(home)/_components/FeatureCard.tsx
+++ b/apps/web/src/app/(home)/_components/FeatureCard.tsx
@@ -3,7 +3,7 @@
import { motion } from "motion/react";
import Image from "next/image";
import { useTheme } from "next-themes";
-import { useEffect, useState } from "react";
+
import { ScrollArea } from "@/components/ui/scroll-area";
import { cn } from "@/lib/utils";
@@ -29,44 +29,46 @@ function TechIcon({
name: string;
className?: string;
}) {
- const [mounted, setMounted] = useState(false);
const { theme } = useTheme();
- useEffect(() => {
- setMounted(true);
- }, []);
-
- if (mounted && icon.startsWith("/icon/")) {
- if (
- theme === "light" &&
- (icon.includes("drizzle") ||
- icon.includes("prisma") ||
- icon.includes("express"))
- ) {
- icon = icon.replace(".svg", "-light.svg");
- }
+ // If no icon, return empty
+ if (!icon) return null;
+ // If it's an emoji or text icon, render as span
+ if (!icon.startsWith("https://")) {
return (
-
+
+ {icon}
+
);
}
+ // Handle light theme variants
+ let iconSrc = icon;
+ if (
+ theme === "light" &&
+ (icon.includes("drizzle") ||
+ icon.includes("prisma") ||
+ icon.includes("express"))
+ ) {
+ iconSrc = icon.replace(".svg", "-light.svg");
+ }
+
+ // Render as image
return (
-
- {icon}
-
+
);
}
diff --git a/apps/web/src/app/(home)/_components/footer.tsx b/apps/web/src/app/(home)/_components/footer.tsx
index e00a776..bfa4651 100644
--- a/apps/web/src/app/(home)/_components/footer.tsx
+++ b/apps/web/src/app/(home)/_components/footer.tsx
@@ -1,5 +1,7 @@
import { Github } from "lucide-react";
+import Image from "next/image";
import Link from "next/link";
+import npmIcon from "@/public/icon/npm.svg";
const Footer = () => {
return (
@@ -26,18 +28,10 @@ const Footer = () => {
-
+
diff --git a/apps/web/src/app/(home)/_components/stack-builder.tsx b/apps/web/src/app/(home)/_components/stack-builder.tsx
index a09a903..f3df09b 100644
--- a/apps/web/src/app/(home)/_components/stack-builder.tsx
+++ b/apps/web/src/app/(home)/_components/stack-builder.tsx
@@ -138,39 +138,37 @@ function TechIcon({
name: string;
className?: string;
}) {
- const [mounted, setMounted] = useState(false);
const { theme } = useTheme();
- useEffect(() => {
- setMounted(true);
- }, []);
-
- if (mounted && icon.startsWith("/icon/")) {
- if (
- theme === "light" &&
- (icon.includes("drizzle") ||
- icon.includes("prisma") ||
- icon.includes("express"))
- ) {
- icon = icon.replace(".svg", "-light.svg");
- }
+ if (!icon) return null;
+ if (!icon.startsWith("https://")) {
return (
-
+
+ {icon}
+
);
}
+ let iconSrc = icon;
+ if (
+ theme === "light" &&
+ (icon.includes("drizzle") ||
+ icon.includes("prisma") ||
+ icon.includes("express"))
+ ) {
+ iconSrc = icon.replace(".svg", "-light.svg");
+ }
+
return (
-
- {icon}
-
+
);
}
@@ -1202,12 +1200,7 @@ const StackBuilder = () => {
)}
{tech.name}
@@ -1236,9 +1229,7 @@ const StackBuilder = () => {
getBadgeColors(category),
)}
>
- {tech.icon !== "" && (
-
- )}
+
{tech.name}
,
);
diff --git a/apps/web/src/app/(home)/analytics/page.tsx b/apps/web/src/app/(home)/analytics/page.tsx
index 28b5113..66af6a4 100644
--- a/apps/web/src/app/(home)/analytics/page.tsx
+++ b/apps/web/src/app/(home)/analytics/page.tsx
@@ -24,7 +24,7 @@ import {
ChartTooltip,
ChartTooltipContent,
} from "@/components/ui/chart";
-import discordLogo from "@/public/icon/discord.svg";
+import discordIcon from "@/public/icon/discord.svg";
import Footer from "../_components/footer";
interface AggregatedAnalyticsData {
@@ -650,7 +650,7 @@ export default function AnalyticsPage() {
diff --git a/apps/web/src/lib/constant.ts b/apps/web/src/lib/constant.ts
index d68a7f4..9ae592f 100644
--- a/apps/web/src/lib/constant.ts
+++ b/apps/web/src/lib/constant.ts
@@ -1,5 +1,7 @@
import type { TechCategory } from "./types";
+export const ICON_BASE_URL = "https://r2.better-t-stack.dev/icons";
+
export const TECH_OPTIONS: Record<
TechCategory,
{
@@ -17,7 +19,7 @@ export const TECH_OPTIONS: Record<
id: "trpc",
name: "tRPC",
description: "End-to-end typesafe APIs",
- icon: "/icon/trpc.svg",
+ icon: `${ICON_BASE_URL}/trpc.svg`,
color: "from-blue-500 to-blue-700",
default: true,
},
@@ -25,7 +27,7 @@ export const TECH_OPTIONS: Record<
id: "orpc",
name: "oRPC",
description: "Typesafe APIs Made Simple",
- icon: "/icon/orpc.svg",
+ icon: `${ICON_BASE_URL}/orpc.svg`,
color: "from-indigo-400 to-indigo-600",
},
{
@@ -41,7 +43,7 @@ export const TECH_OPTIONS: Record<
id: "tanstack-router",
name: "TanStack Router",
description: "Modern type-safe router for React",
- icon: "/icon/tanstack.svg",
+ icon: `${ICON_BASE_URL}/tanstack.svg`,
color: "from-blue-400 to-blue-600",
default: true,
},
@@ -49,7 +51,7 @@ export const TECH_OPTIONS: Record<
id: "react-router",
name: "React Router",
description: "Declarative routing for React",
- icon: "/icon/react-router.svg",
+ icon: `${ICON_BASE_URL}/react-router.svg`,
color: "from-cyan-400 to-cyan-600",
default: false,
},
@@ -58,7 +60,7 @@ export const TECH_OPTIONS: Record<
name: "TanStack Start (vite)",
description:
"Full-stack React and Solid framework powered by TanStack Router",
- icon: "/icon/tanstack.svg",
+ icon: `${ICON_BASE_URL}/tanstack.svg`,
color: "from-purple-400 to-purple-600",
default: false,
},
@@ -66,7 +68,7 @@ export const TECH_OPTIONS: Record<
id: "next",
name: "Next.js",
description: "React framework with hybrid rendering",
- icon: "/icon/nextjs.svg",
+ icon: `${ICON_BASE_URL}/nextjs.svg`,
color: "from-gray-700 to-black",
default: false,
},
@@ -74,7 +76,7 @@ export const TECH_OPTIONS: Record<
id: "nuxt",
name: "Nuxt",
description: "Vue full-stack framework (SSR, SSG, hybrid)",
- icon: "/icon/nuxt.svg",
+ icon: `${ICON_BASE_URL}/nuxt.svg`,
color: "from-green-400 to-green-700",
default: false,
},
@@ -82,7 +84,7 @@ export const TECH_OPTIONS: Record<
id: "svelte",
name: "Svelte",
description: "Cybernetically enhanced web apps",
- icon: "/icon/svelte.svg",
+ icon: `${ICON_BASE_URL}/svelte.svg`,
color: "from-orange-500 to-orange-700",
default: false,
},
@@ -90,7 +92,7 @@ export const TECH_OPTIONS: Record<
id: "solid",
name: "Solid",
description: "Simple and performant reactivity for building UIs",
- icon: "/icon/solid.svg",
+ icon: `${ICON_BASE_URL}/solid.svg`,
color: "from-blue-600 to-blue-800",
default: false,
},
@@ -108,7 +110,7 @@ export const TECH_OPTIONS: Record<
id: "native-nativewind",
name: "React Native + NativeWind",
description: "Expo with NativeWind (Tailwind)",
- icon: "/icon/expo.svg",
+ icon: `${ICON_BASE_URL}/expo.svg`,
color: "from-purple-400 to-purple-600",
className: "invert-0 dark:invert",
default: false,
@@ -117,7 +119,7 @@ export const TECH_OPTIONS: Record<
id: "native-unistyles",
name: "React Native + Unistyles",
description: "Expo with Unistyles",
- icon: "/icon/expo.svg",
+ icon: `${ICON_BASE_URL}/expo.svg`,
color: "from-pink-400 to-pink-600",
className: "invert-0 dark:invert",
default: false,
@@ -136,7 +138,7 @@ export const TECH_OPTIONS: Record<
id: "bun",
name: "Bun",
description: "Fast JavaScript runtime & toolkit",
- icon: "/icon/bun.svg",
+ icon: `${ICON_BASE_URL}/bun.svg`,
color: "from-amber-400 to-amber-600",
default: true,
},
@@ -144,14 +146,14 @@ export const TECH_OPTIONS: Record<
id: "node",
name: "Node.js",
description: "JavaScript runtime environment",
- icon: "/icon/node.svg",
+ icon: `${ICON_BASE_URL}/node.svg`,
color: "from-green-400 to-green-600",
},
{
id: "workers",
name: "Cloudflare Workers",
description: "Serverless runtime for the edge",
- icon: "/icon/workers.svg",
+ icon: `${ICON_BASE_URL}/workers.svg`,
color: "from-orange-400 to-orange-600",
},
{
@@ -167,7 +169,7 @@ export const TECH_OPTIONS: Record<
id: "hono",
name: "Hono",
description: "Ultrafast web framework",
- icon: "/icon/hono.svg",
+ icon: `${ICON_BASE_URL}/hono.svg`,
color: "from-blue-500 to-blue-700",
default: true,
},
@@ -175,35 +177,35 @@ export const TECH_OPTIONS: Record<
id: "next",
name: "Next.js",
description: "App Router and API Routes",
- icon: "/icon/nextjs.svg",
+ icon: `${ICON_BASE_URL}/nextjs.svg`,
color: "from-gray-700 to-black",
},
{
id: "elysia",
name: "Elysia",
description: "TypeScript web framework",
- icon: "/icon/elysia.svg",
+ icon: `${ICON_BASE_URL}/elysia.svg`,
color: "from-purple-500 to-purple-700",
},
{
id: "express",
name: "Express",
description: "Popular Node.js framework",
- icon: "/icon/express.svg",
+ icon: `${ICON_BASE_URL}/express.svg`,
color: "from-gray-500 to-gray-700",
},
{
id: "fastify",
name: "Fastify",
description: "Fast, low-overhead web framework for Node.js",
- icon: "/icon/fastify.svg",
+ icon: `${ICON_BASE_URL}/fastify.svg`,
color: "from-gray-500 to-gray-700",
},
{
id: "convex",
name: "Convex",
description: "Reactive backend-as-a-service",
- icon: "/icon/convex.svg",
+ icon: `${ICON_BASE_URL}/convex.svg`,
color: "from-pink-500 to-pink-700",
},
{
@@ -219,7 +221,7 @@ export const TECH_OPTIONS: Record<
id: "sqlite",
name: "SQLite",
description: "File-based SQL database",
- icon: "/icon/sqlite.svg",
+ icon: `${ICON_BASE_URL}/sqlite.svg`,
color: "from-blue-400 to-cyan-500",
default: true,
},
@@ -227,21 +229,21 @@ export const TECH_OPTIONS: Record<
id: "postgres",
name: "PostgreSQL",
description: "Advanced SQL database",
- icon: "/icon/postgres.svg",
+ icon: `${ICON_BASE_URL}/postgres.svg`,
color: "from-indigo-400 to-indigo-600",
},
{
id: "mysql",
name: "MySQL",
description: "Popular relational database",
- icon: "/icon/mysql.svg",
+ icon: `${ICON_BASE_URL}/mysql.svg`,
color: "from-blue-500 to-blue-700",
},
{
id: "mongodb",
name: "MongoDB",
description: "NoSQL document database",
- icon: "/icon/mongodb.svg",
+ icon: `${ICON_BASE_URL}/mongodb.svg`,
color: "from-green-400 to-green-600",
},
{
@@ -257,7 +259,7 @@ export const TECH_OPTIONS: Record<
id: "drizzle",
name: "Drizzle",
description: "TypeScript ORM",
- icon: "/icon/drizzle.svg",
+ icon: `${ICON_BASE_URL}/drizzle.svg`,
color: "from-cyan-400 to-cyan-600",
default: true,
},
@@ -265,14 +267,14 @@ export const TECH_OPTIONS: Record<
id: "prisma",
name: "Prisma",
description: "Next-gen ORM",
- icon: "/icon/prisma.svg",
+ icon: `${ICON_BASE_URL}/prisma.svg`,
color: "from-purple-400 to-purple-600",
},
{
id: "mongoose",
name: "Mongoose",
description: "Elegant object modeling tool",
- icon: "/icon/mongoose.svg",
+ icon: `${ICON_BASE_URL}/mongoose.svg`,
color: "from-blue-400 to-blue-600",
},
{
@@ -288,49 +290,49 @@ export const TECH_OPTIONS: Record<
id: "turso",
name: "Turso",
description: "SQLite cloud database powered by libSQL",
- icon: "/icon/turso.svg",
+ icon: `${ICON_BASE_URL}/turso.svg`,
color: "from-pink-400 to-pink-600",
},
{
id: "d1",
name: "Cloudflare D1",
description: "Serverless SQLite database on Cloudflare Workers",
- icon: "/icon/workers.svg",
+ icon: `${ICON_BASE_URL}/workers.svg`,
color: "from-orange-400 to-orange-600",
},
{
id: "neon",
name: "Neon Postgres",
description: "Serverless PostgreSQL with Neon",
- icon: "/icon/neon.svg",
+ icon: `${ICON_BASE_URL}/neon.svg`,
color: "from-blue-400 to-blue-600",
},
{
id: "prisma-postgres",
name: "Prisma PostgreSQL",
description: "Set up PostgreSQL with Prisma",
- icon: "/icon/prisma.svg",
+ icon: `${ICON_BASE_URL}/prisma.svg`,
color: "from-indigo-400 to-indigo-600",
},
{
id: "mongodb-atlas",
name: "MongoDB Atlas",
description: "Cloud MongoDB setup with Atlas",
- icon: "/icon/mongodb.svg",
+ icon: `${ICON_BASE_URL}/mongodb.svg`,
color: "from-green-400 to-green-600",
},
{
id: "supabase",
name: "Supabase",
description: "Local Supabase stack (requires Docker)",
- icon: "/icon/supabase.svg",
+ icon: `${ICON_BASE_URL}/supabase.svg`,
color: "from-emerald-400 to-emerald-600",
},
{
id: "docker",
name: "Docker",
description: "Local database with Docker Compose",
- icon: "/icon/docker.svg",
+ icon: `${ICON_BASE_URL}/docker.svg`,
color: "from-blue-500 to-blue-700",
},
{
@@ -347,7 +349,7 @@ export const TECH_OPTIONS: Record<
id: "workers",
name: "Cloudflare Workers",
description: "Deploy to Cloudflare Workers",
- icon: "/icon/workers.svg",
+ icon: `${ICON_BASE_URL}/workers.svg`,
color: "from-orange-400 to-orange-600",
},
{
@@ -364,7 +366,7 @@ export const TECH_OPTIONS: Record<
id: "true",
name: "Better Auth",
description: "Simple authentication",
- icon: "/icon/better-auth.svg",
+ icon: `${ICON_BASE_URL}/better-auth.svg`,
color: "from-green-400 to-green-600",
default: true,
},
@@ -381,7 +383,7 @@ export const TECH_OPTIONS: Record<
id: "npm",
name: "npm",
description: "Default package manager",
- icon: "/icon/npm.svg",
+ icon: `${ICON_BASE_URL}/npm.svg`,
color: "from-red-500 to-red-700",
className: "invert-0 dark:invert",
},
@@ -389,14 +391,14 @@ export const TECH_OPTIONS: Record<
id: "pnpm",
name: "pnpm",
description: "Fast, disk space efficient",
- icon: "/icon/pnpm.svg",
+ icon: `${ICON_BASE_URL}/pnpm.svg`,
color: "from-orange-500 to-orange-700",
},
{
id: "bun",
name: "bun",
description: "All-in-one toolkit",
- icon: "/icon/bun.svg",
+ icon: `${ICON_BASE_URL}/bun.svg`,
color: "from-amber-500 to-amber-700",
default: true,
},
@@ -414,7 +416,7 @@ export const TECH_OPTIONS: Record<
id: "tauri",
name: "Tauri",
description: "Build native desktop apps",
- icon: "/icon/tauri.svg",
+ icon: `${ICON_BASE_URL}/tauri.svg`,
color: "from-amber-500 to-amber-700",
default: false,
},
@@ -422,7 +424,7 @@ export const TECH_OPTIONS: Record<
id: "starlight",
name: "Starlight",
description: "Build stellar docs with astro",
- icon: "/icon/starlight.svg",
+ icon: `${ICON_BASE_URL}/starlight.svg`,
color: "from-teal-500 to-teal-700",
default: false,
},
@@ -430,7 +432,7 @@ export const TECH_OPTIONS: Record<
id: "biome",
name: "Biome",
description: "Format, lint, and more",
- icon: "/icon/biome.svg",
+ icon: `${ICON_BASE_URL}/biome.svg`,
color: "from-green-500 to-green-700",
default: false,
},
@@ -446,7 +448,7 @@ export const TECH_OPTIONS: Record<
id: "ultracite",
name: "Ultracite",
description: "Biome preset with AI integration",
- icon: "/icon/ultracite.svg",
+ icon: `${ICON_BASE_URL}/ultracite.svg`,
color: "from-blue-500 to-blue-700",
className: "invert-0 dark:invert",
default: false,
@@ -471,7 +473,7 @@ export const TECH_OPTIONS: Record<
id: "turborepo",
name: "Turborepo",
description: "High-performance build system",
- icon: "/icon/turborepo.svg",
+ icon: `${ICON_BASE_URL}/turborepo.svg`,
color: "from-gray-400 to-gray-700",
default: true,
},
@@ -499,7 +501,7 @@ export const TECH_OPTIONS: Record<
id: "true",
name: "Git",
description: "Initialize Git repository",
- icon: "/icon/git.svg",
+ icon: `${ICON_BASE_URL}/git.svg`,
color: "from-gray-500 to-gray-700",
default: true,
},