commit ceafcc6d1eb811fd53696966f6696f4d1e8acc82 Author: Florian Wilde Date: Sat Jul 25 19:33:12 2026 +0200 chore: Projektgeruest mit Next.js 15, TypeScript und Tailwind CSS 4 Grundlage fuer Nebula, das Dashboard fuer Vibe-Coding Projekte. - Next.js 15 (App Router) mit React 19 und TypeScript im strict-Modus - Tailwind CSS 4 ueber @tailwindcss/postcss, ohne separate Config-Datei - output: "standalone", damit dasselbe Build sowohl nativ als auch im Docker-Image laeuft - Pfad-Alias @/* auf src/ - .gitattributes erzwingt LF fuer Shell-Skripte (wichtig fuers Image) - MIT-Lizenz Co-Authored-By: Claude Opus 5 (1M context) diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..e85d634 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,17 @@ +node_modules +.next +.git +.gitignore +Dockerfile +.dockerignore +docker-compose*.yml +README.md +FEATURES.md +data +postgres-data +*.log +.env +.env.local +.env.*.local +.idea +.vscode diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..9c7d473 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,12 @@ +# Zeilenenden vereinheitlichen – wichtig fuer Shell-Skripte im Docker-Image. +* text=auto eol=lf + +*.sh text eol=lf +Dockerfile text eol=lf +*.ps1 text eol=crlf + +*.png binary +*.jpg binary +*.ico binary +*.woff binary +*.woff2 binary diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c02a8c7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,49 @@ +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# next.js +/.next/ +/out/ +next-env.d.ts.bak + +# production +/build +/dist + +# misc +.DS_Store +*.pem +Thumbs.db + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env +.env +.env.local +.env.development.local +.env.test.local +.env.production.local +!.env.example + +# typescript +*.tsbuildinfo + +# prisma +/prisma/*.db +/prisma/*.db-journal + +# docker volumes / data +/data +/postgres-data + +# editors +.idea/ +.vscode/* +!.vscode/extensions.json diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e13bc55 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Florian Wilde + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/next-env.d.ts b/next-env.d.ts new file mode 100644 index 0000000..1b3be08 --- /dev/null +++ b/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/next.config.ts b/next.config.ts new file mode 100644 index 0000000..f0f1d73 --- /dev/null +++ b/next.config.ts @@ -0,0 +1,19 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + // "standalone" erzeugt einen self-contained Server unter .next/standalone. + // Das Docker-Image nutzt genau diesen Output; im Standalone-Betrieb ohne + // Docker stoert die Option nicht ("npm start" laeuft weiterhin ueber next start). + output: "standalone", + reactStrictMode: true, + poweredByHeader: false, + experimental: { + // Prisma darf nicht gebundlet werden, sonst findet der Client seine Engine nicht. + serverActions: { + bodySizeLimit: "2mb", + }, + }, + serverExternalPackages: ["@prisma/client", "prisma"], +}; + +export default nextConfig; diff --git a/package.json b/package.json new file mode 100644 index 0000000..59aa578 --- /dev/null +++ b/package.json @@ -0,0 +1,52 @@ +{ + "name": "nebula", + "version": "0.1.0", + "private": true, + "description": "Nebula – Dashboard fuer Vibe-Coding Projekte mit Git-Anbindung (GitHub, GitLab, Gitea)", + "scripts": { + "dev": "next dev", + "build": "prisma generate && next build", + "start": "next start", + "lint": "next lint", + "typecheck": "tsc --noEmit", + "db:generate": "prisma generate", + "db:migrate": "prisma migrate deploy", + "db:migrate:dev": "prisma migrate dev", + "db:push": "prisma db push", + "db:studio": "prisma studio", + "db:seed": "prisma db seed", + "db:reset": "prisma migrate reset", + "docker:db": "docker compose up -d db", + "docker:db:down": "docker compose stop db", + "docker:up": "docker compose --profile full up -d --build", + "docker:down": "docker compose --profile full down", + "docker:logs": "docker compose --profile full logs -f app", + "docker:tools": "docker compose --profile tools up -d", + "setup": "node scripts/setup.mjs", + "postinstall": "prisma generate" + }, + "prisma": { + "seed": "tsx prisma/seed.ts" + }, + "dependencies": { + "@prisma/client": "^6.8.2", + "lucide-react": "^0.511.0", + "next": "^15.3.3", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "zod": "^3.25.28" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4.1.7", + "@types/node": "^22.15.21", + "@types/react": "^19.1.5", + "@types/react-dom": "^19.1.5", + "prisma": "^6.8.2", + "tailwindcss": "^4.1.7", + "tsx": "^4.19.4", + "typescript": "^5.8.3" + }, + "engines": { + "node": ">=20.11" + } +} diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..79bcf13 --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,8 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + "@tailwindcss/postcss": {}, + }, +}; + +export default config; diff --git a/public/.gitkeep b/public/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..6978b6c --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [{ "name": "next" }], + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +}