"use client"; import { format, parseISO } from "date-fns"; import { Cpu, Download, Terminal, TrendingUp, Users } from "lucide-react"; import Image from "next/image"; import Link from "next/link"; import { useCallback, useEffect, useState } from "react"; import { Area, AreaChart, Bar, BarChart, CartesianGrid, Cell, Pie, PieChart, XAxis, YAxis, } from "recharts"; import { type ChartConfig, ChartContainer, ChartLegend, ChartLegendContent, ChartTooltip, ChartTooltipContent, } from "@/components/ui/chart"; import discordIcon from "@/public/icon/discord.svg"; import Footer from "../_components/footer"; interface AggregatedAnalyticsData { lastUpdated: string | null; generatedAt: string; totalRecords: number; timeSeries: Array<{ date: string; displayDate: string; count: number }>; monthlyTimeSeries: Array<{ month: string; displayMonth: string; count: number; }>; platformDistribution: Array<{ name: string; value: number }>; packageManagerDistribution: Array<{ name: string; value: number }>; backendDistribution: Array<{ name: string; value: number }>; databaseDistribution: Array<{ name: string; value: number }>; ormDistribution: Array<{ name: string; value: number }>; dbSetupDistribution: Array<{ name: string; value: number }>; apiDistribution: Array<{ name: string; value: number }>; frontendDistribution: Array<{ name: string; value: number }>; nodeVersionDistribution: Array<{ version: string; count: number }>; cliVersionDistribution: Array<{ version: string; count: number }>; authDistribution: Array<{ name: string; value: number }>; gitDistribution: Array<{ name: string; value: number }>; installDistribution: Array<{ name: string; value: number }>; examplesDistribution: Array<{ name: string; value: number }>; addonsDistribution: Array<{ name: string; value: number }>; runtimeDistribution: Array<{ name: string; value: number }>; projectTypeDistribution: Array<{ name: string; value: number }>; popularStackCombinations: Array<{ name: string; value: number }>; databaseORMCombinations: Array<{ name: string; value: number }>; hourlyDistribution: Array<{ hour: string; displayHour: string; count: number; }>; summary: { totalProjects: number; avgProjectsPerDay: number; authEnabledPercent: number; mostPopularFrontend: string; mostPopularBackend: string; mostPopularORM: string; mostPopularAPI: string; mostPopularPackageManager: string; }; } const timeSeriesConfig = { projects: { label: "Projects Created", color: "hsl(var(--chart-1))", }, } satisfies ChartConfig; const platformConfig = { darwin: { label: "macOS", color: "hsl(var(--chart-1))", }, linux: { label: "Linux", color: "hsl(var(--chart-2))", }, win32: { label: "Windows", color: "hsl(var(--chart-3))", }, } satisfies ChartConfig; const packageManagerConfig = { npm: { label: "npm", color: "hsl(var(--chart-1))", }, pnpm: { label: "pnpm", color: "hsl(var(--chart-2))", }, bun: { label: "bun", color: "hsl(var(--chart-3))", }, } satisfies ChartConfig; const backendConfig = { hono: { label: "Hono", color: "hsl(var(--chart-1))", }, express: { label: "Express", color: "hsl(var(--chart-2))", }, fastify: { label: "Fastify", color: "hsl(var(--chart-3))", }, next: { label: "Next.js", color: "hsl(var(--chart-4))", }, elysia: { label: "Elysia", color: "hsl(var(--chart-5))", }, convex: { label: "Convex", color: "hsl(var(--chart-6))", }, none: { label: "None", color: "hsl(var(--chart-7))", }, } satisfies ChartConfig; const databaseConfig = { sqlite: { label: "SQLite", color: "hsl(var(--chart-1))", }, postgres: { label: "PostgreSQL", color: "hsl(var(--chart-2))", }, mysql: { label: "MySQL", color: "hsl(var(--chart-3))", }, mongodb: { label: "MongoDB", color: "hsl(var(--chart-4))", }, none: { label: "None", color: "hsl(var(--chart-5))", }, } satisfies ChartConfig; const ormConfig = { drizzle: { label: "Drizzle", color: "hsl(var(--chart-1))", }, prisma: { label: "Prisma", color: "hsl(var(--chart-2))", }, mongoose: { label: "Mongoose", color: "hsl(var(--chart-3))", }, none: { label: "None", color: "hsl(var(--chart-4))", }, } satisfies ChartConfig; const dbSetupConfig = { turso: { label: "Turso", color: "hsl(var(--chart-1))", }, "prisma-postgres": { label: "Prisma Postgres", color: "hsl(var(--chart-2))", }, "mongodb-atlas": { label: "MongoDB Atlas", color: "hsl(var(--chart-3))", }, neon: { label: "Neon", color: "hsl(var(--chart-4))", }, supabase: { label: "Supabase", color: "hsl(var(--chart-5))", }, none: { label: "None", color: "hsl(var(--chart-6))", }, } satisfies ChartConfig; const apiConfig = { trpc: { label: "tRPC", color: "hsl(var(--chart-1))", }, orpc: { label: "oRPC", color: "hsl(var(--chart-2))", }, none: { label: "None", color: "hsl(var(--chart-3))", }, } satisfies ChartConfig; const frontendConfig = { "react-router": { label: "React Router", color: "hsl(var(--chart-1))", }, "tanstack-router": { label: "TanStack Router", color: "hsl(var(--chart-2))", }, "tanstack-start": { label: "TanStack Start", color: "hsl(var(--chart-3))", }, next: { label: "Next", color: "hsl(var(--chart-4))", }, nuxt: { label: "Nuxt", color: "hsl(var(--chart-5))", }, "native-nativewind": { label: "Expo NativeWind", color: "hsl(var(--chart-6))", }, "native-unistyles": { label: "Expo Unistyles", color: "hsl(var(--chart-7))", }, svelte: { label: "Svelte", color: "hsl(var(--chart-3))", }, solid: { label: "Solid", color: "hsl(var(--chart-4))", }, none: { label: "None", color: "hsl(var(--chart-7))", }, } satisfies ChartConfig; const nodeVersionConfig = { "18": { label: "Node.js 18", color: "hsl(var(--chart-1))", }, "20": { label: "Node.js 20", color: "hsl(var(--chart-2))", }, "22": { label: "Node.js 22", color: "hsl(var(--chart-3))", }, "16": { label: "Node.js 16", color: "hsl(var(--chart-4))", }, other: { label: "Other", color: "hsl(var(--chart-5))", }, } satisfies ChartConfig; const cliVersionConfig = { latest: { label: "Latest", color: "hsl(var(--chart-1))", }, outdated: { label: "Outdated", color: "hsl(var(--chart-2))", }, } satisfies ChartConfig; const authConfig = { enabled: { label: "Enabled", color: "hsl(var(--chart-1))", }, disabled: { label: "Disabled", color: "hsl(var(--chart-2))", }, } satisfies ChartConfig; const gitConfig = { enabled: { label: "Git Init", color: "hsl(var(--chart-1))", }, disabled: { label: "No Git", color: "hsl(var(--chart-2))", }, } satisfies ChartConfig; const installConfig = { enabled: { label: "Auto Install", color: "hsl(var(--chart-1))", }, disabled: { label: "Skip Install", color: "hsl(var(--chart-2))", }, } satisfies ChartConfig; const examplesConfig = { todo: { label: "Todo App", color: "hsl(var(--chart-1))", }, ai: { label: "AI Example", color: "hsl(var(--chart-2))", }, none: { label: "No Examples", color: "hsl(var(--chart-3))", }, } satisfies ChartConfig; const addonsConfig = { pwa: { label: "PWA", color: "hsl(var(--chart-1))", }, biome: { label: "Biome", color: "hsl(var(--chart-2))", }, tauri: { label: "Tauri", color: "hsl(var(--chart-3))", }, husky: { label: "Husky", color: "hsl(var(--chart-4))", }, starlight: { label: "Starlight", color: "hsl(var(--chart-5))", }, turborepo: { label: "Turborepo", color: "hsl(var(--chart-6))", }, none: { label: "No Addons", color: "hsl(var(--chart-7))", }, } satisfies ChartConfig; const runtimeConfig = { node: { label: "Node.js", color: "hsl(var(--chart-1))", }, bun: { label: "Bun", color: "hsl(var(--chart-2))", }, workers: { label: "Cloudflare Workers", color: "hsl(var(--chart-3))", }, none: { label: "None", color: "hsl(var(--chart-4))", }, } satisfies ChartConfig; const projectTypeConfig = { fullstack: { label: "Full-stack", color: "hsl(var(--chart-1))", }, "frontend-only": { label: "Frontend-only", color: "hsl(var(--chart-2))", }, "backend-only": { label: "Backend-only", color: "hsl(var(--chart-3))", }, } satisfies ChartConfig; const hourlyDistributionConfig = { count: { label: "Projects Created", color: "hsl(var(--chart-1))", }, } satisfies ChartConfig; export default function AnalyticsPage() { const [data, setData] = useState(null); const [loadingLastUpdated, setLoadingLastUpdated] = useState(true); const loadAnalyticsData = useCallback(async () => { try { const response = await fetch("https://r2.amanv.dev/analytics-data.json"); const analyticsData = await response.json(); setData(analyticsData); console.log("Loaded aggregated analytics data from R2 bucket"); console.log(`Data generated at: ${analyticsData.generatedAt}`); } catch (error: unknown) { console.error("Error loading analytics data:", error); } finally { setLoadingLastUpdated(false); } }, []); useEffect(() => { loadAnalyticsData(); }, [loadAnalyticsData]); const getPlatformData = () => { if (!data) return []; return data.platformDistribution || []; }; const getPackageManagerData = () => { if (!data) return []; return data.packageManagerDistribution || []; }; const getBackendData = () => { if (!data) return []; return data.backendDistribution || []; }; const getDatabaseData = () => { if (!data) return []; return data.databaseDistribution || []; }; const getORMData = () => { if (!data) return []; return data.ormDistribution || []; }; const getDBSetupData = () => { if (!data) return []; return data.dbSetupDistribution || []; }; const getAPIData = () => { if (!data) return []; return data.apiDistribution || []; }; const getFrontendData = () => { if (!data) return []; return data.frontendDistribution || []; }; const getTimeSeriesData = () => { if (!data) return []; return data.timeSeries || []; }; const getNodeVersionData = () => { if (!data) return []; return data.nodeVersionDistribution || []; }; const getCLIVersionData = () => { if (!data) return []; return data.cliVersionDistribution || []; }; const getAuthData = () => { if (!data) return []; return data.authDistribution || []; }; const getGitData = () => { if (!data) return []; return data.gitDistribution || []; }; const getInstallData = () => { if (!data) return []; return data.installDistribution || []; }; const getExamplesData = () => { if (!data) return []; return data.examplesDistribution || []; }; const getAddonsData = () => { if (!data) return []; return data.addonsDistribution || []; }; const getRuntimeData = () => { if (!data) return []; return data.runtimeDistribution || []; }; const getProjectTypeData = () => { if (!data) return []; return data.projectTypeDistribution || []; }; const getMonthlyTimeSeriesData = () => { if (!data) return []; return data.monthlyTimeSeries || []; }; const getPopularStackCombinations = () => { if (!data) return []; return data.popularStackCombinations || []; }; const getDatabaseORMCombinations = () => { if (!data) return []; return data.databaseORMCombinations || []; }; const getHourlyDistributionData = () => { if (!data) return []; return data.hourlyDistribution || []; }; const totalProjects = data?.summary?.totalProjects || 0; const getAvgProjectsPerDay = () => { if (!data) return 0; return data.summary?.avgProjectsPerDay || 0; }; const avgProjectsPerDay = getAvgProjectsPerDay(); const authEnabledPercent = data?.summary?.authEnabledPercent || 0; const runtimeData = getRuntimeData(); const mostPopularFrontend = data?.summary?.mostPopularFrontend || "None"; const mostPopularBackend = data?.summary?.mostPopularBackend || "None"; const projectTypeData = getProjectTypeData(); const monthlyTimeSeriesData = getMonthlyTimeSeriesData(); const popularStackCombinations = getPopularStackCombinations(); const databaseORMCombinations = getDatabaseORMCombinations(); const hourlyDistributionData = getHourlyDistributionData(); return (
ANALYTICS_DASHBOARD.SH
[{totalProjects} PROJECTS_ANALYZED]
$ Analytics from Better-T-Stack CLI usage data
$ Uses PostHog - no personal info tracked, runs on each project creation
$ Source:{" "} analytics.ts {" | "} export.csv
$ Last updated:{" "} {loadingLastUpdated ? "CHECKING..." : data?.lastUpdated ? `${data.lastUpdated} UTC` : "UNKNOWN"}
discord
DISCORD_NOTIFICATIONS.IRC

Join for LIVE project creation alerts

JOIN
SYSTEM_METRICS.LOG
TOTAL_PROJECTS
{totalProjects.toLocaleString()}

$ ./create-better-t-stack executions

TOP_FRONTEND
{mostPopularFrontend}

$ most_selected_frontend.sh

TOP_BACKEND
{mostPopularBackend}

$ most_selected_backend.sh

TOP_ORM
{data?.summary?.mostPopularORM || "None"}

$ most_selected_orm.sh

TOP_API
{data?.summary?.mostPopularAPI || "None"}

$ most_selected_api.sh

AUTH_ADOPTION
{authEnabledPercent}%

$ auth_enabled_percentage.sh

TOP_PKG_MGR
{data?.summary?.mostPopularPackageManager || "npm"}

$ most_used_package_manager.sh

AVG_DAILY
{avgProjectsPerDay.toFixed(1)}

$ average_projects_per_day.sh

TIMELINE_ANALYSIS.CHARTS
PROJECT_TIMELINE.CHART

Daily project creation timeline from actual data

} labelFormatter={(value, payload) => { const date = payload?.[0]?.payload?.date; return date ? format(parseISO(date), "MMM dd, yyyy") : value; }} />
MONTHLY_TRENDS.CHART

Monthly project creation trends

} />
PLATFORM_DISTRIBUTION.PIE

Operating system distribution

} /> `${name} ${(percent * 100).toFixed(0)}%` } outerRadius={80} fill="hsl(var(--chart-1))" dataKey="value" > {getPlatformData().map((entry) => ( ))} } />
HOURLY_DISTRIBUTION.BAR

Projects created by hour of day (UTC)

} labelFormatter={(value, payload) => { const hour = payload?.[0]?.payload?.displayHour; return hour ? `${hour} UTC` : value; }} />
STACK_CONFIGURATION.DB
[CORE_COMPONENTS]
POPULAR_STACK_COMBINATIONS.BAR

Most popular frontend + backend combinations

} />
FRONTEND_FRAMEWORKS.BAR

Frontend framework and meta-framework usage

} /> {getFrontendData().map((entry) => ( ))}
BACKEND_FRAMEWORKS.BAR

Backend framework distribution

} /> {getBackendData().map((entry) => ( ))}
DATABASE_DISTRIBUTION.BAR

Database technology distribution

} /> {getDatabaseData().map((entry) => ( ))}
ORM_DISTRIBUTION.BAR

ORM/Database layer distribution

} /> {getORMData().map((entry) => ( ))}
DATABASE_HOSTING.BAR

Database hosting service preferences

} /> {getDBSetupData().map((entry) => ( ))}
API_LAYER.PIE

API layer technology distribution

} /> {getAPIData().map((entry) => ( ))} } />
AUTH_ADOPTION.PIE

Authentication implementation rate

} /> `${name} ${(percent * 100).toFixed(0)}%` } > {getAuthData().map((entry) => ( ))} } />
RUNTIME_DISTRIBUTION.PIE

JavaScript runtime preference distribution

} /> `${name} ${(percent * 100).toFixed(0)}%` } > {runtimeData.map((entry) => ( ))} } />
PROJECT_TYPES.PIE

Full-stack vs Frontend-only vs Backend-only projects

} /> `${name} ${(percent * 100).toFixed(0)}%` } > {projectTypeData.map((entry) => ( ))} } />
DATABASE_ORM_COMBINATIONS.BAR

Popular database + ORM combinations

} />
ADDONS_USAGE.BAR

Additional features and tooling adoption

} /> {getAddonsData().map((entry) => ( ))}
EXAMPLES_USAGE.BAR

Example applications included in projects

} /> {getExamplesData().map((entry) => ( ))}
DEV_ENVIRONMENT.CONFIG
GIT_INITIALIZATION.PIE

Git repository initialization rate

} /> `${name} ${(percent * 100).toFixed(0)}%` } > {getGitData().map((entry) => ( ))} } />
PACKAGE_MANAGER.BAR

Package manager usage distribution

} /> {getPackageManagerData().map((entry) => ( ))}
INSTALL_PREFERENCE.PIE

Automatic dependency installation preference

} /> `${name} ${(percent * 100).toFixed(0)}%` } > {getInstallData().map((entry) => ( ))} } />
NODE_VERSIONS.BAR

Node.js version distribution (major versions)

} />
CLI_VERSIONS.BAR

CLI version distribution across project creations

} />
); }