import Link from "next/link"; import { CalendarRange, CircleDot, GitBranch, Lightbulb, Rocket, Trophy } from "lucide-react"; import { ProjectBoard } from "@/components/ProjectBoard"; import { StatCard } from "@/components/StatCard"; import { requireUserPage } from "@/lib/auth/guard"; import { prisma } from "@/lib/db"; import { connectionSafeSelect, projectListInclude } from "@/lib/projects"; import { STATUS_META } from "@/lib/status"; import type { ConnectionSafe, ProjectListItem } from "@/types"; export const dynamic = "force-dynamic"; export default async function DashboardPage() { const user = await requireUserPage(); const [projects, connections] = await Promise.all([ prisma.project.findMany({ where: { ownerId: user.id }, include: projectListInclude, orderBy: [{ favorite: "desc" }, { updatedAt: "desc" }], }), prisma.gitConnection.findMany({ where: { ownerId: user.id }, select: connectionSafeSelect, orderBy: { name: "asc" }, }), ]); const active = projects.filter((project) => project.status !== "ARCHIVED"); const ideas = active.filter((project) => project.status === "IDEA").length; const inDev = active.filter((project) => project.status === "IN_DEVELOPMENT").length; const done = active.filter((project) => project.status === "DONE").length; const linked = active.filter((project) => project.repositories.length > 0).length; const averageProgress = active.length > 0 ? Math.round(active.reduce((sum, project) => sum + project.progress, 0) / active.length) : 0; return (
Vibe Coding Kontrollzentrum
Ideen festhalten, Status pflegen, Notizen sammeln – und live sehen, was in den verknuepften Repositories bei GitHub, GitLab und Gitea passiert.
{/* Kein weiterer Punkt in der Kopfleiste – die ist auf dem Telefon schon eng. Der Rueckblick haengt dort, wo man ohnehin hinsieht. */}