Skip to content

Commit 92812ca

Browse files
committed
feat: upgrade Next.js and React, add SEO features including sitemap, robots.txt, web manifest, and enhanced metadata
1 parent bacce3c commit 92812ca

10 files changed

Lines changed: 473 additions & 252 deletions

File tree

app/layout.tsx

Lines changed: 137 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,113 @@ const jsonLdPerson = {
2323
"@type": "Person",
2424
"name": "William Keri",
2525
"url": "https://codevoid.site",
26-
"jobTitle": ["Full Stack Developer", "Software Engineer", "ML Engineer"],
26+
"image": "https://codevoid.site/logo.webp",
27+
"jobTitle": ["Software Engineer", "Full Stack Developer", "Software Engineer", "ML Engineer"],
28+
"description": "Software Engineer, Full Stack Developer, Competitive Programmer, and Machine Learning Enthusiast",
29+
"knowsAbout": [
30+
// Languages
31+
"C", "C++", "Python", "Java", "JavaScript", "TypeScript",
32+
// Technologies & Frameworks
33+
"React", "Next.js", "Express.js", "Node.js", "FastAPI", "LangChain", "LlamaIndex", "FAISS",
34+
// Databases
35+
"MongoDB", "MySQL", "PostgreSQL", "Redis", "ChromaDB",
36+
// Tools & Cloud
37+
"Git", "Docker", "Linux", "AWS Lambda", "AWS S3", "CloudWatch", "CloudFormation", "Cloudflare",
38+
"Kubernetes", "Terraform", "Grafana", "Prometheus",
39+
// Protocols & Messaging
40+
"gRPC", "Kafka", "WebSockets",
41+
// Domains
42+
"Full Stack Development", "Machine Learning", "Competitive Programming",
43+
"Data Structures", "Algorithms", "Web Development", "AI/RAG Applications"
44+
],
2745
"sameAs": [
2846
"https://linkedin.com/in/codevoid",
2947
"https://github.com/codevoid048",
3048
"https://x.com/code__void",
3149
]
3250
}
3351

52+
const jsonLdWebSite = {
53+
"@context": "https://schema.org",
54+
"@type": "WebSite",
55+
"name": "William Keri Portfolio",
56+
"url": "https://codevoid.site",
57+
"description": "Personal portfolio website of William Keri, Software Engineer, Full Stack Developer, Competitive Programmer, and Machine Learning Enthusiast",
58+
"author": {
59+
"@type": "Person",
60+
"name": "William Keri",
61+
"url": "https://codevoid.site"
62+
},
63+
"potentialAction": {
64+
"@type": "SearchAction",
65+
"target": "https://codevoid.site/#search?q={search_term_string}",
66+
"query-input": "required name=search_term_string"
67+
}
68+
}
69+
70+
const jsonLdBreadcrumb = {
71+
"@context": "https://schema.org",
72+
"@type": "BreadcrumbList",
73+
"itemListElement": [
74+
{
75+
"@type": "ListItem",
76+
"position": 1,
77+
"name": "Home",
78+
"item": "https://codevoid.site"
79+
},
80+
{
81+
"@type": "ListItem",
82+
"position": 2,
83+
"name": "Experience",
84+
"item": "https://codevoid.site/#experience"
85+
},
86+
{
87+
"@type": "ListItem",
88+
"position": 3,
89+
"name": "Projects",
90+
"item": "https://codevoid.site/#projects"
91+
},
92+
{
93+
"@type": "ListItem",
94+
"position": 4,
95+
"name": "Contact",
96+
"item": "https://codevoid.site/#contact"
97+
}
98+
]
99+
}
100+
34101
export const metadata: Metadata = {
35102
metadataBase: new URL("https://codevoid.site"),
36-
title: "William Keri | Portfolio",
37-
description: "Personal portfolio website of William Keri, Full Stack Developer",
103+
title: {
104+
default: "William Keri | Software Engineer",
105+
template: "%s | William Keri"
106+
},
107+
description: "Personal portfolio of William Keri - Software Engineer, Full Stack Developer, Competitive Programmer, and Machine Learning Enthusiast. Explore projects, skills, and work experience.",
108+
alternates: {
109+
canonical: "https://codevoid.site",
110+
},
111+
robots: {
112+
index: true,
113+
follow: true,
114+
nocache: false,
115+
googleBot: {
116+
index: true,
117+
follow: true,
118+
noimageindex: false,
119+
'max-video-preview': -1,
120+
'max-image-preview': 'large',
121+
'max-snippet': -1,
122+
},
123+
},
38124
authors: [{ name: "William Keri", url: "https://linkedin.com/in/codevoid" }],
125+
creator: "William Keri",
126+
publisher: "William Keri",
127+
formatDetection: {
128+
email: true,
129+
address: false,
130+
telephone: false,
131+
},
132+
category: "technology",
39133
keywords: [
40134
"William Keri",
41135
"codevoid",
@@ -51,30 +145,47 @@ export const metadata: Metadata = {
51145
"Node.js Developer",
52146
"JavaScript Developer",
53147
"TypeScript Developer",
148+
"Machine Learning",
149+
"Competitive Programmer",
150+
"Python Developer",
54151
],
152+
manifest: "/manifest.json",
55153
icons: {
56-
icon: "/logo2.webp",
57-
shortcut: "/logo2.webp",
58-
apple: "/logo2.webp",
154+
icon: "/logo.webp",
155+
shortcut: "/logo.webp",
156+
apple: "/logo.webp",
59157
},
60158
openGraph: {
61-
title: "William | Portfolio",
62-
description: "Full Stack Developer, Competitive Programmer, and ML Enthusiast",
159+
type: "website",
160+
locale: "en_US",
161+
url: "https://codevoid.site",
162+
siteName: "William Keri Portfolio",
163+
title: "William Keri | Software Engineer",
164+
description: "Software Engineer, Full Stack Developer, Competitive Programmer, and ML Enthusiast. Explore my projects, skills, and work experience.",
63165
images: [
64166
{
65-
url: "https://codevoid.site/logo2.webp",
167+
url: "https://codevoid.site/logo.webp",
66168
width: 1200,
67169
height: 630,
68-
alt: "William Portfolio",
170+
alt: "William Keri - Software Engineer",
69171
},
70172
],
71173
},
72174
twitter: {
73175
card: "summary_large_image",
74-
title: "William Keri | Portfolio",
75-
description: "Full Stack Developer, Competitive Programmer, and ML Enthusiast",
176+
site: "@code__void",
76177
creator: "@code__void",
77-
images: ["https://codevoid.site/logo2.webp"],
178+
title: "William Keri | Software Engineer",
179+
description: "Software Engineer, Full Stack Developer, Competitive Programmer, and ML Enthusiast. Explore my projects, skills, and work experience.",
180+
images: {
181+
url: "https://codevoid.site/logo.webp",
182+
alt: "William Keri - Software Engineer",
183+
},
184+
},
185+
verification: {
186+
// google: "google-verification-code",
187+
// yandex: "yandex-verification-code",
188+
// bing: "bing-verification-code",
78189
},
79190
}
80191

@@ -109,12 +220,25 @@ export default function RootLayout({
109220
/>
110221
<ThemeProvider attribute="class" defaultTheme="dark" enableSystem={false} disableTransitionOnChange>
111222
{children}
223+
{/* Structured Data - JSON-LD */}
112224
<Script
113225
id="jsonld-person"
114226
type="application/ld+json"
115227
strategy="afterInteractive"
116228
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLdPerson) }}
117229
/>
230+
<Script
231+
id="jsonld-website"
232+
type="application/ld+json"
233+
strategy="afterInteractive"
234+
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLdWebSite) }}
235+
/>
236+
<Script
237+
id="jsonld-breadcrumb"
238+
type="application/ld+json"
239+
strategy="afterInteractive"
240+
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLdBreadcrumb) }}
241+
/>
118242
</ThemeProvider>
119243
<Analytics />
120244
</body>

app/sitemap.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import type { MetadataRoute } from 'next'
2+
3+
export const dynamic = 'force-static'
4+
5+
export default function sitemap(): MetadataRoute.Sitemap {
6+
const baseUrl = 'https://codevoid.site'
7+
const lastModified = new Date()
8+
9+
return [
10+
{
11+
url: baseUrl,
12+
lastModified,
13+
changeFrequency: 'monthly',
14+
priority: 1.0,
15+
},
16+
{
17+
url: `${baseUrl}/#experience`,
18+
lastModified,
19+
changeFrequency: 'monthly',
20+
priority: 0.8,
21+
},
22+
{
23+
url: `${baseUrl}/#skills`,
24+
lastModified,
25+
changeFrequency: 'monthly',
26+
priority: 0.8,
27+
},
28+
{
29+
url: `${baseUrl}/#projects`,
30+
lastModified,
31+
changeFrequency: 'monthly',
32+
priority: 0.9,
33+
},
34+
{
35+
url: `${baseUrl}/#contact`,
36+
lastModified,
37+
changeFrequency: 'yearly',
38+
priority: 0.7,
39+
},
40+
]
41+
}

next.config.mjs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@
22
const nextConfig = {
33
output: 'export',
44
trailingSlash: true,
5-
eslint: {
6-
ignoreDuringBuilds: true,
7-
},
85
typescript: {
96
ignoreBuildErrors: true,
107
},

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@
2323
"embla-carousel-react": "8.5.1",
2424
"framer-motion": "latest",
2525
"lucide-react": "^0.454.0",
26-
"next": "^15.5.3",
26+
"next": "^16.1.1",
2727
"next-themes": "^0.4.4",
2828
"ogl": "^1.0.11",
29-
"react": "^19.1.1",
29+
"react": "^19.2.3",
3030
"react-day-picker": "^9.0.0",
31-
"react-dom": "^19.1.1",
31+
"react-dom": "^19.2.3",
3232
"react-hook-form": "^7.54.1",
3333
"react-resizable-panels": "^2.1.7",
3434
"recharts": "2.15.0",

0 commit comments

Comments
 (0)