diff --git a/.claude/settings.local.json b/.claude/settings.local.json index d5031ce..61dfcaf 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -17,7 +17,8 @@ "Bash(pnpm approve-builds:*)", "Bash(curl:*)", "Bash(npx tailwindcss:*)", - "Bash(taskkill:*)" + "Bash(taskkill:*)", + "Bash(dir:*)" ], "deny": [] } diff --git a/index.html b/index.html index 585948d..2426235 100644 --- a/index.html +++ b/index.html @@ -1,5 +1,5 @@ - + @@ -12,18 +12,32 @@ })(window,document,'script','dataLayer','GTM-NQK6ZV7N'); + - - + + + + + + - - + + - Damjan Savić - Fullstack Entwickler | Python, JavaScript, KI + + + + + + + + + + Damjan Savić - Senior Fullstack Entwickler & Digital Solutions Consultant Köln | Python, React & KI-Experte @@ -34,23 +48,26 @@ - - + + - - - - + + + + + + + - - - + + + - + - - + + + + + \ No newline at end of file diff --git a/public/manifest.json b/public/manifest.json new file mode 100644 index 0000000..ff8606b --- /dev/null +++ b/public/manifest.json @@ -0,0 +1,40 @@ +{ + "name": "Damjan Savić - Senior Fullstack Entwickler & Digital Solutions Consultant", + "short_name": "Damjan Savić", + "description": "Portfolio von Damjan Savić - Senior Fullstack Entwickler und Digital Solutions Consultant in Köln. Enterprise Software Development, KI-Integration und Cloud Architecture.", + "start_url": "/", + "display": "standalone", + "background_color": "#18181B", + "theme_color": "#18181B", + "orientation": "portrait-primary", + "icons": [ + { + "src": "/logo.svg", + "sizes": "any", + "type": "image/svg+xml", + "purpose": "any maskable" + }, + { + "src": "/logo.png", + "sizes": "1000x1000", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/logo.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "/logo.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any" + } + ], + "categories": ["business", "developer", "productivity"], + "lang": "de-DE", + "dir": "ltr", + "prefer_related_applications": false +} \ No newline at end of file diff --git a/public/robots.txt b/public/robots.txt index 8c9713c..2807c94 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -1,7 +1,6 @@ # Allow all crawlers User-agent: * Allow: / -Crawl-delay: 1 # Disallow admin or sensitive paths if any Disallow: /admin diff --git a/public/sitemap.xml b/public/sitemap.xml index 8cb1bfb..fc8f92d 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -3,7 +3,7 @@ xmlns:xhtml="http://www.w3.org/1999/xhtml"> https://damjan-savic.com/ - 2025-08-01 + 2025-01-15 weekly 1.0 @@ -12,7 +12,7 @@ https://damjan-savic.com/en/ - 2025-08-01 + 2025-01-15 weekly 1.0 @@ -21,7 +21,7 @@ https://damjan-savic.com/sr/ - 2025-08-01 + 2025-01-15 weekly 1.0 @@ -30,7 +30,7 @@ https://damjan-savic.com/about - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -39,7 +39,7 @@ https://damjan-savic.com/en/about - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -48,7 +48,7 @@ https://damjan-savic.com/sr/about - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -57,7 +57,7 @@ https://damjan-savic.com/portfolio - 2025-08-01 + 2025-01-15 weekly 0.9 @@ -66,7 +66,7 @@ https://damjan-savic.com/en/portfolio - 2025-08-01 + 2025-01-15 weekly 0.9 @@ -75,7 +75,7 @@ https://damjan-savic.com/sr/portfolio - 2025-08-01 + 2025-01-15 weekly 0.9 @@ -84,7 +84,7 @@ https://damjan-savic.com/blog - 2025-08-01 + 2025-01-15 weekly 0.9 @@ -93,7 +93,7 @@ https://damjan-savic.com/en/blog - 2025-08-01 + 2025-01-15 weekly 0.9 @@ -102,7 +102,7 @@ https://damjan-savic.com/sr/blog - 2025-08-01 + 2025-01-15 weekly 0.9 @@ -111,7 +111,7 @@ https://damjan-savic.com/contact - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -120,7 +120,7 @@ https://damjan-savic.com/en/contact - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -129,7 +129,7 @@ https://damjan-savic.com/sr/contact - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -138,7 +138,7 @@ https://damjan-savic.com/privacy - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -147,7 +147,7 @@ https://damjan-savic.com/en/privacy - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -156,7 +156,7 @@ https://damjan-savic.com/sr/privacy - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -165,7 +165,7 @@ https://damjan-savic.com/terms - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -174,7 +174,7 @@ https://damjan-savic.com/en/terms - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -183,7 +183,7 @@ https://damjan-savic.com/sr/terms - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -192,7 +192,7 @@ https://damjan-savic.com/blog/erp-integration-breuninger - 2025-08-01 + 2025-01-15 monthly 0.7 @@ -201,7 +201,7 @@ https://damjan-savic.com/en/blog/erp-integration-breuninger - 2025-08-01 + 2025-01-15 monthly 0.7 @@ -210,7 +210,7 @@ https://damjan-savic.com/sr/blog/erp-integration-breuninger - 2025-08-01 + 2025-01-15 monthly 0.7 @@ -219,7 +219,7 @@ https://damjan-savic.com/blog/fullstack-development-timetracking - 2025-08-01 + 2025-01-15 monthly 0.7 @@ -228,7 +228,7 @@ https://damjan-savic.com/en/blog/fullstack-development-timetracking - 2025-08-01 + 2025-01-15 monthly 0.7 @@ -237,7 +237,7 @@ https://damjan-savic.com/sr/blog/fullstack-development-timetracking - 2025-08-01 + 2025-01-15 monthly 0.7 @@ -246,7 +246,7 @@ https://damjan-savic.com/blog/rfid-automation - 2025-08-01 + 2025-01-15 monthly 0.7 @@ -255,7 +255,7 @@ https://damjan-savic.com/en/blog/rfid-automation - 2025-08-01 + 2025-01-15 monthly 0.7 @@ -264,7 +264,7 @@ https://damjan-savic.com/sr/blog/rfid-automation - 2025-08-01 + 2025-01-15 monthly 0.7 @@ -273,7 +273,7 @@ https://damjan-savic.com/portfolio/ai-data-reader - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -282,7 +282,7 @@ https://damjan-savic.com/en/portfolio/ai-data-reader - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -291,7 +291,7 @@ https://damjan-savic.com/sr/portfolio/ai-data-reader - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -300,7 +300,7 @@ https://damjan-savic.com/portfolio/bi-vision - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -309,7 +309,7 @@ https://damjan-savic.com/en/portfolio/bi-vision - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -318,7 +318,7 @@ https://damjan-savic.com/sr/portfolio/bi-vision - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -327,7 +327,7 @@ https://damjan-savic.com/portfolio/business-intelligence-ai - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -336,7 +336,7 @@ https://damjan-savic.com/en/portfolio/business-intelligence-ai - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -345,7 +345,7 @@ https://damjan-savic.com/sr/portfolio/business-intelligence-ai - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -354,7 +354,7 @@ https://damjan-savic.com/portfolio/claude-personal-assistant - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -363,7 +363,7 @@ https://damjan-savic.com/en/portfolio/claude-personal-assistant - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -372,7 +372,7 @@ https://damjan-savic.com/sr/portfolio/claude-personal-assistant - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -381,7 +381,7 @@ https://damjan-savic.com/portfolio/e-commerce-integration - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -390,7 +390,7 @@ https://damjan-savic.com/en/portfolio/e-commerce-integration - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -399,7 +399,7 @@ https://damjan-savic.com/sr/portfolio/e-commerce-integration - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -408,7 +408,7 @@ https://damjan-savic.com/portfolio/local-llm-training - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -417,7 +417,7 @@ https://damjan-savic.com/en/portfolio/local-llm-training - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -426,7 +426,7 @@ https://damjan-savic.com/sr/portfolio/local-llm-training - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -435,7 +435,7 @@ https://damjan-savic.com/portfolio/rfid-automation - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -444,7 +444,7 @@ https://damjan-savic.com/en/portfolio/rfid-automation - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -453,7 +453,7 @@ https://damjan-savic.com/sr/portfolio/rfid-automation - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -462,7 +462,7 @@ https://damjan-savic.com/portfolio/timetracking-software - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -471,7 +471,7 @@ https://damjan-savic.com/en/portfolio/timetracking-software - 2025-08-01 + 2025-01-15 monthly 0.8 @@ -480,7 +480,7 @@ https://damjan-savic.com/sr/portfolio/timetracking-software - 2025-08-01 + 2025-01-15 monthly 0.8 diff --git a/src/components/SEO.tsx b/src/components/SEO.tsx index 1e5a2f0..3c9b5e2 100644 --- a/src/components/SEO.tsx +++ b/src/components/SEO.tsx @@ -4,6 +4,10 @@ import { useTranslation } from 'react-i18next'; import { HreflangTags } from './HreflangTags'; import { seoContent as seoContentDe } from '../i18n/locales/de/seo-content'; import { seoContent as seoContentEn } from '../i18n/locales/en/seo-content'; +import { seoContent as seoContentSr } from '../i18n/locales/sr/seo-content'; +import { meta as metaDe } from '../i18n/locales/de/meta'; +import { meta as metaEn } from '../i18n/locales/en/meta'; +import { meta as metaSr } from '../i18n/locales/sr/meta'; import { AutoBreadcrumbs } from './schemas/BreadcrumbSchema'; interface SEOProps { @@ -38,8 +42,14 @@ const SEO: React.FC = ({ const currentLanguage = i18n.language; // SEO-Content basierend auf Sprache auswählen - const seoContent = currentLanguage === 'de' ? seoContentDe : seoContentEn; + const seoContent = currentLanguage === 'de' ? seoContentDe : + currentLanguage === 'sr' ? seoContentSr : + seoContentEn; + const meta = currentLanguage === 'de' ? metaDe : + currentLanguage === 'sr' ? metaSr : + metaEn; const defaultDescription = description || seoContent.hero.description; + const defaultKeywords = keywords || meta.site.keywords; // Default schema für die Website const defaultSchema = { @@ -54,7 +64,11 @@ const SEO: React.FC = ({ 'https://linkedin.com/in/damjansavic', 'https://github.com/damjansavic' ], - jobTitle: ['Fullstack Developer', 'Software Engineer', 'KI Spezialist'], + jobTitle: currentLanguage === 'de' ? + ['Senior Fullstack Entwickler', 'Digital Solutions Consultant', 'Software Architekt', 'KI/AI Spezialist'] : + currentLanguage === 'sr' ? + ['Старији програмер пуног стека', 'Консултант за дигитална решења', 'Софтверски архитекта'] : + ['Senior Fullstack Developer', 'Digital Solutions Consultant', 'Software Architect', 'AI Specialist'], worksFor: { '@type': 'Organization', name: 'CoderConda' @@ -109,8 +123,10 @@ const SEO: React.FC = ({ ? i18n.options.supportedLngs .filter((lng: string) => lng !== 'cimode') .map((lng: string) => ({ - hrefLang: lng, - href: `${siteUrl}/${lng}${window.location.pathname}`, + hrefLang: lng === 'de' ? 'de-DE' : lng === 'sr' ? 'sr-RS' : 'en-US', + href: lng === 'de' ? + `${siteUrl}${window.location.pathname}` : + `${siteUrl}/${lng}${window.location.pathname}`, })) : []; @@ -133,7 +149,11 @@ const SEO: React.FC = ({ - + {alternateUrls?.map( ({ hrefLang }: { hrefLang: string; href: string }) => ( @@ -151,9 +171,9 @@ const SEO: React.FC = ({ - + {/* Schema.org markup */}