cloudflare
tcp/443 tcp/80 tcp/8443
pages-server
tcp/443
Open service 104.21.49.204:8443 · ttntm.me
2026-01-25 17:22
HTTP/1.1 200 OK
Date: Sun, 25 Jan 2026 17:22:27 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: public, max-age=21600
Server-Timing: cfCacheStatus;desc="DYNAMIC"
Server-Timing: cfEdge;dur=12,cfOrigin;dur=369
Link: <https://webmention.io/ttntm.me/webmention>; rel="webmention"
content-security-policy: default-src 'self' 'unsafe-inline'; img-src * data:; style-src 'self' 'unsafe-inline'; frame-ancestors 'none'
permissions-policy: document-domain=()
referrer-policy: no-referrer, strict-origin-when-cross-origin
x-content-type-options: nosniff
x-frame-options: DENY
x-robots-tag: noai, noimageai, SPC
x-xss-protection: 1; mode=block
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=GLuCYVS%2FunEjpfL%2BI71Aq7XA0huzt55KOl1%2FOwiXtLGEQJMj0qgvu1h4Q16wjxAO626GFk8WRmUiwy9UpLneUYwn1Dp9a3Xr"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
Strict-Transport-Security: max-age=0; includeSubDomains; preload
cf-cache-status: DYNAMIC
CF-RAY: 9c3973e64ba985e5-BOM
alt-svc: h3=":8443"; ma=86400
Page title: Homepage - ttntm.me
<!doctype html><html lang="en"><head><link rel="preload" href="/css/page.css" as="style"><link rel="preload" href="/fonts/space-mono-v15-latin-regular.woff2" as="font" type="font/woff2" crossorigin=""><link rel="preload" href="/fonts/space-mono-v15-latin-700.woff2" as="font" type="font/woff2" crossorigin=""><link rel="preload" href="/fonts/titillium-web-v9-latin-regular.woff2" as="font" type="font/woff2" crossorigin=""><title>Homepage - ttntm.me</title><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="author" content="humans.txt"><meta name="description" content="Tom's homepage. A personal website, journal and playground."><meta name="fediverse:creator" content="@ttntm@hachyderm.io"><meta property="og:site_name" content="Tom's Homepage"><meta property="og:title" content="Homepage"><meta property="og:description" content="Tom's homepage. A personal website, journal and playground."><meta property="og:url" content="https://ttntm.me/"><meta property="og:image" content="https://ttntm.me/img/social.jpg"><link rel="manifest" href="/site.webmanifest"><meta name="theme-color" content="#fff"><link rel="icon" type="image/png" sizes="384x384" href="/img/favicon/android-chrome-512x512.png"><link rel="icon" type="image/png" sizes="192x192" href="/img/favicon/android-chrome-192x192.png"><link rel="icon" type="image/png" sizes="32x32" href="/img/favicon/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/img/favicon/favicon-16x16.png"><link rel="apple-touch-icon" sizes="180x180" href="/img/favicon/apple-180x180-solid.png"><link rel="mask-icon" href="/img/favicon/safari-pinned-tab.svg" color="#5bbad5"><meta name="masapplication-config" content="/browserconfig.xml"><link rel="stylesheet" href="/css/page.css"><link rel="canonical" href="https://ttntm.me/"><meta name="robots" content="index, follow, noai, noimageai"><meta name="google-site-verification" content="xnb1OPOcw77ws6qsMtbTNh6CVyT4H0hPq1JPimFDwyI"><link rel="blogroll" type="text/xml" href="/blogroll.opml"><link rel="webmention" href="https://webmention.io/ttntm.me/webmention"><link rel="pingback" href="https://webmention.io/ttntm.me/xmlrpc"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/blog/feed.xml" title="Blog Feed"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/likes/feed.xml" title="Likes Feed"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/notes/feed.xml" title="Notes Feed"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/everything.xml" title="Everything Feed"><script>function applyTheme(e=void 0,t=!1){e&&"string"==typeof e&&(document.documentElement.setAttribute("data-theme",e),t||localStorage.setItem("theme",e));const n=document.querySelector(".btn-theme-header"),o=document.querySelector(".btn-theme-footer");n&&(n.innerHTML=getIcon(e,"d-block",22,"currentColor",2)),o&&(o.innerHTML=getIcon(e,"icon",24,"#81a1c1",1.5))}function getThemeFromLS(){return localStorage.getItem("theme")}function getIcon(e,t,n,o,a){return"dark"===e?`<svg xmlns="http://www.w3.org/2000/svg" class="${t}" width="${n}" height="${n}" viewBox="0 0 24 24" stroke-width="${a}" stroke="${o}" fill="none" stroke-linecap="round" stroke-linejoin="round" style="pointer-events: none;"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 12m-4 0a4 4 0 1 0 8 0a4 4 0 1 0 -8 0" /><path d="M3 12h1m8 -9v1m8 8h1m-9 8v1m-6.4 -15.4l.7 .7m12.1 -.7l-.7 .7m0 11.4l.7 .7m-12.1 -.7l-.7 .7" /></svg>`:`<svg xmlns="http://www.w3.org/2000/svg" class="${t}" width="${n}" height="${n}" viewBox="0 0 24 24" stroke-width="${a}" stroke="${o}" fill="none" stroke-linecap="round" stroke-linejoin="round" style="pointer-events: none;"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" /><path d="M17 4a2 2 0 0 0 2 2a2 2 0 0 0 -2 2a2 2 0 0 0 -2 -2a2 2 0 0 0 2 -2" /><path d="M19 11h2m-1 -1v2" /></svg>`}function main(){const e=getThemeFromLS();if(e)applyTheme(e);else{window.matchMedia("(pr
Open service 172.67.167.25:443 · ttntm.me
2026-01-25 17:22
HTTP/1.1 200 OK
Date: Sun, 25 Jan 2026 17:22:25 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: public, max-age=21600
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Link: <https://webmention.io/ttntm.me/webmention>; rel="webmention"
content-security-policy: default-src 'self' 'unsafe-inline'; img-src * data:; style-src 'self' 'unsafe-inline'; frame-ancestors 'none'
permissions-policy: document-domain=()
referrer-policy: no-referrer, strict-origin-when-cross-origin
x-content-type-options: nosniff
x-frame-options: DENY
x-robots-tag: noai, noimageai, SPC
x-xss-protection: 1; mode=block
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=8QbUCLm7%2BGAOS%2F2%2FTPnb8tyVDGngbZb%2FI4ken5WI5Byv5aV46%2BH4L59I7RbwW5%2F2aPNIQAEN2TT1%2BIkGF%2FzJqw42k5umxA%3D%3D"}]}
cf-cache-status: HIT
Server-Timing: cfCacheStatus;desc="HIT"
Server-Timing: cfEdge;dur=14,cfOrigin;dur=0
Server: cloudflare
Strict-Transport-Security: max-age=0; includeSubDomains; preload
Age: 9891
CF-RAY: 9c3973e069b46a5f-EWR
alt-svc: h3=":443"; ma=86400
Page title: Homepage - ttntm.me
<!doctype html><html lang="en"><head><link rel="preload" href="/css/page.css" as="style"><link rel="preload" href="/fonts/space-mono-v15-latin-regular.woff2" as="font" type="font/woff2" crossorigin=""><link rel="preload" href="/fonts/space-mono-v15-latin-700.woff2" as="font" type="font/woff2" crossorigin=""><link rel="preload" href="/fonts/titillium-web-v9-latin-regular.woff2" as="font" type="font/woff2" crossorigin=""><title>Homepage - ttntm.me</title><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="author" content="humans.txt"><meta name="description" content="Tom's homepage. A personal website, journal and playground."><meta name="fediverse:creator" content="@ttntm@hachyderm.io"><meta property="og:site_name" content="Tom's Homepage"><meta property="og:title" content="Homepage"><meta property="og:description" content="Tom's homepage. A personal website, journal and playground."><meta property="og:url" content="https://ttntm.me/"><meta property="og:image" content="https://ttntm.me/img/social.jpg"><link rel="manifest" href="/site.webmanifest"><meta name="theme-color" content="#fff"><link rel="icon" type="image/png" sizes="384x384" href="/img/favicon/android-chrome-512x512.png"><link rel="icon" type="image/png" sizes="192x192" href="/img/favicon/android-chrome-192x192.png"><link rel="icon" type="image/png" sizes="32x32" href="/img/favicon/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/img/favicon/favicon-16x16.png"><link rel="apple-touch-icon" sizes="180x180" href="/img/favicon/apple-180x180-solid.png"><link rel="mask-icon" href="/img/favicon/safari-pinned-tab.svg" color="#5bbad5"><meta name="masapplication-config" content="/browserconfig.xml"><link rel="stylesheet" href="/css/page.css"><link rel="canonical" href="https://ttntm.me/"><meta name="robots" content="index, follow, noai, noimageai"><meta name="google-site-verification" content="xnb1OPOcw77ws6qsMtbTNh6CVyT4H0hPq1JPimFDwyI"><link rel="blogroll" type="text/xml" href="/blogroll.opml"><link rel="webmention" href="https://webmention.io/ttntm.me/webmention"><link rel="pingback" href="https://webmention.io/ttntm.me/xmlrpc"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/blog/feed.xml" title="Blog Feed"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/likes/feed.xml" title="Likes Feed"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/notes/feed.xml" title="Notes Feed"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/everything.xml" title="Everything Feed"><script>function applyTheme(e=void 0,t=!1){e&&"string"==typeof e&&(document.documentElement.setAttribute("data-theme",e),t||localStorage.setItem("theme",e));const n=document.querySelector(".btn-theme-header"),o=document.querySelector(".btn-theme-footer");n&&(n.innerHTML=getIcon(e,"d-block",22,"currentColor",2)),o&&(o.innerHTML=getIcon(e,"icon",24,"#81a1c1",1.5))}function getThemeFromLS(){return localStorage.getItem("theme")}function getIcon(e,t,n,o,a){return"dark"===e?`<svg xmlns="http://www.w3.org/2000/svg" class="${t}" width="${n}" height="${n}" viewBox="0 0 24 24" stroke-width="${a}" stroke="${o}" fill="none" stroke-linecap="round" stroke-linejoin="round" style="pointer-events: none;"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 12m-4 0a4 4 0 1 0 8 0a4 4 0 1 0 -8 0" /><path d="M3 12h1m8 -9v1m8 8h1m-9 8v1m-6.4 -15.4l.7 .7m12.1 -.7l-.7 .7m0 11.4l.7 .7m-12.1 -.7l-.7 .7" /></svg>`:`<svg xmlns="http://www.w3.org/2000/svg" class="${t}" width="${n}" height="${n}" viewBox="0 0 24 24" stroke-width="${a}" stroke="${o}" fill="none" stroke-linecap="round" stroke-linejoin="round" style="pointer-events: none;"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" /><path d="M17 4a2 2 0 0 0 2 2a2 2 0 0 0 -2 2a2 2 0 0 0 -2 -2a2 2 0 0 0 2 -2" /><path d="M19 11h2m-1 -1v2" /></svg>`}function main(){const e=getThemeFromLS();if(e)applyTheme(e);else{window.matchMedia("(pr
Open service 2606:4700:3035::ac43:a719:443 · ttntm.me
2026-01-25 17:22
HTTP/1.1 200 OK
Date: Sun, 25 Jan 2026 17:22:26 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Access-Control-Allow-Origin: *
cache-control: public, max-age=21600
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Link: <https://webmention.io/ttntm.me/webmention>; rel="webmention"
content-security-policy: default-src 'self' 'unsafe-inline'; img-src * data:; style-src 'self' 'unsafe-inline'; frame-ancestors 'none'
permissions-policy: document-domain=()
referrer-policy: no-referrer, strict-origin-when-cross-origin
x-content-type-options: nosniff
x-frame-options: DENY
x-robots-tag: noai, noimageai, SPC
x-xss-protection: 1; mode=block
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=%2FPQK4%2FP0qRQ5y%2FXlj3UOETqU40bUXAs5yiQO3DHOfvdL6H68FRihbWj5oeImlPcD6QwIZe4B%2BaJAccbVTOB%2FEk5QetEWMuoH3MABA3bVypgsUfU4"}]}
Age: 17285
cf-cache-status: HIT
Server: cloudflare
Strict-Transport-Security: max-age=0; includeSubDomains; preload
CF-RAY: 9c3973e0bfe23836-FRA
alt-svc: h3=":443"; ma=86400
Page title: Homepage - ttntm.me
<!doctype html><html lang="en"><head><link rel="preload" href="/css/page.css" as="style"><link rel="preload" href="/fonts/space-mono-v15-latin-regular.woff2" as="font" type="font/woff2" crossorigin=""><link rel="preload" href="/fonts/space-mono-v15-latin-700.woff2" as="font" type="font/woff2" crossorigin=""><link rel="preload" href="/fonts/titillium-web-v9-latin-regular.woff2" as="font" type="font/woff2" crossorigin=""><title>Homepage - ttntm.me</title><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="author" content="humans.txt"><meta name="description" content="Tom's homepage. A personal website, journal and playground."><meta name="fediverse:creator" content="@ttntm@hachyderm.io"><meta property="og:site_name" content="Tom's Homepage"><meta property="og:title" content="Homepage"><meta property="og:description" content="Tom's homepage. A personal website, journal and playground."><meta property="og:url" content="https://ttntm.me/"><meta property="og:image" content="https://ttntm.me/img/social.jpg"><link rel="manifest" href="/site.webmanifest"><meta name="theme-color" content="#fff"><link rel="icon" type="image/png" sizes="384x384" href="/img/favicon/android-chrome-512x512.png"><link rel="icon" type="image/png" sizes="192x192" href="/img/favicon/android-chrome-192x192.png"><link rel="icon" type="image/png" sizes="32x32" href="/img/favicon/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/img/favicon/favicon-16x16.png"><link rel="apple-touch-icon" sizes="180x180" href="/img/favicon/apple-180x180-solid.png"><link rel="mask-icon" href="/img/favicon/safari-pinned-tab.svg" color="#5bbad5"><meta name="masapplication-config" content="/browserconfig.xml"><link rel="stylesheet" href="/css/page.css"><link rel="canonical" href="https://ttntm.me/"><meta name="robots" content="index, follow, noai, noimageai"><meta name="google-site-verification" content="xnb1OPOcw77ws6qsMtbTNh6CVyT4H0hPq1JPimFDwyI"><link rel="blogroll" type="text/xml" href="/blogroll.opml"><link rel="webmention" href="https://webmention.io/ttntm.me/webmention"><link rel="pingback" href="https://webmention.io/ttntm.me/xmlrpc"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/blog/feed.xml" title="Blog Feed"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/likes/feed.xml" title="Likes Feed"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/notes/feed.xml" title="Notes Feed"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/everything.xml" title="Everything Feed"><script>function applyTheme(e=void 0,t=!1){e&&"string"==typeof e&&(document.documentElement.setAttribute("data-theme",e),t||localStorage.setItem("theme",e));const n=document.querySelector(".btn-theme-header"),o=document.querySelector(".btn-theme-footer");n&&(n.innerHTML=getIcon(e,"d-block",22,"currentColor",2)),o&&(o.innerHTML=getIcon(e,"icon",24,"#81a1c1",1.5))}function getThemeFromLS(){return localStorage.getItem("theme")}function getIcon(e,t,n,o,a){return"dark"===e?`<svg xmlns="http://www.w3.org/2000/svg" class="${t}" width="${n}" height="${n}" viewBox="0 0 24 24" stroke-width="${a}" stroke="${o}" fill="none" stroke-linecap="round" stroke-linejoin="round" style="pointer-events: none;"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 12m-4 0a4 4 0 1 0 8 0a4 4 0 1 0 -8 0" /><path d="M3 12h1m8 -9v1m8 8h1m-9 8v1m-6.4 -15.4l.7 .7m12.1 -.7l-.7 .7m0 11.4l.7 .7m-12.1 -.7l-.7 .7" /></svg>`:`<svg xmlns="http://www.w3.org/2000/svg" class="${t}" width="${n}" height="${n}" viewBox="0 0 24 24" stroke-width="${a}" stroke="${o}" fill="none" stroke-linecap="round" stroke-linejoin="round" style="pointer-events: none;"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" /><path d="M17 4a2 2 0 0 0 2 2a2 2 0 0 0 -2 2a2 2 0 0 0 -2 -2a2 2 0 0 0 2 -2" /><path d="M19 11h2m-1 -1v2" /></svg>`}function main(){const e=getThemeFromLS();if(e)applyTheme(e);else{window.matchMedia("(pr
Open service 2606:4700:3030::6815:31cc:443 · ttntm.me
2026-01-25 17:22
HTTP/1.1 200 OK
Date: Sun, 25 Jan 2026 17:22:25 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Access-Control-Allow-Origin: *
cache-control: public, max-age=21600
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Link: <https://webmention.io/ttntm.me/webmention>; rel="webmention"
content-security-policy: default-src 'self' 'unsafe-inline'; img-src * data:; style-src 'self' 'unsafe-inline'; frame-ancestors 'none'
permissions-policy: document-domain=()
referrer-policy: no-referrer, strict-origin-when-cross-origin
x-content-type-options: nosniff
x-frame-options: DENY
x-robots-tag: noai, noimageai, SPC
x-xss-protection: 1; mode=block
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=%2FPQK4%2FP0qRQ5y%2FXlj3UOETqU40bUXAs5yiQO3DHOfvdL6H68FRihbWj5oeImlPcD6QwIZe4B%2BaJAccbVTOB%2FEk5QetEWMuoH3MABA3bVypgsUfU4"}]}
Age: 17285
cf-cache-status: HIT
Server: cloudflare
Strict-Transport-Security: max-age=0; includeSubDomains; preload
CF-RAY: 9c3973e04b5b2b41-FRA
alt-svc: h3=":443"; ma=86400
Page title: Homepage - ttntm.me
<!doctype html><html lang="en"><head><link rel="preload" href="/css/page.css" as="style"><link rel="preload" href="/fonts/space-mono-v15-latin-regular.woff2" as="font" type="font/woff2" crossorigin=""><link rel="preload" href="/fonts/space-mono-v15-latin-700.woff2" as="font" type="font/woff2" crossorigin=""><link rel="preload" href="/fonts/titillium-web-v9-latin-regular.woff2" as="font" type="font/woff2" crossorigin=""><title>Homepage - ttntm.me</title><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="author" content="humans.txt"><meta name="description" content="Tom's homepage. A personal website, journal and playground."><meta name="fediverse:creator" content="@ttntm@hachyderm.io"><meta property="og:site_name" content="Tom's Homepage"><meta property="og:title" content="Homepage"><meta property="og:description" content="Tom's homepage. A personal website, journal and playground."><meta property="og:url" content="https://ttntm.me/"><meta property="og:image" content="https://ttntm.me/img/social.jpg"><link rel="manifest" href="/site.webmanifest"><meta name="theme-color" content="#fff"><link rel="icon" type="image/png" sizes="384x384" href="/img/favicon/android-chrome-512x512.png"><link rel="icon" type="image/png" sizes="192x192" href="/img/favicon/android-chrome-192x192.png"><link rel="icon" type="image/png" sizes="32x32" href="/img/favicon/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/img/favicon/favicon-16x16.png"><link rel="apple-touch-icon" sizes="180x180" href="/img/favicon/apple-180x180-solid.png"><link rel="mask-icon" href="/img/favicon/safari-pinned-tab.svg" color="#5bbad5"><meta name="masapplication-config" content="/browserconfig.xml"><link rel="stylesheet" href="/css/page.css"><link rel="canonical" href="https://ttntm.me/"><meta name="robots" content="index, follow, noai, noimageai"><meta name="google-site-verification" content="xnb1OPOcw77ws6qsMtbTNh6CVyT4H0hPq1JPimFDwyI"><link rel="blogroll" type="text/xml" href="/blogroll.opml"><link rel="webmention" href="https://webmention.io/ttntm.me/webmention"><link rel="pingback" href="https://webmention.io/ttntm.me/xmlrpc"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/blog/feed.xml" title="Blog Feed"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/likes/feed.xml" title="Likes Feed"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/notes/feed.xml" title="Notes Feed"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/everything.xml" title="Everything Feed"><script>function applyTheme(e=void 0,t=!1){e&&"string"==typeof e&&(document.documentElement.setAttribute("data-theme",e),t||localStorage.setItem("theme",e));const n=document.querySelector(".btn-theme-header"),o=document.querySelector(".btn-theme-footer");n&&(n.innerHTML=getIcon(e,"d-block",22,"currentColor",2)),o&&(o.innerHTML=getIcon(e,"icon",24,"#81a1c1",1.5))}function getThemeFromLS(){return localStorage.getItem("theme")}function getIcon(e,t,n,o,a){return"dark"===e?`<svg xmlns="http://www.w3.org/2000/svg" class="${t}" width="${n}" height="${n}" viewBox="0 0 24 24" stroke-width="${a}" stroke="${o}" fill="none" stroke-linecap="round" stroke-linejoin="round" style="pointer-events: none;"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 12m-4 0a4 4 0 1 0 8 0a4 4 0 1 0 -8 0" /><path d="M3 12h1m8 -9v1m8 8h1m-9 8v1m-6.4 -15.4l.7 .7m12.1 -.7l-.7 .7m0 11.4l.7 .7m-12.1 -.7l-.7 .7" /></svg>`:`<svg xmlns="http://www.w3.org/2000/svg" class="${t}" width="${n}" height="${n}" viewBox="0 0 24 24" stroke-width="${a}" stroke="${o}" fill="none" stroke-linecap="round" stroke-linejoin="round" style="pointer-events: none;"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" /><path d="M17 4a2 2 0 0 0 2 2a2 2 0 0 0 -2 2a2 2 0 0 0 -2 -2a2 2 0 0 0 2 -2" /><path d="M19 11h2m-1 -1v2" /></svg>`}function main(){const e=getThemeFromLS();if(e)applyTheme(e);else{window.matchMedia("(pr
Open service 104.21.49.204:80 · ttntm.me
2026-01-25 17:22
HTTP/1.1 301 Moved Permanently
Date: Sun, 25 Jan 2026 17:22:25 GMT
Content-Length: 0
Connection: close
Location: https://ttntm.me/
X-Content-Type-Options: nosniff
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=2dXG6skf9sZXFqgc9r6RGhxdMWGkjGprs0JgihFDFNn78aEwZo2N3%2BluH%2BNUu7YAsHF2D5DBJbPZ%2Bt442Pra3e9n2LmSCA%3D%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfEdge;dur=19,cfOrigin;dur=0
Server: cloudflare
CF-RAY: 9c3973e00c925fc6-SIN
Open service 2606:4700:3035::ac43:a719:8443 · ttntm.me
2026-01-25 17:22
HTTP/1.1 200 OK
Date: Sun, 25 Jan 2026 17:22:26 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: public, max-age=21600
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Link: <https://webmention.io/ttntm.me/webmention>; rel="webmention"
content-security-policy: default-src 'self' 'unsafe-inline'; img-src * data:; style-src 'self' 'unsafe-inline'; frame-ancestors 'none'
permissions-policy: document-domain=()
referrer-policy: no-referrer, strict-origin-when-cross-origin
x-content-type-options: nosniff
x-frame-options: DENY
x-robots-tag: noai, noimageai, SPC
x-xss-protection: 1; mode=block
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=GcuQxDHL%2B0sZpC8XHa1WvhO52L6R8V5CFJ10qE8CPuLQZBQyMFW%2FJAqQiA1QfeAErJV%2BpHgoAckwGb8QH%2FGUZbp3hHLOTDPHAhrT2hcH8%2Fms%2FCl6"}]}
Server: cloudflare
Strict-Transport-Security: max-age=0; includeSubDomains; preload
cf-cache-status: DYNAMIC
CF-RAY: 9c3973e0bff39736-FRA
alt-svc: h3=":8443"; ma=86400
Page title: Homepage - ttntm.me
<!doctype html><html lang="en"><head><link rel="preload" href="/css/page.css" as="style"><link rel="preload" href="/fonts/space-mono-v15-latin-regular.woff2" as="font" type="font/woff2" crossorigin=""><link rel="preload" href="/fonts/space-mono-v15-latin-700.woff2" as="font" type="font/woff2" crossorigin=""><link rel="preload" href="/fonts/titillium-web-v9-latin-regular.woff2" as="font" type="font/woff2" crossorigin=""><title>Homepage - ttntm.me</title><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="author" content="humans.txt"><meta name="description" content="Tom's homepage. A personal website, journal and playground."><meta name="fediverse:creator" content="@ttntm@hachyderm.io"><meta property="og:site_name" content="Tom's Homepage"><meta property="og:title" content="Homepage"><meta property="og:description" content="Tom's homepage. A personal website, journal and playground."><meta property="og:url" content="https://ttntm.me/"><meta property="og:image" content="https://ttntm.me/img/social.jpg"><link rel="manifest" href="/site.webmanifest"><meta name="theme-color" content="#fff"><link rel="icon" type="image/png" sizes="384x384" href="/img/favicon/android-chrome-512x512.png"><link rel="icon" type="image/png" sizes="192x192" href="/img/favicon/android-chrome-192x192.png"><link rel="icon" type="image/png" sizes="32x32" href="/img/favicon/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/img/favicon/favicon-16x16.png"><link rel="apple-touch-icon" sizes="180x180" href="/img/favicon/apple-180x180-solid.png"><link rel="mask-icon" href="/img/favicon/safari-pinned-tab.svg" color="#5bbad5"><meta name="masapplication-config" content="/browserconfig.xml"><link rel="stylesheet" href="/css/page.css"><link rel="canonical" href="https://ttntm.me/"><meta name="robots" content="index, follow, noai, noimageai"><meta name="google-site-verification" content="xnb1OPOcw77ws6qsMtbTNh6CVyT4H0hPq1JPimFDwyI"><link rel="blogroll" type="text/xml" href="/blogroll.opml"><link rel="webmention" href="https://webmention.io/ttntm.me/webmention"><link rel="pingback" href="https://webmention.io/ttntm.me/xmlrpc"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/blog/feed.xml" title="Blog Feed"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/likes/feed.xml" title="Likes Feed"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/notes/feed.xml" title="Notes Feed"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/everything.xml" title="Everything Feed"><script>function applyTheme(e=void 0,t=!1){e&&"string"==typeof e&&(document.documentElement.setAttribute("data-theme",e),t||localStorage.setItem("theme",e));const n=document.querySelector(".btn-theme-header"),o=document.querySelector(".btn-theme-footer");n&&(n.innerHTML=getIcon(e,"d-block",22,"currentColor",2)),o&&(o.innerHTML=getIcon(e,"icon",24,"#81a1c1",1.5))}function getThemeFromLS(){return localStorage.getItem("theme")}function getIcon(e,t,n,o,a){return"dark"===e?`<svg xmlns="http://www.w3.org/2000/svg" class="${t}" width="${n}" height="${n}" viewBox="0 0 24 24" stroke-width="${a}" stroke="${o}" fill="none" stroke-linecap="round" stroke-linejoin="round" style="pointer-events: none;"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 12m-4 0a4 4 0 1 0 8 0a4 4 0 1 0 -8 0" /><path d="M3 12h1m8 -9v1m8 8h1m-9 8v1m-6.4 -15.4l.7 .7m12.1 -.7l-.7 .7m0 11.4l.7 .7m-12.1 -.7l-.7 .7" /></svg>`:`<svg xmlns="http://www.w3.org/2000/svg" class="${t}" width="${n}" height="${n}" viewBox="0 0 24 24" stroke-width="${a}" stroke="${o}" fill="none" stroke-linecap="round" stroke-linejoin="round" style="pointer-events: none;"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" /><path d="M17 4a2 2 0 0 0 2 2a2 2 0 0 0 -2 2a2 2 0 0 0 -2 -2a2 2 0 0 0 2 -2" /><path d="M19 11h2m-1 -1v2" /></svg>`}function main(){const e=getThemeFromLS();if(e)applyTheme(e);else{window.matchMedia("(pr
Open service 172.67.167.25:80 · ttntm.me
2026-01-25 17:22
HTTP/1.1 301 Moved Permanently
Date: Sun, 25 Jan 2026 17:22:25 GMT
Content-Length: 0
Connection: close
Location: https://ttntm.me/
X-Content-Type-Options: nosniff
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=OnnwmhRYUXpr6o%2BnIKm8luz3Dw6yfMN6ua4vPmC8ObGa119CDs8jNCdPhMdEosrunxckq%2FHItjNi2Cb7S0e3GLaIOcD5KgAv"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9c3973dfbebb7dcc-LHR
Open service 2606:4700:3030::6815:31cc:8443 · ttntm.me
2026-01-25 17:22
HTTP/1.1 200 OK
Date: Sun, 25 Jan 2026 17:22:26 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: public, max-age=21600
Server-Timing: cfCacheStatus;desc="DYNAMIC"
Server-Timing: cfEdge;dur=10,cfOrigin;dur=20
Link: <https://webmention.io/ttntm.me/webmention>; rel="webmention"
content-security-policy: default-src 'self' 'unsafe-inline'; img-src * data:; style-src 'self' 'unsafe-inline'; frame-ancestors 'none'
permissions-policy: document-domain=()
referrer-policy: no-referrer, strict-origin-when-cross-origin
x-content-type-options: nosniff
x-frame-options: DENY
x-robots-tag: noai, noimageai, SPC
x-xss-protection: 1; mode=block
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=ALqgmFiN4fNS5RyIas43tBnEOrzd5yFZtWrLJ8%2FBnHwdLUIaosQCjHaY6qp4nsm16Ek48CMABtF%2BCHmByScxHm8xovM4BpOvetLM7is9JDIak9gP"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
Strict-Transport-Security: max-age=0; includeSubDomains; preload
cf-cache-status: DYNAMIC
CF-RAY: 9c3973e32a5245c8-SIN
alt-svc: h3=":8443"; ma=86400
Page title: Homepage - ttntm.me
<!doctype html><html lang="en"><head><link rel="preload" href="/css/page.css" as="style"><link rel="preload" href="/fonts/space-mono-v15-latin-regular.woff2" as="font" type="font/woff2" crossorigin=""><link rel="preload" href="/fonts/space-mono-v15-latin-700.woff2" as="font" type="font/woff2" crossorigin=""><link rel="preload" href="/fonts/titillium-web-v9-latin-regular.woff2" as="font" type="font/woff2" crossorigin=""><title>Homepage - ttntm.me</title><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="author" content="humans.txt"><meta name="description" content="Tom's homepage. A personal website, journal and playground."><meta name="fediverse:creator" content="@ttntm@hachyderm.io"><meta property="og:site_name" content="Tom's Homepage"><meta property="og:title" content="Homepage"><meta property="og:description" content="Tom's homepage. A personal website, journal and playground."><meta property="og:url" content="https://ttntm.me/"><meta property="og:image" content="https://ttntm.me/img/social.jpg"><link rel="manifest" href="/site.webmanifest"><meta name="theme-color" content="#fff"><link rel="icon" type="image/png" sizes="384x384" href="/img/favicon/android-chrome-512x512.png"><link rel="icon" type="image/png" sizes="192x192" href="/img/favicon/android-chrome-192x192.png"><link rel="icon" type="image/png" sizes="32x32" href="/img/favicon/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/img/favicon/favicon-16x16.png"><link rel="apple-touch-icon" sizes="180x180" href="/img/favicon/apple-180x180-solid.png"><link rel="mask-icon" href="/img/favicon/safari-pinned-tab.svg" color="#5bbad5"><meta name="masapplication-config" content="/browserconfig.xml"><link rel="stylesheet" href="/css/page.css"><link rel="canonical" href="https://ttntm.me/"><meta name="robots" content="index, follow, noai, noimageai"><meta name="google-site-verification" content="xnb1OPOcw77ws6qsMtbTNh6CVyT4H0hPq1JPimFDwyI"><link rel="blogroll" type="text/xml" href="/blogroll.opml"><link rel="webmention" href="https://webmention.io/ttntm.me/webmention"><link rel="pingback" href="https://webmention.io/ttntm.me/xmlrpc"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/blog/feed.xml" title="Blog Feed"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/likes/feed.xml" title="Likes Feed"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/notes/feed.xml" title="Notes Feed"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/everything.xml" title="Everything Feed"><script>function applyTheme(e=void 0,t=!1){e&&"string"==typeof e&&(document.documentElement.setAttribute("data-theme",e),t||localStorage.setItem("theme",e));const n=document.querySelector(".btn-theme-header"),o=document.querySelector(".btn-theme-footer");n&&(n.innerHTML=getIcon(e,"d-block",22,"currentColor",2)),o&&(o.innerHTML=getIcon(e,"icon",24,"#81a1c1",1.5))}function getThemeFromLS(){return localStorage.getItem("theme")}function getIcon(e,t,n,o,a){return"dark"===e?`<svg xmlns="http://www.w3.org/2000/svg" class="${t}" width="${n}" height="${n}" viewBox="0 0 24 24" stroke-width="${a}" stroke="${o}" fill="none" stroke-linecap="round" stroke-linejoin="round" style="pointer-events: none;"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 12m-4 0a4 4 0 1 0 8 0a4 4 0 1 0 -8 0" /><path d="M3 12h1m8 -9v1m8 8h1m-9 8v1m-6.4 -15.4l.7 .7m12.1 -.7l-.7 .7m0 11.4l.7 .7m-12.1 -.7l-.7 .7" /></svg>`:`<svg xmlns="http://www.w3.org/2000/svg" class="${t}" width="${n}" height="${n}" viewBox="0 0 24 24" stroke-width="${a}" stroke="${o}" fill="none" stroke-linecap="round" stroke-linejoin="round" style="pointer-events: none;"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" /><path d="M17 4a2 2 0 0 0 2 2a2 2 0 0 0 -2 2a2 2 0 0 0 -2 -2a2 2 0 0 0 2 -2" /><path d="M19 11h2m-1 -1v2" /></svg>`}function main(){const e=getThemeFromLS();if(e)applyTheme(e);else{window.matchMedia("(pr
Open service 2606:4700:3035::ac43:a719:80 · ttntm.me
2026-01-25 17:22
HTTP/1.1 301 Moved Permanently
Date: Sun, 25 Jan 2026 17:22:25 GMT
Content-Length: 0
Connection: close
Location: https://ttntm.me/
X-Content-Type-Options: nosniff
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=LiVdXAOpehBWDvJzM%2Bw7oXG07L1v2tTnpCsTBdb9cS%2BNlnKO32FXT1JrKN0B0Hi3LlaBdZWARfvcj%2FHmxl5ChVzuNb%2BA6EPGwe84gFePpAXoJdyb"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfEdge;dur=15,cfOrigin;dur=0
Server: cloudflare
CF-RAY: 9c3973dfeb3180c2-BOM
Open service 104.21.49.204:443 · ttntm.me
2026-01-25 17:22
HTTP/1.1 200 OK
Date: Sun, 25 Jan 2026 17:22:25 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Access-Control-Allow-Origin: *
cache-control: public, max-age=21600
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Link: <https://webmention.io/ttntm.me/webmention>; rel="webmention"
content-security-policy: default-src 'self' 'unsafe-inline'; img-src * data:; style-src 'self' 'unsafe-inline'; frame-ancestors 'none'
permissions-policy: document-domain=()
referrer-policy: no-referrer, strict-origin-when-cross-origin
x-content-type-options: nosniff
x-frame-options: DENY
x-robots-tag: noai, noimageai, SPC
x-xss-protection: 1; mode=block
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=LGh0rvgpN5mEzrSS4vkZEs4BIURlXUpCDdfBh0boPQTMFD5qXliniGUJvMl5LplJngzekkcznWaAFTQAar1x0TEnN0ike%2Feuaf6Fqf1Wtyf86kmb"}]}
cf-cache-status: HIT
Server-Timing: cfCacheStatus;desc="HIT"
Server-Timing: cfEdge;dur=8,cfOrigin;dur=0
Server: cloudflare
Strict-Transport-Security: max-age=0; includeSubDomains; preload
Age: 15431
CF-RAY: 9c3973dfaca5888e-SJC
alt-svc: h3=":443"; ma=86400
Page title: Homepage - ttntm.me
<!doctype html><html lang="en"><head><link rel="preload" href="/css/page.css" as="style"><link rel="preload" href="/fonts/space-mono-v15-latin-regular.woff2" as="font" type="font/woff2" crossorigin=""><link rel="preload" href="/fonts/space-mono-v15-latin-700.woff2" as="font" type="font/woff2" crossorigin=""><link rel="preload" href="/fonts/titillium-web-v9-latin-regular.woff2" as="font" type="font/woff2" crossorigin=""><title>Homepage - ttntm.me</title><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="author" content="humans.txt"><meta name="description" content="Tom's homepage. A personal website, journal and playground."><meta name="fediverse:creator" content="@ttntm@hachyderm.io"><meta property="og:site_name" content="Tom's Homepage"><meta property="og:title" content="Homepage"><meta property="og:description" content="Tom's homepage. A personal website, journal and playground."><meta property="og:url" content="https://ttntm.me/"><meta property="og:image" content="https://ttntm.me/img/social.jpg"><link rel="manifest" href="/site.webmanifest"><meta name="theme-color" content="#fff"><link rel="icon" type="image/png" sizes="384x384" href="/img/favicon/android-chrome-512x512.png"><link rel="icon" type="image/png" sizes="192x192" href="/img/favicon/android-chrome-192x192.png"><link rel="icon" type="image/png" sizes="32x32" href="/img/favicon/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/img/favicon/favicon-16x16.png"><link rel="apple-touch-icon" sizes="180x180" href="/img/favicon/apple-180x180-solid.png"><link rel="mask-icon" href="/img/favicon/safari-pinned-tab.svg" color="#5bbad5"><meta name="masapplication-config" content="/browserconfig.xml"><link rel="stylesheet" href="/css/page.css"><link rel="canonical" href="https://ttntm.me/"><meta name="robots" content="index, follow, noai, noimageai"><meta name="google-site-verification" content="xnb1OPOcw77ws6qsMtbTNh6CVyT4H0hPq1JPimFDwyI"><link rel="blogroll" type="text/xml" href="/blogroll.opml"><link rel="webmention" href="https://webmention.io/ttntm.me/webmention"><link rel="pingback" href="https://webmention.io/ttntm.me/xmlrpc"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/blog/feed.xml" title="Blog Feed"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/likes/feed.xml" title="Likes Feed"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/notes/feed.xml" title="Notes Feed"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/everything.xml" title="Everything Feed"><script>function applyTheme(e=void 0,t=!1){e&&"string"==typeof e&&(document.documentElement.setAttribute("data-theme",e),t||localStorage.setItem("theme",e));const n=document.querySelector(".btn-theme-header"),o=document.querySelector(".btn-theme-footer");n&&(n.innerHTML=getIcon(e,"d-block",22,"currentColor",2)),o&&(o.innerHTML=getIcon(e,"icon",24,"#81a1c1",1.5))}function getThemeFromLS(){return localStorage.getItem("theme")}function getIcon(e,t,n,o,a){return"dark"===e?`<svg xmlns="http://www.w3.org/2000/svg" class="${t}" width="${n}" height="${n}" viewBox="0 0 24 24" stroke-width="${a}" stroke="${o}" fill="none" stroke-linecap="round" stroke-linejoin="round" style="pointer-events: none;"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 12m-4 0a4 4 0 1 0 8 0a4 4 0 1 0 -8 0" /><path d="M3 12h1m8 -9v1m8 8h1m-9 8v1m-6.4 -15.4l.7 .7m12.1 -.7l-.7 .7m0 11.4l.7 .7m-12.1 -.7l-.7 .7" /></svg>`:`<svg xmlns="http://www.w3.org/2000/svg" class="${t}" width="${n}" height="${n}" viewBox="0 0 24 24" stroke-width="${a}" stroke="${o}" fill="none" stroke-linecap="round" stroke-linejoin="round" style="pointer-events: none;"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" /><path d="M17 4a2 2 0 0 0 2 2a2 2 0 0 0 -2 2a2 2 0 0 0 -2 -2a2 2 0 0 0 2 -2" /><path d="M19 11h2m-1 -1v2" /></svg>`}function main(){const e=getThemeFromLS();if(e)applyTheme(e);else{window.matchMedia("(pr
Open service 2606:4700:3030::6815:31cc:80 · ttntm.me
2026-01-25 17:22
HTTP/1.1 301 Moved Permanently
Date: Sun, 25 Jan 2026 17:22:25 GMT
Content-Length: 0
Connection: close
Location: https://ttntm.me/
X-Content-Type-Options: nosniff
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=L1qmEXpK3qn5ftt%2B7cFDjEDG61c2FwBtBgrfsR6uzXzGVr8ZPr2uoh%2FMOYXnXhF3yaP7hIrbL9ofGxynjXXHo7U77hlIHxSjb1pwaW1eCF1%2FweBC"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfEdge;dur=12,cfOrigin;dur=0
Server: cloudflare
CF-RAY: 9c3973dfa8acae68-SIN
Open service 172.67.167.25:8443 · ttntm.me
2026-01-25 17:22
HTTP/1.1 200 OK
Date: Sun, 25 Jan 2026 17:22:26 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Access-Control-Allow-Origin: *
Cache-Control: public, max-age=21600
Server-Timing: cfCacheStatus;desc="DYNAMIC"
Server-Timing: cfEdge;dur=9,cfOrigin;dur=24
Link: <https://webmention.io/ttntm.me/webmention>; rel="webmention"
content-security-policy: default-src 'self' 'unsafe-inline'; img-src * data:; style-src 'self' 'unsafe-inline'; frame-ancestors 'none'
permissions-policy: document-domain=()
referrer-policy: no-referrer, strict-origin-when-cross-origin
x-content-type-options: nosniff
x-frame-options: DENY
x-robots-tag: noai, noimageai, SPC
x-xss-protection: 1; mode=block
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=QsDwkn3CcLYYmCIdtcNfzY47V3ndEvqsBaUTxGLt1YQJEjgmyWTkSKcXfJb7AZVIpvYaGpttMyvoIAXGsLcVXZfQjJafaJxs"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
Strict-Transport-Security: max-age=0; includeSubDomains; preload
cf-cache-status: DYNAMIC
CF-RAY: 9c3973e23c4249f3-SIN
alt-svc: h3=":8443"; ma=86400
Page title: Homepage - ttntm.me
<!doctype html><html lang="en"><head><link rel="preload" href="/css/page.css" as="style"><link rel="preload" href="/fonts/space-mono-v15-latin-regular.woff2" as="font" type="font/woff2" crossorigin=""><link rel="preload" href="/fonts/space-mono-v15-latin-700.woff2" as="font" type="font/woff2" crossorigin=""><link rel="preload" href="/fonts/titillium-web-v9-latin-regular.woff2" as="font" type="font/woff2" crossorigin=""><title>Homepage - ttntm.me</title><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="author" content="humans.txt"><meta name="description" content="Tom's homepage. A personal website, journal and playground."><meta name="fediverse:creator" content="@ttntm@hachyderm.io"><meta property="og:site_name" content="Tom's Homepage"><meta property="og:title" content="Homepage"><meta property="og:description" content="Tom's homepage. A personal website, journal and playground."><meta property="og:url" content="https://ttntm.me/"><meta property="og:image" content="https://ttntm.me/img/social.jpg"><link rel="manifest" href="/site.webmanifest"><meta name="theme-color" content="#fff"><link rel="icon" type="image/png" sizes="384x384" href="/img/favicon/android-chrome-512x512.png"><link rel="icon" type="image/png" sizes="192x192" href="/img/favicon/android-chrome-192x192.png"><link rel="icon" type="image/png" sizes="32x32" href="/img/favicon/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/img/favicon/favicon-16x16.png"><link rel="apple-touch-icon" sizes="180x180" href="/img/favicon/apple-180x180-solid.png"><link rel="mask-icon" href="/img/favicon/safari-pinned-tab.svg" color="#5bbad5"><meta name="masapplication-config" content="/browserconfig.xml"><link rel="stylesheet" href="/css/page.css"><link rel="canonical" href="https://ttntm.me/"><meta name="robots" content="index, follow, noai, noimageai"><meta name="google-site-verification" content="xnb1OPOcw77ws6qsMtbTNh6CVyT4H0hPq1JPimFDwyI"><link rel="blogroll" type="text/xml" href="/blogroll.opml"><link rel="webmention" href="https://webmention.io/ttntm.me/webmention"><link rel="pingback" href="https://webmention.io/ttntm.me/xmlrpc"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/blog/feed.xml" title="Blog Feed"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/likes/feed.xml" title="Likes Feed"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/notes/feed.xml" title="Notes Feed"><link type="application/atom+xml" rel="alternate" href="https://ttntm.me/everything.xml" title="Everything Feed"><script>function applyTheme(e=void 0,t=!1){e&&"string"==typeof e&&(document.documentElement.setAttribute("data-theme",e),t||localStorage.setItem("theme",e));const n=document.querySelector(".btn-theme-header"),o=document.querySelector(".btn-theme-footer");n&&(n.innerHTML=getIcon(e,"d-block",22,"currentColor",2)),o&&(o.innerHTML=getIcon(e,"icon",24,"#81a1c1",1.5))}function getThemeFromLS(){return localStorage.getItem("theme")}function getIcon(e,t,n,o,a){return"dark"===e?`<svg xmlns="http://www.w3.org/2000/svg" class="${t}" width="${n}" height="${n}" viewBox="0 0 24 24" stroke-width="${a}" stroke="${o}" fill="none" stroke-linecap="round" stroke-linejoin="round" style="pointer-events: none;"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 12m-4 0a4 4 0 1 0 8 0a4 4 0 1 0 -8 0" /><path d="M3 12h1m8 -9v1m8 8h1m-9 8v1m-6.4 -15.4l.7 .7m12.1 -.7l-.7 .7m0 11.4l.7 .7m-12.1 -.7l-.7 .7" /></svg>`:`<svg xmlns="http://www.w3.org/2000/svg" class="${t}" width="${n}" height="${n}" viewBox="0 0 24 24" stroke-width="${a}" stroke="${o}" fill="none" stroke-linecap="round" stroke-linejoin="round" style="pointer-events: none;"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" /><path d="M17 4a2 2 0 0 0 2 2a2 2 0 0 0 -2 2a2 2 0 0 0 -2 -2a2 2 0 0 0 2 -2" /><path d="M19 11h2m-1 -1v2" /></svg>`}function main(){const e=getThemeFromLS();if(e)applyTheme(e);else{window.matchMedia("(pr
Open service 2a0a:4580:103f:c0de::2:80 · kb.ttntm.me
2026-01-10 08:22
HTTP/1.1 302 Found content-length: 0 location: https://kb.ttntm.me/ cache-control: no-cache connection: close
Open service 217.197.84.141:443 · kb.ttntm.me
2026-01-10 08:22
HTTP/1.1 200 OK
Allow: GET, HEAD, OPTIONS
Cache-Control: public, max-age=600
Content-Length: 21830
Content-Type: text/html; charset=utf-8
Etag: "fcfa5dcb86278d1964df81af25745169d6a4a2c0"
Last-Modified: Wed, 06 Aug 2025 09:49:45 GMT
Referrer-Policy: strict-origin-when-cross-origin
Server: pages-server
X-Pages-Cache: true
Date: Sat, 10 Jan 2026 08:22:29 GMT
Connection: close
Page title: Homepage - TKB
<!DOCTYPE HTML>
<html lang="en" class="light" dir="ltr">
<head>
<!-- Book generated using mdBook -->
<meta charset="UTF-8">
<title>Homepage - TKB</title>
<!-- Custom HTML head -->
<meta name="description" content="Tom's Knowledge Base, a personal wiki published and maintained by ttntm.">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="#ffffff">
<link rel="icon" href="favicon.svg">
<link rel="shortcut icon" href="favicon.png">
<link rel="stylesheet" href="css/variables.css">
<link rel="stylesheet" href="css/general.css">
<link rel="stylesheet" href="css/chrome.css">
<!-- Fonts -->
<link rel="stylesheet" href="FontAwesome/css/font-awesome.css">
<link rel="stylesheet" href="fonts/fonts.css">
<!-- Highlight.js Stylesheets -->
<link rel="stylesheet" href="highlight.css">
<link rel="stylesheet" href="tomorrow-night.css">
<link rel="stylesheet" href="ayu-highlight.css">
<!-- Custom theme stylesheets -->
<link rel="stylesheet" href="overrides.css">
</head>
<body class="sidebar-visible no-js">
<div id="body-container">
<!-- Provide site root to javascript -->
<script>
var path_to_root = "";
var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "light" : "light";
</script>
<!-- Work around some values being stored in localStorage wrapped in quotes -->
<script>
try {
var theme = localStorage.getItem('mdbook-theme');
var sidebar = localStorage.getItem('mdbook-sidebar');
if (theme.startsWith('"') && theme.endsWith('"')) {
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
}
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
}
} catch (e) { }
</script>
<!-- Set the theme before any content is loaded, prevents flash -->
<script>
var theme;
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; }
var html = document.querySelector('html');
html.classList.remove('light')
html.classList.add(theme);
var body = document.querySelector('body');
body.classList.remove('no-js')
body.classList.add('js');
</script>
<input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
<!-- Hide / unhide sidebar before it is displayed -->
<script>
var body = document.querySelector('body');
var sidebar = null;
var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
} else {
sidebar = 'hidden';
}
sidebar_toggle.checked = sidebar === 'visible';
body.classList.remove('sidebar-visible');
body.classList.add("sidebar-" + sidebar);
</script>
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
<div class="sidebar-scrollbox">
<ol class="chapter"><li class="chapter-item affix "><li class="part-title">Wiki</li><li class="chapter-item expanded "><a href="home.html" class="active">Homepage</a></li><li class="chapter-item "><a href="development/index.html">Development</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="development/architecture/index.html">Architecture</a><a class="toggle"><div>❱</div></
Open service 217.197.84.141:80 · kb.ttntm.me
2026-01-10 08:22
HTTP/1.1 302 Found content-length: 0 location: https://kb.ttntm.me/ cache-control: no-cache connection: close
Open service 2a0a:4580:103f:c0de::2:443 · kb.ttntm.me
2026-01-10 08:22
HTTP/1.1 200 OK
Allow: GET, HEAD, OPTIONS
Cache-Control: public, max-age=600
Content-Length: 21830
Content-Type: text/html; charset=utf-8
Etag: "fcfa5dcb86278d1964df81af25745169d6a4a2c0"
Last-Modified: Wed, 06 Aug 2025 09:49:45 GMT
Referrer-Policy: strict-origin-when-cross-origin
Server: pages-server
X-Pages-Cache: true
Date: Sat, 10 Jan 2026 08:22:29 GMT
Connection: close
Page title: Homepage - TKB
<!DOCTYPE HTML>
<html lang="en" class="light" dir="ltr">
<head>
<!-- Book generated using mdBook -->
<meta charset="UTF-8">
<title>Homepage - TKB</title>
<!-- Custom HTML head -->
<meta name="description" content="Tom's Knowledge Base, a personal wiki published and maintained by ttntm.">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="#ffffff">
<link rel="icon" href="favicon.svg">
<link rel="shortcut icon" href="favicon.png">
<link rel="stylesheet" href="css/variables.css">
<link rel="stylesheet" href="css/general.css">
<link rel="stylesheet" href="css/chrome.css">
<!-- Fonts -->
<link rel="stylesheet" href="FontAwesome/css/font-awesome.css">
<link rel="stylesheet" href="fonts/fonts.css">
<!-- Highlight.js Stylesheets -->
<link rel="stylesheet" href="highlight.css">
<link rel="stylesheet" href="tomorrow-night.css">
<link rel="stylesheet" href="ayu-highlight.css">
<!-- Custom theme stylesheets -->
<link rel="stylesheet" href="overrides.css">
</head>
<body class="sidebar-visible no-js">
<div id="body-container">
<!-- Provide site root to javascript -->
<script>
var path_to_root = "";
var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "light" : "light";
</script>
<!-- Work around some values being stored in localStorage wrapped in quotes -->
<script>
try {
var theme = localStorage.getItem('mdbook-theme');
var sidebar = localStorage.getItem('mdbook-sidebar');
if (theme.startsWith('"') && theme.endsWith('"')) {
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
}
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
}
} catch (e) { }
</script>
<!-- Set the theme before any content is loaded, prevents flash -->
<script>
var theme;
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; }
var html = document.querySelector('html');
html.classList.remove('light')
html.classList.add(theme);
var body = document.querySelector('body');
body.classList.remove('no-js')
body.classList.add('js');
</script>
<input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
<!-- Hide / unhide sidebar before it is displayed -->
<script>
var body = document.querySelector('body');
var sidebar = null;
var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
} else {
sidebar = 'hidden';
}
sidebar_toggle.checked = sidebar === 'visible';
body.classList.remove('sidebar-visible');
body.classList.add("sidebar-" + sidebar);
</script>
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
<div class="sidebar-scrollbox">
<ol class="chapter"><li class="chapter-item affix "><li class="part-title">Wiki</li><li class="chapter-item expanded "><a href="home.html" class="active">Homepage</a></li><li class="chapter-item "><a href="development/index.html">Development</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="development/architecture/index.html">Architecture</a><a class="toggle"><div>❱</div></