cloudflare
tcp/443 tcp/80 tcp/8443
Open service 104.21.43.82:8443 · joacimandersson.com
2026-01-11 10:16
HTTP/1.1 301 Moved Permanently
Date: Sun, 11 Jan 2026 10:16:51 GMT
Content-Length: 0
Connection: close
Location: https://www.joacimandersson.com/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=W%2FtIV7xBRTEQXEDSqW%2FqJ3WVKGmq7lb5HOWrMrRlFFCi9gTZ61noJ5Qy29YDKULr9sSL1myNRxi2gvxEL4W86JFJ5%2Bmi6S%2FfCgaDC7dFAxoY0ME%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bc3a9373a5b456e-SJC
Open service 2606:4700:3037::6815:2b52:80 · joacimandersson.com
2026-01-11 10:16
HTTP/1.1 301 Moved Permanently
Date: Sun, 11 Jan 2026 10:16:51 GMT
Content-Length: 0
Connection: close
Location: https://joacimandersson.com/
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=aLP7IScWl9MMjmXBVKu%2BDVERU5FAr93eVbyeXa7ODgFemYL7QSmoBq1g0vf1ifkqI3Uay7GZdK9pg4DvyaeSWK8zhxteoZDDiThm%2Fc3xuWH%2F9d6cu%2FL2VePQF7pf"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
Server-Timing: cfCacheStatus;desc="DYNAMIC"
Server-Timing: cfEdge;dur=21,cfOrigin;dur=9
cf-cache-status: DYNAMIC
CF-RAY: 9bc3a9373e3ca3e8-SIN
alt-svc: h3=":443"; ma=86400
Open service 2606:4700:3037::6815:2b52:8443 · joacimandersson.com
2026-01-11 10:16
HTTP/1.1 301 Moved Permanently
Date: Sun, 11 Jan 2026 10:16:51 GMT
Content-Length: 0
Connection: close
Location: https://www.joacimandersson.com/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=QdwNNGCiT8pW2ZoXI7kRna3q4g%2F02bgzzs8WnzalKoH%2F7JwPr9Tw7CNRp%2Bycp4rHt4OEzDct8U8WdoWQkdw3nQJo3PTPbvuI6OSKFAhCLgTZ%2FP4jcVQy1L8zBu1P5bY%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bc3a936dff7920e-FRA
Open service 2606:4700:3037::6815:2b52:443 · joacimandersson.com
2026-01-11 10:16
HTTP/1.1 301 Moved Permanently
Date: Sun, 11 Jan 2026 10:16:50 GMT
Content-Length: 0
Connection: close
Location: https://www.joacimandersson.com/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=pgFJySsp9AFVbVyRRegKj3P1h7allTOb5Gn10CkW5SBxiKHRFJ0aPT71zoadznrBimYFhGu%2BWsFR5SZhbJABaiFCBUhC%2FcwsDnSQC7WPEBj1QG99N5Wn0zyF%2FMckbQ4%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bc3a936bf9218e1-FRA
Open service 104.21.43.82:80 · joacimandersson.com
2026-01-11 10:16
HTTP/1.1 301 Moved Permanently
Date: Sun, 11 Jan 2026 10:16:51 GMT
Content-Length: 0
Connection: close
Location: https://joacimandersson.com/
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=zR43wVZXbcQ2p%2B9kQrUAKIpLHuEwN%2FTcScBnhJ9kVY5lbSe9PwmMTDCcyq%2Bv4lwkQtcx6T46GHqnH0s6%2Bo%2FXwvs74seYI86h%2B%2FxqvxkM2iK7BBo%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
cf-cache-status: DYNAMIC
CF-RAY: 9bc3a936bd2adcac-FRA
alt-svc: h3=":443"; ma=86400
Open service 2606:4700:3032::ac43:b0f6:80 · joacimandersson.com
2026-01-11 10:16
HTTP/1.1 301 Moved Permanently
Date: Sun, 11 Jan 2026 10:16:51 GMT
Content-Length: 0
Connection: close
Location: https://joacimandersson.com/
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=aGSXghECjtvzkLpiZEncZbrw4HFp0xheGoarVZCUzAFYjkCk3epDV1UjQga7WFLUTso5adHRMsXyB60qQEsM8pKUN8KOZk%2Fcn2UVHXm6qIAaGyW3RU0XLaKqC8l8Fj8%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
cf-cache-status: DYNAMIC
CF-RAY: 9bc3a936b900d7e3-LHR
alt-svc: h3=":443"; ma=86400
Open service 172.67.176.246:8443 · joacimandersson.com
2026-01-11 10:16
HTTP/1.1 301 Moved Permanently
Date: Sun, 11 Jan 2026 10:16:50 GMT
Content-Length: 0
Connection: close
Location: https://www.joacimandersson.com/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=X7%2FiQc1%2FCLW52c2R1TOt2miikJBPkFMV%2BlkB0TPDConenedyxn%2B9xgFuAuLCLAfaS5nobF3HLSO%2FtLdebFKz3x2MZVtchTBeP3Ef4UgGGVuwItM%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bc3a936687846eb-FRA
Open service 104.21.43.82:443 · joacimandersson.com
2026-01-11 10:16
HTTP/1.1 301 Moved Permanently
Date: Sun, 11 Jan 2026 10:16:50 GMT
Content-Length: 0
Connection: close
Location: https://www.joacimandersson.com/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=5RjTBY1uRkZjGLr3zVrphitWSY6MiM55HDyDrQCGlhUZIZQgiOdD82lHlByMHA%2FoQJDcuTNMgu7EvxJZChWl4cUbCwxNFETK7LDBoH0l1Ht6quY%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bc3a9366b7c9752-FRA
Open service 2606:4700:3032::ac43:b0f6:8443 · joacimandersson.com
2026-01-11 10:16
HTTP/1.1 301 Moved Permanently
Date: Sun, 11 Jan 2026 10:16:50 GMT
Content-Length: 0
Connection: close
Location: https://www.joacimandersson.com/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=QgLJHodzVW4elR3ClgHMCjtq2YSW4SAiC9tQ3foaXF8dIAXO19%2Bdq1YPXtGVr1yPndrT%2FcJMaumkM3FdJ1Ijvc9vs702A7Ovzl7JnhvWTCQQO91HcjgIPZ%2F1c6xydmA%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bc3a9365eb8cdda-SIN
Open service 172.67.176.246:80 · joacimandersson.com
2026-01-11 10:16
HTTP/1.1 301 Moved Permanently
Date: Sun, 11 Jan 2026 10:16:50 GMT
Content-Length: 0
Connection: close
Location: https://joacimandersson.com/
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=vgBukgRCPO180vu5Txex5E4Ilt%2Bu69dPpW2w937hUj25A8zMsJ7CrdOZVQ4n%2BMYHTfjNe8e5LTY4fbmveXB4ZAUBAXtQ7QCtt7ItSiglhToChjU%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
Server-Timing: cfCacheStatus;desc="DYNAMIC"
Server-Timing: cfEdge;dur=17,cfOrigin;dur=8
cf-cache-status: DYNAMIC
CF-RAY: 9bc3a9366ea2aafe-YYZ
alt-svc: h3=":443"; ma=86400
Open service 172.67.176.246:443 · joacimandersson.com
2026-01-11 10:16
HTTP/1.1 301 Moved Permanently
Date: Sun, 11 Jan 2026 10:16:50 GMT
Content-Length: 0
Connection: close
Location: https://www.joacimandersson.com/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=4mLrvQeqqq0rFRHknonGu8aGSjnuwN8oD9uYtqUqDaZ0C%2F5V06M7T4m73Mlt5J21eWlunhjZArbXssfAQMSszflSSdbJkbK0sk9hDZsl1f%2Fbi2o%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bc3a93638a6beb4-LHR
Open service 2606:4700:3032::ac43:b0f6:443 · joacimandersson.com
2026-01-11 10:16
HTTP/1.1 301 Moved Permanently
Date: Sun, 11 Jan 2026 10:16:50 GMT
Content-Length: 0
Connection: close
Location: https://www.joacimandersson.com/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=e0JbKwvOXYlmAJRByCdFWw7gWNL%2Fec7lYhbZ3fnF%2BZJvQG2mMoYTR0OaifhKwSp%2FrymaZ7sTmO2wnyEGbuEKHRfX5MLpwdtI8yzoHPK8vCp905lokmOWY1FfcrTQHbs%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9bc3a936195cdbff-FRA
Open service 2606:4700:3037::6815:2b52:8443 · www.joacimandersson.com
2026-01-06 20:58
HTTP/1.1 200 OK
Date: Tue, 06 Jan 2026 20:58:46 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: public, max-age=0, must-revalidate
referrer-policy: strict-origin-when-cross-origin
x-content-type-options: nosniff
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=Sf%2BcCPbPnqJ4WJdJiEMt14sqj%2FJT4S0llJWQlXWBY1UKLpL7WBHrWtiu2QoCDtSOZaFr0y%2F4oQl0ifzQRuds%2BRKmlLKVwmPURenvhWx12Jij7fvcIcqbs60AYMGRtFKbOQQ8"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
cf-cache-status: DYNAMIC
CF-RAY: 9b9e22a9fdfc4dcc-FRA
alt-svc: h3=":8443"; ma=86400
Page title: Joacim Andersson - Software Engineering
<!DOCTYPE html>
<html lang="en">
<head>
<script async src="https://www.googletagmanager.com/gtag/js?id=G-NBW80J8LB6"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag('js', new Date());
gtag('config', 'G-NBW80J8LB6');
</script>
<meta name="author" content="joacand"/>
<meta name="robots" content="index, follow"/>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script defer src="/assets/common.js"></script>
<link rel="stylesheet" href="/assets/styles.css">
<link rel="icon" type="image/png" href="/assets/logo.png" />
<link rel="preload"
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
rel="stylesheet">
</noscript>
<title>Joacim Andersson - Software Engineering</title>
<meta name="description" content="Personal portfolio and blog, programming tutorials, web applications, software projects, and tools."/>
<meta name="keywords" content="portfolio, web tools, applications, software engineering, posts" />
<link rel="prefetch" href="/posts/">
<link rel="preload"
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
rel="stylesheet">
</noscript>
<link rel="stylesheet" href="/assets/main.css">
</head>
<body>
<header>
<nav>
<a href="/">Home</a>
<a href="/posts/">Posts</a>
<a href="/tools/">Tools</a>
<a href="/applications/">Applications</a>
<button id="theme-toggle" class="theme-toggle" aria-label="Toggle dark mode">
<span class="toggle-track">
<span class="toggle-thumb"></span>
<span class="toggle-icon sun">☀️</span>
<span class="toggle-icon moon">🌙</span>
</span>
</button>
</nav>
</header>
<main>
<section class="base">
<div class="container">
<div class="base-content">
<div class="base-text">
<h1>Joacim<br>Andersson</h1>
<p class="base-subtitle">Software Engineering | .NET | Cloud | DevOps</p>
<div class="social-links">
<a href="https://www.linkedin.com/in/joacim-andersson" class="social-link" title="LinkedIn">
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
<path
d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z" />
</svg>
</a>
<a href="https://github.com/joacand" class="social-link" title="GitHub">
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
<path
d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.7
Open service 2606:4700:3037::6815:2b52:443 · www.joacimandersson.com
2026-01-06 20:58
HTTP/1.1 200 OK
Date: Tue, 06 Jan 2026 20:58:46 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: public, max-age=0, must-revalidate
referrer-policy: strict-origin-when-cross-origin
x-content-type-options: nosniff
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=Bmky0LGyoaJbi3bg7k2TUL8NP8XqIO%2B5kG2YQo3mLR6cQDE%2BQJDW3lM1VgJB3XcGbVCjb%2B3Z%2BwLULVFW%2B5BFoPjDB7pBNOgNZAsoVEuIWEXBXE%2BWbh3q5MgaDJvdeuLQ97hB"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
cf-cache-status: DYNAMIC
CF-RAY: 9b9e22a9fab3d7d5-FRA
alt-svc: h3=":443"; ma=86400
Page title: Joacim Andersson - Software Engineering
<!DOCTYPE html>
<html lang="en">
<head>
<script async src="https://www.googletagmanager.com/gtag/js?id=G-NBW80J8LB6"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag('js', new Date());
gtag('config', 'G-NBW80J8LB6');
</script>
<meta name="author" content="joacand"/>
<meta name="robots" content="index, follow"/>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script defer src="/assets/common.js"></script>
<link rel="stylesheet" href="/assets/styles.css">
<link rel="icon" type="image/png" href="/assets/logo.png" />
<link rel="preload"
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
rel="stylesheet">
</noscript>
<title>Joacim Andersson - Software Engineering</title>
<meta name="description" content="Personal portfolio and blog, programming tutorials, web applications, software projects, and tools."/>
<meta name="keywords" content="portfolio, web tools, applications, software engineering, posts" />
<link rel="prefetch" href="/posts/">
<link rel="preload"
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
rel="stylesheet">
</noscript>
<link rel="stylesheet" href="/assets/main.css">
</head>
<body>
<header>
<nav>
<a href="/">Home</a>
<a href="/posts/">Posts</a>
<a href="/tools/">Tools</a>
<a href="/applications/">Applications</a>
<button id="theme-toggle" class="theme-toggle" aria-label="Toggle dark mode">
<span class="toggle-track">
<span class="toggle-thumb"></span>
<span class="toggle-icon sun">☀️</span>
<span class="toggle-icon moon">🌙</span>
</span>
</button>
</nav>
</header>
<main>
<section class="base">
<div class="container">
<div class="base-content">
<div class="base-text">
<h1>Joacim<br>Andersson</h1>
<p class="base-subtitle">Software Engineering | .NET | Cloud | DevOps</p>
<div class="social-links">
<a href="https://www.linkedin.com/in/joacim-andersson" class="social-link" title="LinkedIn">
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
<path
d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z" />
</svg>
</a>
<a href="https://github.com/joacand" class="social-link" title="GitHub">
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
<path
d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.7
Open service 2606:4700:3032::ac43:b0f6:8443 · www.joacimandersson.com
2026-01-06 20:58
HTTP/1.1 200 OK
Date: Tue, 06 Jan 2026 20:58:46 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: public, max-age=0, must-revalidate
referrer-policy: strict-origin-when-cross-origin
x-content-type-options: nosniff
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=Fp%2FryNyBme8kO8dpbQJSmAxKk8RzGSLDPcQKTFL5ylp17yVw3%2BwgeVsYk2WGa5w24ZsgQEGBAm2k8F8ua%2FwMs1tUpKqvwG4bgF24Rr6MhQKPvX%2BidBU%2BMhAlF2y7gGofLUAZ"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
cf-cache-status: DYNAMIC
CF-RAY: 9b9e22aa088737ea-FRA
alt-svc: h3=":8443"; ma=86400
Page title: Joacim Andersson - Software Engineering
<!DOCTYPE html>
<html lang="en">
<head>
<script async src="https://www.googletagmanager.com/gtag/js?id=G-NBW80J8LB6"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag('js', new Date());
gtag('config', 'G-NBW80J8LB6');
</script>
<meta name="author" content="joacand"/>
<meta name="robots" content="index, follow"/>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script defer src="/assets/common.js"></script>
<link rel="stylesheet" href="/assets/styles.css">
<link rel="icon" type="image/png" href="/assets/logo.png" />
<link rel="preload"
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
rel="stylesheet">
</noscript>
<title>Joacim Andersson - Software Engineering</title>
<meta name="description" content="Personal portfolio and blog, programming tutorials, web applications, software projects, and tools."/>
<meta name="keywords" content="portfolio, web tools, applications, software engineering, posts" />
<link rel="prefetch" href="/posts/">
<link rel="preload"
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
rel="stylesheet">
</noscript>
<link rel="stylesheet" href="/assets/main.css">
</head>
<body>
<header>
<nav>
<a href="/">Home</a>
<a href="/posts/">Posts</a>
<a href="/tools/">Tools</a>
<a href="/applications/">Applications</a>
<button id="theme-toggle" class="theme-toggle" aria-label="Toggle dark mode">
<span class="toggle-track">
<span class="toggle-thumb"></span>
<span class="toggle-icon sun">☀️</span>
<span class="toggle-icon moon">🌙</span>
</span>
</button>
</nav>
</header>
<main>
<section class="base">
<div class="container">
<div class="base-content">
<div class="base-text">
<h1>Joacim<br>Andersson</h1>
<p class="base-subtitle">Software Engineering | .NET | Cloud | DevOps</p>
<div class="social-links">
<a href="https://www.linkedin.com/in/joacim-andersson" class="social-link" title="LinkedIn">
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
<path
d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z" />
</svg>
</a>
<a href="https://github.com/joacand" class="social-link" title="GitHub">
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
<path
d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.7
Open service 2606:4700:3032::ac43:b0f6:443 · www.joacimandersson.com
2026-01-06 20:58
HTTP/1.1 200 OK
Date: Tue, 06 Jan 2026 20:58:46 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: public, max-age=0, must-revalidate
referrer-policy: strict-origin-when-cross-origin
x-content-type-options: nosniff
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=6JRRCqzNU%2BzI0lFWKWjMDviL9aVBwxYi3CyJNSWwzYNcc4oHQJvh89K%2FqTaywLrM%2BMKMYz5Cs%2FSmN6qm3vfPOOkN5CR%2FeVlSWZS1WMlqWKoJVYTdbm75HbH7x5A1Q2y5uVDv"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
cf-cache-status: DYNAMIC
CF-RAY: 9b9e22a9f978366e-FRA
alt-svc: h3=":443"; ma=86400
Page title: Joacim Andersson - Software Engineering
<!DOCTYPE html>
<html lang="en">
<head>
<script async src="https://www.googletagmanager.com/gtag/js?id=G-NBW80J8LB6"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag('js', new Date());
gtag('config', 'G-NBW80J8LB6');
</script>
<meta name="author" content="joacand"/>
<meta name="robots" content="index, follow"/>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script defer src="/assets/common.js"></script>
<link rel="stylesheet" href="/assets/styles.css">
<link rel="icon" type="image/png" href="/assets/logo.png" />
<link rel="preload"
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
rel="stylesheet">
</noscript>
<title>Joacim Andersson - Software Engineering</title>
<meta name="description" content="Personal portfolio and blog, programming tutorials, web applications, software projects, and tools."/>
<meta name="keywords" content="portfolio, web tools, applications, software engineering, posts" />
<link rel="prefetch" href="/posts/">
<link rel="preload"
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
rel="stylesheet">
</noscript>
<link rel="stylesheet" href="/assets/main.css">
</head>
<body>
<header>
<nav>
<a href="/">Home</a>
<a href="/posts/">Posts</a>
<a href="/tools/">Tools</a>
<a href="/applications/">Applications</a>
<button id="theme-toggle" class="theme-toggle" aria-label="Toggle dark mode">
<span class="toggle-track">
<span class="toggle-thumb"></span>
<span class="toggle-icon sun">☀️</span>
<span class="toggle-icon moon">🌙</span>
</span>
</button>
</nav>
</header>
<main>
<section class="base">
<div class="container">
<div class="base-content">
<div class="base-text">
<h1>Joacim<br>Andersson</h1>
<p class="base-subtitle">Software Engineering | .NET | Cloud | DevOps</p>
<div class="social-links">
<a href="https://www.linkedin.com/in/joacim-andersson" class="social-link" title="LinkedIn">
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
<path
d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z" />
</svg>
</a>
<a href="https://github.com/joacand" class="social-link" title="GitHub">
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
<path
d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.7
Open service 2606:4700:3037::6815:2b52:80 · www.joacimandersson.com
2026-01-06 20:58
HTTP/1.1 301 Moved Permanently
Date: Tue, 06 Jan 2026 20:58:46 GMT
Content-Length: 0
Connection: close
Location: https://www.joacimandersson.com/
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=fRdPI9zsGqABhO%2BojvmSvOQYBqehEAliDPY1CC89afZgxnnFu5Cezc8z6897RRYPC69nxiuVB0f7ECYOQ8uMO3Acrrn%2FnvW1OpMNoeyWwNE0LWg7cPraYVW%2FNHxaTgfXw9tf"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
cf-cache-status: DYNAMIC
CF-RAY: 9b9e22a9bef2dbcd-FRA
alt-svc: h3=":443"; ma=86400
Open service 104.21.43.82:8443 · www.joacimandersson.com
2026-01-06 20:58
HTTP/1.1 200 OK
Date: Tue, 06 Jan 2026 20:58:46 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: public, max-age=0, must-revalidate
referrer-policy: strict-origin-when-cross-origin
x-content-type-options: nosniff
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=EeWQzzXN3AThSi0KyWYbaPQF2QFBBxEV%2B1YMO%2BkCXUc2%2Fu%2FeDtR5NP7KtsXE%2FZYdN%2B8zKLHNXws9zkqE%2Br0fA5OCu1DnAZcsCa%2FClLpt%2BJF7BuN22W8x"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
cf-cache-status: DYNAMIC
CF-RAY: 9b9e22a9ec2c92b9-FRA
alt-svc: h3=":8443"; ma=86400
Page title: Joacim Andersson - Software Engineering
<!DOCTYPE html>
<html lang="en">
<head>
<script async src="https://www.googletagmanager.com/gtag/js?id=G-NBW80J8LB6"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag('js', new Date());
gtag('config', 'G-NBW80J8LB6');
</script>
<meta name="author" content="joacand"/>
<meta name="robots" content="index, follow"/>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script defer src="/assets/common.js"></script>
<link rel="stylesheet" href="/assets/styles.css">
<link rel="icon" type="image/png" href="/assets/logo.png" />
<link rel="preload"
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
rel="stylesheet">
</noscript>
<title>Joacim Andersson - Software Engineering</title>
<meta name="description" content="Personal portfolio and blog, programming tutorials, web applications, software projects, and tools."/>
<meta name="keywords" content="portfolio, web tools, applications, software engineering, posts" />
<link rel="prefetch" href="/posts/">
<link rel="preload"
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
rel="stylesheet">
</noscript>
<link rel="stylesheet" href="/assets/main.css">
</head>
<body>
<header>
<nav>
<a href="/">Home</a>
<a href="/posts/">Posts</a>
<a href="/tools/">Tools</a>
<a href="/applications/">Applications</a>
<button id="theme-toggle" class="theme-toggle" aria-label="Toggle dark mode">
<span class="toggle-track">
<span class="toggle-thumb"></span>
<span class="toggle-icon sun">☀️</span>
<span class="toggle-icon moon">🌙</span>
</span>
</button>
</nav>
</header>
<main>
<section class="base">
<div class="container">
<div class="base-content">
<div class="base-text">
<h1>Joacim<br>Andersson</h1>
<p class="base-subtitle">Software Engineering | .NET | Cloud | DevOps</p>
<div class="social-links">
<a href="https://www.linkedin.com/in/joacim-andersson" class="social-link" title="LinkedIn">
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
<path
d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z" />
</svg>
</a>
<a href="https://github.com/joacand" class="social-link" title="GitHub">
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
<path
d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.7
Open service 104.21.43.82:443 · www.joacimandersson.com
2026-01-06 20:58
HTTP/1.1 200 OK
Date: Tue, 06 Jan 2026 20:58:46 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: public, max-age=0, must-revalidate
referrer-policy: strict-origin-when-cross-origin
x-content-type-options: nosniff
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=4IaZhEb9OqOyeJgD6dMSd6VZIjvgNgUzhWfRsh8tczAOAvWtDTSiNDLtkf62FiOtx1EzLxp37fwfPjVPrzja1pFklBwwaw8XYu3obpfDUKQIqyAn5Syd"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
cf-cache-status: DYNAMIC
CF-RAY: 9b9e22a9e9263648-FRA
alt-svc: h3=":443"; ma=86400
Page title: Joacim Andersson - Software Engineering
<!DOCTYPE html>
<html lang="en">
<head>
<script async src="https://www.googletagmanager.com/gtag/js?id=G-NBW80J8LB6"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag('js', new Date());
gtag('config', 'G-NBW80J8LB6');
</script>
<meta name="author" content="joacand"/>
<meta name="robots" content="index, follow"/>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script defer src="/assets/common.js"></script>
<link rel="stylesheet" href="/assets/styles.css">
<link rel="icon" type="image/png" href="/assets/logo.png" />
<link rel="preload"
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
rel="stylesheet">
</noscript>
<title>Joacim Andersson - Software Engineering</title>
<meta name="description" content="Personal portfolio and blog, programming tutorials, web applications, software projects, and tools."/>
<meta name="keywords" content="portfolio, web tools, applications, software engineering, posts" />
<link rel="prefetch" href="/posts/">
<link rel="preload"
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
rel="stylesheet">
</noscript>
<link rel="stylesheet" href="/assets/main.css">
</head>
<body>
<header>
<nav>
<a href="/">Home</a>
<a href="/posts/">Posts</a>
<a href="/tools/">Tools</a>
<a href="/applications/">Applications</a>
<button id="theme-toggle" class="theme-toggle" aria-label="Toggle dark mode">
<span class="toggle-track">
<span class="toggle-thumb"></span>
<span class="toggle-icon sun">☀️</span>
<span class="toggle-icon moon">🌙</span>
</span>
</button>
</nav>
</header>
<main>
<section class="base">
<div class="container">
<div class="base-content">
<div class="base-text">
<h1>Joacim<br>Andersson</h1>
<p class="base-subtitle">Software Engineering | .NET | Cloud | DevOps</p>
<div class="social-links">
<a href="https://www.linkedin.com/in/joacim-andersson" class="social-link" title="LinkedIn">
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
<path
d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z" />
</svg>
</a>
<a href="https://github.com/joacand" class="social-link" title="GitHub">
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
<path
d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.7
Open service 172.67.176.246:443 · www.joacimandersson.com
2026-01-06 20:58
HTTP/1.1 200 OK
Date: Tue, 06 Jan 2026 20:58:46 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: public, max-age=0, must-revalidate
referrer-policy: strict-origin-when-cross-origin
x-content-type-options: nosniff
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=%2BQildiKgh1dUmMq0SbMK4w2pUKgjl8iT5Y4tQIBy7DCiw9qezYikd5Tpts%2Fy3buK%2Fz9EakJBXbud90ypCRFv1tmReUOiQqQdqko%2B6bDtBD06Rk1zEw%3D%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
cf-cache-status: DYNAMIC
CF-RAY: 9b9e22aa2d666ae8-FRA
alt-svc: h3=":443"; ma=86400
Page title: Joacim Andersson - Software Engineering
<!DOCTYPE html>
<html lang="en">
<head>
<script async src="https://www.googletagmanager.com/gtag/js?id=G-NBW80J8LB6"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag('js', new Date());
gtag('config', 'G-NBW80J8LB6');
</script>
<meta name="author" content="joacand"/>
<meta name="robots" content="index, follow"/>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script defer src="/assets/common.js"></script>
<link rel="stylesheet" href="/assets/styles.css">
<link rel="icon" type="image/png" href="/assets/logo.png" />
<link rel="preload"
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
rel="stylesheet">
</noscript>
<title>Joacim Andersson - Software Engineering</title>
<meta name="description" content="Personal portfolio and blog, programming tutorials, web applications, software projects, and tools."/>
<meta name="keywords" content="portfolio, web tools, applications, software engineering, posts" />
<link rel="prefetch" href="/posts/">
<link rel="preload"
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
rel="stylesheet">
</noscript>
<link rel="stylesheet" href="/assets/main.css">
</head>
<body>
<header>
<nav>
<a href="/">Home</a>
<a href="/posts/">Posts</a>
<a href="/tools/">Tools</a>
<a href="/applications/">Applications</a>
<button id="theme-toggle" class="theme-toggle" aria-label="Toggle dark mode">
<span class="toggle-track">
<span class="toggle-thumb"></span>
<span class="toggle-icon sun">☀️</span>
<span class="toggle-icon moon">🌙</span>
</span>
</button>
</nav>
</header>
<main>
<section class="base">
<div class="container">
<div class="base-content">
<div class="base-text">
<h1>Joacim<br>Andersson</h1>
<p class="base-subtitle">Software Engineering | .NET | Cloud | DevOps</p>
<div class="social-links">
<a href="https://www.linkedin.com/in/joacim-andersson" class="social-link" title="LinkedIn">
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
<path
d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z" />
</svg>
</a>
<a href="https://github.com/joacand" class="social-link" title="GitHub">
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
<path
d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.7
Open service 172.67.176.246:8443 · www.joacimandersson.com
2026-01-06 20:58
HTTP/1.1 200 OK
Date: Tue, 06 Jan 2026 20:58:46 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: public, max-age=0, must-revalidate
referrer-policy: strict-origin-when-cross-origin
x-content-type-options: nosniff
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=hXOMtvP%2Fi4MGS1PTbq8Fd%2F7fJ2IbmYLDBfiyWbzIfmK%2BKDP25qOR%2BBOSMjl5bCmi867BhgV%2FxHzsSr5gthi2jgEzq9St9kB4dZA1qyYyAcHx0suvIz%2Be"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
cf-cache-status: DYNAMIC
CF-RAY: 9b9e22a9e940e7b9-FRA
alt-svc: h3=":8443"; ma=86400
Page title: Joacim Andersson - Software Engineering
<!DOCTYPE html>
<html lang="en">
<head>
<script async src="https://www.googletagmanager.com/gtag/js?id=G-NBW80J8LB6"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag('js', new Date());
gtag('config', 'G-NBW80J8LB6');
</script>
<meta name="author" content="joacand"/>
<meta name="robots" content="index, follow"/>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script defer src="/assets/common.js"></script>
<link rel="stylesheet" href="/assets/styles.css">
<link rel="icon" type="image/png" href="/assets/logo.png" />
<link rel="preload"
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
rel="stylesheet">
</noscript>
<title>Joacim Andersson - Software Engineering</title>
<meta name="description" content="Personal portfolio and blog, programming tutorials, web applications, software projects, and tools."/>
<meta name="keywords" content="portfolio, web tools, applications, software engineering, posts" />
<link rel="prefetch" href="/posts/">
<link rel="preload"
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Merriweather:wght@700&display=swap"
rel="stylesheet">
</noscript>
<link rel="stylesheet" href="/assets/main.css">
</head>
<body>
<header>
<nav>
<a href="/">Home</a>
<a href="/posts/">Posts</a>
<a href="/tools/">Tools</a>
<a href="/applications/">Applications</a>
<button id="theme-toggle" class="theme-toggle" aria-label="Toggle dark mode">
<span class="toggle-track">
<span class="toggle-thumb"></span>
<span class="toggle-icon sun">☀️</span>
<span class="toggle-icon moon">🌙</span>
</span>
</button>
</nav>
</header>
<main>
<section class="base">
<div class="container">
<div class="base-content">
<div class="base-text">
<h1>Joacim<br>Andersson</h1>
<p class="base-subtitle">Software Engineering | .NET | Cloud | DevOps</p>
<div class="social-links">
<a href="https://www.linkedin.com/in/joacim-andersson" class="social-link" title="LinkedIn">
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
<path
d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z" />
</svg>
</a>
<a href="https://github.com/joacand" class="social-link" title="GitHub">
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
<path
d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.7
Open service 2606:4700:3032::ac43:b0f6:80 · www.joacimandersson.com
2026-01-06 20:58
HTTP/1.1 301 Moved Permanently
Date: Tue, 06 Jan 2026 20:58:46 GMT
Content-Length: 0
Connection: close
Location: https://www.joacimandersson.com/
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=ZWGhEyr8VKRe6seQieBp29ZhbV4Be1%2BQkUkLw%2F28lpFYlTXzxMX9YuqjQIn5vHc015T13QJaQ4m2n1ZdREHHj1EYLcxOO5otSalFA3arh2q7Gx06j65gdNUB28JyFP4KSaPr"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
cf-cache-status: DYNAMIC
CF-RAY: 9b9e22a9ca89198f-FRA
alt-svc: h3=":443"; ma=86400
Open service 172.67.176.246:80 · www.joacimandersson.com
2026-01-06 20:58
HTTP/1.1 301 Moved Permanently
Date: Tue, 06 Jan 2026 20:58:46 GMT
Content-Length: 0
Connection: close
Location: https://www.joacimandersson.com/
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=xHqccJUM6bRnUk%2FqhTb5FnmzfZiUfXegGasGNZHAiMzhrznTnrRt9oeThY%2B0bQj%2FUUkuN2jpGStnmX4JcL35z2v5GZzmzZJYtoMGPAQFxrvOaJs%2BoNow"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
cf-cache-status: DYNAMIC
CF-RAY: 9b9e22a9cb2e902e-FRA
alt-svc: h3=":443"; ma=86400
Open service 104.21.43.82:80 · www.joacimandersson.com
2026-01-06 20:58
HTTP/1.1 301 Moved Permanently
Date: Tue, 06 Jan 2026 20:58:46 GMT
Content-Length: 0
Connection: close
Location: https://www.joacimandersson.com/
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=YBlPJy5W0Hq9Yxw5%2BrEM9Py%2FjRcpH5lHSJMWD8DD1k%2BaZt3sKPOFbqpjJt9gU6N%2Fef932jxaTAz9%2BfOzkowjX4zQ84xtUbD6iukJdghOgSyQeSYI%2FWMY"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
cf-cache-status: DYNAMIC
CF-RAY: 9b9e22a9db8b7882-FRA
alt-svc: h3=":443"; ma=86400
Open service 2606:4700:3032::ac43:b0f6:8443 · joacimandersson.com
2026-01-06 18:42
HTTP/1.1 301 Moved Permanently
Date: Tue, 06 Jan 2026 18:42:45 GMT
Content-Length: 0
Connection: close
Location: https://www.joacimandersson.com/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=jSNbQHJ%2FjzEnjhM%2BD9Ybh9Cq7J3BjZecz6mV%2BQv4qz1A82ivQv8CHRk2K7ncwD3u6CAM3d2RjsGbKUHyk%2Bw%2Batw4aCcvOLVN%2FmJrgmHLgDtiRcdM8KmwT2fk6%2Fs8pO4%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9b9d5b681e774f09-YYZ
Open service 104.21.43.82:80 · joacimandersson.com
2026-01-06 18:42
HTTP/1.1 301 Moved Permanently
Date: Tue, 06 Jan 2026 18:42:45 GMT
Content-Length: 0
Connection: close
Location: https://joacimandersson.com/
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=vNhu%2FQvv8lhX88xIf9iWHWdMwalOOajgC6qO0sxiE5QR5v5ooLBXbQcHIa%2FYAUuDltJGC%2FAZu9hnbFxV%2FlLwsuwtM9pGSWspHgAAL612GtjraRs%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
cf-cache-status: DYNAMIC
CF-RAY: 9b9d5b68196e0baa-AMS
alt-svc: h3=":443"; ma=86400
Open service 104.21.43.82:443 · joacimandersson.com
2026-01-06 18:42
HTTP/1.1 301 Moved Permanently
Date: Tue, 06 Jan 2026 18:42:45 GMT
Content-Length: 0
Connection: close
Location: https://www.joacimandersson.com/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=s4q6WNHoBXg3jy1TMpHNlWDsOuWI5bMb%2BrpAs7uzYBjAWi1GYgc1PD%2BOv%2B5d8OCYI0NLa7YckXR6J9AwiFHePAKTqoFS3pyxMCr6Qd3fT1UxyjQ%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9b9d5b67f9aa9c07-FRA
Open service 104.21.43.82:8443 · joacimandersson.com
2026-01-06 18:42
HTTP/1.1 301 Moved Permanently
Date: Tue, 06 Jan 2026 18:42:45 GMT
Content-Length: 0
Connection: close
Location: https://www.joacimandersson.com/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=rd0KBLoH%2F12dX2iyJPWjDw7IQd2HsBqMSNbFzplhaXQmmcME5JdfgQORVKSCLu%2BzwZzxY%2BUbzwMiIXNS9%2BcbK1Wdmtauhh0SDz48HoiV95PxoJ0%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9b9d5b67c92c1dc7-EWR
Open service 2606:4700:3037::6815:2b52:443 · joacimandersson.com
2026-01-06 18:42
HTTP/1.1 301 Moved Permanently
Date: Tue, 06 Jan 2026 18:42:45 GMT
Content-Length: 0
Connection: close
Location: https://www.joacimandersson.com/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=LTV3tHGAc5JCSvr%2FiPScdwbCMZU6NS3naslMlloV344EPHq8t1aDCZaPTJUxAotYJslJrfGEuovqmVi75fY5coIRkzgpDIqnr5jfOA4neUBgkUA2cAWYjV1VcL5g5Ek%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9b9d5b679ac01703-SJC
Open service 2606:4700:3037::6815:2b52:8443 · joacimandersson.com
2026-01-06 18:42
HTTP/1.1 301 Moved Permanently
Date: Tue, 06 Jan 2026 18:42:44 GMT
Content-Length: 0
Connection: close
Location: https://www.joacimandersson.com/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=m0mLTiORxKGnlWlgfwnwq4%2FIYeCSaDPEA4QSTtfwx8MXwKrzuzGB2P%2BE%2BJTZYVoEt6gJCLI6DoiOtG25mIkU5qNuXwJsXO6YuFxgdGXSUge5EZogQkLPUpaRPpZRAZU%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9b9d5b672824ce6a-SIN
Open service 2606:4700:3032::ac43:b0f6:80 · joacimandersson.com
2026-01-06 18:42
HTTP/1.1 301 Moved Permanently
Date: Tue, 06 Jan 2026 18:42:45 GMT
Content-Length: 0
Connection: close
Location: https://joacimandersson.com/
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=Y7WST9byk3G%2FWrxOwVJ3QOKN3K%2F6kQkAHjKRhrWMYcQJrhSTEXP4kgd1juplCG7OmwoKgPUd%2Bo100xf%2FPGo6dU6IJsD6M294s67lyJxmot4a2AOPa%2BercUlY2bH145Y%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
cf-cache-status: DYNAMIC
CF-RAY: 9b9d5b675bac8ab5-FRA
alt-svc: h3=":443"; ma=86400
Open service 2606:4700:3032::ac43:b0f6:443 · joacimandersson.com
2026-01-06 18:42
HTTP/1.1 301 Moved Permanently
Date: Tue, 06 Jan 2026 18:42:44 GMT
Content-Length: 0
Connection: close
Location: https://www.joacimandersson.com/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=oGEfQZhA%2FJc9CPkVpP00uy20yGTQrz5rxbhYcXSd0zR2cNXLXFajaBF3FnKLu2dow9lP3w0bv%2BwOcYd0aAq%2FbmQvAPqwUrRsfr9Z5FPrmm4uICU0jhRGV%2BJZT3X409M%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9b9d5b671c5335f0-FRA
Open service 172.67.176.246:8443 · joacimandersson.com
2026-01-06 18:42
HTTP/1.1 301 Moved Permanently
Date: Tue, 06 Jan 2026 18:42:44 GMT
Content-Length: 0
Connection: close
Location: https://www.joacimandersson.com/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=%2F%2BJs4Gdkmwq14Ju4KKgaYjmtrX73RdgQ3%2Bz3gmR0pSUU3ljrz1ychaXQKzDMIsKI2AHXxSHun8BAHSOOQo7harP7og1n%2FxUldb5tH9si4md4F1s%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9b9d5b66fe84fd89-SIN
Open service 2606:4700:3037::6815:2b52:80 · joacimandersson.com
2026-01-06 18:42
HTTP/1.1 301 Moved Permanently
Date: Tue, 06 Jan 2026 18:42:45 GMT
Content-Length: 0
Connection: close
Location: https://joacimandersson.com/
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=YWH91NDAQzgnySEkbP%2BQQrXChiLRiOrgo4vrcYqXbgbQgtLGNWoEMhFuewmyd5VHHf9cXRxTzw7ZFAaHHvxotWEDFyx2Q6aysJN9IJ6lSjTDWv0sLxC6fI0V8oK0Uo0%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
cf-cache-status: DYNAMIC
CF-RAY: 9b9d5b67195dd596-AMS
alt-svc: h3=":443"; ma=86400
Open service 172.67.176.246:443 · joacimandersson.com
2026-01-06 18:42
HTTP/1.1 301 Moved Permanently
Date: Tue, 06 Jan 2026 18:42:44 GMT
Content-Length: 0
Connection: close
Location: https://www.joacimandersson.com/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=Z9eKPbTfEQftkxxXJmd7ac4RDAh6E3XegWQJo2pd6nDwOW9%2BhCIwBoQawRSPArluNThy855YwEm0u1yYBrCUxkJ9HjHUyLZ0XzrJaEAKXrsaXgc%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9b9d5b66dfcf6a55-EWR
Open service 172.67.176.246:80 · joacimandersson.com
2026-01-06 18:42
HTTP/1.1 301 Moved Permanently
Date: Tue, 06 Jan 2026 18:42:44 GMT
Content-Length: 0
Connection: close
Location: https://joacimandersson.com/
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=2rSDowqEmV0IK9Slf6o5JHu5DmHQtv%2Biv0INlEpihPB6oada5oYC3CdlMsu1Tv0ZWfJRwTzj93HHzKOcQnj7wd%2BJ6WX0jLpEZQ%2FzcY2oQCZFhGU%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
cf-cache-status: DYNAMIC
CF-RAY: 9b9d5b669aad377c-FRA
alt-svc: h3=":443"; ma=86400