diff --git a/src/app/[locale]/layout.tsx b/src/app/[locale]/layout.tsx
index f3f368e..514caf6 100644
--- a/src/app/[locale]/layout.tsx
+++ b/src/app/[locale]/layout.tsx
@@ -3,7 +3,7 @@ import { NextIntlClientProvider } from 'next-intl';
import { getMessages, setRequestLocale } from 'next-intl/server';
import { Inter } from 'next/font/google';
import { locales, localeMetadata, seoKeywords, type Locale } from '@/i18n/config';
-import type { Metadata } from 'next';
+import type { Metadata, Viewport } from 'next';
import { Header, Footer, GlobalBackground } from '@/components/layout';
import { PersonJsonLd, ProfessionalServiceJsonLd, OrganizationJsonLd, WebSiteJsonLd } from '@/components/seo';
import { WebVitals } from '@/components/analytics';
@@ -21,6 +21,12 @@ type Props = {
params: Promise<{ locale: string }>;
};
+export const viewport: Viewport = {
+ width: 'device-width',
+ initialScale: 1,
+ viewportFit: 'cover',
+};
+
export function generateStaticParams() {
return locales.map((locale) => ({ locale }));
}
@@ -39,9 +45,9 @@ export async function generateMetadata({ params }: Props): Promise {
};
const descriptions: Record = {
- de: 'Fullstack Entwicklung für Websites, Apps und SaaS mit Next.js, React und TypeScript.',
- en: 'Fullstack development for websites, apps and SaaS with Next.js, React and TypeScript.',
- sr: 'Fullstack razvoj za web stranice, aplikacije i SaaS sa Next.js, React i TypeScript.',
+ de: 'Fullstack Developer & KI Entwickler – Websites, Apps und SaaS mit Next.js, React, TypeScript und Claude AI. Künstliche Intelligenz & AI Agents aus Köln.',
+ en: 'Fullstack Developer & AI Expert – Websites, apps and SaaS with Next.js, React, TypeScript and Claude AI. Artificial intelligence & AI agent development.',
+ sr: 'Fullstack Developer & AI Expert – Web stranice, aplikacije i SaaS sa Next.js, React, TypeScript i Claude AI. Veštačka inteligencija i AI agenti.',
};
// Generate alternates using localeMetadata
@@ -121,7 +127,7 @@ export default async function LocaleLayout({ children, params }: Props) {
- {children}
+ {children}
{/* AI Chatbot - lazy loaded for performance */}
diff --git a/src/app/[locale]/leistungen/[slug]/page.tsx b/src/app/[locale]/leistungen/[slug]/page.tsx
index 3eefdfc..d6a9be8 100644
--- a/src/app/[locale]/leistungen/[slug]/page.tsx
+++ b/src/app/[locale]/leistungen/[slug]/page.tsx
@@ -4,7 +4,7 @@ import Link from 'next/link';
import { ArrowLeft, ArrowRight, CheckCircle, Brain, Mic, Workflow, Cloud, Code, Bot, Building, ShoppingCart, Factory } from 'lucide-react';
import { notFound } from 'next/navigation';
import { allServices, getServiceBySlug, getAllServiceSlugs } from '@/data/services';
-import { BreadcrumbJsonLd, ServiceJsonLd } from '@/components/seo';
+import { BreadcrumbJsonLd, ServiceJsonLd, FAQJsonLd } from '@/components/seo';
import { type Locale, locales } from '@/i18n/config';
type Props = {
@@ -51,15 +51,17 @@ export async function generateMetadata({ params }: Props): Promise {
const localePath = locale === 'de' ? `/leistungen/${slug}` : `/${locale}/leistungen/${slug}`;
- // Enhanced keywords for English
- const enhancedKeywords = locale === 'en'
- ? [...service.technologies, 'Remote AI Developer', 'Hire AI Developer', 'AI Consultant USA', 'AI Developer UK'].join(', ')
- : service.technologies.join(', ');
+ // Use seoKeywords if available, otherwise fall back to technologies
+ const seoKw = service.seoKeywords?.[locale as Locale] || [];
+ const allKeywords = [...service.technologies, ...seoKw];
+ if (locale === 'en') {
+ allKeywords.push('Remote AI Developer', 'Hire AI Developer', 'AI Consultant USA', 'AI Developer UK');
+ }
return {
title,
description: service.description[locale as Locale] || service.description.de,
- keywords: enhancedKeywords,
+ keywords: allKeywords.join(', '),
alternates: {
canonical: `${BASE_URL}${localePath}`,
languages: {
@@ -76,6 +78,14 @@ export async function generateMetadata({ params }: Props): Promise {
type: 'website',
locale: locale === 'de' ? 'de_DE' : locale === 'sr' ? 'sr_RS' : 'en_US',
alternateLocale: ['de_DE', 'en_US', 'sr_RS'].filter(l => l !== (locale === 'de' ? 'de_DE' : locale === 'sr' ? 'sr_RS' : 'en_US')),
+ images: [
+ {
+ url: `${BASE_URL}/images/og-image.avif`,
+ width: 1200,
+ height: 630,
+ alt: `${service.name[locale as Locale]} - Damjan Savić`,
+ },
+ ],
},
};
}
@@ -101,6 +111,48 @@ export default async function ServicePage({ params }: Props) {
// Get related services (excluding current)
const relatedServices = allServices.filter((s) => s.slug !== slug).slice(0, 3);
+ // FAQ items for this service
+ const serviceFaqItems = locale === 'de' ? [
+ {
+ question: `Was kostet ${service.name.de}?`,
+ answer: `Die Kosten für ${service.name.de} variieren je nach Projektumfang und Komplexität. Ich erstelle gerne ein individuelles Angebot nach einem kostenlosen Erstgespräch.`,
+ },
+ {
+ question: `Welche Technologien nutzen Sie für ${service.name.de}?`,
+ answer: `Für ${service.name.de} setze ich auf bewährte Technologien: ${service.technologies.join(', ')}. Die genaue Auswahl hängt von Ihren Anforderungen ab.`,
+ },
+ {
+ question: `Wie lange dauert ein typisches ${service.name.de}-Projekt?`,
+ answer: `Die Dauer eines ${service.name.de}-Projekts hängt vom Umfang ab. Einfache Projekte können in 2-4 Wochen abgeschlossen werden, komplexere Lösungen in 6-12 Wochen.`,
+ },
+ ] : locale === 'en' ? [
+ {
+ question: `How much does ${service.name.en} cost?`,
+ answer: `The cost of ${service.name.en} varies depending on project scope and complexity. I'm happy to provide a custom quote after a free initial consultation.`,
+ },
+ {
+ question: `What technologies do you use for ${service.name.en}?`,
+ answer: `For ${service.name.en}, I use proven technologies: ${service.technologies.join(', ')}. The exact selection depends on your requirements.`,
+ },
+ {
+ question: `How long does a typical ${service.name.en} project take?`,
+ answer: `The duration of a ${service.name.en} project depends on scope. Simple projects can be completed in 2-4 weeks, more complex solutions in 6-12 weeks.`,
+ },
+ ] : [
+ {
+ question: `Koliko košta ${service.name.sr}?`,
+ answer: `Troškovi za ${service.name.sr} variraju u zavisnosti od obima i kompleksnosti projekta. Rado ću vam dati individualizovanu ponudu nakon besplatnog inicijalnog razgovora.`,
+ },
+ {
+ question: `Koje tehnologije koristite za ${service.name.sr}?`,
+ answer: `Za ${service.name.sr} koristim proverene tehnologije: ${service.technologies.join(', ')}. Tačan izbor zavisi od vaših zahteva.`,
+ },
+ {
+ question: `Koliko traje tipičan ${service.name.sr} projekat?`,
+ answer: `Trajanje ${service.name.sr} projekta zavisi od obima. Jednostavni projekti mogu se završiti za 2-4 nedelje, kompleksnija rešenja za 6-12 nedelja.`,
+ },
+ ];
+
return (
diff --git a/src/app/[locale]/leistungen/standort/[city]/page.tsx b/src/app/[locale]/leistungen/standort/[city]/page.tsx
index 5d7ad1e..5c67c0d 100644
--- a/src/app/[locale]/leistungen/standort/[city]/page.tsx
+++ b/src/app/[locale]/leistungen/standort/[city]/page.tsx
@@ -12,6 +12,8 @@ type Props = {
params: Promise<{ locale: string; city: string }>;
};
+const BASE_URL = process.env.NEXT_PUBLIC_SITE_URL || 'https://damjan-savic.com';
+
const iconMap: Record> = {
Brain,
Mic,
@@ -39,15 +41,15 @@ export async function generateMetadata({ params }: Props): Promise {
}
const titles: Record = {
- de: `KI Entwickler ${city.name.de} - AI & Automatisierung | Damjan Savić`,
- en: `AI Developer ${city.name.en} - AI & Automation | Damjan Savić`,
- sr: `AI Developer ${city.name.sr} - AI & Automatizacija | Damjan Savić`,
+ de: `Fullstack Developer & KI Entwickler ${city.name.de} | Claude AI, Next.js, React | Damjan Savić`,
+ en: `AI & Fullstack Developer ${city.name.en} | Claude AI, Next.js, React | Damjan Savić`,
+ sr: `AI & Fullstack Developer ${city.name.sr} | Claude AI, Next.js, React | Damjan Savić`,
};
const descriptions: Record = {
- de: `Professionelle KI-Entwicklung und Automatisierung in ${city.name.de}. Voice AI, Prozessautomatisierung, SaaS-Entwicklung. Ihr AI & Automation Specialist für ${city.name.de} und ${city.region}.`,
- en: `Professional AI development and automation in ${city.name.en}. Voice AI, process automation, SaaS development. Your AI & Automation Specialist for ${city.name.en} and ${city.region}.`,
- sr: `Profesionalni AI razvoj i automatizacija u ${city.name.sr}. Voice AI, automatizacija procesa, SaaS razvoj. Vaš AI & Automation Specialist za ${city.name.sr} i ${city.region}.`,
+ de: `Fullstack Developer & KI Entwickler in ${city.name.de}. Claude AI, Next.js, React, TypeScript, Tailwind CSS. Voice AI, Prozessautomatisierung, SaaS-Entwicklung. Ihr AI & Automation Specialist für ${city.name.de} und ${city.region}.`,
+ en: `Fullstack Developer & AI Expert in ${city.name.en}. Claude AI, Next.js, React, TypeScript, Tailwind CSS. Voice AI, process automation, SaaS development. Your AI & Automation Specialist for ${city.name.en} and ${city.region}.`,
+ sr: `Fullstack Developer & AI Expert u ${city.name.sr}. Claude AI, Next.js, React, TypeScript, Tailwind CSS. Voice AI, automatizacija procesa, SaaS razvoj. Vaš AI & Automation Specialist za ${city.name.sr} i ${city.region}.`,
};
return {
@@ -55,17 +57,27 @@ export async function generateMetadata({ params }: Props): Promise {
description: descriptions[locale] || descriptions.de,
keywords: city.keywords[locale as Locale]?.join(', ') || city.keywords.de.join(', '),
alternates: {
- canonical: `/${locale}/leistungen/standort/${citySlug}`,
+ canonical: `${BASE_URL}/${locale}/leistungen/standort/${citySlug}`,
languages: {
- de: `/de/leistungen/standort/${citySlug}`,
- en: `/en/leistungen/standort/${citySlug}`,
- sr: `/sr/leistungen/standort/${citySlug}`,
+ 'x-default': `${BASE_URL}/de/leistungen/standort/${citySlug}`,
+ de: `${BASE_URL}/de/leistungen/standort/${citySlug}`,
+ en: `${BASE_URL}/en/leistungen/standort/${citySlug}`,
+ sr: `${BASE_URL}/sr/leistungen/standort/${citySlug}`,
},
},
openGraph: {
title: titles[locale] || titles.de,
description: descriptions[locale] || descriptions.de,
type: 'website',
+ url: `${BASE_URL}/${locale}/leistungen/standort/${citySlug}`,
+ images: [
+ {
+ url: `${BASE_URL}/images/og-image.avif`,
+ width: 1200,
+ height: 630,
+ alt: `Damjan Savić - AI Developer ${city.name.en}`,
+ },
+ ],
},
};
}
@@ -91,6 +103,14 @@ export default async function CityPage({ params }: Props) {
question: `Bieten Sie Ihre Dienstleistungen auch vor Ort in ${city.name.de} an?`,
answer: `Ja, ich arbeite mit Unternehmen in ${city.name.de} und Umgebung. Die meisten Projekte wickle ich remote ab, aber persönliche Meetings in ${city.name.de} sind bei Bedarf möglich.`,
},
+ {
+ question: `Entwickeln Sie mit Next.js und React in ${city.name.de}?`,
+ answer: `Ja, ich bin auf moderne Webentwicklung mit Next.js, React, TypeScript und Tailwind CSS spezialisiert. Für Unternehmen in ${city.name.de} entwickle ich performante, SEO-optimierte Web-Anwendungen und SaaS-Produkte mit diesem Tech-Stack.`,
+ },
+ {
+ question: `Setzen Sie Claude AI für Projekte in ${city.name.de} ein?`,
+ answer: `Ja, ich integriere Claude AI von Anthropic sowie andere KI-Modelle wie GPT-4 in Geschäftsprozesse. Ob KI-Agenten, Chatbots oder automatisierte Workflows – ich setze modernste Künstliche Intelligenz für Unternehmen in ${city.name.de} ein.`,
+ },
{
question: `Welche Branchen bedienen Sie in ${city.name.de}?`,
answer: `Ich arbeite branchenübergreifend mit Startups, mittelständischen Unternehmen und Konzernen in ${city.name.de}. Besonders häufig sind Projekte in den Bereichen E-Commerce, Fintech, Healthcare und B2B-Services.`,
@@ -104,6 +124,14 @@ export default async function CityPage({ params }: Props) {
question: `Do you also offer your services on-site in ${city.name.en}?`,
answer: `Yes, I work with companies in ${city.name.en} and the surrounding area. Most projects are handled remotely, but in-person meetings in ${city.name.en} are possible if needed.`,
},
+ {
+ question: `Do you develop with Next.js and React in ${city.name.en}?`,
+ answer: `Yes, I specialize in modern web development with Next.js, React, TypeScript, and Tailwind CSS. For companies in ${city.name.en}, I build performant, SEO-optimized web applications and SaaS products using this tech stack.`,
+ },
+ {
+ question: `Do you use Claude AI for projects in ${city.name.en}?`,
+ answer: `Yes, I integrate Claude AI by Anthropic as well as other AI models like GPT-4 into business processes. Whether AI agents, chatbots, or automated workflows – I leverage cutting-edge artificial intelligence for companies in ${city.name.en}.`,
+ },
{
question: `Which industries do you serve in ${city.name.en}?`,
answer: `I work across industries with startups, medium-sized companies and corporations in ${city.name.en}. Projects are particularly common in e-commerce, fintech, healthcare and B2B services.`,
@@ -117,6 +145,14 @@ export default async function CityPage({ params }: Props) {
question: `Da li nudite usluge i na licu mesta u ${city.name.sr}?`,
answer: `Da, radim sa kompanijama u ${city.name.sr} i okolini. Većina projekata se obrađuje remote, ali lični sastanci u ${city.name.sr} su mogući po potrebi.`,
},
+ {
+ question: `Da li razvijate sa Next.js i React u ${city.name.sr}?`,
+ answer: `Da, specijalizovan sam za moderni web razvoj sa Next.js, React, TypeScript i Tailwind CSS. Za kompanije u ${city.name.sr} pravim performantne, SEO-optimizovane web aplikacije i SaaS proizvode sa ovim tech stack-om.`,
+ },
+ {
+ question: `Da li koristite Claude AI za projekte u ${city.name.sr}?`,
+ answer: `Da, integrisem Claude AI od Anthropic-a kao i druge AI modele poput GPT-4 u poslovne procese. Bilo da su u pitanju AI agenti, chatbotovi ili automatizovani radni tokovi – koristim najsavremeniju veštačku inteligenciju za kompanije u ${city.name.sr}.`,
+ },
{
question: `Koje industrije opslužujete u ${city.name.sr}?`,
answer: `Radim u svim industrijama sa startapima, srednjim preduzećima i korporacijama u ${city.name.sr}. Projekti su posebno česti u e-commerce, fintech, zdravstvu i B2B uslugama.`,
@@ -162,7 +198,7 @@ export default async function CityPage({ params }: Props) {
- {city.region}, Deutschland
+ {city.region}
@@ -175,7 +211,7 @@ export default async function CityPage({ params }: Props) {
{/* Keywords as tags */}
- {city.keywords[locale as Locale]?.slice(0, 5).map((keyword) => (
+ {city.keywords[locale as Locale]?.map((keyword) => (
;
+};
+
+const BASE_URL = process.env.NEXT_PUBLIC_SITE_URL || 'https://damjan-savic.com';
+
+export async function generateStaticParams() {
+ const slugs = getAllTechnologySlugs();
+ return locales.flatMap((locale) =>
+ slugs.map((tech) => ({
+ locale,
+ tech,
+ }))
+ );
+}
+
+export async function generateMetadata({ params }: Props): Promise {
+ const { locale, tech: techSlug } = await params;
+ const tech = getTechnologyBySlug(techSlug);
+
+ if (!tech) {
+ return { title: 'Technology Not Found' };
+ }
+
+ const title = `${tech.title[locale as Locale]} | Damjan Savić`;
+
+ return {
+ title,
+ description: tech.description[locale as Locale],
+ keywords: tech.keywords[locale as Locale].join(', '),
+ alternates: {
+ canonical: `${BASE_URL}/${locale}/leistungen/technologie/${techSlug}`,
+ languages: {
+ 'x-default': `${BASE_URL}/de/leistungen/technologie/${techSlug}`,
+ de: `${BASE_URL}/de/leistungen/technologie/${techSlug}`,
+ en: `${BASE_URL}/en/leistungen/technologie/${techSlug}`,
+ sr: `${BASE_URL}/sr/leistungen/technologie/${techSlug}`,
+ },
+ },
+ openGraph: {
+ title,
+ description: tech.description[locale as Locale],
+ url: `${BASE_URL}/${locale}/leistungen/technologie/${techSlug}`,
+ type: 'website',
+ locale: locale === 'de' ? 'de_DE' : locale === 'sr' ? 'sr_RS' : 'en_US',
+ alternateLocale: ['de_DE', 'en_US', 'sr_RS'].filter(l => l !== (locale === 'de' ? 'de_DE' : locale === 'sr' ? 'sr_RS' : 'en_US')),
+ images: [
+ {
+ url: `${BASE_URL}/images/og-image.avif`,
+ width: 1200,
+ height: 630,
+ alt: `${tech.name} Developer - Damjan Savić`,
+ },
+ ],
+ },
+ };
+}
+
+export default async function TechnologyPage({ params }: Props) {
+ const { locale, tech: techSlug } = await params;
+ setRequestLocale(locale);
+
+ const tech = getTechnologyBySlug(techSlug);
+
+ if (!tech) {
+ notFound();
+ }
+
+ const breadcrumbItems = [
+ { name: locale === 'de' ? 'Start' : locale === 'sr' ? 'Početna' : 'Home', url: `/${locale}` },
+ { name: locale === 'de' ? 'Leistungen' : locale === 'sr' ? 'Usluge' : 'Services', url: `/${locale}/leistungen` },
+ { name: tech.name, url: `/${locale}/leistungen/technologie/${techSlug}` },
+ ];
+
+ const faqItems = locale === 'de' ? [
+ {
+ question: `Warum ${tech.name} für mein Projekt?`,
+ answer: `${tech.name} bietet hervorragende Performance, Skalierbarkeit und Entwicklerproduktivität. Als erfahrener ${tech.name} Entwickler kann ich Ihnen die beste Lösung für Ihre Anforderungen empfehlen.`,
+ },
+ {
+ question: `Was kostet ein ${tech.name}-Projekt?`,
+ answer: `Die Kosten hängen vom Projektumfang ab. Ich erstelle gerne ein individuelles Angebot nach einem kostenlosen Erstgespräch. Einfache Projekte starten ab ca. 2.000€.`,
+ },
+ {
+ question: `Wie lange dauert ein ${tech.name}-Projekt?`,
+ answer: `Je nach Komplexität zwischen 2 und 12 Wochen. Ein MVP kann in 4-6 Wochen realisiert werden. Ich arbeite agil mit wöchentlichen Updates.`,
+ },
+ ] : locale === 'en' ? [
+ {
+ question: `Why choose ${tech.name} for my project?`,
+ answer: `${tech.name} offers excellent performance, scalability and developer productivity. As an experienced ${tech.name} developer, I can recommend the best solution for your requirements.`,
+ },
+ {
+ question: `How much does a ${tech.name} project cost?`,
+ answer: `The cost depends on the project scope. I'm happy to provide a custom quote after a free initial consultation. Simple projects start from around $2,200.`,
+ },
+ {
+ question: `How long does a ${tech.name} project take?`,
+ answer: `Depending on complexity, between 2 and 12 weeks. An MVP can be realized in 4-6 weeks. I work agile with weekly updates.`,
+ },
+ ] : [
+ {
+ question: `Zašto odabrati ${tech.name} za moj projekat?`,
+ answer: `${tech.name} nudi odlične performanse, skalabilnost i produktivnost. Kao iskusni ${tech.name} developer, mogu vam preporučiti najbolje rešenje za vaše zahteve.`,
+ },
+ {
+ question: `Koliko košta ${tech.name} projekat?`,
+ answer: `Troškovi zavise od obima projekta. Rado ću vam dati individualizovanu ponudu nakon besplatnog inicijalnog razgovora. Jednostavni projekti počinju od oko 2.000€.`,
+ },
+ {
+ question: `Koliko traje ${tech.name} projekat?`,
+ answer: `U zavisnosti od kompleksnosti, između 2 i 12 nedelja. MVP se može realizovati za 4-6 nedelja. Radim agilno sa nedeljnim ažuriranjima.`,
+ },
+ ];
+
+ // Related services
+ const relatedServiceData = tech.relatedServices
+ .map((slug) => getServiceBySlug(slug))
+ .filter(Boolean);
+
+ // Other technologies for cross-linking
+ const otherTechnologies = technologies.filter((t) => t.slug !== techSlug).slice(0, 4);
+
+ // Select cities for cross-linking (mix of regions)
+ const featuredCities = cities.filter((c) =>
+ ['koeln', 'berlin', 'muenchen', 'london', 'new-york', 'beograd'].includes(c.slug)
+ );
+
+ return (
+
+ {locale === 'de'
+ ? 'Lassen Sie uns besprechen, wie ich Ihnen helfen kann.'
+ : locale === 'sr'
+ ? 'Razgovarajmo o tome kako vam mogu pomoći.'
+ : "Let's discuss how I can help you."}
+
+ );
+}
diff --git a/src/app/[locale]/page.tsx b/src/app/[locale]/page.tsx
index 6445971..d0d2844 100644
--- a/src/app/[locale]/page.tsx
+++ b/src/app/[locale]/page.tsx
@@ -12,38 +12,53 @@ export async function generateMetadata({ params }: Props): Promise {
const { locale } = await params;
const titles: Record = {
- de: 'KI Entwickler Köln | AI Agents & Automatisierung | Damjan Savić',
- en: 'AI Developer Cologne | AI Agents & Automation | Damjan Savić',
- sr: 'AI Developer Keln | AI Agenti & Automatizacija | Damjan Savić',
+ de: 'Fullstack Developer & KI Entwickler Köln | Claude AI, Next.js, React | Damjan Savić',
+ en: 'AI & Fullstack Developer | Claude AI, Next.js, React, TypeScript | Damjan Savić',
+ sr: 'AI & Fullstack Developer | Claude AI, Next.js, React | Damjan Savić',
};
const descriptions: Record = {
- de: 'Freelance KI Entwickler aus Köln. Spezialisiert auf KI-Agenten, Voice AI, Prozessautomatisierung mit n8n und SaaS-Entwicklung. Über 7 Jahre Erfahrung.',
- en: 'Remote AI Developer & Automation Expert based in Germany. Building AI agents, Voice AI systems, and n8n automations for clients in USA, UK, and Europe. 7+ years experience. Available for international projects.',
- sr: 'AI Developer i Automation Specialist iz Nemačke, poreklo iz Srbije. Specijalizovan za AI agente, Voice AI, n8n automatizaciju i SaaS razvoj. Radim sa klijentima iz Srbije, Nemačke i dijaspore. 7+ godina iskustva.',
+ de: 'Freelance Fullstack Developer & KI Entwickler aus Köln. Spezialisiert auf Claude AI, KI-Agenten, Next.js, React, TypeScript und Tailwind CSS. Prozessautomatisierung mit n8n, Voice AI und SaaS-Entwicklung. Über 7 Jahre Erfahrung in Künstlicher Intelligenz und Webentwicklung.',
+ en: 'Remote Fullstack Developer & AI Expert based in Germany. Building Claude AI integrations, AI agents, and modern web apps with Next.js, React, TypeScript and Tailwind CSS. Voice AI, n8n automation, and SaaS development for clients in USA, UK, and Europe. 7+ years experience.',
+ sr: 'AI & Fullstack Developer iz Nemačke, poreklo iz Srbije. Specijalizovan za Claude AI, AI agente, Next.js, React, TypeScript i Tailwind CSS. Voice AI, n8n automatizacija i SaaS razvoj za klijente iz Srbije, Nemačke i dijaspore. 7+ godina iskustva u veštačkoj inteligenciji.',
};
const keywords: Record = {
de: [
+ 'Fullstack Developer Köln',
'KI Entwickler Köln',
+ 'Claude AI Entwickler',
+ 'Next.js Entwickler',
+ 'React Entwickler',
+ 'TypeScript Entwickler',
+ 'Tailwind CSS Entwickler',
+ 'Künstliche Intelligenz',
'AI Developer Deutschland',
'KI Entwickler DACH',
'AI Agentur Köln',
+ 'KI-Agenten Entwicklung',
'Prozessautomatisierung',
'n8n Entwickler',
'Voice AI',
- 'KI-Agenten',
- 'Fullstack Entwickler',
'SaaS Entwicklung',
- 'Automatisierung',
'GPT-4 Integration',
+ 'Claude AI Integration',
'KI Entwickler Wien',
'AI Developer Zürich',
+ 'Python Entwickler',
'Freelancer Deutschland',
- 'Claude AI Integration',
],
en: [
+ 'Fullstack Developer',
'AI Developer',
+ 'Claude AI Developer',
+ 'Claude AI Integration',
+ 'Next.js Developer',
+ 'React Developer',
+ 'TypeScript Developer',
+ 'Tailwind CSS Developer',
+ 'Artificial Intelligence',
+ 'AI Agent Developer',
'Remote AI Developer',
'AI Developer USA',
'AI Developer UK',
@@ -51,32 +66,32 @@ export async function generateMetadata({ params }: Props): Promise {
'Process Automation Expert',
'n8n Developer',
'Voice AI Developer',
- 'AI Agents Developer',
- 'Fullstack Developer',
'SaaS Development',
'GPT-4 Integration',
- 'ChatGPT Integration',
+ 'Python Developer',
'Remote Developer',
'Freelance AI Developer',
'AI Consultant',
- 'Automation Specialist',
],
sr: [
'AI Developer Srbija',
+ 'Fullstack Programer Srbija',
+ 'Claude AI Developer',
+ 'Next.js Programer',
+ 'React Programer',
+ 'TypeScript Programer',
+ 'Veštačka Inteligencija',
'AI Programer Beograd',
'AI Developer Novi Sad',
- 'Fullstack Programer Srbija',
+ 'AI Agenti',
'Automatizacija procesa',
'n8n Automatizacija',
'Voice AI Srbija',
- 'AI Agenti',
'SaaS Razvoj',
- 'GPT-4 Integracija',
'Python Programer Srbija',
'React Programer Beograd',
'Freelance Developer Srbija',
'Remote Programer Nemačka',
- 'Srpski Developer Dijaspora',
'Web Razvoj Beograd',
],
};
diff --git a/src/app/[locale]/terms/page.tsx b/src/app/[locale]/terms/page.tsx
index 6a9e64b..ed95efa 100644
--- a/src/app/[locale]/terms/page.tsx
+++ b/src/app/[locale]/terms/page.tsx
@@ -1,6 +1,5 @@
import { setRequestLocale } from 'next-intl/server';
import type { Metadata } from 'next';
-import { getTranslations } from 'next-intl/server';
import Link from 'next/link';
type Props = {
@@ -11,13 +10,24 @@ const BASE_URL = process.env.NEXT_PUBLIC_SITE_URL || 'https://damjan-savic.com';
export async function generateMetadata({ params }: Props): Promise {
const { locale } = await params;
- const t = await getTranslations({ locale, namespace: 'pages.terms.seo' });
+
+ const titles: Record = {
+ de: 'Allgemeine Geschäftsbedingungen | Damjan Savić - KI Entwickler Köln',
+ en: 'Terms and Conditions | Damjan Savić - AI Developer',
+ sr: 'Uslovi korišćenja | Damjan Savić - AI Developer',
+ };
+
+ const descriptions: Record = {
+ de: 'Allgemeine Geschäftsbedingungen (AGB) für die Dienstleistungen und Portfolio-Website von Damjan Savić, Fullstack Developer & KI Entwickler aus Köln.',
+ en: 'Terms and Conditions for the services and portfolio website of Damjan Savić, Fullstack Developer & AI Developer.',
+ sr: 'Uslovi korišćenja za usluge i portfolio veb sajt Damjana Savića, Fullstack Developer & AI Developer.',
+ };
const localePath = locale === 'de' ? '/terms' : `/${locale}/terms`;
return {
- title: t('title'),
- description: t('description'),
+ title: titles[locale] || titles.de,
+ description: descriptions[locale] || descriptions.de,
alternates: {
canonical: `${BASE_URL}${localePath}`,
languages: {
@@ -28,8 +38,8 @@ export async function generateMetadata({ params }: Props): Promise {
},
},
openGraph: {
- title: t('title'),
- description: t('description'),
+ title: titles[locale] || titles.de,
+ description: descriptions[locale] || descriptions.de,
url: `${BASE_URL}${localePath}`,
type: 'website',
locale: locale === 'de' ? 'de_DE' : locale === 'sr' ? 'sr_RS' : 'en_US',
@@ -42,64 +52,283 @@ export async function generateMetadata({ params }: Props): Promise {
};
}
+type TermsContent = {
+ title: string;
+ lastUpdated: string;
+ sections: { title: string; content: string; items?: string[] }[];
+ contact: { title: string; content: string[] };
+ privacyNote: { text: string; link: string };
+};
+
export default async function TermsPage({ params }: Props) {
const { locale } = await params;
setRequestLocale(locale);
- const t = await getTranslations('pages.terms');
+ const content: Record = {
+ de: {
+ title: 'Allgemeine Geschäftsbedingungen',
+ lastUpdated: 'Zuletzt aktualisiert: Februar 2026',
+ sections: [
+ {
+ title: '1. Geltungsbereich',
+ content: 'Diese Allgemeinen Geschäftsbedingungen (AGB) gelten für alle Dienstleistungen und Angebote von Damjan Savić im Bereich Fullstack-Entwicklung, KI-Entwicklung, Prozessautomatisierung und IT-Beratung sowie für die Nutzung der Website damjan-savic.com.',
+ },
+ {
+ title: '2. Leistungsumfang',
+ content: 'Der Umfang der zu erbringenden Leistungen ergibt sich aus der jeweiligen Projektvereinbarung oder dem Angebot. Leistungen umfassen unter anderem:',
+ items: [
+ 'Entwicklung von Webanwendungen und SaaS-Lösungen (Next.js, React, TypeScript)',
+ 'KI-Entwicklung und Integration (Claude AI, GPT, Voice AI)',
+ 'Prozessautomatisierung (n8n, Make, individuelle Lösungen)',
+ 'IT-Beratung und technische Konzeptentwicklung',
+ 'Wartung und Support bestehender Anwendungen',
+ ],
+ },
+ {
+ title: '3. Angebote und Vertragsschluss',
+ content: 'Angebote sind freibleibend und unverbindlich. Ein Vertrag kommt erst durch schriftliche Bestätigung oder durch Aufnahme der Leistungserbringung zustande. Mündliche Nebenabreden bedürfen der schriftlichen Bestätigung.',
+ },
+ {
+ title: '4. Vergütung und Zahlungsbedingungen',
+ content: 'Die Vergütung richtet sich nach der jeweiligen Vereinbarung. Rechnungen sind innerhalb von 14 Tagen nach Rechnungsstellung ohne Abzug zahlbar. Bei Zahlungsverzug werden Verzugszinsen in gesetzlicher Höhe berechnet. Bei größeren Projekten können Abschlagszahlungen vereinbart werden.',
+ },
+ {
+ title: '5. Mitwirkungspflichten des Auftraggebers',
+ content: 'Der Auftraggeber stellt alle für die Leistungserbringung erforderlichen Informationen, Zugänge und Materialien rechtzeitig zur Verfügung. Verzögerungen, die auf fehlender Mitwirkung beruhen, gehen nicht zu Lasten des Auftragnehmers und können zu Terminverschiebungen führen.',
+ },
+ {
+ title: '6. Urheberrecht und Nutzungsrechte',
+ content: 'Mit vollständiger Bezahlung gehen die vereinbarten Nutzungsrechte an den erstellten Werken auf den Auftraggeber über. Der Auftragnehmer behält das Recht, die erstellten Arbeiten als Referenz im Portfolio zu verwenden, sofern nicht ausdrücklich anders vereinbart. Quellcode und Dokumentation werden nach Abschluss und Bezahlung vollständig übergeben.',
+ },
+ {
+ title: '7. Gewährleistung und Haftung',
+ content: 'Die Gewährleistung richtet sich nach den gesetzlichen Bestimmungen. Mängel sind unverzüglich nach Entdeckung schriftlich anzuzeigen. Die Haftung für leichte Fahrlässigkeit ist auf den vorhersehbaren, vertragstypischen Schaden begrenzt, soweit es sich nicht um die Verletzung wesentlicher Vertragspflichten, Schäden aus der Verletzung des Lebens, des Körpers oder der Gesundheit handelt.',
+ },
+ {
+ title: '8. Vertraulichkeit und Datenschutz',
+ content: 'Beide Parteien verpflichten sich, alle im Rahmen der Zusammenarbeit erhaltenen vertraulichen Informationen geheim zu halten. Die Verarbeitung personenbezogener Daten erfolgt im Einklang mit der DSGVO. Weitere Informationen finden Sie in der Datenschutzerklärung.',
+ },
+ {
+ title: '9. Kündigung',
+ content: 'Projektverträge können von beiden Seiten mit einer Frist von 14 Tagen zum Monatsende schriftlich gekündigt werden, sofern nicht anders vereinbart. Bereits erbrachte Leistungen sind in jedem Fall zu vergüten. Das Recht zur außerordentlichen Kündigung aus wichtigem Grund bleibt unberührt.',
+ },
+ {
+ title: '10. Schlussbestimmungen',
+ content: 'Es gilt das Recht der Bundesrepublik Deutschland. Erfüllungsort und Gerichtsstand ist Köln, soweit gesetzlich zulässig. Sollten einzelne Bestimmungen dieser AGB unwirksam sein oder werden, bleibt die Wirksamkeit der übrigen Bestimmungen unberührt.',
+ },
+ ],
+ contact: {
+ title: 'Kontakt',
+ content: [
+ 'Bei Fragen zu diesen AGB erreichen Sie mich unter:',
+ 'Damjan Savić',
+ 'E-Mail: info@damjan-savic.com',
+ ],
+ },
+ privacyNote: {
+ text: 'Informationen zum Datenschutz finden Sie in unserer',
+ link: 'Datenschutzerklärung',
+ },
+ },
+ en: {
+ title: 'Terms and Conditions',
+ lastUpdated: 'Last updated: February 2026',
+ sections: [
+ {
+ title: '1. Scope of Application',
+ content: 'These Terms and Conditions apply to all services and offerings by Damjan Savić in the fields of fullstack development, AI development, process automation and IT consulting, as well as the use of the website damjan-savic.com.',
+ },
+ {
+ title: '2. Scope of Services',
+ content: 'The scope of services to be provided is determined by the respective project agreement or offer. Services include but are not limited to:',
+ items: [
+ 'Development of web applications and SaaS solutions (Next.js, React, TypeScript)',
+ 'AI development and integration (Claude AI, GPT, Voice AI)',
+ 'Process automation (n8n, Make, custom solutions)',
+ 'IT consulting and technical concept development',
+ 'Maintenance and support of existing applications',
+ ],
+ },
+ {
+ title: '3. Offers and Contract Formation',
+ content: 'Offers are non-binding and subject to change. A contract is only concluded upon written confirmation or commencement of service delivery. Oral side agreements require written confirmation.',
+ },
+ {
+ title: '4. Remuneration and Payment Terms',
+ content: 'Remuneration is based on the respective agreement. Invoices are payable within 14 days of invoicing without deductions. In case of late payment, default interest at the statutory rate will be charged. For larger projects, progress payments may be agreed upon.',
+ },
+ {
+ title: '5. Client Cooperation Obligations',
+ content: 'The client shall provide all information, access, and materials required for service delivery in a timely manner. Delays resulting from lack of cooperation are not attributable to the contractor and may lead to schedule adjustments.',
+ },
+ {
+ title: '6. Copyright and Usage Rights',
+ content: 'Upon full payment, the agreed usage rights to the created works are transferred to the client. The contractor retains the right to use the created works as portfolio references, unless expressly agreed otherwise. Source code and documentation are fully handed over upon completion and payment.',
+ },
+ {
+ title: '7. Warranty and Liability',
+ content: 'Warranty is governed by statutory provisions. Defects must be reported in writing immediately upon discovery. Liability for slight negligence is limited to foreseeable, contract-typical damage, unless it concerns the breach of essential contractual obligations or damages resulting from injury to life, body, or health.',
+ },
+ {
+ title: '8. Confidentiality and Data Protection',
+ content: 'Both parties commit to keeping all confidential information received in the course of cooperation secret. The processing of personal data is carried out in accordance with the GDPR. Further information can be found in the Privacy Policy.',
+ },
+ {
+ title: '9. Termination',
+ content: 'Project contracts may be terminated by either party with 14 days\' notice to the end of the month in writing, unless otherwise agreed. Services already rendered must be compensated in any case. The right to extraordinary termination for good cause remains unaffected.',
+ },
+ {
+ title: '10. Final Provisions',
+ content: 'The laws of the Federal Republic of Germany apply. The place of performance and jurisdiction is Cologne (Köln), to the extent permitted by law. Should individual provisions of these Terms and Conditions be or become invalid, the validity of the remaining provisions shall remain unaffected.',
+ },
+ ],
+ contact: {
+ title: 'Contact',
+ content: [
+ 'For questions about these Terms and Conditions, please contact:',
+ 'Damjan Savić',
+ 'Email: info@damjan-savic.com',
+ ],
+ },
+ privacyNote: {
+ text: 'For information on data protection, please see our',
+ link: 'Privacy Policy',
+ },
+ },
+ sr: {
+ title: 'Uslovi korišćenja',
+ lastUpdated: 'Poslednje ažuriranje: Februar 2026',
+ sections: [
+ {
+ title: '1. Oblast primene',
+ content: 'Ovi Uslovi korišćenja se primenjuju na sve usluge i ponude Damjana Savića u oblastima fullstack razvoja, AI razvoja, automatizacije procesa i IT konsaltinga, kao i na korišćenje web stranice damjan-savic.com.',
+ },
+ {
+ title: '2. Obim usluga',
+ content: 'Obim usluga koje treba pružiti određuje se odgovarajućim projektnim ugovorom ili ponudom. Usluge uključuju, ali nisu ograničene na:',
+ items: [
+ 'Razvoj veb aplikacija i SaaS rešenja (Next.js, React, TypeScript)',
+ 'AI razvoj i integracija (Claude AI, GPT, Voice AI)',
+ 'Automatizacija procesa (n8n, Make, prilagođena rešenja)',
+ 'IT konsalting i razvoj tehničkih koncepata',
+ 'Održavanje i podrška postojećih aplikacija',
+ ],
+ },
+ {
+ title: '3. Ponude i zaključenje ugovora',
+ content: 'Ponude su neobavezujuće i podložne promenama. Ugovor se zaključuje tek pisanom potvrdom ili početkom pružanja usluga. Usmeni sporedni dogovori zahtevaju pisanu potvrdu.',
+ },
+ {
+ title: '4. Naknada i uslovi plaćanja',
+ content: 'Naknada se zasniva na odgovarajućem dogovoru. Fakture se plaćaju u roku od 14 dana od izdavanja bez odbitaka. U slučaju kašnjenja s plaćanjem, zaračunavaju se zakonske zatezne kamate. Za veće projekte mogu se dogovoriti avansna plaćanja.',
+ },
+ {
+ title: '5. Obaveze saradnje klijenta',
+ content: 'Klijent je dužan da blagovremeno obezbedi sve informacije, pristupe i materijale potrebne za pružanje usluga. Kašnjenja nastala usled nedostatka saradnje ne pripisuju se izvršiocu i mogu dovesti do prilagođavanja rokova.',
+ },
+ {
+ title: '6. Autorska prava i prava korišćenja',
+ content: 'Po izvršenoj uplati, dogovorena prava korišćenja kreiranih dela prenose se na klijenta. Izvršilac zadržava pravo da koristi kreirana dela kao referentne projekte u portfoliju, osim ako je izričito drugačije dogovoreno. Izvorni kod i dokumentacija se u potpunosti predaju po završetku i plaćanju.',
+ },
+ {
+ title: '7. Garancija i odgovornost',
+ content: 'Garancija se reguliše zakonskim odredbama. Nedostaci se moraju prijaviti u pisanoj formi odmah po otkrivanju. Odgovornost za blagi nemar ograničena je na predvidivu, ugovorom tipičnu štetu, osim ako se radi o kršenju suštinskih ugovornih obaveza ili štetama nastalim povredom života, tela ili zdravlja.',
+ },
+ {
+ title: '8. Poverljivost i zaštita podataka',
+ content: 'Obe strane se obavezuju da će čuvati sve poverljive informacije primljene tokom saradnje. Obrada ličnih podataka vrši se u skladu sa GDPR-om. Više informacija možete pronaći u Politici privatnosti.',
+ },
+ {
+ title: '9. Raskid ugovora',
+ content: 'Projektni ugovori mogu se raskinuti od strane bilo koje strane sa rokom od 14 dana do kraja meseca u pisanoj formi, osim ako nije drugačije dogovoreno. Već pružene usluge moraju se u svakom slučaju nadoknaditi. Pravo na vanredan raskid iz opravdanog razloga ostaje nepromenjeno.',
+ },
+ {
+ title: '10. Završne odredbe',
+ content: 'Primenjuju se zakoni Savezne Republike Nemačke. Mesto ispunjenja i nadležnost je Keln (Köln), u meri dozvoljenoj zakonom. Ukoliko pojedine odredbe ovih Uslova korišćenja budu ili postanu nevažeće, važnost ostalih odredbi ostaje nepromenjena.',
+ },
+ ],
+ contact: {
+ title: 'Kontakt',
+ content: [
+ 'Za pitanja o ovim Uslovima korišćenja, kontaktirajte:',
+ 'Damjan Savić',
+ 'Email: info@damjan-savic.com',
+ ],
+ },
+ privacyNote: {
+ text: 'Za informacije o zaštiti podataka, pogledajte našu',
+ link: 'Politiku privatnosti',
+ },
+ },
+ };
+
+ const c = content[locale] || content.de;
return (
-
-
+
+
{/* Breadcrumb */}
-
-
{t('content.title')}
-
{t('content.lastUpdated')}
+
{c.title}
+
{c.lastUpdated}
-
1. Agreement to Terms
-
- By accessing our website, you agree to be bound by these Terms and Conditions
- and to comply with all applicable laws and regulations.
-
+
+ {c.sections.map((section, index) => (
+
+
{section.title}
+
{section.content}
+ {section.items && (
+
+ {section.items.map((item, itemIndex) => (
+
{item}
+ ))}
+
+ )}
+
+ ))}
-
2. Intellectual Property
-
- All content on this website, including text, graphics, logos, images, and software,
- is the property of Damjan Savić and is protected by intellectual property laws.
-
+ {/* Contact */}
+
+
{c.contact.title}
+
+ {c.contact.content.map((line, index) => (
+
{line}
+ ))}
+
+
-
3. User Responsibilities
-
- When using our website, you agree to provide accurate information,
- use the website legally and ethically, and not attempt unauthorized access.
-