TechStartup Pro
Moderne SaaS-Landingpage mit Conversion-Optimierung, interaktiven Feature-Demos und Stripe Integration.

CODE. BUILD. DELIVER.
1import { NextResponse } from "next/server"2import type { NextRequest } from "next/server"3import { getToken } from "next-auth/jwt"45export async function middleware(request: NextRequest) {6 const token = await getToken({ req: request })7 if (!token && isProtectedRoute(request)) {8 return NextResponse.redirect(new URL("/login", request.url))9 }10 return NextResponse.next()11}1213export const config = {14 matcher: ["/dashboard/:path*", "/api/:path*"],15}1617// lib/db.ts18import { PrismaClient } from "@prisma/client"1920const globalForPrisma = globalThis as { prisma?: PrismaClient }21export const db = globalForPrisma.prisma ?? new PrismaClient()2223if (process.env.NODE_ENV !== "production") {24 globalForPrisma.prisma = db25}2627// components/Card.tsx28interface CardProps {29 title: string30 description: string31 href: string32 icon?: React.ReactNode33}3435export function Card({ title, description, href, icon }: CardProps) {36 return (37 <Link href={href} className={cn(cardBase, cardHover)}>38 {icon && <div className="card-icon">{icon}</div>}39 <h3 className="font-semibold text-lg">{title}</h3>40 <p className="text-zinc-400 text-sm">{description}</p>41 </Link>42 )43}4445// app/api/projects/route.ts46export async function GET(request: Request) {47 const { searchParams } = new URL(request.url)48 const page = parseInt(searchParams.get("page") ?? "1")49 const projects = await db.project.findMany({50 take: 12,51 skip: (page - 1) * 12,52 orderBy: { updatedAt: "desc" },53 include: { author: true, tags: true },54 })55 return Response.json({ projects, page })56}5758export async function POST(request: Request) {59 const body = await request.json()60 const validated = projectSchema.parse(body)61 const project = await db.project.create({62 data: { ...validated, authorId: session.user.id },63 })64 return Response.json(project, { status: 201 })65}6667// hooks/useDebounce.ts68export function useDebounce<T>(value: T, delay: number): T {69 const [debouncedValue, setDebouncedValue] = useState<T>(value)70 useEffect(() => {71 const timer = setTimeout(() => setDebouncedValue(value), delay)72 return () => clearTimeout(timer)73 }, [value, delay])74 return debouncedValue75}7677// hooks/useLocalStorage.ts78export function useLocalStorage<T>(key: string, initial: T) {79 const [value, setValue] = useState<T>(() => {80 if (typeof window === "undefined") return initial81 const stored = localStorage.getItem(key)82 return stored ? JSON.parse(stored) : initial83 })84 const setStored = (val: T) => {85 setValue(val)86 localStorage.setItem(key, JSON.stringify(val))87 }88 return [value, setStored] as const89}9091// app/dashboard/page.tsx92export default async function DashboardPage() {93 const session = await getServerSession(authOptions)94 if (!session) redirect("/login")95 const projects = await db.project.findMany({96 where: { authorId: session.user.id },97 orderBy: { updatedAt: "desc" },98 })99 return (100 <main className="container mx-auto py-8">101 <h1 className="text-3xl font-bold mb-8">Dashboard</h1>102 <ProjectGrid projects={projects} />103 </main>104 )105}106107// lib/auth.ts108export const authOptions: NextAuthOptions = {109 adapter: PrismaAdapter(db),110 providers: [111 GitHubProvider({112 clientId: process.env.GITHUB_ID!,113 clientSecret: process.env.GITHUB_SECRET!,114 }),115 GoogleProvider({116 clientId: process.env.GOOGLE_ID!,117 clientSecret: process.env.GOOGLE_SECRET!,118 }),119 ],120 callbacks: {121 session({ session, user }) {122 session.user.id = user.id123 return session124 },125 },126}1import { NextResponse } from "next/server"2import type { NextRequest } from "next/server"3import { getToken } from "next-auth/jwt"45export async function middleware(request: NextRequest) {6 const token = await getToken({ req: request })7 if (!token && isProtectedRoute(request)) {8 return NextResponse.redirect(new URL("/login", request.url))9 }10 return NextResponse.next()11}1213export const config = {14 matcher: ["/dashboard/:path*", "/api/:path*"],15}1617// lib/db.ts18import { PrismaClient } from "@prisma/client"1920const globalForPrisma = globalThis as { prisma?: PrismaClient }21export const db = globalForPrisma.prisma ?? new PrismaClient()2223if (process.env.NODE_ENV !== "production") {24 globalForPrisma.prisma = db25}2627// components/Card.tsx28interface CardProps {29 title: string30 description: string31 href: string32 icon?: React.ReactNode33}3435export function Card({ title, description, href, icon }: CardProps) {36 return (37 <Link href={href} className={cn(cardBase, cardHover)}>38 {icon && <div className="card-icon">{icon}</div>}39 <h3 className="font-semibold text-lg">{title}</h3>40 <p className="text-zinc-400 text-sm">{description}</p>41 </Link>42 )43}4445// app/api/projects/route.ts46export async function GET(request: Request) {47 const { searchParams } = new URL(request.url)48 const page = parseInt(searchParams.get("page") ?? "1")49 const projects = await db.project.findMany({50 take: 12,51 skip: (page - 1) * 12,52 orderBy: { updatedAt: "desc" },53 include: { author: true, tags: true },54 })55 return Response.json({ projects, page })56}5758export async function POST(request: Request) {59 const body = await request.json()60 const validated = projectSchema.parse(body)61 const project = await db.project.create({62 data: { ...validated, authorId: session.user.id },63 })64 return Response.json(project, { status: 201 })65}6667// hooks/useDebounce.ts68export function useDebounce<T>(value: T, delay: number): T {69 const [debouncedValue, setDebouncedValue] = useState<T>(value)70 useEffect(() => {71 const timer = setTimeout(() => setDebouncedValue(value), delay)72 return () => clearTimeout(timer)73 }, [value, delay])74 return debouncedValue75}7677// hooks/useLocalStorage.ts78export function useLocalStorage<T>(key: string, initial: T) {79 const [value, setValue] = useState<T>(() => {80 if (typeof window === "undefined") return initial81 const stored = localStorage.getItem(key)82 return stored ? JSON.parse(stored) : initial83 })84 const setStored = (val: T) => {85 setValue(val)86 localStorage.setItem(key, JSON.stringify(val))87 }88 return [value, setStored] as const89}9091// app/dashboard/page.tsx92export default async function DashboardPage() {93 const session = await getServerSession(authOptions)94 if (!session) redirect("/login")95 const projects = await db.project.findMany({96 where: { authorId: session.user.id },97 orderBy: { updatedAt: "desc" },98 })99 return (100 <main className="container mx-auto py-8">101 <h1 className="text-3xl font-bold mb-8">Dashboard</h1>102 <ProjectGrid projects={projects} />103 </main>104 )105}106107// lib/auth.ts108export const authOptions: NextAuthOptions = {109 adapter: PrismaAdapter(db),110 providers: [111 GitHubProvider({112 clientId: process.env.GITHUB_ID!,113 clientSecret: process.env.GITHUB_SECRET!,114 }),115 GoogleProvider({116 clientId: process.env.GOOGLE_ID!,117 clientSecret: process.env.GOOGLE_SECRET!,118 }),119 ],120 callbacks: {121 session({ session, user }) {122 session.user.id = user.id123 return session124 },125 },126}
1import { NextResponse } from "next/server"2import type { NextRequest } from "next/server"3import { getToken } from "next-auth/jwt"45export async function middleware(request: NextRequest) {6 const token = await getToken({ req: request })7 if (!token && isProtectedRoute(request)) {8 return NextResponse.redirect(new URL("/login", request.url))9 }10 return NextResponse.next()11}1213export const config = {14 matcher: ["/dashboard/:path*", "/api/:path*"],15}1617// lib/db.ts18import { PrismaClient } from "@prisma/client"1920const globalForPrisma = globalThis as { prisma?: PrismaClient }21export const db = globalForPrisma.prisma ?? new PrismaClient()2223if (process.env.NODE_ENV !== "production") {24 globalForPrisma.prisma = db25}2627// components/Card.tsx28interface CardProps {29 title: string30 description: string31 href: string32 icon?: React.ReactNode33}3435export function Card({ title, description, href, icon }: CardProps) {36 return (37 <Link href={href} className={cn(cardBase, cardHover)}>38 {icon && <div className="card-icon">{icon}</div>}39 <h3 className="font-semibold text-lg">{title}</h3>40 <p className="text-zinc-400 text-sm">{description}</p>41 </Link>42 )43}4445// app/api/projects/route.ts46export async function GET(request: Request) {47 const { searchParams } = new URL(request.url)48 const page = parseInt(searchParams.get("page") ?? "1")49 const projects = await db.project.findMany({50 take: 12,51 skip: (page - 1) * 12,52 orderBy: { updatedAt: "desc" },53 include: { author: true, tags: true },54 })55 return Response.json({ projects, page })56}5758export async function POST(request: Request) {59 const body = await request.json()60 const validated = projectSchema.parse(body)61 const project = await db.project.create({62 data: { ...validated, authorId: session.user.id },63 })64 return Response.json(project, { status: 201 })65}6667// hooks/useDebounce.ts68export function useDebounce<T>(value: T, delay: number): T {69 const [debouncedValue, setDebouncedValue] = useState<T>(value)70 useEffect(() => {71 const timer = setTimeout(() => setDebouncedValue(value), delay)72 return () => clearTimeout(timer)73 }, [value, delay])74 return debouncedValue75}7677// hooks/useLocalStorage.ts78export function useLocalStorage<T>(key: string, initial: T) {79 const [value, setValue] = useState<T>(() => {80 if (typeof window === "undefined") return initial81 const stored = localStorage.getItem(key)82 return stored ? JSON.parse(stored) : initial83 })84 const setStored = (val: T) => {85 setValue(val)86 localStorage.setItem(key, JSON.stringify(val))87 }88 return [value, setStored] as const89}9091// app/dashboard/page.tsx92export default async function DashboardPage() {93 const session = await getServerSession(authOptions)94 if (!session) redirect("/login")95 const projects = await db.project.findMany({96 where: { authorId: session.user.id },97 orderBy: { updatedAt: "desc" },98 })99 return (100 <main className="container mx-auto py-8">101 <h1 className="text-3xl font-bold mb-8">Dashboard</h1>102 <ProjectGrid projects={projects} />103 </main>104 )105}106107// lib/auth.ts108export const authOptions: NextAuthOptions = {109 adapter: PrismaAdapter(db),110 providers: [111 GitHubProvider({112 clientId: process.env.GITHUB_ID!,113 clientSecret: process.env.GITHUB_SECRET!,114 }),115 GoogleProvider({116 clientId: process.env.GOOGLE_ID!,117 clientSecret: process.env.GOOGLE_SECRET!,118 }),119 ],120 callbacks: {121 session({ session, user }) {122 session.user.id = user.id123 return session124 },125 },126}1import { NextResponse } from "next/server"2import type { NextRequest } from "next/server"3import { getToken } from "next-auth/jwt"45export async function middleware(request: NextRequest) {6 const token = await getToken({ req: request })7 if (!token && isProtectedRoute(request)) {8 return NextResponse.redirect(new URL("/login", request.url))9 }10 return NextResponse.next()11}1213export const config = {14 matcher: ["/dashboard/:path*", "/api/:path*"],15}1617// lib/db.ts18import { PrismaClient } from "@prisma/client"1920const globalForPrisma = globalThis as { prisma?: PrismaClient }21export const db = globalForPrisma.prisma ?? new PrismaClient()2223if (process.env.NODE_ENV !== "production") {24 globalForPrisma.prisma = db25}2627// components/Card.tsx28interface CardProps {29 title: string30 description: string31 href: string32 icon?: React.ReactNode33}3435export function Card({ title, description, href, icon }: CardProps) {36 return (37 <Link href={href} className={cn(cardBase, cardHover)}>38 {icon && <div className="card-icon">{icon}</div>}39 <h3 className="font-semibold text-lg">{title}</h3>40 <p className="text-zinc-400 text-sm">{description}</p>41 </Link>42 )43}4445// app/api/projects/route.ts46export async function GET(request: Request) {47 const { searchParams } = new URL(request.url)48 const page = parseInt(searchParams.get("page") ?? "1")49 const projects = await db.project.findMany({50 take: 12,51 skip: (page - 1) * 12,52 orderBy: { updatedAt: "desc" },53 include: { author: true, tags: true },54 })55 return Response.json({ projects, page })56}5758export async function POST(request: Request) {59 const body = await request.json()60 const validated = projectSchema.parse(body)61 const project = await db.project.create({62 data: { ...validated, authorId: session.user.id },63 })64 return Response.json(project, { status: 201 })65}6667// hooks/useDebounce.ts68export function useDebounce<T>(value: T, delay: number): T {69 const [debouncedValue, setDebouncedValue] = useState<T>(value)70 useEffect(() => {71 const timer = setTimeout(() => setDebouncedValue(value), delay)72 return () => clearTimeout(timer)73 }, [value, delay])74 return debouncedValue75}7677// hooks/useLocalStorage.ts78export function useLocalStorage<T>(key: string, initial: T) {79 const [value, setValue] = useState<T>(() => {80 if (typeof window === "undefined") return initial81 const stored = localStorage.getItem(key)82 return stored ? JSON.parse(stored) : initial83 })84 const setStored = (val: T) => {85 setValue(val)86 localStorage.setItem(key, JSON.stringify(val))87 }88 return [value, setStored] as const89}9091// app/dashboard/page.tsx92export default async function DashboardPage() {93 const session = await getServerSession(authOptions)94 if (!session) redirect("/login")95 const projects = await db.project.findMany({96 where: { authorId: session.user.id },97 orderBy: { updatedAt: "desc" },98 })99 return (100 <main className="container mx-auto py-8">101 <h1 className="text-3xl font-bold mb-8">Dashboard</h1>102 <ProjectGrid projects={projects} />103 </main>104 )105}106107// lib/auth.ts108export const authOptions: NextAuthOptions = {109 adapter: PrismaAdapter(db),110 providers: [111 GitHubProvider({112 clientId: process.env.GITHUB_ID!,113 clientSecret: process.env.GITHUB_SECRET!,114 }),115 GoogleProvider({116 clientId: process.env.GOOGLE_ID!,117 clientSecret: process.env.GOOGLE_SECRET!,118 }),119 ],120 callbacks: {121 session({ session, user }) {122 session.user.id = user.id123 return session124 },125 },126}
Premium Webseiten für Unternehmen, Startups und Personal Brands.
Maßgeschneidert. Performant. Unvergesslich.
Gleiche Qualität. Deutlich weniger Kosten. Kein Overhead, keine Zwischenstufen — nur Ergebnisse.
Jetzt kostenlos anfragenVon der Idee bis zum Launch – alles aus einer Hand, ohne Kompromisse.
Repräsentative Unternehmenswebsites, die Vertrauen aufbauen und qualifizierte Kunden überzeugen.
Conversion-optimierte Landingpages, die aus Besuchern Kunden machen – messbar und skalierbar.
Hochperformante Online-Shops mit reibungsloser Kauferfahrung, Payment-Integration und Inventory.
Maßgeschneiderte Webanwendungen, die komplexe Prozesse automatisieren und digitalisieren.
Durchdachte Interfaces, die begeistern – von der ersten Wireframe bis zum Pixel-perfect Design.
Technische SEO und Content-Strategie für bessere Rankings und mehr organischen Traffic.
Lighthouse Score auf 95+ bringen – Ladezeit, Rendering und Bundle Size professionell optimieren.
Jedes Projekt mit einem klaren Ziel: messbare Ergebnisse für den Kunden.
Moderne SaaS-Landingpage mit Conversion-Optimierung, interaktiven Feature-Demos und Stripe Integration.
Hochperformanter Online-Shop mit über 10.000 Produkten, Echtzeit-Suche und automatisiertem Inventory.
Komplexes Analytics-Dashboard mit Echtzeit-Daten, Custom Charts und Role-based Access Control.
Award-würdige Kreativagentur-Website mit immersiven Scroll-Animationen und 3D-Elementen.
Health-Tracking App mit Offline-Funktionalität, Push-Notifications und biometrischer Authentifizierung.
Professioneller Webauftritt für eine internationale Kanzlei – mehrsprachig, DSGVO-konform, barrierefrei.
Wir sind kein Tool, kein Template-Generator und keine Agentur mit 50 Zwischenstufen. Wir sind ein Team, das sich wirklich für euren Erfolg einsetzt.
“Wir setzen uns direkt ans Projekt – damit ihr so schnell wie möglich live geht.”
— Das Dispine Team
Ihr habt feste Ansprechpartner in unserem Team – keine externen Freelancer, keine Weiterleitung. Euer Projekt bleibt bei uns.
Design, Entwicklung, SEO und Launch – wir übernehmen den kompletten Prozess. Ihr müsst nichts koordinieren, wir kümmern uns um alles.
Keine versteckten Kosten, keine bösen Überraschungen. Wir klären den Preis vorab transparent – ab 150 € individuell nach euren Wünschen.
Wir setzen uns direkt ans Projekt – keine langen Vorgespräche, kein Warten. Euer Start ist unser Start.
Wir liefern Qualität, die ihr sonst nur bei teuren Agenturen bekommt – zu einem Preis, der fair und realistisch ist.
Mit uns hört die Zusammenarbeit nicht beim Launch auf. Wir bleiben euer Partner – für Updates, Anpassungen und Wachstum.
Kein Copy-Paste. Keine Templates. Echte Handwerksarbeit, die Ergebnisse liefert.
Wir setzen uns direkt an euer Projekt. Klare Updates, transparent und ohne Überraschungen.
Inspiriert von Apple, Stripe und Linear. Designs, die 2025 und darüber hinaus funktionieren.
Lighthouse Score 95+ garantiert. Jede Millisekunde zählt – für Rankings und Conversions.
Technisch sauberes Fundament, strukturierte Daten und optimale Core Web Vitals für bessere Rankings.
Kein Baukastensystem. Jede Zeile Code ist für euer spezifisches Projekt und eure Ziele geschrieben.
100% Custom Design. Eure Website ist einzigartig – nicht das Skin über einem Fremden-Framework.
Vier klare Schritte – vom ersten Gespräch bis zum erfolgreichen Launch.
Hallo! Wir brauchen eine neue Website für unser Startup
Super! Lasst uns das besprechen. Wann passt ein kurzes Gespräch?
Kontaktiert uns mit eurer Idee – unser Team setzt sich direkt ans Projekt und bespricht alles Weitere kostenlos und unverbindlich.
Wir erarbeiten ein maßgeschneidertes Konzept: Zieldefinition, Wireframes, Designdirektion und ein transparenter Kostenrahmen.
$ git commit -m 'feat: hero section'
✓ 3 files changed
$ npm run build
▲ Next.js 14.2 compiled
✓ Ready in 1.3s
Wir entwickeln euer Projekt mit regelmäßigen Updates und Live-Previews. Ihr habt jederzeit Einblick in den aktuellen Stand.
Nach finaler Abnahme wird eure Website live gestellt – inklusive technischer Übergabe, Training und 30 Tagen Support.
Echte Ergebnisse für echte Unternehmen.
“Die Zusammenarbeit war absolut professionell. Die Website übertrifft alle unsere Erwartungen – schnell, modern und wunderschön. Unsere Leads haben sich verdoppelt.”
“Endlich ein Entwickler, der wirklich zuhört. Das Ergebnis spricht für sich – unsere Conversion Rate ist um 40% gestiegen. Absolut empfehlenswert.”
“Pünktlich, kommunikativ, und das beste Design, das ich je gesehen habe. Hat unsere Konkurrenz weit überholt. Werden definitiv wieder buchen.”
“Das Team hat sich direkt ans Projekt gesetzt – und wir haben eine Website bekommen, auf die wir stolz sind. Der Prozess war klar, die Kommunikation top und das Ergebnis überragend.”
“Professionelle Abwicklung von A bis Z. Lighthouse Score von 98 – unsere Kunden fragen immer, wer die Seite gemacht hat.”
“Wir brauchten eine komplexe Web-App mit Dashboard und API-Anbindung. Sauber umgesetzt, on time, on budget. Exzellent.”
Einfach Formular ausfüllen – unser Team setzt sich direkt an euer Projekt und klärt alles Weitere. Kostenlos und unverbindlich.
Alle mit * markierten Felder sind Pflichtfelder.