diff --git a/content/projects/gym-progress-app.mdx b/content/projects/gym-progress-app.mdx index 168836d..bd1e0b2 100644 --- a/content/projects/gym-progress-app.mdx +++ b/content/projects/gym-progress-app.mdx @@ -6,6 +6,7 @@ tags: ['typescript', 'react', 'pwa'] featured: false category: Web role: Solo project +cover: '/projects/gym-progress-app.svg' --- The frustration: every other tracker wants me to log mood, sleep, water intake, diff --git a/content/projects/kmp-weather-app.mdx b/content/projects/kmp-weather-app.mdx index 673e0cf..b8f4283 100644 --- a/content/projects/kmp-weather-app.mdx +++ b/content/projects/kmp-weather-app.mdx @@ -6,6 +6,7 @@ tags: ['kotlin', 'kmp', 'android', 'ios', 'compose'] featured: true category: Mobile role: Solo project +cover: '/projects/kmp-weather-app.svg' --- A deliberate small project to learn KMP without hand-waving the hard parts: diff --git a/content/projects/link-safety-checker.mdx b/content/projects/link-safety-checker.mdx index 7027894..9904e02 100644 --- a/content/projects/link-safety-checker.mdx +++ b/content/projects/link-safety-checker.mdx @@ -6,6 +6,7 @@ tags: ['python', 'security', 'url-analysis', 'cli'] featured: false category: Tools role: Solo project +cover: '/projects/link-safety-checker.svg' --- A small Python tool that takes a URL and returns a risk score plus a list of diff --git a/content/projects/system-health-dashboard.mdx b/content/projects/system-health-dashboard.mdx index 26d95d3..c09e811 100644 --- a/content/projects/system-health-dashboard.mdx +++ b/content/projects/system-health-dashboard.mdx @@ -6,6 +6,7 @@ tags: ['c#', 'wpf', '.net', 'observability'] featured: true category: Desktop role: Solo project +cover: '/projects/system-health-dashboard.svg' --- A native Windows desktop application that streams live OS metrics into a single diff --git a/content/projects/tutoria-mobile-app.mdx b/content/projects/tutoria-mobile-app.mdx index 5d0c0da..2777a01 100644 --- a/content/projects/tutoria-mobile-app.mdx +++ b/content/projects/tutoria-mobile-app.mdx @@ -6,6 +6,7 @@ tags: ['react-native', 'typescript', 'a11y', 'mobile'] featured: true category: Mobile role: Bachelor project +cover: '/projects/tutoria-mobile-app.svg' --- Tutoria treats reading practice as a physical-digital loop: a child arranges diff --git a/public/altan-esmer.jpg b/public/altan-esmer.jpg new file mode 100644 index 0000000..2761249 Binary files /dev/null and b/public/altan-esmer.jpg differ diff --git a/public/projects/gym-progress-app.svg b/public/projects/gym-progress-app.svg new file mode 100644 index 0000000..5530186 --- /dev/null +++ b/public/projects/gym-progress-app.svg @@ -0,0 +1,119 @@ + + + + + + + + + WEB · CASE STUDY + + + gym-progress + + + + + + + + typescript + + + + react + + + + pwa + + + + + + + VOLUME TREND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + W1 + W2 + W3 + W4 + W5 + W6 + W7 + W8 + + + + + + + + + + + + + + + + + + + + + + + + PR + + + + + + Progressive overload tracking · Personal records · PWA + diff --git a/public/projects/kmp-weather-app.svg b/public/projects/kmp-weather-app.svg new file mode 100644 index 0000000..8b50f4b --- /dev/null +++ b/public/projects/kmp-weather-app.svg @@ -0,0 +1,100 @@ + + + + + + + + + MOBILE · CASE STUDY + + + KMP Weather + + + + + + + + kotlin + + + + kmp + + + + compose + + + Shared business logic across Android & iOS + + + + + + + + SHARED + KMP Module + + + + + + + + + + + + + + + + + + + + + + + + + 22° + ANDROID + + + + + + + + + + + + + + + + + + + + + + + + + + 22° + iOS + + + + + + + diff --git a/public/projects/link-safety-checker.svg b/public/projects/link-safety-checker.svg new file mode 100644 index 0000000..46b3a3b --- /dev/null +++ b/public/projects/link-safety-checker.svg @@ -0,0 +1,97 @@ + + + + + + + + + TOOLS · CASE STUDY + + + Link Safety + Checker + + + + + python + + + + security + + + + cli + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://example.com/path?ref=123 + + + + + + + + + SAFE + + + + + SAFE + + + + + WARN + + + + + SAFE + + + + + + + + + + + + All checks passed + 3 safe · 1 warning · 0 blocked + + + + diff --git a/public/projects/system-health-dashboard.svg b/public/projects/system-health-dashboard.svg new file mode 100644 index 0000000..fafa34b --- /dev/null +++ b/public/projects/system-health-dashboard.svg @@ -0,0 +1,118 @@ + + + + + + + + + DESKTOP · CASE STUDY + + + System Health + Dashboard + + + + + c# + + + + wpf + + + + .net + + + + + + + + + + + + + + + + SYSTEM MONITOR + + + + + + + + + + CPU + 64% + + + + + + + + MEM + 41% + + + + + + NET + ↑ spike + + + + + + + + + + + + + + + + + + + + + + + 98% + UPTIME + + + + + API · OK + + + DB · OK + + + NET · WARN + + + SVC · OK + + + + + + + LAST UPDATED 14:32:07 + LIVE + + + diff --git a/public/projects/tutoria-mobile-app.svg b/public/projects/tutoria-mobile-app.svg new file mode 100644 index 0000000..15e910b --- /dev/null +++ b/public/projects/tutoria-mobile-app.svg @@ -0,0 +1,119 @@ + + + + + + + + + MOBILE · CASE STUDY + + + Tutoria + + + Phonics for children with dyslexia + + + + + + + + react-native + + + + typescript + + + + a11y + + + + + + + + + + + + + + + + + + C + + + + A + + + + T + + + + + + + + + + + + + + + + + + + + + + Lesson 4 of 12 + + + + + B + + + + A + + + + T + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx index 3ae8b23..a348ce6 100644 --- a/src/app/about/page.tsx +++ b/src/app/about/page.tsx @@ -10,9 +10,9 @@ export const metadata = { const TIMELINE = [ { - year: '2025', - title: 'Building & writing', - desc: 'Shipping gym-progress and publishing project case studies and notes.', + year: '2023', + title: 'Started university', + desc: 'Began the B.Sc. in Computer Science at the University of Southern Denmark.', }, { year: '2024', @@ -20,14 +20,14 @@ const TIMELINE = [ desc: 'Built the System Health Dashboard (C# / WPF) and KMP Weather with Kotlin Multiplatform.', }, { - year: '2023', - title: 'B.Sc. Computer Science', - desc: 'Graduated from the University of Southern Denmark. Bachelor project: Tutoria, a phonics app for children with dyslexia.', + year: '2025', + title: 'Building & writing', + desc: 'Shipping gym-progress and publishing project case studies and notes.', }, { - year: '2019', - title: 'Started university', - desc: 'Began the B.Sc. in Computer Science at the University of Southern Denmark.', + year: '2026', + title: 'B.Sc. Computer Science', + desc: 'Graduated from the University of Southern Denmark. Bachelor project: Tutoria, a phonics app for children with dyslexia.', }, ]; @@ -113,49 +113,28 @@ export default function AboutPage() { - {/* Right column — portrait placeholder */} + {/* Right column — portrait */}
-
- AE -
- - Portrait - + />
@@ -191,7 +170,7 @@ export default function AboutPage() { - {/* Preview placeholder */} + {/* Preview cover (falls back to a placeholder when no cover is set) */} -
- Project preview -
+ {item.frontmatter.cover ? ( + // eslint-disable-next-line @next/next/no-img-element + {`${item.frontmatter.title} + ) : ( +
+ Project preview +
+ )}
{/* MDX body */} diff --git a/src/components/ContactForm.tsx b/src/components/ContactForm.tsx index b514d34..a35a716 100644 --- a/src/components/ContactForm.tsx +++ b/src/components/ContactForm.tsx @@ -47,6 +47,20 @@ export default function ContactForm() { setErrors(newErrors); return; } + + const bodyLines = [ + `Name: ${form.name.trim()}`, + `Email: ${form.email.trim()}`, + ...(form.budget ? [`Budget: ${form.budget}`] : []), + '', + form.message.trim(), + ]; + const mailto = + `mailto:esmeraltan@gmail.com` + + `?subject=${encodeURIComponent(`Portfolio enquiry from ${form.name.trim()}`)}` + + `&body=${encodeURIComponent(bodyLines.join('\n'))}`; + window.location.href = mailto; + setSent(true); }; @@ -148,7 +162,9 @@ export default function ContactForm() { margin: '10px 0 0', }} > - Your message is on its way. I'll get back to you within 24 hours. + Your email app should have opened with the message ready to send. + If it didn't, email me directly at esmeraltan@gmail.com — I reply + within 24 hours.