Fly f93a653b1
tcp/443 tcp/80
Open service 2a09:8280:1::ae:e399:0:443 · www.mikkopoikkilehto.com
2026-01-11 00:30
HTTP/1.1 200 OK
x-powered-by: Express
content-type: text/html; charset=utf-8
content-length: 67766
etag: W/"108b6-DBvm70MdTKuvIzOz4OJ+va/p4Z4"
date: Sun, 11 Jan 2026 00:30:31 GMT
connection: close
keep-alive: timeout=5
server: Fly/f93a653b1 (2026-01-08)
via: 1.1 fly.io, 1.1 fly.io
fly-request-id: 01KEN7C9DCPRGKNRG6P4FNZG06-fra
Page title: Mikko Poikkilehto — AI Software Developer PortfolioGitHubLinkedInGitHubGitHubGitHubGitHub
<!DOCTYPE html>
<html lang="en" class="dark">
<head>
<script>
(function () {
var root = document.documentElement;
var theme = 'dark';
try {
var stored = window.localStorage.getItem('theme');
if (stored) {
theme = stored;
} else if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
theme = 'dark';
} else {
theme = 'light';
}
} catch (error) {}
root.classList.remove('light', 'dark');
root.classList.add(theme);
root.setAttribute('data-theme', theme);
})();
</script>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Mikko Poikkilehto — AI Software Developer Portfolio</title>
<meta name="description" content="Explore machine learning projects, intelligent automation demos, and product case studies from AI engineer Mikko Poikkilehto.">
<meta property="og:type" content="website">
<meta property="og:title" content="Mikko Poikkilehto — AI Software Developer Portfolio">
<meta property="og:description" content="Explore machine learning projects, intelligent automation demos, and product case studies from AI engineer Mikko Poikkilehto.">
<meta property="og:url" content="https://mikkopoikkilehto.com/">
<meta property="og:image" content="https://mikkopoikkilehto.com/social/portfolio-preview.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://mikkopoikkilehto.com/">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&display=swap" rel="stylesheet">
<script type="module" crossorigin src="/assets/index-CBiFztvu.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-IfQbqWjg.css">
</head>
<body>
<div id="root"><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]"></ol></div><div class="min-h-screen bg-background text-foreground"><nav class="fixed top-0 left-0 right-0 z-50 bg-background/80 backdrop-blur-md border-b"><div class="max-w-6xl mx-auto px-4 sm:px-6 lg:px-8"><div class="flex justify-between items-center h-16"><div class="flex-shrink-0"><h1 class="text-xl font-bold text-foreground" data-testid="text-logo">Mikko Poikkilehto</h1></div><div class="hidden md:block"><div class="flex items-center space-x-4"><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover-elevate active-elevate-2 border border-transparent min-h-9 px-4 py-2 hover-elevate" data-testid="link-nav-home">Home</button><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover-elevate active-elevate-2 border border-transparent min-h-9 px-4 py-2 hover-elevate" data-testid="link-nav-projects">Projects</button><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover-elevate a
Open service 2a09:8280:1::ae:e399:0:80 · www.mikkopoikkilehto.com
2026-01-11 00:30
HTTP/1.1 301 Moved Permanently location: https://www.mikkopoikkilehto.com/ server: Fly/f93a653b1 (2026-01-08) via: 1.1 fly.io fly-request-id: 01KEN7C8AJ1JTBTX8YRT27ZTEP-lhr connection: close content-length: 0 date: Sun, 11 Jan 2026 00:30:27 GMT
Open service 66.241.124.228:443 · www.mikkopoikkilehto.com
2026-01-11 00:30
HTTP/1.1 200 OK
x-powered-by: Express
content-type: text/html; charset=utf-8
content-length: 67766
etag: W/"108b6-DBvm70MdTKuvIzOz4OJ+va/p4Z4"
date: Sun, 11 Jan 2026 00:30:31 GMT
connection: close
keep-alive: timeout=5
server: Fly/f93a653b1 (2026-01-08)
via: 1.1 fly.io, 1.1 fly.io
fly-request-id: 01KEN7C99HE02JHWAAX6NH8NJ9-ams
Page title: Mikko Poikkilehto — AI Software Developer PortfolioGitHubLinkedInGitHubGitHubGitHubGitHub
<!DOCTYPE html>
<html lang="en" class="dark">
<head>
<script>
(function () {
var root = document.documentElement;
var theme = 'dark';
try {
var stored = window.localStorage.getItem('theme');
if (stored) {
theme = stored;
} else if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
theme = 'dark';
} else {
theme = 'light';
}
} catch (error) {}
root.classList.remove('light', 'dark');
root.classList.add(theme);
root.setAttribute('data-theme', theme);
})();
</script>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Mikko Poikkilehto — AI Software Developer Portfolio</title>
<meta name="description" content="Explore machine learning projects, intelligent automation demos, and product case studies from AI engineer Mikko Poikkilehto.">
<meta property="og:type" content="website">
<meta property="og:title" content="Mikko Poikkilehto — AI Software Developer Portfolio">
<meta property="og:description" content="Explore machine learning projects, intelligent automation demos, and product case studies from AI engineer Mikko Poikkilehto.">
<meta property="og:url" content="https://mikkopoikkilehto.com/">
<meta property="og:image" content="https://mikkopoikkilehto.com/social/portfolio-preview.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://mikkopoikkilehto.com/">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&display=swap" rel="stylesheet">
<script type="module" crossorigin src="/assets/index-CBiFztvu.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-IfQbqWjg.css">
</head>
<body>
<div id="root"><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]"></ol></div><div class="min-h-screen bg-background text-foreground"><nav class="fixed top-0 left-0 right-0 z-50 bg-background/80 backdrop-blur-md border-b"><div class="max-w-6xl mx-auto px-4 sm:px-6 lg:px-8"><div class="flex justify-between items-center h-16"><div class="flex-shrink-0"><h1 class="text-xl font-bold text-foreground" data-testid="text-logo">Mikko Poikkilehto</h1></div><div class="hidden md:block"><div class="flex items-center space-x-4"><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover-elevate active-elevate-2 border border-transparent min-h-9 px-4 py-2 hover-elevate" data-testid="link-nav-home">Home</button><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover-elevate active-elevate-2 border border-transparent min-h-9 px-4 py-2 hover-elevate" data-testid="link-nav-projects">Projects</button><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover-elevate a
Open service 66.241.124.228:80 · www.mikkopoikkilehto.com
2026-01-11 00:30
HTTP/1.1 301 Moved Permanently location: https://www.mikkopoikkilehto.com/ server: Fly/f93a653b1 (2026-01-08) via: 1.1 fly.io fly-request-id: 01KEN7C8VGBZPP3AH7NHDCMYSE-ams connection: close content-length: 0 date: Sun, 11 Jan 2026 00:30:27 GMT
Open service 2a09:8280:1::ae:e399:0:443 · mikkopoikkilehto.com
2026-01-11 00:30
HTTP/1.1 200 OK
x-powered-by: Express
content-type: text/html; charset=utf-8
content-length: 67766
etag: W/"108b6-DBvm70MdTKuvIzOz4OJ+va/p4Z4"
date: Sun, 11 Jan 2026 00:30:31 GMT
connection: close
keep-alive: timeout=5
server: Fly/f93a653b1 (2026-01-08)
via: 1.1 fly.io, 1.1 fly.io
fly-request-id: 01KEN7C4JEWK083RC48AX7JFD6-bom
Page title: Mikko Poikkilehto — AI Software Developer PortfolioGitHubLinkedInGitHubGitHubGitHubGitHub
<!DOCTYPE html>
<html lang="en" class="dark">
<head>
<script>
(function () {
var root = document.documentElement;
var theme = 'dark';
try {
var stored = window.localStorage.getItem('theme');
if (stored) {
theme = stored;
} else if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
theme = 'dark';
} else {
theme = 'light';
}
} catch (error) {}
root.classList.remove('light', 'dark');
root.classList.add(theme);
root.setAttribute('data-theme', theme);
})();
</script>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Mikko Poikkilehto — AI Software Developer Portfolio</title>
<meta name="description" content="Explore machine learning projects, intelligent automation demos, and product case studies from AI engineer Mikko Poikkilehto.">
<meta property="og:type" content="website">
<meta property="og:title" content="Mikko Poikkilehto — AI Software Developer Portfolio">
<meta property="og:description" content="Explore machine learning projects, intelligent automation demos, and product case studies from AI engineer Mikko Poikkilehto.">
<meta property="og:url" content="https://mikkopoikkilehto.com/">
<meta property="og:image" content="https://mikkopoikkilehto.com/social/portfolio-preview.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://mikkopoikkilehto.com/">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&display=swap" rel="stylesheet">
<script type="module" crossorigin src="/assets/index-CBiFztvu.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-IfQbqWjg.css">
</head>
<body>
<div id="root"><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]"></ol></div><div class="min-h-screen bg-background text-foreground"><nav class="fixed top-0 left-0 right-0 z-50 bg-background/80 backdrop-blur-md border-b"><div class="max-w-6xl mx-auto px-4 sm:px-6 lg:px-8"><div class="flex justify-between items-center h-16"><div class="flex-shrink-0"><h1 class="text-xl font-bold text-foreground" data-testid="text-logo">Mikko Poikkilehto</h1></div><div class="hidden md:block"><div class="flex items-center space-x-4"><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover-elevate active-elevate-2 border border-transparent min-h-9 px-4 py-2 hover-elevate" data-testid="link-nav-home">Home</button><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover-elevate active-elevate-2 border border-transparent min-h-9 px-4 py-2 hover-elevate" data-testid="link-nav-projects">Projects</button><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover-elevate a
Open service 66.241.124.228:80 · mikkopoikkilehto.com
2026-01-11 00:30
HTTP/1.1 301 Moved Permanently location: https://mikkopoikkilehto.com/ server: Fly/f93a653b1 (2026-01-08) via: 1.1 fly.io fly-request-id: 01KEN7C3K57V8XB365MMVRHHQN-lhr connection: close content-length: 0 date: Sun, 11 Jan 2026 00:30:22 GMT
Open service 2a09:8280:1::ae:e399:0:80 · mikkopoikkilehto.com
2026-01-11 00:30
HTTP/1.1 301 Moved Permanently location: https://mikkopoikkilehto.com/ server: Fly/f93a653b1 (2026-01-08) via: 1.1 fly.io fly-request-id: 01KEN7C3FKWFJWJYMBQV92E2VW-fra connection: close content-length: 0 date: Sun, 11 Jan 2026 00:30:22 GMT
Open service 66.241.124.228:443 · mikkopoikkilehto.com
2026-01-11 00:30
HTTP/1.1 200 OK
x-powered-by: Express
content-type: text/html; charset=utf-8
content-length: 67766
etag: W/"108b6-DBvm70MdTKuvIzOz4OJ+va/p4Z4"
date: Sun, 11 Jan 2026 00:30:32 GMT
connection: close
keep-alive: timeout=5
server: Fly/f93a653b1 (2026-01-08)
via: 1.1 fly.io, 1.1 fly.io
fly-request-id: 01KEN7C4GZEG70AKQZHFGKG0R5-ams
Page title: Mikko Poikkilehto — AI Software Developer PortfolioGitHubLinkedInGitHubGitHubGitHubGitHub
<!DOCTYPE html>
<html lang="en" class="dark">
<head>
<script>
(function () {
var root = document.documentElement;
var theme = 'dark';
try {
var stored = window.localStorage.getItem('theme');
if (stored) {
theme = stored;
} else if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
theme = 'dark';
} else {
theme = 'light';
}
} catch (error) {}
root.classList.remove('light', 'dark');
root.classList.add(theme);
root.setAttribute('data-theme', theme);
})();
</script>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Mikko Poikkilehto — AI Software Developer Portfolio</title>
<meta name="description" content="Explore machine learning projects, intelligent automation demos, and product case studies from AI engineer Mikko Poikkilehto.">
<meta property="og:type" content="website">
<meta property="og:title" content="Mikko Poikkilehto — AI Software Developer Portfolio">
<meta property="og:description" content="Explore machine learning projects, intelligent automation demos, and product case studies from AI engineer Mikko Poikkilehto.">
<meta property="og:url" content="https://mikkopoikkilehto.com/">
<meta property="og:image" content="https://mikkopoikkilehto.com/social/portfolio-preview.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://mikkopoikkilehto.com/">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&display=swap" rel="stylesheet">
<script type="module" crossorigin src="/assets/index-CBiFztvu.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-IfQbqWjg.css">
</head>
<body>
<div id="root"><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]"></ol></div><div class="min-h-screen bg-background text-foreground"><nav class="fixed top-0 left-0 right-0 z-50 bg-background/80 backdrop-blur-md border-b"><div class="max-w-6xl mx-auto px-4 sm:px-6 lg:px-8"><div class="flex justify-between items-center h-16"><div class="flex-shrink-0"><h1 class="text-xl font-bold text-foreground" data-testid="text-logo">Mikko Poikkilehto</h1></div><div class="hidden md:block"><div class="flex items-center space-x-4"><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover-elevate active-elevate-2 border border-transparent min-h-9 px-4 py-2 hover-elevate" data-testid="link-nav-home">Home</button><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover-elevate active-elevate-2 border border-transparent min-h-9 px-4 py-2 hover-elevate" data-testid="link-nav-projects">Projects</button><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover-elevate a