diff --git a/Dockerfile b/Dockerfile
index 3109424..312d9bd 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -4,7 +4,7 @@ FROM node:20 AS base
# Install dependencies only when needed
FROM base AS deps
# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
-RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
+RUN apt-get update && apt-get install -y --no-install-recommends curl && rm -rf /var/lib/apt/lists/*
WORKDIR /app
# Install dependencies based on the preferred package manager
diff --git a/app/components/Contact.tsx b/app/components/Contact.tsx
index d968927..e93cd82 100644
--- a/app/components/Contact.tsx
+++ b/app/components/Contact.tsx
@@ -93,10 +93,10 @@ const Contact = () => {
className="text-center mb-16"
>
- Get In Touch
+ Contact Me
- Have a project in mind or want to collaborate? I would love to hear from you!
+ Interested in working together or have questions about my projects? Feel free to reach out!
@@ -111,11 +111,11 @@ const Contact = () => {
>
- Let's Connect
+ Get In Touch
- I'm always open to discussing new opportunities, interesting projects,
- or just having a chat about technology and innovation.
+ I'm always available to discuss new opportunities, interesting projects,
+ or simply chat about technology and innovation.
diff --git a/app/components/Hero.tsx b/app/components/Hero.tsx
index b5336f3..97ba3a5 100644
--- a/app/components/Hero.tsx
+++ b/app/components/Hero.tsx
@@ -216,7 +216,7 @@ const Hero = () => {
whileTap={{ scale: 0.95 }}
className="px-8 py-4 text-lg font-semibold border-2 border-gray-600 text-gray-300 hover:text-white hover:border-gray-500 rounded-lg transition-all duration-200"
>
- Get In Touch
+ Contact Me
diff --git a/app/layout.tsx b/app/layout.tsx
index 270c153..f6edce4 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -42,7 +42,7 @@ export const metadata: Metadata = {
authors: [{name: "Dennis Konkol", url: "https://dk0.dev"}],
openGraph: {
title: "Dennis Konkol | Portfolio",
- description: "Explore my projects and get in touch!",
+ description: "Explore my projects and contact me for collaboration opportunities!",
url: "https://dk0.dev",
siteName: "Dennis Konkol Portfolio",
images: [
diff --git a/next.config.ts b/next.config.ts
index 2c05905..70fa257 100644
--- a/next.config.ts
+++ b/next.config.ts
@@ -8,6 +8,7 @@ dotenv.config({ path: path.resolve(__dirname, '.env') });
const nextConfig: NextConfig = {
// Enable standalone output for Docker
output: 'standalone',
+ outputFileTracingRoot: path.join(__dirname, '../../'),
// Optimize for production
compress: true,
@@ -42,8 +43,7 @@ const nextConfig: NextConfig = {
minimumCacheTTL: 60,
},
- // Disable static generation for dynamic routes
- generateStaticParams: false,
+ // Dynamic routes are handled automatically by Next.js
// Add cache-busting headers
async headers() {
diff --git a/prisma/schema.prisma b/prisma/schema.prisma
index 44b46c9..f34bf02 100644
--- a/prisma/schema.prisma
+++ b/prisma/schema.prisma
@@ -1,6 +1,3 @@
-// This is your Prisma schema file,
-// learn more about it in the docs: https://pris.ly/d/prisma-schema
-
generator client {
provider = "prisma-client-js"
}
@@ -11,46 +8,37 @@ datasource db {
}
model Project {
- id Int @id @default(autoincrement())
- title String @db.VarChar(255)
- description String @db.Text
- content String @db.Text
- tags String[] @default([])
- featured Boolean @default(false)
- category String @db.VarChar(100)
- date String @db.VarChar(10)
- github String? @db.VarChar(500)
- live String? @db.VarChar(500)
- published Boolean @default(true)
- imageUrl String? @db.VarChar(500)
- metaDescription String? @db.Text
- keywords String? @db.Text
- ogImage String? @db.VarChar(500)
- schema Json?
-
- // Advanced features
- difficulty Difficulty @default(INTERMEDIATE)
- timeToComplete String? @db.VarChar(100)
- technologies String[] @default([])
- challenges String[] @default([])
- lessonsLearned String[] @default([])
- futureImprovements String[] @default([])
- demoVideo String? @db.VarChar(500)
- screenshots String[] @default([])
- colorScheme String @db.VarChar(100) @default("Dark")
- accessibility Boolean @default(true)
-
- // Performance metrics
- performance Json @default("{\"lighthouse\": 90, \"bundleSize\": \"50KB\", \"loadTime\": \"1.5s\"}")
-
- // Analytics
- analytics Json @default("{\"views\": 0, \"likes\": 0, \"shares\": 0}")
-
- // Timestamps
- createdAt DateTime @default(now()) @map("created_at")
- updatedAt DateTime @updatedAt @map("updated_at")
-
- // Indexes for performance
+ id Int @id @default(autoincrement())
+ title String @db.VarChar(255)
+ description String
+ content String
+ tags String[] @default([])
+ featured Boolean @default(false)
+ category String @db.VarChar(100)
+ date String @db.VarChar(10)
+ github String? @db.VarChar(500)
+ live String? @db.VarChar(500)
+ published Boolean @default(true)
+ imageUrl String? @db.VarChar(500)
+ metaDescription String?
+ keywords String?
+ ogImage String? @db.VarChar(500)
+ schema Json?
+ difficulty Difficulty @default(INTERMEDIATE)
+ timeToComplete String? @db.VarChar(100)
+ technologies String[] @default([])
+ challenges String[] @default([])
+ lessonsLearned String[] @default([])
+ futureImprovements String[] @default([])
+ demoVideo String? @db.VarChar(500)
+ screenshots String[] @default([])
+ colorScheme String @default("Dark") @db.VarChar(100)
+ accessibility Boolean @default(true)
+ performance Json @default("{\"loadTime\": \"1.5s\", \"bundleSize\": \"50KB\", \"lighthouse\": 90}")
+ analytics Json @default("{\"likes\": 0, \"views\": 0, \"shares\": 0}")
+ createdAt DateTime @default(now()) @map("created_at")
+ updatedAt DateTime @updatedAt @map("updated_at")
+
@@index([category])
@@index([featured])
@@index([published])
@@ -59,6 +47,49 @@ model Project {
@@index([tags])
}
+model PageView {
+ id Int @id @default(autoincrement())
+ projectId Int? @map("project_id")
+ page String @db.VarChar(100)
+ ip String? @db.VarChar(45)
+ userAgent String? @map("user_agent")
+ referrer String? @db.VarChar(500)
+ timestamp DateTime @default(now())
+
+ @@index([projectId])
+ @@index([timestamp])
+ @@index([page])
+}
+
+model UserInteraction {
+ id Int @id @default(autoincrement())
+ projectId Int @map("project_id")
+ type InteractionType
+ ip String? @db.VarChar(45)
+ userAgent String? @map("user_agent")
+ timestamp DateTime @default(now())
+
+ @@index([projectId])
+ @@index([type])
+ @@index([timestamp])
+}
+
+model Contact {
+ id Int @id @default(autoincrement())
+ name String @db.VarChar(255)
+ email String @db.VarChar(255)
+ subject String @db.VarChar(500)
+ message String
+ responded Boolean @default(false)
+ responseTemplate String? @map("response_template") @db.VarChar(50)
+ createdAt DateTime @default(now()) @map("created_at")
+ updatedAt DateTime @updatedAt @map("updated_at")
+
+ @@index([email])
+ @@index([responded])
+ @@index([createdAt])
+}
+
enum Difficulty {
BEGINNER
INTERMEDIATE
@@ -66,55 +97,9 @@ enum Difficulty {
EXPERT
}
-// Analytics tracking
-model PageView {
- id Int @id @default(autoincrement())
- projectId Int? @map("project_id")
- page String @db.VarChar(100)
- ip String? @db.VarChar(45)
- userAgent String? @db.Text @map("user_agent")
- referrer String? @db.VarChar(500)
- timestamp DateTime @default(now())
-
- @@index([projectId])
- @@index([timestamp])
- @@index([page])
-}
-
-// User interactions
-model UserInteraction {
- id Int @id @default(autoincrement())
- projectId Int @map("project_id")
- type InteractionType
- ip String? @db.VarChar(45)
- userAgent String? @db.Text @map("user_agent")
- timestamp DateTime @default(now())
-
- @@index([projectId])
- @@index([type])
- @@index([timestamp])
-}
-
enum InteractionType {
LIKE
SHARE
BOOKMARK
COMMENT
}
-
-// Contact form submissions
-model Contact {
- id Int @id @default(autoincrement())
- name String @db.VarChar(255)
- email String @db.VarChar(255)
- subject String @db.VarChar(500)
- message String @db.Text
- responded Boolean @default(false)
- responseTemplate String? @db.VarChar(50) @map("response_template")
- createdAt DateTime @default(now()) @map("created_at")
- updatedAt DateTime @updatedAt @map("updated_at")
-
- @@index([email])
- @@index([responded])
- @@index([createdAt])
-}