Migrate from Vite to Next.js 15 with SSR

- Replace Vite + React Router with Next.js 15 App Router
- Implement i18n with next-intl (URL-based: /de, /en, /sr)
- Add SSR/SSG for all pages (48 static pages generated)
- Setup Supabase SSR client for auth
- Migrate all pages: Home, About, Portfolio, Blog, Contact, Login, Dashboard, Imprint, Privacy, Terms
- Add Docker support with standalone output
- Replace i18next with next-intl JSON translations
- Use next/image for optimized images

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-17 01:00:33 +01:00
co-authored by Claude Opus 4.5
parent a66f51b9a2
commit b1ec7b4d61
281 changed files with 8024 additions and 8901 deletions
@@ -0,0 +1,33 @@
export const hero = {
// Navigation/Header
aboutMe: 'ABOUT ME',
// Main Section
title: 'Digital Solutions Expert',
description: 'With a background in software development and expertise in digital transformation, I help companies optimize and automate their processes through innovative solutions.',
// Expertise Areas
expertise: {
processAutomation: {
title: 'Process Automation',
description: 'Development of efficient automated workflows'
},
systemIntegration: {
title: 'System Integration',
description: 'Connection and optimization of business systems'
},
customDevelopment: {
title: 'Custom Development',
description: 'Creation of tailored software solutions'
}
},
// Languages
languages: {
english: 'English',
serbian: 'Serbian',
german: 'German',
french: 'French',
spanish: 'Spanish',
russian: 'Russian'
}
} as const;
// Type for type safety
export type HeroTranslations = typeof hero;
@@ -0,0 +1,28 @@
import { hero } from './hero';
import { journey } from './journey';
import { schema } from './schema';
import { skillbar } from './skillbar';
import { skillgroup } from './skillgroup';
import { skills } from './skills';
import { workflow } from './workflow';
export const about = {
seo: {
title: 'About Me - Damjan Savić | Fullstack Developer & AI Specialist',
description: 'Learn more about Damjan Savić - AI & Automation Specialist focused on Voice AI, autonomous agents, and process automation from Cologne, Germany.'
},
hero,
journey,
schema,
skillbar,
skillgroup,
skills,
workflow
} as const;
// Typen exportieren
export type { HeroTranslations } from './hero';
export type { JourneyTranslations } from './journey';
export type { SchemaTranslations } from './schema';
export type { SkillBarTranslations } from './skillbar';
export type { SkillGroupTranslations } from './skillgroup';
export type { SkillsTranslations } from './skills';
export type { WorkflowTranslations } from './workflow';
@@ -0,0 +1,95 @@
export const journey = {
// Header
title: 'Professional Journey',
subtitle: 'From digital media to enterprise solutions',
// Education Section
education: {
title: 'Education',
degrees: {
masters: {
degree: 'M.A. Software Development',
university: 'Middlesex University, London',
period: '2020 - 2022'
},
bachelors: {
degree: 'B.A. Cross-Media Production',
university: 'Middlesex University, London',
period: '2018 - 2020'
}
}
},
// Languages Section
languages: {
title: 'Languages',
items: {
english: {
name: 'English',
level: 'C2'
},
serbian: {
name: 'Serbian',
level: 'C2'
},
german: {
name: 'German',
level: 'C2'
},
french: {
name: 'French',
level: 'B2'
},
spanish: {
name: 'Spanish',
level: 'B2'
},
russian: {
name: 'Russian',
level: 'A1'
}
}
},
// Work History
work: {
positions: [
{
period: '08/2023 - Present',
company: 'Ritter Digital GmbH',
title: 'Digital Solutions Consultant',
location: 'Oberhausen',
highlights: [
'ERP consulting and implementation (JTL WaWi)',
'Process automation & full-stack development',
'RFID technology & automation',
'Lead generation & management',
'AI-supported content management'
]
},
{
period: '02/2023 - 08/2023',
company: 'Joyce & Girls Co AG',
title: 'ERP Integration Specialist',
location: 'Köln',
highlights: [
'Complex system integration (Apparel Magic, TradeByte)',
'Server administration and automation',
'Database and API development',
'Digital marketing and campaign analysis'
]
},
{
period: '08/2022 - 01/2023',
company: 'Magnarius',
title: 'RPA Developer & E-Commerce Manager',
location: 'Bergisch Gladbach',
highlights: [
'Shopware 6 development and JTL integration',
'Google Ads automation',
'CMS management and optimization',
'SEO strategy implementation'
]
}
]
}
} as const;
// Type for type safety
export type JourneyTranslations = typeof journey;
@@ -0,0 +1,31 @@
export const schema = {
page: {
name: 'About Damjan Savić',
description: 'Learn more about Damjan Savić, a certified JTL expert with extensive experience in e-commerce and warehouse management solutions.'
},
person: {
jobTitle: 'JTL Integration Expert',
description: 'With extensive experience in integrating and optimizing e-commerce systems, I help companies with the digital transformation of their business processes.',
languages: {
english: 'English',
serbian: 'Serbian',
german: 'German',
french: 'French',
spanish: 'Spanish',
russian: 'Russian'
},
skills: {
python: 'Python',
googleAds: 'Google Ads',
metaAds: 'Meta Ads',
shopware: 'Shopware',
shopify: 'Shopify',
wooCommerce: 'WooCommerce',
jtlWawi: 'JTL WAWI',
serverAdmin: 'Server Administration',
airflow: 'AirFlow'
}
}
} as const;
// Type for type safety
export type SchemaTranslations = typeof schema;
@@ -0,0 +1,13 @@
export const skillbar = {
// Accessibility labels
ariaLabel: {
skillLevel: 'Skill Level',
progressBar: 'Progress Bar'
},
// Screen reader text
screenReader: {
progress: '{{level}} percent progress for {{skill}}'
}
} as const;
// Type for type safety
export type SkillBarTranslations = typeof skillbar;
@@ -0,0 +1,63 @@
export const skillgroup = {
// Categories
categories: {
development: 'Development',
ecommerce: 'E-Commerce',
marketing: 'Marketing',
automation: 'Automation',
languages: 'Programming Languages',
databases: 'Databases'
},
// Skills by category
skills: {
development: {
frontend: 'Frontend Development',
backend: 'Backend Development',
fullstack: 'Full-Stack Development',
api: 'API Development',
testing: 'Software Testing'
},
ecommerce: {
jtl: 'JTL WaWi',
shopware: 'Shopware',
shopify: 'Shopify',
woocommerce: 'WooCommerce',
magento: 'Magento'
},
marketing: {
seo: 'Search Engine Optimization',
sea: 'Search Engine Advertising',
analytics: 'Web Analytics',
googleAds: 'Google Ads',
metaAds: 'Meta Ads'
},
automation: {
rpa: 'Robotic Process Automation',
workflow: 'Workflow Automation',
cicd: 'CI/CD',
testing: 'Test Automation',
deployment: 'Deployment Automation'
},
languages: {
python: 'Python',
javascript: 'JavaScript',
typescript: 'TypeScript',
php: 'PHP',
sql: 'SQL'
},
databases: {
mysql: 'MySQL',
postgresql: 'PostgreSQL',
mongodb: 'MongoDB',
redis: 'Redis',
elasticsearch: 'Elasticsearch'
}
},
// Accessibility
ariaLabels: {
skillGroup: 'Skill Group',
skillList: 'List of skills in this category'
}
} as const;
// Type for type safety
export type SkillGroupTranslations = typeof skillgroup;
@@ -0,0 +1,46 @@
// en/pages/about/skills.ts
export const skills = {
title: 'Skills',
skillGroups: [
{
category: 'Development',
items: [
{ name: 'Python', level: 90 },
{ name: 'Google Ads', level: 85 },
{ name: 'Meta Ads', level: 85 }
]
},
{
category: 'E-Commerce',
items: [
{ name: 'Shopware', level: 85 },
{ name: 'Shopify', level: 85 },
{ name: 'WooCommerce', level: 85 }
]
},
{
category: 'System Administration',
items: [
{ name: 'JTL WAWI', level: 85 },
{ name: 'Server', level: 75 },
{ name: 'AirFlow', level: 60 }
]
}
],
ui: {
percentage: 'percent',
levelLabel: 'Level',
skillLevel: '{{level}}% proficiency in {{skill}}'
},
aria: {
skillGroup: 'Skill group for {{category}}',
skillBar: 'Progress bar for {{skill}}',
skillIcon: 'Icon for {{category}}',
selectSkill: 'Select skill'
},
screenReader: {
skillProgress: '{{skill}} with a level of {{level}} percent'
}
} as const;
export type SkillsTranslations = typeof skills;
@@ -0,0 +1,44 @@
export const workflow = {
// Page title
title: 'MY WORKFLOW',
description: 'Systematic approach to software development through defined steps',
// Workflow steps
steps: [
{
number: '01',
title: 'REQUIREMENTS ANALYSIS'
},
{
number: '02',
title: 'ASSESSMENT OF DEADLINES AND CONSTRAINTS'
},
{
number: '03',
title: 'DEVELOPMENT ENVIRONMENT SETUP'
},
{
number: '04',
title: 'PROGRAMMING'
},
{
number: '05',
title: 'TESTING THE RESULTS'
},
{
number: '06',
title: 'CODE SUPPORT AND SCALING'
}
],
// Aria Labels for accessibility
aria: {
workflowSection: 'Workflow Process',
stepNumber: 'Step {{number}}',
stepDescription: 'Workflow step: {{title}}'
},
// Screen Reader texts
screenReader: {
stepProgress: 'Step {{number}} of {{total}}: {{title}}'
}
} as const;
// Type for type safety
export type WorkflowTranslations = typeof workflow;