nginx 1.24.0
tcp/443 tcp/80
Open service 151.101.1.91:80 · www.drewbell.net
2026-01-08 13:11
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://www.drewbell.net/ Accept-Ranges: bytes Date: Thu, 08 Jan 2026 13:11:54 GMT X-Served-By: cache-yyz4541-YYZ X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1767877914.079747,VS0,VE1 Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 2a04:4e42:600::347:80 · www.drewbell.net
2026-01-08 13:11
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://www.drewbell.net/ Accept-Ranges: bytes Date: Thu, 08 Jan 2026 13:11:54 GMT X-Served-By: cache-rtm-ehrd2290048-RTM X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1767877914.057401,VS0,VE1 Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 151.101.65.91:443 · drewbell.net
2026-01-08 13:11
HTTP/1.1 200 OK
Connection: close
set-cookie: _fs_ch_st_FSBmUei20MqUiJb9=ASydf8BRjeqbmtiWeq6xcAlflv5zxu_d2AbSW1TWG9zXlz85vw9ORlX27-suiKxp1fczzlQn5IK0oG93dWgz_WTf208P1-v2dn37xFC2UqRk6t2VPkkLVhRZSk-rZ-_h68d8qqYYUwo8TfkgXjl180JmVAOcIsthzth_vEo33rB6_YWarAPoAp6OfQPf0CQMYghb8lY5BcMnNxfJhFU137W5KnxXDrWNnzNTrxP_MlExt3gu4glEWD1XPAOxy9CGlvG8apZ1-q_csSAzzbySLQPqdXKv9RnIiKj_uGusd-mDGlN3-ZVIiU5bKgbSF9uvZCnIAf07SbSIQum5IouH58ysZ5OhovPV-v359dCyU0hkPv8qgpVPzV8qZGznZ3LO-0eOltBUZiH3fm3FIMY=; Max-Age=10; HttpOnly; Path=/
content-type: text/html; charset=utf-8
cache-control: private, no-store
Accept-Ranges: bytes
Date: Thu, 08 Jan 2026 13:11:54 GMT
X-Served-By: cache-ams21066-AMS, cache-ams21079-AMS, cache-vie6345-VIE
X-Cache: MISS, MISS
X-Cache-Hits: 0, 0
Vary: Accept-Encoding
Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
transfer-encoding: chunked
Page title: Client Challenge
<!DOCTYPE html>
<html lang="en">
<head>
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; img-src 'self' data:; media-src 'self' data:; object-src 'none'; style-src 'self' 'sha256-o4vzfmmUENEg4chMjjRP9EuW9ucGnGIGVdbl8d0SHQQ='; script-src 'self' 'sha256-KXex2o39zxtnzVWK4H5rW07g2+BlwSPtn+aguzsWkNg=';"
/>
<link
href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/inter-var.woff2"
rel="preload"
as="font"
type="font/woff2"
crossorigin
/>
<link href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/styles.css" rel="stylesheet" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Client Challenge</title>
<style>
#loading-error {
font-size: 16px;
font-family: 'Inter', sans-serif;
margin-top: 10px;
margin-left: 10px;
display: none;
}
</style>
</head>
<body>
<noscript>
<div class="noscript-container">
<div class="noscript-content">
<img
src="/_fs-ch-1T1wmsGaOgGaSxcX/assets/errorIcon.svg"
alt=""
role="presentation"
class="error-icon"
/>
<span class="noscript-span"
>JavaScript is disabled in your browser.</span
>
<p>Please enable JavaScript to proceed.</p>
</div>
</div>
</noscript>
<div id="loading-error" role="alert" aria-live="polite">
A required part of this site couldn’t load. This may be due to a browser
extension, network issues, or browser settings. Please check your
connection, disable any ad blockers, or try using a different browser.
</div>
<script>
function loadScript(src) {
return new Promise((resolve, reject) => {
const script = document.createElement('script');
script.onload = resolve;
script.onerror = (event) => {
console.error('Script load error event:', event);
document.getElementById('loading-error').style.display = 'block';
loadingError.setAttribute('aria-hidden', 'false');
reject(
new Error(
`Failed to load script: ${src}, Please contact the service administrator.`
)
);
};
script.src = src;
document.body.appendChild(script);
});
}
loadScript('/_fs-ch-1T1wmsGaOgGaSxcX/errors.js')
.then(() => {
const script = document.createElement('script');
script.src = '/_fs-ch-1T1wmsGaOgGaSxcX/script.js?reload=true';
script.onerror = (event) => {
console.error('Script load error event:', event);
const errorMsg = new Error(
`Failed to load script: ${script.src}. Please contact the service administrator.`
);
console.error(errorMsg);
handleScriptError();
};
document.body.appendChild(script);
})
.catch((error) => {
console.error(error);
});
</script>
</body>
</html>
Open service 151.101.129.91:443 · drewbell.net
2026-01-08 13:11
HTTP/1.1 200 OK
Connection: close
set-cookie: _fs_ch_st_FSBmUei20MqUiJb9=ARFldaKgO4LU6fEPQ1AX_2LdCoIP4M4aq3ebL9xq_W96lCs3G8Wg8Xau0xR1FQ9V5Vp_1Ia5knk95m_Rp8m44ScksGiYw6uKsqCqv6CNSUEeUWkE5ynlmYjU5GDyfiNlFMnodXxs0qjTcmmcFJ9zQ-Z2we83_AW0B0D51W951vf80vDRCsv_jtmUHQpQf4QRKrM4WfTt0GMU7GSt6-A0zBVzeoaVluriTCOvIdTSmGZ5ljeVNKKL_sVCt3guNd_fWxZ5q509DLUjTsOHQyNNIKOG5jkzzHNrRbJDT_xM0M2ExXz9-e1tNUztZqTZxS0VMjEmFInDs6sutUvjVp-z4K9N775UQ7Uhxn5hdBtctyQPOPrhvKspgOgq_LChYJN61UljnRfbKGmQiowwLKI=; Max-Age=10; HttpOnly; Path=/
content-type: text/html; charset=utf-8
cache-control: private, no-store
Accept-Ranges: bytes
Date: Thu, 08 Jan 2026 13:11:54 GMT
X-Served-By: cache-ams2100123-AMS, cache-ams2100122-AMS, cache-vie6352-VIE
X-Cache: MISS, MISS
X-Cache-Hits: 0, 0
Vary: Accept-Encoding
Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
transfer-encoding: chunked
Page title: Client Challenge
<!DOCTYPE html>
<html lang="en">
<head>
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; img-src 'self' data:; media-src 'self' data:; object-src 'none'; style-src 'self' 'sha256-o4vzfmmUENEg4chMjjRP9EuW9ucGnGIGVdbl8d0SHQQ='; script-src 'self' 'sha256-KXex2o39zxtnzVWK4H5rW07g2+BlwSPtn+aguzsWkNg=';"
/>
<link
href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/inter-var.woff2"
rel="preload"
as="font"
type="font/woff2"
crossorigin
/>
<link href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/styles.css" rel="stylesheet" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Client Challenge</title>
<style>
#loading-error {
font-size: 16px;
font-family: 'Inter', sans-serif;
margin-top: 10px;
margin-left: 10px;
display: none;
}
</style>
</head>
<body>
<noscript>
<div class="noscript-container">
<div class="noscript-content">
<img
src="/_fs-ch-1T1wmsGaOgGaSxcX/assets/errorIcon.svg"
alt=""
role="presentation"
class="error-icon"
/>
<span class="noscript-span"
>JavaScript is disabled in your browser.</span
>
<p>Please enable JavaScript to proceed.</p>
</div>
</div>
</noscript>
<div id="loading-error" role="alert" aria-live="polite">
A required part of this site couldn’t load. This may be due to a browser
extension, network issues, or browser settings. Please check your
connection, disable any ad blockers, or try using a different browser.
</div>
<script>
function loadScript(src) {
return new Promise((resolve, reject) => {
const script = document.createElement('script');
script.onload = resolve;
script.onerror = (event) => {
console.error('Script load error event:', event);
document.getElementById('loading-error').style.display = 'block';
loadingError.setAttribute('aria-hidden', 'false');
reject(
new Error(
`Failed to load script: ${src}, Please contact the service administrator.`
)
);
};
script.src = src;
document.body.appendChild(script);
});
}
loadScript('/_fs-ch-1T1wmsGaOgGaSxcX/errors.js')
.then(() => {
const script = document.createElement('script');
script.src = '/_fs-ch-1T1wmsGaOgGaSxcX/script.js?reload=true';
script.onerror = (event) => {
console.error('Script load error event:', event);
const errorMsg = new Error(
`Failed to load script: ${script.src}. Please contact the service administrator.`
);
console.error(errorMsg);
handleScriptError();
};
document.body.appendChild(script);
})
.catch((error) => {
console.error(error);
});
</script>
</body>
</html>
Open service 151.101.1.91:443 · www.drewbell.net
2026-01-08 13:11
HTTP/1.1 200 OK
Connection: close
set-cookie: _fs_ch_st_FSBmUei20MqUiJb9=AR1uxevg-GzMs5K-rkPg7lYzCeDwUeuOdaF18LqDe81b9s3h2ankACoUsE7HCwRfPn0oWcoexOAGZIQN7kY4tS-p3IPY5scJQSAZpRENQwNugMjcUmeWmaXd5yyim3zROKNwvh7ms-kR7kH183z_OuY6J_yVF9mFycxlbwr8cB5gjbRFiLRYa8bdEKyLhMEyry99NZHyGN36VDRZUUaE0GWr3QjhcHc1GdbjAtKFINuhCiTrm5ZQKyoPBEpLYb4A95IswUgh_ywt8P2UHfRjzJF4JxQaX-nsAE6q4o7m51QX-Nv2yxrZ_t114cLdrP6JJnm_rNRNE4vYcDU5qx5JT5kyHrXL5nmew4Ek6EcxVmV-nHmOyslstcaCxHrv0SGZdVB8ppA8QYbz4PUz1SU=; Max-Age=10; HttpOnly; Path=/
content-type: text/html; charset=utf-8
cache-control: private, no-store
Accept-Ranges: bytes
Date: Thu, 08 Jan 2026 13:11:55 GMT
X-Served-By: cache-ams2100118-AMS, cache-ams21034-AMS, cache-sjc10063-SJC
X-Cache: MISS, MISS
X-Cache-Hits: 0, 0
Vary: Accept-Encoding
Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
transfer-encoding: chunked
Page title: Client Challenge
<!DOCTYPE html>
<html lang="en">
<head>
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; img-src 'self' data:; media-src 'self' data:; object-src 'none'; style-src 'self' 'sha256-o4vzfmmUENEg4chMjjRP9EuW9ucGnGIGVdbl8d0SHQQ='; script-src 'self' 'sha256-KXex2o39zxtnzVWK4H5rW07g2+BlwSPtn+aguzsWkNg=';"
/>
<link
href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/inter-var.woff2"
rel="preload"
as="font"
type="font/woff2"
crossorigin
/>
<link href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/styles.css" rel="stylesheet" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Client Challenge</title>
<style>
#loading-error {
font-size: 16px;
font-family: 'Inter', sans-serif;
margin-top: 10px;
margin-left: 10px;
display: none;
}
</style>
</head>
<body>
<noscript>
<div class="noscript-container">
<div class="noscript-content">
<img
src="/_fs-ch-1T1wmsGaOgGaSxcX/assets/errorIcon.svg"
alt=""
role="presentation"
class="error-icon"
/>
<span class="noscript-span"
>JavaScript is disabled in your browser.</span
>
<p>Please enable JavaScript to proceed.</p>
</div>
</div>
</noscript>
<div id="loading-error" role="alert" aria-live="polite">
A required part of this site couldn’t load. This may be due to a browser
extension, network issues, or browser settings. Please check your
connection, disable any ad blockers, or try using a different browser.
</div>
<script>
function loadScript(src) {
return new Promise((resolve, reject) => {
const script = document.createElement('script');
script.onload = resolve;
script.onerror = (event) => {
console.error('Script load error event:', event);
document.getElementById('loading-error').style.display = 'block';
loadingError.setAttribute('aria-hidden', 'false');
reject(
new Error(
`Failed to load script: ${src}, Please contact the service administrator.`
)
);
};
script.src = src;
document.body.appendChild(script);
});
}
loadScript('/_fs-ch-1T1wmsGaOgGaSxcX/errors.js')
.then(() => {
const script = document.createElement('script');
script.src = '/_fs-ch-1T1wmsGaOgGaSxcX/script.js?reload=true';
script.onerror = (event) => {
console.error('Script load error event:', event);
const errorMsg = new Error(
`Failed to load script: ${script.src}. Please contact the service administrator.`
);
console.error(errorMsg);
handleScriptError();
};
document.body.appendChild(script);
})
.catch((error) => {
console.error(error);
});
</script>
</body>
</html>
Open service 2a04:4e42::347:80 · www.drewbell.net
2026-01-08 13:11
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://www.drewbell.net/ Accept-Ranges: bytes Date: Thu, 08 Jan 2026 13:11:54 GMT X-Served-By: cache-pao-kpao1770072-PAO X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1767877914.089186,VS0,VE21 Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 151.101.65.91:443 · www.drewbell.net
2026-01-08 13:11
HTTP/1.1 200 OK
Connection: close
set-cookie: _fs_ch_st_FSBmUei20MqUiJb9=AaknupRkwWwFc_wAk3hWIZdCq04JqGHqEfFA4wqehsHfGhPedOHEojhFjesniLNQMnf8A7U3hgshmLpG7ZYYRCNMHdD2roCwUyUWqWgh275UxAvjXINxK1gLOGklyjhTY9kOpUGS3KzLv0hpY-rvvUVLvuHGzFMYVXiF8_AmrMrqb75UWXahvVEmCDZU4r9NDmJIUu-kEePKpHyCnnGMtrxvPjH7Dw25aiL1rAqDgvxbQlyxBfXKlxiifEo5PGth5Iwu6J-_xs5AOM0THZkmtqPrqzvGTMi0Nysgkzjd5MK55XkZAER5bb3wDhVvic7i4Up3A0Y034gT6eSLxWkIGXIYAdy9yWJF6TjLxwAWEiGE8Ptt1c865AV3gyXCEM9MQBIvSwI-HmvS4Ri3N8Q=; Max-Age=10; HttpOnly; Path=/
content-type: text/html; charset=utf-8
cache-control: private, no-store
Accept-Ranges: bytes
Date: Thu, 08 Jan 2026 13:11:54 GMT
X-Served-By: cache-ams2100118-AMS, cache-ams2100143-AMS, cache-lga21981-LGA
X-Cache: MISS, MISS
X-Cache-Hits: 0, 0
Vary: Accept-Encoding
Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
transfer-encoding: chunked
Page title: Client Challenge
<!DOCTYPE html>
<html lang="en">
<head>
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; img-src 'self' data:; media-src 'self' data:; object-src 'none'; style-src 'self' 'sha256-o4vzfmmUENEg4chMjjRP9EuW9ucGnGIGVdbl8d0SHQQ='; script-src 'self' 'sha256-KXex2o39zxtnzVWK4H5rW07g2+BlwSPtn+aguzsWkNg=';"
/>
<link
href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/inter-var.woff2"
rel="preload"
as="font"
type="font/woff2"
crossorigin
/>
<link href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/styles.css" rel="stylesheet" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Client Challenge</title>
<style>
#loading-error {
font-size: 16px;
font-family: 'Inter', sans-serif;
margin-top: 10px;
margin-left: 10px;
display: none;
}
</style>
</head>
<body>
<noscript>
<div class="noscript-container">
<div class="noscript-content">
<img
src="/_fs-ch-1T1wmsGaOgGaSxcX/assets/errorIcon.svg"
alt=""
role="presentation"
class="error-icon"
/>
<span class="noscript-span"
>JavaScript is disabled in your browser.</span
>
<p>Please enable JavaScript to proceed.</p>
</div>
</div>
</noscript>
<div id="loading-error" role="alert" aria-live="polite">
A required part of this site couldn’t load. This may be due to a browser
extension, network issues, or browser settings. Please check your
connection, disable any ad blockers, or try using a different browser.
</div>
<script>
function loadScript(src) {
return new Promise((resolve, reject) => {
const script = document.createElement('script');
script.onload = resolve;
script.onerror = (event) => {
console.error('Script load error event:', event);
document.getElementById('loading-error').style.display = 'block';
loadingError.setAttribute('aria-hidden', 'false');
reject(
new Error(
`Failed to load script: ${src}, Please contact the service administrator.`
)
);
};
script.src = src;
document.body.appendChild(script);
});
}
loadScript('/_fs-ch-1T1wmsGaOgGaSxcX/errors.js')
.then(() => {
const script = document.createElement('script');
script.src = '/_fs-ch-1T1wmsGaOgGaSxcX/script.js?reload=true';
script.onerror = (event) => {
console.error('Script load error event:', event);
const errorMsg = new Error(
`Failed to load script: ${script.src}. Please contact the service administrator.`
);
console.error(errorMsg);
handleScriptError();
};
document.body.appendChild(script);
})
.catch((error) => {
console.error(error);
});
</script>
</body>
</html>
Open service 151.101.129.91:443 · www.drewbell.net
2026-01-08 13:11
HTTP/1.1 200 OK
Connection: close
set-cookie: _fs_ch_st_FSBmUei20MqUiJb9=AfFFGZ70h5dy1rGkZ_5Ks-qVkfKUxAdo6oRsvEuB8MByxksWk-z7nFvX4OQgCT2GJdvrc9n4EpQ53sistsxMPa6Jet-c5QZ2voP3TytVvzcd2fFUtb0hVK4WSOZHzmTvNfBCBVwM-1QyC1zI7IWScPvzSWW1p20o7O9HKLXv5J4hOIz2rQJHbq-CEj1nyddXZGO5r8sfxhXaUt7wwrJjspzXyOElmGd0JekRjy9WcDURifWXaSYaiPwgnbu9IewNKUh2Q9Xn-6EvNAgwvOHOCxxPDT9c6QsdNPZKC3wVtAxdWJOvUh0bYRpL3esIONCuW-21w1GPeEc_RhwUVRXPWfpGYEO-jLN5jC4ROYcTVb3_PW0oS7-94IcCFMoNoWauvV_XnDH32W7TA0gmEBo=; Max-Age=10; HttpOnly; Path=/
content-type: text/html; charset=utf-8
cache-control: private, no-store
Accept-Ranges: bytes
Date: Thu, 08 Jan 2026 13:11:54 GMT
X-Served-By: cache-ams2100118-AMS, cache-ams21043-AMS, cache-sjc1000120-SJC
X-Cache: MISS, MISS
X-Cache-Hits: 0, 0
Vary: Accept-Encoding
Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
transfer-encoding: chunked
Page title: Client Challenge
<!DOCTYPE html>
<html lang="en">
<head>
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; img-src 'self' data:; media-src 'self' data:; object-src 'none'; style-src 'self' 'sha256-o4vzfmmUENEg4chMjjRP9EuW9ucGnGIGVdbl8d0SHQQ='; script-src 'self' 'sha256-KXex2o39zxtnzVWK4H5rW07g2+BlwSPtn+aguzsWkNg=';"
/>
<link
href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/inter-var.woff2"
rel="preload"
as="font"
type="font/woff2"
crossorigin
/>
<link href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/styles.css" rel="stylesheet" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Client Challenge</title>
<style>
#loading-error {
font-size: 16px;
font-family: 'Inter', sans-serif;
margin-top: 10px;
margin-left: 10px;
display: none;
}
</style>
</head>
<body>
<noscript>
<div class="noscript-container">
<div class="noscript-content">
<img
src="/_fs-ch-1T1wmsGaOgGaSxcX/assets/errorIcon.svg"
alt=""
role="presentation"
class="error-icon"
/>
<span class="noscript-span"
>JavaScript is disabled in your browser.</span
>
<p>Please enable JavaScript to proceed.</p>
</div>
</div>
</noscript>
<div id="loading-error" role="alert" aria-live="polite">
A required part of this site couldn’t load. This may be due to a browser
extension, network issues, or browser settings. Please check your
connection, disable any ad blockers, or try using a different browser.
</div>
<script>
function loadScript(src) {
return new Promise((resolve, reject) => {
const script = document.createElement('script');
script.onload = resolve;
script.onerror = (event) => {
console.error('Script load error event:', event);
document.getElementById('loading-error').style.display = 'block';
loadingError.setAttribute('aria-hidden', 'false');
reject(
new Error(
`Failed to load script: ${src}, Please contact the service administrator.`
)
);
};
script.src = src;
document.body.appendChild(script);
});
}
loadScript('/_fs-ch-1T1wmsGaOgGaSxcX/errors.js')
.then(() => {
const script = document.createElement('script');
script.src = '/_fs-ch-1T1wmsGaOgGaSxcX/script.js?reload=true';
script.onerror = (event) => {
console.error('Script load error event:', event);
const errorMsg = new Error(
`Failed to load script: ${script.src}. Please contact the service administrator.`
);
console.error(errorMsg);
handleScriptError();
};
document.body.appendChild(script);
})
.catch((error) => {
console.error(error);
});
</script>
</body>
</html>
Open service 151.101.193.91:80 · www.drewbell.net
2026-01-08 13:11
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://www.drewbell.net/ Accept-Ranges: bytes Date: Thu, 08 Jan 2026 13:11:53 GMT X-Served-By: cache-sin-wsat1880078-SIN X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1767877914.999045,VS0,VE1 Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 151.101.193.91:443 · www.drewbell.net
2026-01-08 13:11
HTTP/1.1 200 OK
Connection: close
set-cookie: _fs_ch_st_FSBmUei20MqUiJb9=AYnJhLCPJUTUPD0mxdiKgywWEaEiGGi7wDsTJO-dkMrcOf-9mcaO7e_44jQVNoYaP54Ke66M6CH6URgjQIt8M5H8ArUatDJ6DbdHXvgYauFOT-yVmZ339l1ls-4kkpb96c02OKqr7RsdbBWzbpKmMd0rztjQoAhgOLgmN8PlwuMj1s1IPwEGosjQYNF12_JQqpzjIbRGyW1GwYEirbkKr_a9bFhDIT-5_BaRTeUG5ioMuQRhu3T5Z8hpkCSbEc9pGOfk2HU5dGwrcjYqs0gClbGXayz4q6OVd2QnMVMr0gvqRjIXJ1sM7WMDa4vt1ORZQNH9u0ASH4LrMcxFMsaWj8JdXhWIgeltqqDOKhEqBcX8M4hT4CT-W2XK1Yenmel_vhxSL1sdQU4v1xDZQQ==; Max-Age=10; HttpOnly; Path=/
content-type: text/html; charset=utf-8
cache-control: private, no-store
Accept-Ranges: bytes
Date: Thu, 08 Jan 2026 13:11:54 GMT
X-Served-By: cache-ams2100118-AMS, cache-ams21033-AMS, cache-fra-eddf8230081-FRA
X-Cache: MISS, MISS
X-Cache-Hits: 0, 0
Vary: Accept-Encoding
Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
transfer-encoding: chunked
Page title: Client Challenge
<!DOCTYPE html>
<html lang="en">
<head>
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; img-src 'self' data:; media-src 'self' data:; object-src 'none'; style-src 'self' 'sha256-o4vzfmmUENEg4chMjjRP9EuW9ucGnGIGVdbl8d0SHQQ='; script-src 'self' 'sha256-KXex2o39zxtnzVWK4H5rW07g2+BlwSPtn+aguzsWkNg=';"
/>
<link
href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/inter-var.woff2"
rel="preload"
as="font"
type="font/woff2"
crossorigin
/>
<link href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/styles.css" rel="stylesheet" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Client Challenge</title>
<style>
#loading-error {
font-size: 16px;
font-family: 'Inter', sans-serif;
margin-top: 10px;
margin-left: 10px;
display: none;
}
</style>
</head>
<body>
<noscript>
<div class="noscript-container">
<div class="noscript-content">
<img
src="/_fs-ch-1T1wmsGaOgGaSxcX/assets/errorIcon.svg"
alt=""
role="presentation"
class="error-icon"
/>
<span class="noscript-span"
>JavaScript is disabled in your browser.</span
>
<p>Please enable JavaScript to proceed.</p>
</div>
</div>
</noscript>
<div id="loading-error" role="alert" aria-live="polite">
A required part of this site couldn’t load. This may be due to a browser
extension, network issues, or browser settings. Please check your
connection, disable any ad blockers, or try using a different browser.
</div>
<script>
function loadScript(src) {
return new Promise((resolve, reject) => {
const script = document.createElement('script');
script.onload = resolve;
script.onerror = (event) => {
console.error('Script load error event:', event);
document.getElementById('loading-error').style.display = 'block';
loadingError.setAttribute('aria-hidden', 'false');
reject(
new Error(
`Failed to load script: ${src}, Please contact the service administrator.`
)
);
};
script.src = src;
document.body.appendChild(script);
});
}
loadScript('/_fs-ch-1T1wmsGaOgGaSxcX/errors.js')
.then(() => {
const script = document.createElement('script');
script.src = '/_fs-ch-1T1wmsGaOgGaSxcX/script.js?reload=true';
script.onerror = (event) => {
console.error('Script load error event:', event);
const errorMsg = new Error(
`Failed to load script: ${script.src}. Please contact the service administrator.`
);
console.error(errorMsg);
handleScriptError();
};
document.body.appendChild(script);
})
.catch((error) => {
console.error(error);
});
</script>
</body>
</html>
Open service 151.101.129.91:80 · www.drewbell.net
2026-01-08 13:11
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://www.drewbell.net/ Accept-Ranges: bytes Date: Thu, 08 Jan 2026 13:11:53 GMT X-Served-By: cache-vie6365-VIE X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1767877914.989975,VS0,VE1 Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 2a04:4e42:400::347:443 · www.drewbell.net
2026-01-08 13:11
HTTP/1.1 200 OK
Connection: close
Content-Length: 22092
content-type: text/html; charset=utf-8
cache-control: public, max-age=0
etag: W/"564c-RDjYTFVDLez6YGiTAH9p5VkXzGI"
reporting-endpoints: ep="https://csp-reports.security.fastly-edge.com/r?id=WEYn4bsKSQWL8cteUxIeAt&inv=1"
Accept-Ranges: bytes
Date: Thu, 08 Jan 2026 13:11:54 GMT
Age: 2
X-Served-By: cache-ams2100118-AMS, cache-ams2100118-AMS, cache-sin-wsat1880043-SIN
X-Cache: MISS, MISS, HIT
X-Cache-Hits: 0, 0, 1
Vary: Accept-Encoding
Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Page title: Drew Bell
<!DOCTYPE html>
<html lang="en" class="is-color-default">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Drew Bell</title>
<link rel="preload" as="style" href="/assets/built/screen.css?v=4718f07bb9">
<link rel="preload" as="script" href="/assets/built/main.min.js?v=4718f07bb9">
<link rel="stylesheet" type="text/css" href="/assets/built/screen.css?v=4718f07bb9">
<script>
// Function to set the theme
function setTheme(theme) {
document.documentElement.setAttribute('data-theme', theme);
localStorage.setItem('theme', theme);
updateThemeToggleIcon(theme);
}
// Function to get the user's color scheme preference
function getColorScheme() {
return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}
// Function to update theme toggle icon
function updateThemeToggleIcon(theme) {
const toggle = document.querySelector('.gh-theme-toggle');
if (toggle) {
toggle.setAttribute('data-theme', theme);
}
}
// Function to toggle theme
function toggleTheme() {
const currentTheme = document.documentElement.getAttribute('data-theme');
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
setTheme(newTheme);
}
// Get the theme setting from Ghost
var themeSetting = 'system';
var savedTheme = localStorage.getItem('theme');
// Initialize theme based on settings
if (themeSetting === 'user') {
// Use saved preference if available, otherwise system preference
if (savedTheme) {
setTheme(savedTheme);
} else {
setTheme(getColorScheme());
}
} else if (themeSetting === 'light') {
setTheme('light');
} else if (themeSetting === 'dark') {
setTheme('dark');
} else if (themeSetting === 'system') {
setTheme(getColorScheme());
}
// Add click handler to theme toggles
document.addEventListener('DOMContentLoaded', function() {
const themeToggles = document.querySelectorAll('.gh-theme-toggle');
themeToggles.forEach(toggle => {
toggle.addEventListener('click', function() {
if (themeSetting === 'user') {
toggleTheme();
}
});
});
});
// Listen for changes in system color scheme
if (themeSetting === 'system') {
window.matchMedia('(prefers-color-scheme: dark)').addListener((e) => {
setTheme(e.matches ? 'dark' : 'light');
});
}
</script>
<meta name="description" content="Thoughts, stories and ideas.">
<link rel="canonical" href="https://www.drewbell.net/">
<meta name="referrer" content="no-referrer-when-downgrade">
<meta property="og:site_name" content="Drew Bell">
<meta property="og:type" content="website">
<meta property="og:title" content="Drew Bell">
<meta property="og:description" content="Thoughts, stories and ideas.">
<meta property="og:url" content="https://www.drewbell.net/">
<meta property="og:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Drew Bell">
<meta name="twitter:description" content="Thoughts, stories and ideas.">
<meta name="twitter:url" content="https://www.drewbell.net/">
<meta name="twitter:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="840">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"publi
Open service 2a04:4e42:200::347:443 · www.drewbell.net
2026-01-08 13:11
HTTP/1.1 200 OK
Connection: close
Content-Length: 22092
content-type: text/html; charset=utf-8
cache-control: public, max-age=0
etag: W/"564c-RDjYTFVDLez6YGiTAH9p5VkXzGI"
Accept-Ranges: bytes
Date: Thu, 08 Jan 2026 13:11:54 GMT
Age: 2
X-Served-By: cache-ams2100118-AMS, cache-ams2100118-AMS, cache-lcy-egml8630050-LCY
X-Cache: MISS, MISS, HIT
X-Cache-Hits: 0, 0, 1
Vary: Accept-Encoding
Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Page title: Drew Bell
<!DOCTYPE html>
<html lang="en" class="is-color-default">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Drew Bell</title>
<link rel="preload" as="style" href="/assets/built/screen.css?v=4718f07bb9">
<link rel="preload" as="script" href="/assets/built/main.min.js?v=4718f07bb9">
<link rel="stylesheet" type="text/css" href="/assets/built/screen.css?v=4718f07bb9">
<script>
// Function to set the theme
function setTheme(theme) {
document.documentElement.setAttribute('data-theme', theme);
localStorage.setItem('theme', theme);
updateThemeToggleIcon(theme);
}
// Function to get the user's color scheme preference
function getColorScheme() {
return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}
// Function to update theme toggle icon
function updateThemeToggleIcon(theme) {
const toggle = document.querySelector('.gh-theme-toggle');
if (toggle) {
toggle.setAttribute('data-theme', theme);
}
}
// Function to toggle theme
function toggleTheme() {
const currentTheme = document.documentElement.getAttribute('data-theme');
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
setTheme(newTheme);
}
// Get the theme setting from Ghost
var themeSetting = 'system';
var savedTheme = localStorage.getItem('theme');
// Initialize theme based on settings
if (themeSetting === 'user') {
// Use saved preference if available, otherwise system preference
if (savedTheme) {
setTheme(savedTheme);
} else {
setTheme(getColorScheme());
}
} else if (themeSetting === 'light') {
setTheme('light');
} else if (themeSetting === 'dark') {
setTheme('dark');
} else if (themeSetting === 'system') {
setTheme(getColorScheme());
}
// Add click handler to theme toggles
document.addEventListener('DOMContentLoaded', function() {
const themeToggles = document.querySelectorAll('.gh-theme-toggle');
themeToggles.forEach(toggle => {
toggle.addEventListener('click', function() {
if (themeSetting === 'user') {
toggleTheme();
}
});
});
});
// Listen for changes in system color scheme
if (themeSetting === 'system') {
window.matchMedia('(prefers-color-scheme: dark)').addListener((e) => {
setTheme(e.matches ? 'dark' : 'light');
});
}
</script>
<meta name="description" content="Thoughts, stories and ideas.">
<link rel="canonical" href="https://www.drewbell.net/">
<meta name="referrer" content="no-referrer-when-downgrade">
<meta property="og:site_name" content="Drew Bell">
<meta property="og:type" content="website">
<meta property="og:title" content="Drew Bell">
<meta property="og:description" content="Thoughts, stories and ideas.">
<meta property="og:url" content="https://www.drewbell.net/">
<meta property="og:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Drew Bell">
<meta name="twitter:description" content="Thoughts, stories and ideas.">
<meta name="twitter:url" content="https://www.drewbell.net/">
<meta name="twitter:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="840">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"publi
Open service 2a04:4e42:400::347:80 · www.drewbell.net
2026-01-08 13:11
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://www.drewbell.net/ Accept-Ranges: bytes Date: Thu, 08 Jan 2026 13:11:54 GMT X-Served-By: cache-vie6370-VIE X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1767877914.993740,VS0,VE75 Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 2a04:4e42:600::347:443 · drewbell.net
2026-01-08 13:11
HTTP/1.1 200 OK
Connection: close
Content-Length: 22092
etag: W/"564c-RDjYTFVDLez6YGiTAH9p5VkXzGI"
content-type: text/html; charset=utf-8
cache-control: public, max-age=0
Accept-Ranges: bytes
Date: Thu, 08 Jan 2026 13:11:54 GMT
X-Served-By: cache-ams2100103-AMS, cache-ams21072-AMS, cache-lga21930-LGA
X-Cache: MISS, MISS, MISS
X-Cache-Hits: 0, 0, 0
Vary: Accept-Encoding
Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Page title: Drew Bell
<!DOCTYPE html>
<html lang="en" class="is-color-default">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Drew Bell</title>
<link rel="preload" as="style" href="/assets/built/screen.css?v=4718f07bb9">
<link rel="preload" as="script" href="/assets/built/main.min.js?v=4718f07bb9">
<link rel="stylesheet" type="text/css" href="/assets/built/screen.css?v=4718f07bb9">
<script>
// Function to set the theme
function setTheme(theme) {
document.documentElement.setAttribute('data-theme', theme);
localStorage.setItem('theme', theme);
updateThemeToggleIcon(theme);
}
// Function to get the user's color scheme preference
function getColorScheme() {
return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}
// Function to update theme toggle icon
function updateThemeToggleIcon(theme) {
const toggle = document.querySelector('.gh-theme-toggle');
if (toggle) {
toggle.setAttribute('data-theme', theme);
}
}
// Function to toggle theme
function toggleTheme() {
const currentTheme = document.documentElement.getAttribute('data-theme');
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
setTheme(newTheme);
}
// Get the theme setting from Ghost
var themeSetting = 'system';
var savedTheme = localStorage.getItem('theme');
// Initialize theme based on settings
if (themeSetting === 'user') {
// Use saved preference if available, otherwise system preference
if (savedTheme) {
setTheme(savedTheme);
} else {
setTheme(getColorScheme());
}
} else if (themeSetting === 'light') {
setTheme('light');
} else if (themeSetting === 'dark') {
setTheme('dark');
} else if (themeSetting === 'system') {
setTheme(getColorScheme());
}
// Add click handler to theme toggles
document.addEventListener('DOMContentLoaded', function() {
const themeToggles = document.querySelectorAll('.gh-theme-toggle');
themeToggles.forEach(toggle => {
toggle.addEventListener('click', function() {
if (themeSetting === 'user') {
toggleTheme();
}
});
});
});
// Listen for changes in system color scheme
if (themeSetting === 'system') {
window.matchMedia('(prefers-color-scheme: dark)').addListener((e) => {
setTheme(e.matches ? 'dark' : 'light');
});
}
</script>
<meta name="description" content="Thoughts, stories and ideas.">
<link rel="canonical" href="https://www.drewbell.net/">
<meta name="referrer" content="no-referrer-when-downgrade">
<meta property="og:site_name" content="Drew Bell">
<meta property="og:type" content="website">
<meta property="og:title" content="Drew Bell">
<meta property="og:description" content="Thoughts, stories and ideas.">
<meta property="og:url" content="https://www.drewbell.net/">
<meta property="og:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Drew Bell">
<meta name="twitter:description" content="Thoughts, stories and ideas.">
<meta name="twitter:url" content="https://www.drewbell.net/">
<meta name="twitter:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="840">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"publi
Open service 151.101.1.91:80 · drewbell.net
2026-01-08 13:11
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://drewbell.net/ Accept-Ranges: bytes Date: Thu, 08 Jan 2026 13:11:53 GMT X-Served-By: cache-rtm-ehrd2290035-RTM X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1767877914.921807,VS0,VE0 Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 151.101.65.91:80 · www.drewbell.net
2026-01-08 13:11
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://www.drewbell.net/ Accept-Ranges: bytes Date: Thu, 08 Jan 2026 13:11:54 GMT X-Served-By: cache-fra-eddf8230190-FRA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1767877914.065647,VS0,VE1 Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 2a04:4e42:200::347:443 · drewbell.net
2026-01-08 13:11
HTTP/1.1 200 OK
Connection: close
Content-Length: 22092
content-type: text/html; charset=utf-8
etag: W/"564c-RDjYTFVDLez6YGiTAH9p5VkXzGI"
cache-control: public, max-age=0
Accept-Ranges: bytes
Date: Thu, 08 Jan 2026 13:11:53 GMT
Age: 14
X-Served-By: cache-ams21066-AMS, cache-ams2100101-AMS, cache-fra-eddf8230145-FRA
X-Cache: MISS, MISS, HIT
X-Cache-Hits: 0, 0, 1
Vary: Accept-Encoding
Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Page title: Drew Bell
<!DOCTYPE html>
<html lang="en" class="is-color-default">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Drew Bell</title>
<link rel="preload" as="style" href="/assets/built/screen.css?v=4718f07bb9">
<link rel="preload" as="script" href="/assets/built/main.min.js?v=4718f07bb9">
<link rel="stylesheet" type="text/css" href="/assets/built/screen.css?v=4718f07bb9">
<script>
// Function to set the theme
function setTheme(theme) {
document.documentElement.setAttribute('data-theme', theme);
localStorage.setItem('theme', theme);
updateThemeToggleIcon(theme);
}
// Function to get the user's color scheme preference
function getColorScheme() {
return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}
// Function to update theme toggle icon
function updateThemeToggleIcon(theme) {
const toggle = document.querySelector('.gh-theme-toggle');
if (toggle) {
toggle.setAttribute('data-theme', theme);
}
}
// Function to toggle theme
function toggleTheme() {
const currentTheme = document.documentElement.getAttribute('data-theme');
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
setTheme(newTheme);
}
// Get the theme setting from Ghost
var themeSetting = 'system';
var savedTheme = localStorage.getItem('theme');
// Initialize theme based on settings
if (themeSetting === 'user') {
// Use saved preference if available, otherwise system preference
if (savedTheme) {
setTheme(savedTheme);
} else {
setTheme(getColorScheme());
}
} else if (themeSetting === 'light') {
setTheme('light');
} else if (themeSetting === 'dark') {
setTheme('dark');
} else if (themeSetting === 'system') {
setTheme(getColorScheme());
}
// Add click handler to theme toggles
document.addEventListener('DOMContentLoaded', function() {
const themeToggles = document.querySelectorAll('.gh-theme-toggle');
themeToggles.forEach(toggle => {
toggle.addEventListener('click', function() {
if (themeSetting === 'user') {
toggleTheme();
}
});
});
});
// Listen for changes in system color scheme
if (themeSetting === 'system') {
window.matchMedia('(prefers-color-scheme: dark)').addListener((e) => {
setTheme(e.matches ? 'dark' : 'light');
});
}
</script>
<meta name="description" content="Thoughts, stories and ideas.">
<link rel="canonical" href="https://www.drewbell.net/">
<meta name="referrer" content="no-referrer-when-downgrade">
<meta property="og:site_name" content="Drew Bell">
<meta property="og:type" content="website">
<meta property="og:title" content="Drew Bell">
<meta property="og:description" content="Thoughts, stories and ideas.">
<meta property="og:url" content="https://www.drewbell.net/">
<meta property="og:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Drew Bell">
<meta name="twitter:description" content="Thoughts, stories and ideas.">
<meta name="twitter:url" content="https://www.drewbell.net/">
<meta name="twitter:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="840">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"publi
Open service 2a04:4e42::347:80 · drewbell.net
2026-01-08 13:11
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://drewbell.net/ Accept-Ranges: bytes Date: Thu, 08 Jan 2026 13:11:53 GMT X-Served-By: cache-fra-eddf8230110-FRA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1767877914.922641,VS0,VE1 Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 151.101.193.91:443 · drewbell.net
2026-01-08 13:11
HTTP/1.1 200 OK
Connection: close
Content-Length: 22092
content-type: text/html; charset=utf-8
etag: W/"564c-RDjYTFVDLez6YGiTAH9p5VkXzGI"
cache-control: public, max-age=0
Accept-Ranges: bytes
Date: Thu, 08 Jan 2026 13:11:53 GMT
Age: 14
X-Served-By: cache-ams21066-AMS, cache-ams2100101-AMS, cache-fra-eddf8230133-FRA
X-Cache: MISS, MISS, HIT
X-Cache-Hits: 0, 0, 1
Vary: Accept-Encoding
Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Page title: Drew Bell
<!DOCTYPE html>
<html lang="en" class="is-color-default">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Drew Bell</title>
<link rel="preload" as="style" href="/assets/built/screen.css?v=4718f07bb9">
<link rel="preload" as="script" href="/assets/built/main.min.js?v=4718f07bb9">
<link rel="stylesheet" type="text/css" href="/assets/built/screen.css?v=4718f07bb9">
<script>
// Function to set the theme
function setTheme(theme) {
document.documentElement.setAttribute('data-theme', theme);
localStorage.setItem('theme', theme);
updateThemeToggleIcon(theme);
}
// Function to get the user's color scheme preference
function getColorScheme() {
return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}
// Function to update theme toggle icon
function updateThemeToggleIcon(theme) {
const toggle = document.querySelector('.gh-theme-toggle');
if (toggle) {
toggle.setAttribute('data-theme', theme);
}
}
// Function to toggle theme
function toggleTheme() {
const currentTheme = document.documentElement.getAttribute('data-theme');
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
setTheme(newTheme);
}
// Get the theme setting from Ghost
var themeSetting = 'system';
var savedTheme = localStorage.getItem('theme');
// Initialize theme based on settings
if (themeSetting === 'user') {
// Use saved preference if available, otherwise system preference
if (savedTheme) {
setTheme(savedTheme);
} else {
setTheme(getColorScheme());
}
} else if (themeSetting === 'light') {
setTheme('light');
} else if (themeSetting === 'dark') {
setTheme('dark');
} else if (themeSetting === 'system') {
setTheme(getColorScheme());
}
// Add click handler to theme toggles
document.addEventListener('DOMContentLoaded', function() {
const themeToggles = document.querySelectorAll('.gh-theme-toggle');
themeToggles.forEach(toggle => {
toggle.addEventListener('click', function() {
if (themeSetting === 'user') {
toggleTheme();
}
});
});
});
// Listen for changes in system color scheme
if (themeSetting === 'system') {
window.matchMedia('(prefers-color-scheme: dark)').addListener((e) => {
setTheme(e.matches ? 'dark' : 'light');
});
}
</script>
<meta name="description" content="Thoughts, stories and ideas.">
<link rel="canonical" href="https://www.drewbell.net/">
<meta name="referrer" content="no-referrer-when-downgrade">
<meta property="og:site_name" content="Drew Bell">
<meta property="og:type" content="website">
<meta property="og:title" content="Drew Bell">
<meta property="og:description" content="Thoughts, stories and ideas.">
<meta property="og:url" content="https://www.drewbell.net/">
<meta property="og:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Drew Bell">
<meta name="twitter:description" content="Thoughts, stories and ideas.">
<meta name="twitter:url" content="https://www.drewbell.net/">
<meta name="twitter:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="840">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"publi
Open service 2a04:4e42::347:443 · drewbell.net
2026-01-08 13:11
HTTP/1.1 200 OK
Connection: close
Content-Length: 22092
etag: W/"564c-RDjYTFVDLez6YGiTAH9p5VkXzGI"
content-type: text/html; charset=utf-8
cache-control: public, max-age=0
Accept-Ranges: bytes
Date: Thu, 08 Jan 2026 13:11:54 GMT
X-Served-By: cache-ams21056-AMS, cache-ams2100120-AMS, cache-lga21955-LGA
X-Cache: MISS, MISS, MISS
X-Cache-Hits: 0, 0, 0
Vary: Accept-Encoding
Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Page title: Drew Bell
<!DOCTYPE html>
<html lang="en" class="is-color-default">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Drew Bell</title>
<link rel="preload" as="style" href="/assets/built/screen.css?v=4718f07bb9">
<link rel="preload" as="script" href="/assets/built/main.min.js?v=4718f07bb9">
<link rel="stylesheet" type="text/css" href="/assets/built/screen.css?v=4718f07bb9">
<script>
// Function to set the theme
function setTheme(theme) {
document.documentElement.setAttribute('data-theme', theme);
localStorage.setItem('theme', theme);
updateThemeToggleIcon(theme);
}
// Function to get the user's color scheme preference
function getColorScheme() {
return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}
// Function to update theme toggle icon
function updateThemeToggleIcon(theme) {
const toggle = document.querySelector('.gh-theme-toggle');
if (toggle) {
toggle.setAttribute('data-theme', theme);
}
}
// Function to toggle theme
function toggleTheme() {
const currentTheme = document.documentElement.getAttribute('data-theme');
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
setTheme(newTheme);
}
// Get the theme setting from Ghost
var themeSetting = 'system';
var savedTheme = localStorage.getItem('theme');
// Initialize theme based on settings
if (themeSetting === 'user') {
// Use saved preference if available, otherwise system preference
if (savedTheme) {
setTheme(savedTheme);
} else {
setTheme(getColorScheme());
}
} else if (themeSetting === 'light') {
setTheme('light');
} else if (themeSetting === 'dark') {
setTheme('dark');
} else if (themeSetting === 'system') {
setTheme(getColorScheme());
}
// Add click handler to theme toggles
document.addEventListener('DOMContentLoaded', function() {
const themeToggles = document.querySelectorAll('.gh-theme-toggle');
themeToggles.forEach(toggle => {
toggle.addEventListener('click', function() {
if (themeSetting === 'user') {
toggleTheme();
}
});
});
});
// Listen for changes in system color scheme
if (themeSetting === 'system') {
window.matchMedia('(prefers-color-scheme: dark)').addListener((e) => {
setTheme(e.matches ? 'dark' : 'light');
});
}
</script>
<meta name="description" content="Thoughts, stories and ideas.">
<link rel="canonical" href="https://www.drewbell.net/">
<meta name="referrer" content="no-referrer-when-downgrade">
<meta property="og:site_name" content="Drew Bell">
<meta property="og:type" content="website">
<meta property="og:title" content="Drew Bell">
<meta property="og:description" content="Thoughts, stories and ideas.">
<meta property="og:url" content="https://www.drewbell.net/">
<meta property="og:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Drew Bell">
<meta name="twitter:description" content="Thoughts, stories and ideas.">
<meta name="twitter:url" content="https://www.drewbell.net/">
<meta name="twitter:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="840">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"publi
Open service 151.101.1.91:443 · drewbell.net
2026-01-08 13:11
HTTP/1.1 200 OK
Connection: close
set-cookie: _fs_ch_st_FSBmUei20MqUiJb9=AXMelxk4pDfIsOhACK4sdUjPX8L0dUyrIX76uGfAZBfLcuVFy5K2UM1lfeQIRgwkFnogOgV5e2TZxUFmNgsyTx0GTiEu1IsvNBAnCr7gI3MN3v4qZE3-Aq4GaQO68PKYnJn3yW1FPXl8eXEVLRe6DzThq5rdKmBHudRC33r61GBbrcRUMB1hJw7c1js_kwKk5O6qja9WLrNlRwYHB3yCCjAPcs4Ilh51HYzC0q1vi8t_X3flDonOemHlN6ZXUPLqp-39TTNvr4whLivBlGTxfSVwINAunndKd_6uAnmPtmT1EcgOUIj_pAd1OqE5hYLlNy4o32oXNOq9pdsAXS5hBlRJxIL2-9jP0mH5WqXvO3AwB_WtcsUvFfng4R9m3NX7_NO9adX5l5ny9GGKgnhm; Max-Age=10; HttpOnly; Path=/
content-type: text/html; charset=utf-8
cache-control: private, no-store
Accept-Ranges: bytes
Date: Thu, 08 Jan 2026 13:11:54 GMT
X-Served-By: cache-ams2100088-AMS, cache-ams2100105-AMS, cache-lga21952-LGA
X-Cache: MISS, MISS
X-Cache-Hits: 0, 0
Vary: Accept-Encoding
Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
transfer-encoding: chunked
Page title: Client Challenge
<!DOCTYPE html>
<html lang="en">
<head>
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; img-src 'self' data:; media-src 'self' data:; object-src 'none'; style-src 'self' 'sha256-o4vzfmmUENEg4chMjjRP9EuW9ucGnGIGVdbl8d0SHQQ='; script-src 'self' 'sha256-KXex2o39zxtnzVWK4H5rW07g2+BlwSPtn+aguzsWkNg=';"
/>
<link
href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/inter-var.woff2"
rel="preload"
as="font"
type="font/woff2"
crossorigin
/>
<link href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/styles.css" rel="stylesheet" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Client Challenge</title>
<style>
#loading-error {
font-size: 16px;
font-family: 'Inter', sans-serif;
margin-top: 10px;
margin-left: 10px;
display: none;
}
</style>
</head>
<body>
<noscript>
<div class="noscript-container">
<div class="noscript-content">
<img
src="/_fs-ch-1T1wmsGaOgGaSxcX/assets/errorIcon.svg"
alt=""
role="presentation"
class="error-icon"
/>
<span class="noscript-span"
>JavaScript is disabled in your browser.</span
>
<p>Please enable JavaScript to proceed.</p>
</div>
</div>
</noscript>
<div id="loading-error" role="alert" aria-live="polite">
A required part of this site couldn’t load. This may be due to a browser
extension, network issues, or browser settings. Please check your
connection, disable any ad blockers, or try using a different browser.
</div>
<script>
function loadScript(src) {
return new Promise((resolve, reject) => {
const script = document.createElement('script');
script.onload = resolve;
script.onerror = (event) => {
console.error('Script load error event:', event);
document.getElementById('loading-error').style.display = 'block';
loadingError.setAttribute('aria-hidden', 'false');
reject(
new Error(
`Failed to load script: ${src}, Please contact the service administrator.`
)
);
};
script.src = src;
document.body.appendChild(script);
});
}
loadScript('/_fs-ch-1T1wmsGaOgGaSxcX/errors.js')
.then(() => {
const script = document.createElement('script');
script.src = '/_fs-ch-1T1wmsGaOgGaSxcX/script.js?reload=true';
script.onerror = (event) => {
console.error('Script load error event:', event);
const errorMsg = new Error(
`Failed to load script: ${script.src}. Please contact the service administrator.`
);
console.error(errorMsg);
handleScriptError();
};
document.body.appendChild(script);
})
.catch((error) => {
console.error(error);
});
</script>
</body>
</html>
Open service 151.101.193.91:80 · drewbell.net
2026-01-08 13:11
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://drewbell.net/ Accept-Ranges: bytes Date: Thu, 08 Jan 2026 13:11:53 GMT X-Served-By: cache-lga21964-LGA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1767877914.907201,VS0,VE1 Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 2a04:4e42:600::347:443 · www.drewbell.net
2026-01-08 13:11
HTTP/1.1 200 OK
Connection: close
Content-Length: 22092
content-type: text/html; charset=utf-8
cache-control: public, max-age=0
etag: W/"564c-RDjYTFVDLez6YGiTAH9p5VkXzGI"
Accept-Ranges: bytes
Date: Thu, 08 Jan 2026 13:11:53 GMT
Age: 2
X-Served-By: cache-ams2100118-AMS, cache-ams2100118-AMS, cache-rtm-ehrd2290053-RTM
X-Cache: MISS, MISS, HIT
X-Cache-Hits: 0, 0, 1
Vary: Accept-Encoding
Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Page title: Drew Bell
<!DOCTYPE html>
<html lang="en" class="is-color-default">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Drew Bell</title>
<link rel="preload" as="style" href="/assets/built/screen.css?v=4718f07bb9">
<link rel="preload" as="script" href="/assets/built/main.min.js?v=4718f07bb9">
<link rel="stylesheet" type="text/css" href="/assets/built/screen.css?v=4718f07bb9">
<script>
// Function to set the theme
function setTheme(theme) {
document.documentElement.setAttribute('data-theme', theme);
localStorage.setItem('theme', theme);
updateThemeToggleIcon(theme);
}
// Function to get the user's color scheme preference
function getColorScheme() {
return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}
// Function to update theme toggle icon
function updateThemeToggleIcon(theme) {
const toggle = document.querySelector('.gh-theme-toggle');
if (toggle) {
toggle.setAttribute('data-theme', theme);
}
}
// Function to toggle theme
function toggleTheme() {
const currentTheme = document.documentElement.getAttribute('data-theme');
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
setTheme(newTheme);
}
// Get the theme setting from Ghost
var themeSetting = 'system';
var savedTheme = localStorage.getItem('theme');
// Initialize theme based on settings
if (themeSetting === 'user') {
// Use saved preference if available, otherwise system preference
if (savedTheme) {
setTheme(savedTheme);
} else {
setTheme(getColorScheme());
}
} else if (themeSetting === 'light') {
setTheme('light');
} else if (themeSetting === 'dark') {
setTheme('dark');
} else if (themeSetting === 'system') {
setTheme(getColorScheme());
}
// Add click handler to theme toggles
document.addEventListener('DOMContentLoaded', function() {
const themeToggles = document.querySelectorAll('.gh-theme-toggle');
themeToggles.forEach(toggle => {
toggle.addEventListener('click', function() {
if (themeSetting === 'user') {
toggleTheme();
}
});
});
});
// Listen for changes in system color scheme
if (themeSetting === 'system') {
window.matchMedia('(prefers-color-scheme: dark)').addListener((e) => {
setTheme(e.matches ? 'dark' : 'light');
});
}
</script>
<meta name="description" content="Thoughts, stories and ideas.">
<link rel="canonical" href="https://www.drewbell.net/">
<meta name="referrer" content="no-referrer-when-downgrade">
<meta property="og:site_name" content="Drew Bell">
<meta property="og:type" content="website">
<meta property="og:title" content="Drew Bell">
<meta property="og:description" content="Thoughts, stories and ideas.">
<meta property="og:url" content="https://www.drewbell.net/">
<meta property="og:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Drew Bell">
<meta name="twitter:description" content="Thoughts, stories and ideas.">
<meta name="twitter:url" content="https://www.drewbell.net/">
<meta name="twitter:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="840">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"publi
Open service 2a04:4e42:600::347:80 · drewbell.net
2026-01-08 13:11
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://drewbell.net/ Accept-Ranges: bytes Date: Thu, 08 Jan 2026 13:11:53 GMT X-Served-By: cache-sin-wsss1830031-SIN X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1767877914.926437,VS0,VE2 Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 2a04:4e42:400::347:80 · drewbell.net
2026-01-08 13:11
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://drewbell.net/ Accept-Ranges: bytes Date: Thu, 08 Jan 2026 13:11:53 GMT X-Served-By: cache-sin-wsat1880076-SIN X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1767877914.896592,VS0,VE1 Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 151.101.65.91:80 · drewbell.net
2026-01-08 13:11
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://drewbell.net/ Accept-Ranges: bytes Date: Thu, 08 Jan 2026 13:11:53 GMT X-Served-By: cache-sin-wsat1880095-SIN X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1767877914.893594,VS0,VE1 Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 2a04:4e42::347:443 · www.drewbell.net
2026-01-08 13:11
HTTP/1.1 200 OK
Connection: close
Content-Length: 22092
content-type: text/html; charset=utf-8
cache-control: public, max-age=0
etag: W/"564c-RDjYTFVDLez6YGiTAH9p5VkXzGI"
Accept-Ranges: bytes
Date: Thu, 08 Jan 2026 13:11:54 GMT
Age: 2
X-Served-By: cache-ams2100118-AMS, cache-ams2100118-AMS, cache-lcy-egml8630061-LCY
X-Cache: MISS, MISS, HIT
X-Cache-Hits: 0, 0, 1
Vary: Accept-Encoding
Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Page title: Drew Bell
<!DOCTYPE html>
<html lang="en" class="is-color-default">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Drew Bell</title>
<link rel="preload" as="style" href="/assets/built/screen.css?v=4718f07bb9">
<link rel="preload" as="script" href="/assets/built/main.min.js?v=4718f07bb9">
<link rel="stylesheet" type="text/css" href="/assets/built/screen.css?v=4718f07bb9">
<script>
// Function to set the theme
function setTheme(theme) {
document.documentElement.setAttribute('data-theme', theme);
localStorage.setItem('theme', theme);
updateThemeToggleIcon(theme);
}
// Function to get the user's color scheme preference
function getColorScheme() {
return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}
// Function to update theme toggle icon
function updateThemeToggleIcon(theme) {
const toggle = document.querySelector('.gh-theme-toggle');
if (toggle) {
toggle.setAttribute('data-theme', theme);
}
}
// Function to toggle theme
function toggleTheme() {
const currentTheme = document.documentElement.getAttribute('data-theme');
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
setTheme(newTheme);
}
// Get the theme setting from Ghost
var themeSetting = 'system';
var savedTheme = localStorage.getItem('theme');
// Initialize theme based on settings
if (themeSetting === 'user') {
// Use saved preference if available, otherwise system preference
if (savedTheme) {
setTheme(savedTheme);
} else {
setTheme(getColorScheme());
}
} else if (themeSetting === 'light') {
setTheme('light');
} else if (themeSetting === 'dark') {
setTheme('dark');
} else if (themeSetting === 'system') {
setTheme(getColorScheme());
}
// Add click handler to theme toggles
document.addEventListener('DOMContentLoaded', function() {
const themeToggles = document.querySelectorAll('.gh-theme-toggle');
themeToggles.forEach(toggle => {
toggle.addEventListener('click', function() {
if (themeSetting === 'user') {
toggleTheme();
}
});
});
});
// Listen for changes in system color scheme
if (themeSetting === 'system') {
window.matchMedia('(prefers-color-scheme: dark)').addListener((e) => {
setTheme(e.matches ? 'dark' : 'light');
});
}
</script>
<meta name="description" content="Thoughts, stories and ideas.">
<link rel="canonical" href="https://www.drewbell.net/">
<meta name="referrer" content="no-referrer-when-downgrade">
<meta property="og:site_name" content="Drew Bell">
<meta property="og:type" content="website">
<meta property="og:title" content="Drew Bell">
<meta property="og:description" content="Thoughts, stories and ideas.">
<meta property="og:url" content="https://www.drewbell.net/">
<meta property="og:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Drew Bell">
<meta name="twitter:description" content="Thoughts, stories and ideas.">
<meta name="twitter:url" content="https://www.drewbell.net/">
<meta name="twitter:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="840">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"publi
Open service 2a04:4e42:200::347:80 · drewbell.net
2026-01-08 13:11
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://drewbell.net/ Accept-Ranges: bytes Date: Thu, 08 Jan 2026 13:11:53 GMT X-Served-By: cache-fra-eddf8230129-FRA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1767877914.857785,VS0,VE1 Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 2a04:4e42:400::347:443 · drewbell.net
2026-01-08 13:11
HTTP/1.1 200 OK
Connection: close
Content-Length: 22092
content-type: text/html; charset=utf-8
etag: W/"564c-RDjYTFVDLez6YGiTAH9p5VkXzGI"
cache-control: public, max-age=0
Accept-Ranges: bytes
Date: Thu, 08 Jan 2026 13:11:53 GMT
Age: 14
X-Served-By: cache-ams21066-AMS, cache-ams2100101-AMS, cache-fra-eddf8230121-FRA
X-Cache: MISS, MISS, HIT
X-Cache-Hits: 0, 0, 1
Vary: Accept-Encoding
Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Page title: Drew Bell
<!DOCTYPE html>
<html lang="en" class="is-color-default">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Drew Bell</title>
<link rel="preload" as="style" href="/assets/built/screen.css?v=4718f07bb9">
<link rel="preload" as="script" href="/assets/built/main.min.js?v=4718f07bb9">
<link rel="stylesheet" type="text/css" href="/assets/built/screen.css?v=4718f07bb9">
<script>
// Function to set the theme
function setTheme(theme) {
document.documentElement.setAttribute('data-theme', theme);
localStorage.setItem('theme', theme);
updateThemeToggleIcon(theme);
}
// Function to get the user's color scheme preference
function getColorScheme() {
return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}
// Function to update theme toggle icon
function updateThemeToggleIcon(theme) {
const toggle = document.querySelector('.gh-theme-toggle');
if (toggle) {
toggle.setAttribute('data-theme', theme);
}
}
// Function to toggle theme
function toggleTheme() {
const currentTheme = document.documentElement.getAttribute('data-theme');
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
setTheme(newTheme);
}
// Get the theme setting from Ghost
var themeSetting = 'system';
var savedTheme = localStorage.getItem('theme');
// Initialize theme based on settings
if (themeSetting === 'user') {
// Use saved preference if available, otherwise system preference
if (savedTheme) {
setTheme(savedTheme);
} else {
setTheme(getColorScheme());
}
} else if (themeSetting === 'light') {
setTheme('light');
} else if (themeSetting === 'dark') {
setTheme('dark');
} else if (themeSetting === 'system') {
setTheme(getColorScheme());
}
// Add click handler to theme toggles
document.addEventListener('DOMContentLoaded', function() {
const themeToggles = document.querySelectorAll('.gh-theme-toggle');
themeToggles.forEach(toggle => {
toggle.addEventListener('click', function() {
if (themeSetting === 'user') {
toggleTheme();
}
});
});
});
// Listen for changes in system color scheme
if (themeSetting === 'system') {
window.matchMedia('(prefers-color-scheme: dark)').addListener((e) => {
setTheme(e.matches ? 'dark' : 'light');
});
}
</script>
<meta name="description" content="Thoughts, stories and ideas.">
<link rel="canonical" href="https://www.drewbell.net/">
<meta name="referrer" content="no-referrer-when-downgrade">
<meta property="og:site_name" content="Drew Bell">
<meta property="og:type" content="website">
<meta property="og:title" content="Drew Bell">
<meta property="og:description" content="Thoughts, stories and ideas.">
<meta property="og:url" content="https://www.drewbell.net/">
<meta property="og:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Drew Bell">
<meta name="twitter:description" content="Thoughts, stories and ideas.">
<meta name="twitter:url" content="https://www.drewbell.net/">
<meta name="twitter:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="840">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"publi
Open service 2a04:4e42:200::347:80 · www.drewbell.net
2026-01-08 13:11
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://www.drewbell.net/ Accept-Ranges: bytes Date: Thu, 08 Jan 2026 13:11:53 GMT X-Served-By: cache-rtm-ehrd2290022-RTM X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1767877914.898796,VS0,VE1 Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 151.101.129.91:80 · drewbell.net
2026-01-08 13:11
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://drewbell.net/ Accept-Ranges: bytes Date: Thu, 08 Jan 2026 13:11:53 GMT X-Served-By: cache-fra-eddf8230149-FRA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1767877914.916572,VS0,VE1 Content-Security-Policy-Report-Only: default-src 'self' www.drewbell.net; script-src-elem cdn.jsdelivr.net 'self' cdnjs.cloudflare.com 'unsafe-inline'; style-src-elem 'unsafe-inline' 'self' fonts.bunny.net; connect-src 'self'; font-src fonts.bunny.net; img-src images.unsplash.com 'self'; style-src-attr 'unsafe-inline'; report-uri https://drewbell2.report-uri.com/r/d/csp/wizard X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 94.237.47.8:443 · www.drewbell.net
2025-12-23 16:03
HTTP/1.1 200 OK
Server: nginx/1.24.0 (Ubuntu)
Date: Tue, 23 Dec 2025 16:03:20 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 17359
Connection: close
X-Powered-By: Express
Cache-Control: public, max-age=0
ETag: W/"43cf-A7lG18uWroE/pje7nHt7oPiwxsQ"
Vary: Accept-Encoding
X-Content-Type-Options: nosniff
Page title: Ghost
<!DOCTYPE html>
<html lang="en">
<head>
<title>Ghost</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="preload" as="style" href="/assets/built/screen.css?v=199475bd39">
<link rel="preload" as="script" href="/assets/built/source.js?v=199475bd39">
<link rel="preload" as="font" type="font/woff2" href="/assets/fonts/inter-roman.woff2?v=199475bd39" crossorigin="anonymous">
<style>
@font-face {
font-family: "Inter";
font-style: normal;
font-weight: 100 900;
font-display: optional;
src: url(/assets/fonts/inter-roman.woff2?v=199475bd39) format("woff2");
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
</style>
<link rel="stylesheet" type="text/css" href="/assets/built/screen.css?v=199475bd39">
<style>
:root {
--background-color: #ffffff
}
</style>
<script>
/* The script for calculating the color contrast has been taken from
https://gomakethings.com/dynamically-changing-the-text-color-based-on-background-color-contrast-with-vanilla-js/ */
var accentColor = getComputedStyle(document.documentElement).getPropertyValue('--background-color');
accentColor = accentColor.trim().slice(1);
if (accentColor.length === 3) {
accentColor = accentColor[0] + accentColor[0] + accentColor[1] + accentColor[1] + accentColor[2] + accentColor[2];
}
var r = parseInt(accentColor.substr(0, 2), 16);
var g = parseInt(accentColor.substr(2, 2), 16);
var b = parseInt(accentColor.substr(4, 2), 16);
var yiq = ((r * 299) + (g * 587) + (b * 114)) / 1000;
var textColor = (yiq >= 128) ? 'dark' : 'light';
document.documentElement.className = `has-${textColor}-text`;
</script>
<meta name="description" content="Thoughts, stories and ideas">
<link rel="canonical" href="https://www.drewbell.net/">
<meta name="referrer" content="no-referrer-when-downgrade">
<meta property="og:site_name" content="Ghost">
<meta property="og:type" content="website">
<meta property="og:title" content="Ghost">
<meta property="og:description" content="Thoughts, stories and ideas">
<meta property="og:url" content="https://www.drewbell.net/">
<meta property="og:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta property="article:publisher" content="https://www.facebook.com/ghost">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Ghost">
<meta name="twitter:description" content="Thoughts, stories and ideas">
<meta name="twitter:url" content="https://www.drewbell.net/">
<meta name="twitter:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta name="twitter:site" content="@ghost">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="840">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"publisher": {
"@type": "Organization",
"name": "Ghost",
"url": "https://www.drewbell.net/",
"logo": {
"@type": "ImageObject",
"url": "https://www.drewbell.net/favicon.ico",
"width": 48,
"height": 48
}
},
"url": "https://www.drewbell.net/",
"name": "Ghost",
"image": {
"@type": "ImageObject",
"url": "https://static.ghost.org/v5.0.0/images/publication-cover.jpg",
"width": 1200,
"height": 840
},
"mainEntityOfPage": "https://www.drewbell.net/",
"description": "Thoughts, stories and ideas"
}
</script>
<meta name="generator" content="Ghost 6.10">
<link rel="alternate" type="application/rss+xml" title="Ghost" href="https://www.d
Open service 94.237.47.8:80 · www.drewbell.net
2025-12-23 16:03
HTTP/1.1 301 Moved Permanently Server: nginx/1.24.0 (Ubuntu) Date: Tue, 23 Dec 2025 16:03:20 GMT Content-Type: text/plain; charset=utf-8 Content-Length: 59 Connection: close X-Powered-By: Express Cache-Control: public, max-age=31536000 Location: https://www.drewbell.net/ Vary: Accept, Accept-Encoding X-Content-Type-Options: nosniff Moved Permanently. Redirecting to https://www.drewbell.net/
Open service 151.101.193.91:80 · drewbell.net
2025-12-19 14:05
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://drewbell.net/ Accept-Ranges: bytes Date: Fri, 19 Dec 2025 14:05:25 GMT X-Served-By: cache-sin-wsat1880034-SIN X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1766153125.319606,VS0,VE0 X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 151.101.1.91:80 · www.drewbell.net
2025-12-19 14:05
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://www.drewbell.net/ Accept-Ranges: bytes Date: Fri, 19 Dec 2025 14:05:25 GMT X-Served-By: cache-pao-kpao1770022-PAO X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1766153125.426813,VS0,VE55 X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 151.101.193.91:443 · www.drewbell.net
2025-12-19 14:05
HTTP/1.1 200 OK
Connection: close
set-cookie: _fs_ch_st_FSBmUei20MqUiJb9=AYF0_dukrDKkMHNe2PGfeMzkjHh8v3EQftryG1U2YJMDbcD5VBoCpqJOPI8aeYTtR6Ye7GvhIaumXiVgL4cdelLS8bVizc2fP-V41vuIWxqU_qaQ8b39ES6EbsESMWjUh4nLojRbzuyjigk8COqnlmlh4UfMBXa7zzcpuQqeUUIp4uIRq5qYsAPNEkVAxWqn-hCmsDqaeEzmOC0ENQ4_KSs9_apLka5P1rtzcG-UoF-L8kfb86BWq_z8yjatiWT0MS8brILAMG76DWVfK7WEMHT5e2RdgPOAePSzQb01y5NcMKSfLuIKk0ZJhIqnNNlevWeo94jwuCNtaveZ4kA1OcbU1ersALL085CJ1Xmo5AeYj5HApmfaXynJppvJp_i4SZ43yZR77u77NEu__3I1; Max-Age=10; HttpOnly; Path=/
content-type: text/html; charset=utf-8
cache-control: private, no-store
Accept-Ranges: bytes
Date: Fri, 19 Dec 2025 14:05:25 GMT
X-Served-By: cache-ams21068-AMS, cache-ams2100096-AMS, cache-sin-wsat1880055-SIN
X-Cache: MISS, MISS
X-Cache-Hits: 0, 0
Vary: Accept-Encoding
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
transfer-encoding: chunked
Page title: Client Challenge
<!DOCTYPE html>
<html lang="en">
<head>
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; img-src 'self' data:; media-src 'self' data:; object-src 'none'; style-src 'self' 'sha256-o4vzfmmUENEg4chMjjRP9EuW9ucGnGIGVdbl8d0SHQQ='; script-src 'self' 'sha256-KXex2o39zxtnzVWK4H5rW07g2+BlwSPtn+aguzsWkNg=';"
/>
<link
href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/inter-var.woff2"
rel="preload"
as="font"
type="font/woff2"
crossorigin
/>
<link href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/styles.css" rel="stylesheet" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Client Challenge</title>
<style>
#loading-error {
font-size: 16px;
font-family: 'Inter', sans-serif;
margin-top: 10px;
margin-left: 10px;
display: none;
}
</style>
</head>
<body>
<noscript>
<div class="noscript-container">
<div class="noscript-content">
<img
src="/_fs-ch-1T1wmsGaOgGaSxcX/assets/errorIcon.svg"
alt=""
role="presentation"
class="error-icon"
/>
<span class="noscript-span"
>JavaScript is disabled in your browser.</span
>
<p>Please enable JavaScript to proceed.</p>
</div>
</div>
</noscript>
<div id="loading-error" role="alert" aria-live="polite">
A required part of this site couldn’t load. This may be due to a browser
extension, network issues, or browser settings. Please check your
connection, disable any ad blockers, or try using a different browser.
</div>
<script>
function loadScript(src) {
return new Promise((resolve, reject) => {
const script = document.createElement('script');
script.onload = resolve;
script.onerror = (event) => {
console.error('Script load error event:', event);
document.getElementById('loading-error').style.display = 'block';
loadingError.setAttribute('aria-hidden', 'false');
reject(
new Error(
`Failed to load script: ${src}, Please contact the service administrator.`
)
);
};
script.src = src;
document.body.appendChild(script);
});
}
loadScript('/_fs-ch-1T1wmsGaOgGaSxcX/errors.js')
.then(() => {
const script = document.createElement('script');
script.src = '/_fs-ch-1T1wmsGaOgGaSxcX/script.js?reload=true';
script.onerror = (event) => {
console.error('Script load error event:', event);
const errorMsg = new Error(
`Failed to load script: ${script.src}. Please contact the service administrator.`
);
console.error(errorMsg);
handleScriptError();
};
document.body.appendChild(script);
})
.catch((error) => {
console.error(error);
});
</script>
</body>
</html>
Open service 2a04:4e42:600::347:443 · www.drewbell.net
2025-12-19 14:05
HTTP/1.1 200 OK
Connection: close
Content-Length: 17846
etag: W/"45b6-gT9L4anLSYxV5H7Eiptqb6Ru7gw"
x-content-type-options: nosniff
content-type: text/html; charset=utf-8
cache-control: public, max-age=0
Accept-Ranges: bytes
Date: Fri, 19 Dec 2025 14:05:26 GMT
Age: 0
X-Served-By: cache-ams2100122-AMS, cache-ams2100124-AMS, cache-lga21948-LGA
X-Cache: MISS, MISS, HIT
X-Cache-Hits: 0, 0, 1
Vary: Accept-Encoding
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Page title: Drew Bell
<!DOCTYPE html>
<html lang="en" class="is-color-default">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Drew Bell</title>
<link rel="preload" as="style" href="/assets/built/screen.css?v=21178adbca">
<link rel="preload" as="script" href="/assets/built/main.min.js?v=21178adbca">
<link rel="stylesheet" type="text/css" href="/assets/built/screen.css?v=21178adbca">
<script>
// Function to set the theme
function setTheme(theme) {
document.documentElement.setAttribute('data-theme', theme);
localStorage.setItem('theme', theme);
updateThemeToggleIcon(theme);
}
// Function to get the user's color scheme preference
function getColorScheme() {
return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}
// Function to update theme toggle icon
function updateThemeToggleIcon(theme) {
const toggle = document.querySelector('.gh-theme-toggle');
if (toggle) {
toggle.setAttribute('data-theme', theme);
}
}
// Function to toggle theme
function toggleTheme() {
const currentTheme = document.documentElement.getAttribute('data-theme');
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
setTheme(newTheme);
}
// Get the theme setting from Ghost
var themeSetting = 'system';
var savedTheme = localStorage.getItem('theme');
// Initialize theme based on settings
if (themeSetting === 'user') {
// Use saved preference if available, otherwise system preference
if (savedTheme) {
setTheme(savedTheme);
} else {
setTheme(getColorScheme());
}
} else if (themeSetting === 'light') {
setTheme('light');
} else if (themeSetting === 'dark') {
setTheme('dark');
} else if (themeSetting === 'system') {
setTheme(getColorScheme());
}
// Add click handler to theme toggles
document.addEventListener('DOMContentLoaded', function() {
const themeToggles = document.querySelectorAll('.gh-theme-toggle');
themeToggles.forEach(toggle => {
toggle.addEventListener('click', function() {
if (themeSetting === 'user') {
toggleTheme();
}
});
});
});
// Listen for changes in system color scheme
if (themeSetting === 'system') {
window.matchMedia('(prefers-color-scheme: dark)').addListener((e) => {
setTheme(e.matches ? 'dark' : 'light');
});
}
</script>
<meta name="description" content="Thoughts, stories and ideas.">
<link rel="canonical" href="https://www.drewbell.net/">
<meta name="referrer" content="no-referrer-when-downgrade">
<meta property="og:site_name" content="Drew Bell">
<meta property="og:type" content="website">
<meta property="og:title" content="Drew Bell">
<meta property="og:description" content="Thoughts, stories and ideas.">
<meta property="og:url" content="https://www.drewbell.net/">
<meta property="og:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta property="article:publisher" content="https://www.facebook.com/ghost">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Drew Bell">
<meta name="twitter:description" content="Thoughts, stories and ideas.">
<meta name="twitter:url" content="https://www.drewbell.net/">
<meta name="twitter:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta name="twitter:site" content="@ghost">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" conte
Open service 151.101.129.91:80 · www.drewbell.net
2025-12-19 14:05
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://www.drewbell.net/ Accept-Ranges: bytes Date: Fri, 19 Dec 2025 14:05:25 GMT X-Served-By: cache-fra-eddf8230155-FRA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1766153125.274958,VS0,VE1 X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 151.101.65.91:80 · www.drewbell.net
2025-12-19 14:05
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://www.drewbell.net/ Accept-Ranges: bytes Date: Fri, 19 Dec 2025 14:05:25 GMT X-Served-By: cache-fra-eddf8230097-FRA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1766153125.313276,VS0,VE1 X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 2a04:4e42:200::347:443 · drewbell.net
2025-12-19 14:05
HTTP/1.1 200 OK
Connection: close
Content-Length: 17846
etag: W/"45b6-gT9L4anLSYxV5H7Eiptqb6Ru7gw"
x-content-type-options: nosniff
content-type: text/html; charset=utf-8
cache-control: public, max-age=0
Accept-Ranges: bytes
Date: Fri, 19 Dec 2025 14:05:25 GMT
Age: 0
X-Served-By: cache-ams2100088-AMS, cache-ams21023-AMS, cache-yyz4568-YYZ
X-Cache: MISS, MISS, HIT
X-Cache-Hits: 0, 0, 1
Vary: Accept-Encoding
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Page title: Drew Bell
<!DOCTYPE html>
<html lang="en" class="is-color-default">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Drew Bell</title>
<link rel="preload" as="style" href="/assets/built/screen.css?v=21178adbca">
<link rel="preload" as="script" href="/assets/built/main.min.js?v=21178adbca">
<link rel="stylesheet" type="text/css" href="/assets/built/screen.css?v=21178adbca">
<script>
// Function to set the theme
function setTheme(theme) {
document.documentElement.setAttribute('data-theme', theme);
localStorage.setItem('theme', theme);
updateThemeToggleIcon(theme);
}
// Function to get the user's color scheme preference
function getColorScheme() {
return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}
// Function to update theme toggle icon
function updateThemeToggleIcon(theme) {
const toggle = document.querySelector('.gh-theme-toggle');
if (toggle) {
toggle.setAttribute('data-theme', theme);
}
}
// Function to toggle theme
function toggleTheme() {
const currentTheme = document.documentElement.getAttribute('data-theme');
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
setTheme(newTheme);
}
// Get the theme setting from Ghost
var themeSetting = 'system';
var savedTheme = localStorage.getItem('theme');
// Initialize theme based on settings
if (themeSetting === 'user') {
// Use saved preference if available, otherwise system preference
if (savedTheme) {
setTheme(savedTheme);
} else {
setTheme(getColorScheme());
}
} else if (themeSetting === 'light') {
setTheme('light');
} else if (themeSetting === 'dark') {
setTheme('dark');
} else if (themeSetting === 'system') {
setTheme(getColorScheme());
}
// Add click handler to theme toggles
document.addEventListener('DOMContentLoaded', function() {
const themeToggles = document.querySelectorAll('.gh-theme-toggle');
themeToggles.forEach(toggle => {
toggle.addEventListener('click', function() {
if (themeSetting === 'user') {
toggleTheme();
}
});
});
});
// Listen for changes in system color scheme
if (themeSetting === 'system') {
window.matchMedia('(prefers-color-scheme: dark)').addListener((e) => {
setTheme(e.matches ? 'dark' : 'light');
});
}
</script>
<meta name="description" content="Thoughts, stories and ideas.">
<link rel="canonical" href="https://www.drewbell.net/">
<meta name="referrer" content="no-referrer-when-downgrade">
<meta property="og:site_name" content="Drew Bell">
<meta property="og:type" content="website">
<meta property="og:title" content="Drew Bell">
<meta property="og:description" content="Thoughts, stories and ideas.">
<meta property="og:url" content="https://www.drewbell.net/">
<meta property="og:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta property="article:publisher" content="https://www.facebook.com/ghost">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Drew Bell">
<meta name="twitter:description" content="Thoughts, stories and ideas.">
<meta name="twitter:url" content="https://www.drewbell.net/">
<meta name="twitter:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta name="twitter:site" content="@ghost">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" conte
Open service 2a04:4e42:400::347:80 · www.drewbell.net
2025-12-19 14:05
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://www.drewbell.net/ Accept-Ranges: bytes Date: Fri, 19 Dec 2025 14:05:25 GMT X-Served-By: cache-lga21974-LGA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1766153125.196368,VS0,VE1 X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 2a04:4e42:400::347:443 · www.drewbell.net
2025-12-19 14:05
HTTP/1.1 200 OK
Connection: close
Content-Length: 17846
content-type: text/html; charset=utf-8
etag: W/"45b6-gT9L4anLSYxV5H7Eiptqb6Ru7gw"
cache-control: public, max-age=0
x-content-type-options: nosniff
Accept-Ranges: bytes
Date: Fri, 19 Dec 2025 14:05:25 GMT
X-Served-By: cache-ams2100137-AMS, cache-ams21080-AMS, cache-fra-eddf8230133-FRA
X-Cache: MISS, MISS, MISS
X-Cache-Hits: 0, 0, 0
Vary: Accept-Encoding
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Page title: Drew Bell
<!DOCTYPE html>
<html lang="en" class="is-color-default">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Drew Bell</title>
<link rel="preload" as="style" href="/assets/built/screen.css?v=21178adbca">
<link rel="preload" as="script" href="/assets/built/main.min.js?v=21178adbca">
<link rel="stylesheet" type="text/css" href="/assets/built/screen.css?v=21178adbca">
<script>
// Function to set the theme
function setTheme(theme) {
document.documentElement.setAttribute('data-theme', theme);
localStorage.setItem('theme', theme);
updateThemeToggleIcon(theme);
}
// Function to get the user's color scheme preference
function getColorScheme() {
return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}
// Function to update theme toggle icon
function updateThemeToggleIcon(theme) {
const toggle = document.querySelector('.gh-theme-toggle');
if (toggle) {
toggle.setAttribute('data-theme', theme);
}
}
// Function to toggle theme
function toggleTheme() {
const currentTheme = document.documentElement.getAttribute('data-theme');
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
setTheme(newTheme);
}
// Get the theme setting from Ghost
var themeSetting = 'system';
var savedTheme = localStorage.getItem('theme');
// Initialize theme based on settings
if (themeSetting === 'user') {
// Use saved preference if available, otherwise system preference
if (savedTheme) {
setTheme(savedTheme);
} else {
setTheme(getColorScheme());
}
} else if (themeSetting === 'light') {
setTheme('light');
} else if (themeSetting === 'dark') {
setTheme('dark');
} else if (themeSetting === 'system') {
setTheme(getColorScheme());
}
// Add click handler to theme toggles
document.addEventListener('DOMContentLoaded', function() {
const themeToggles = document.querySelectorAll('.gh-theme-toggle');
themeToggles.forEach(toggle => {
toggle.addEventListener('click', function() {
if (themeSetting === 'user') {
toggleTheme();
}
});
});
});
// Listen for changes in system color scheme
if (themeSetting === 'system') {
window.matchMedia('(prefers-color-scheme: dark)').addListener((e) => {
setTheme(e.matches ? 'dark' : 'light');
});
}
</script>
<meta name="description" content="Thoughts, stories and ideas.">
<link rel="canonical" href="https://www.drewbell.net/">
<meta name="referrer" content="no-referrer-when-downgrade">
<meta property="og:site_name" content="Drew Bell">
<meta property="og:type" content="website">
<meta property="og:title" content="Drew Bell">
<meta property="og:description" content="Thoughts, stories and ideas.">
<meta property="og:url" content="https://www.drewbell.net/">
<meta property="og:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta property="article:publisher" content="https://www.facebook.com/ghost">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Drew Bell">
<meta name="twitter:description" content="Thoughts, stories and ideas.">
<meta name="twitter:url" content="https://www.drewbell.net/">
<meta name="twitter:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta name="twitter:site" content="@ghost">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" conte
Open service 2a04:4e42:200::347:443 · www.drewbell.net
2025-12-19 14:05
HTTP/1.1 200 OK
Connection: close
Content-Length: 17846
content-type: text/html; charset=utf-8
etag: W/"45b6-gT9L4anLSYxV5H7Eiptqb6Ru7gw"
cache-control: public, max-age=0
x-content-type-options: nosniff
Accept-Ranges: bytes
Date: Fri, 19 Dec 2025 14:05:25 GMT
X-Served-By: cache-ams21059-AMS, cache-ams2100086-AMS, cache-vie6381-VIE
X-Cache: MISS, MISS, MISS
X-Cache-Hits: 0, 0, 0
Vary: Accept-Encoding
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Page title: Drew Bell
<!DOCTYPE html>
<html lang="en" class="is-color-default">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Drew Bell</title>
<link rel="preload" as="style" href="/assets/built/screen.css?v=21178adbca">
<link rel="preload" as="script" href="/assets/built/main.min.js?v=21178adbca">
<link rel="stylesheet" type="text/css" href="/assets/built/screen.css?v=21178adbca">
<script>
// Function to set the theme
function setTheme(theme) {
document.documentElement.setAttribute('data-theme', theme);
localStorage.setItem('theme', theme);
updateThemeToggleIcon(theme);
}
// Function to get the user's color scheme preference
function getColorScheme() {
return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}
// Function to update theme toggle icon
function updateThemeToggleIcon(theme) {
const toggle = document.querySelector('.gh-theme-toggle');
if (toggle) {
toggle.setAttribute('data-theme', theme);
}
}
// Function to toggle theme
function toggleTheme() {
const currentTheme = document.documentElement.getAttribute('data-theme');
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
setTheme(newTheme);
}
// Get the theme setting from Ghost
var themeSetting = 'system';
var savedTheme = localStorage.getItem('theme');
// Initialize theme based on settings
if (themeSetting === 'user') {
// Use saved preference if available, otherwise system preference
if (savedTheme) {
setTheme(savedTheme);
} else {
setTheme(getColorScheme());
}
} else if (themeSetting === 'light') {
setTheme('light');
} else if (themeSetting === 'dark') {
setTheme('dark');
} else if (themeSetting === 'system') {
setTheme(getColorScheme());
}
// Add click handler to theme toggles
document.addEventListener('DOMContentLoaded', function() {
const themeToggles = document.querySelectorAll('.gh-theme-toggle');
themeToggles.forEach(toggle => {
toggle.addEventListener('click', function() {
if (themeSetting === 'user') {
toggleTheme();
}
});
});
});
// Listen for changes in system color scheme
if (themeSetting === 'system') {
window.matchMedia('(prefers-color-scheme: dark)').addListener((e) => {
setTheme(e.matches ? 'dark' : 'light');
});
}
</script>
<meta name="description" content="Thoughts, stories and ideas.">
<link rel="canonical" href="https://www.drewbell.net/">
<meta name="referrer" content="no-referrer-when-downgrade">
<meta property="og:site_name" content="Drew Bell">
<meta property="og:type" content="website">
<meta property="og:title" content="Drew Bell">
<meta property="og:description" content="Thoughts, stories and ideas.">
<meta property="og:url" content="https://www.drewbell.net/">
<meta property="og:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta property="article:publisher" content="https://www.facebook.com/ghost">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Drew Bell">
<meta name="twitter:description" content="Thoughts, stories and ideas.">
<meta name="twitter:url" content="https://www.drewbell.net/">
<meta name="twitter:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta name="twitter:site" content="@ghost">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" conte
Open service 2a04:4e42:600::347:80 · www.drewbell.net
2025-12-19 14:05
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://www.drewbell.net/ Accept-Ranges: bytes Date: Fri, 19 Dec 2025 14:05:25 GMT X-Served-By: cache-lga21963-LGA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1766153125.397718,VS0,VE192 X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 2a04:4e42::347:443 · www.drewbell.net
2025-12-19 14:05
HTTP/1.1 200 OK
Connection: close
Content-Length: 17846
etag: W/"45b6-gT9L4anLSYxV5H7Eiptqb6Ru7gw"
x-content-type-options: nosniff
content-type: text/html; charset=utf-8
cache-control: public, max-age=0
Accept-Ranges: bytes
Date: Fri, 19 Dec 2025 14:05:25 GMT
Age: 0
X-Served-By: cache-ams2100122-AMS, cache-ams2100124-AMS, cache-lcy-egml8630028-LCY
X-Cache: MISS, MISS, HIT
X-Cache-Hits: 0, 0, 1
Vary: Accept-Encoding
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Page title: Drew Bell
<!DOCTYPE html>
<html lang="en" class="is-color-default">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Drew Bell</title>
<link rel="preload" as="style" href="/assets/built/screen.css?v=21178adbca">
<link rel="preload" as="script" href="/assets/built/main.min.js?v=21178adbca">
<link rel="stylesheet" type="text/css" href="/assets/built/screen.css?v=21178adbca">
<script>
// Function to set the theme
function setTheme(theme) {
document.documentElement.setAttribute('data-theme', theme);
localStorage.setItem('theme', theme);
updateThemeToggleIcon(theme);
}
// Function to get the user's color scheme preference
function getColorScheme() {
return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}
// Function to update theme toggle icon
function updateThemeToggleIcon(theme) {
const toggle = document.querySelector('.gh-theme-toggle');
if (toggle) {
toggle.setAttribute('data-theme', theme);
}
}
// Function to toggle theme
function toggleTheme() {
const currentTheme = document.documentElement.getAttribute('data-theme');
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
setTheme(newTheme);
}
// Get the theme setting from Ghost
var themeSetting = 'system';
var savedTheme = localStorage.getItem('theme');
// Initialize theme based on settings
if (themeSetting === 'user') {
// Use saved preference if available, otherwise system preference
if (savedTheme) {
setTheme(savedTheme);
} else {
setTheme(getColorScheme());
}
} else if (themeSetting === 'light') {
setTheme('light');
} else if (themeSetting === 'dark') {
setTheme('dark');
} else if (themeSetting === 'system') {
setTheme(getColorScheme());
}
// Add click handler to theme toggles
document.addEventListener('DOMContentLoaded', function() {
const themeToggles = document.querySelectorAll('.gh-theme-toggle');
themeToggles.forEach(toggle => {
toggle.addEventListener('click', function() {
if (themeSetting === 'user') {
toggleTheme();
}
});
});
});
// Listen for changes in system color scheme
if (themeSetting === 'system') {
window.matchMedia('(prefers-color-scheme: dark)').addListener((e) => {
setTheme(e.matches ? 'dark' : 'light');
});
}
</script>
<meta name="description" content="Thoughts, stories and ideas.">
<link rel="canonical" href="https://www.drewbell.net/">
<meta name="referrer" content="no-referrer-when-downgrade">
<meta property="og:site_name" content="Drew Bell">
<meta property="og:type" content="website">
<meta property="og:title" content="Drew Bell">
<meta property="og:description" content="Thoughts, stories and ideas.">
<meta property="og:url" content="https://www.drewbell.net/">
<meta property="og:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta property="article:publisher" content="https://www.facebook.com/ghost">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Drew Bell">
<meta name="twitter:description" content="Thoughts, stories and ideas.">
<meta name="twitter:url" content="https://www.drewbell.net/">
<meta name="twitter:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta name="twitter:site" content="@ghost">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" conte
Open service 2a04:4e42::347:443 · drewbell.net
2025-12-19 14:05
HTTP/1.1 200 OK
Connection: close
Content-Length: 17846
etag: W/"45b6-gT9L4anLSYxV5H7Eiptqb6Ru7gw"
x-content-type-options: nosniff
content-type: text/html; charset=utf-8
cache-control: public, max-age=0
Accept-Ranges: bytes
Date: Fri, 19 Dec 2025 14:05:25 GMT
Age: 0
X-Served-By: cache-ams2100128-AMS, cache-ams21023-AMS, cache-sin-wsat1880098-SIN
X-Cache: MISS, MISS, HIT
X-Cache-Hits: 0, 0, 1
Vary: Accept-Encoding
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Page title: Drew Bell
<!DOCTYPE html>
<html lang="en" class="is-color-default">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Drew Bell</title>
<link rel="preload" as="style" href="/assets/built/screen.css?v=21178adbca">
<link rel="preload" as="script" href="/assets/built/main.min.js?v=21178adbca">
<link rel="stylesheet" type="text/css" href="/assets/built/screen.css?v=21178adbca">
<script>
// Function to set the theme
function setTheme(theme) {
document.documentElement.setAttribute('data-theme', theme);
localStorage.setItem('theme', theme);
updateThemeToggleIcon(theme);
}
// Function to get the user's color scheme preference
function getColorScheme() {
return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}
// Function to update theme toggle icon
function updateThemeToggleIcon(theme) {
const toggle = document.querySelector('.gh-theme-toggle');
if (toggle) {
toggle.setAttribute('data-theme', theme);
}
}
// Function to toggle theme
function toggleTheme() {
const currentTheme = document.documentElement.getAttribute('data-theme');
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
setTheme(newTheme);
}
// Get the theme setting from Ghost
var themeSetting = 'system';
var savedTheme = localStorage.getItem('theme');
// Initialize theme based on settings
if (themeSetting === 'user') {
// Use saved preference if available, otherwise system preference
if (savedTheme) {
setTheme(savedTheme);
} else {
setTheme(getColorScheme());
}
} else if (themeSetting === 'light') {
setTheme('light');
} else if (themeSetting === 'dark') {
setTheme('dark');
} else if (themeSetting === 'system') {
setTheme(getColorScheme());
}
// Add click handler to theme toggles
document.addEventListener('DOMContentLoaded', function() {
const themeToggles = document.querySelectorAll('.gh-theme-toggle');
themeToggles.forEach(toggle => {
toggle.addEventListener('click', function() {
if (themeSetting === 'user') {
toggleTheme();
}
});
});
});
// Listen for changes in system color scheme
if (themeSetting === 'system') {
window.matchMedia('(prefers-color-scheme: dark)').addListener((e) => {
setTheme(e.matches ? 'dark' : 'light');
});
}
</script>
<meta name="description" content="Thoughts, stories and ideas.">
<link rel="canonical" href="https://www.drewbell.net/">
<meta name="referrer" content="no-referrer-when-downgrade">
<meta property="og:site_name" content="Drew Bell">
<meta property="og:type" content="website">
<meta property="og:title" content="Drew Bell">
<meta property="og:description" content="Thoughts, stories and ideas.">
<meta property="og:url" content="https://www.drewbell.net/">
<meta property="og:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta property="article:publisher" content="https://www.facebook.com/ghost">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Drew Bell">
<meta name="twitter:description" content="Thoughts, stories and ideas.">
<meta name="twitter:url" content="https://www.drewbell.net/">
<meta name="twitter:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta name="twitter:site" content="@ghost">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" conte
Open service 2a04:4e42::347:80 · drewbell.net
2025-12-19 14:05
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://drewbell.net/ Accept-Ranges: bytes Date: Fri, 19 Dec 2025 14:05:25 GMT X-Served-By: cache-lga21979-LGA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1766153125.146239,VS0,VE294 X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 2a04:4e42::347:80 · www.drewbell.net
2025-12-19 14:05
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://www.drewbell.net/ Accept-Ranges: bytes Date: Fri, 19 Dec 2025 14:05:25 GMT X-Served-By: cache-lga21920-LGA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1766153125.210580,VS0,VE1 X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 151.101.65.91:80 · drewbell.net
2025-12-19 14:05
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://drewbell.net/ Accept-Ranges: bytes Date: Fri, 19 Dec 2025 14:05:25 GMT X-Served-By: cache-sin-wsat1880043-SIN X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1766153125.118180,VS0,VE1 X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 151.101.129.91:80 · drewbell.net
2025-12-19 14:05
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://drewbell.net/ Accept-Ranges: bytes Date: Fri, 19 Dec 2025 14:05:25 GMT X-Served-By: cache-sin-wsss1830042-SIN X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1766153125.180597,VS0,VE7 X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 2a04:4e42:200::347:80 · www.drewbell.net
2025-12-19 14:05
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://www.drewbell.net/ Accept-Ranges: bytes Date: Fri, 19 Dec 2025 14:05:25 GMT X-Served-By: cache-vie6327-VIE X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1766153125.136537,VS0,VE59 X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 2a04:4e42:200::347:80 · drewbell.net
2025-12-19 14:05
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://drewbell.net/ Accept-Ranges: bytes Date: Fri, 19 Dec 2025 14:05:25 GMT X-Served-By: cache-fra-eddf8230162-FRA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1766153125.096551,VS0,VE3 X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 2a04:4e42:400::347:80 · drewbell.net
2025-12-19 14:05
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://drewbell.net/ Accept-Ranges: bytes Date: Fri, 19 Dec 2025 14:05:25 GMT X-Served-By: cache-yyz4557-YYZ X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1766153125.080781,VS0,VE2 X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 151.101.65.91:443 · www.drewbell.net
2025-12-19 14:05
HTTP/1.1 200 OK
Connection: close
set-cookie: _fs_ch_st_FSBmUei20MqUiJb9=AeCmdvUSAgAMkEw_EySNbDTuMZZG2CYAkmVtxASGsNEjc-6ksINg9ScK8euiAizwgUFLlPXjCPQsQGCgY6cMRLZ6zBkGqFn8TwL1coPKdGr47SIGcTkKTeWypANdY6wb92bIuI0hX5OxJPo7xYiRxIf_SuCSZlTv8FZBiqaDODR_tYases2hs-4p4iIkEs0shqbaEtRBdE3GU87G9GzDZ6ulik8KyzZw4FC0cha675RGfSxIdMneEJq6pnVGyAJqvcq97_AY0FW0Zkpwbc_PRdfb682KQ67bdZcvWLCR5WkeLkvGLTq6AvVijh2Ousv_B4izFYOFl2N__a7lm2w4j9Zx3H6CWvalHNcE0ZudZguyqynbYDdpC35Qpu8SlZ5ls7wg5h67lE8gIzj_ZWaU; Max-Age=10; HttpOnly; Path=/
content-type: text/html; charset=utf-8
cache-control: private, no-store
Accept-Ranges: bytes
Date: Fri, 19 Dec 2025 14:05:25 GMT
X-Served-By: cache-ams2100147-AMS, cache-ams21035-AMS, cache-fra-eddf8230176-FRA
X-Cache: MISS, MISS
X-Cache-Hits: 0, 0
Vary: Accept-Encoding
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
transfer-encoding: chunked
Page title: Client Challenge
<!DOCTYPE html>
<html lang="en">
<head>
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; img-src 'self' data:; media-src 'self' data:; object-src 'none'; style-src 'self' 'sha256-o4vzfmmUENEg4chMjjRP9EuW9ucGnGIGVdbl8d0SHQQ='; script-src 'self' 'sha256-KXex2o39zxtnzVWK4H5rW07g2+BlwSPtn+aguzsWkNg=';"
/>
<link
href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/inter-var.woff2"
rel="preload"
as="font"
type="font/woff2"
crossorigin
/>
<link href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/styles.css" rel="stylesheet" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Client Challenge</title>
<style>
#loading-error {
font-size: 16px;
font-family: 'Inter', sans-serif;
margin-top: 10px;
margin-left: 10px;
display: none;
}
</style>
</head>
<body>
<noscript>
<div class="noscript-container">
<div class="noscript-content">
<img
src="/_fs-ch-1T1wmsGaOgGaSxcX/assets/errorIcon.svg"
alt=""
role="presentation"
class="error-icon"
/>
<span class="noscript-span"
>JavaScript is disabled in your browser.</span
>
<p>Please enable JavaScript to proceed.</p>
</div>
</div>
</noscript>
<div id="loading-error" role="alert" aria-live="polite">
A required part of this site couldn’t load. This may be due to a browser
extension, network issues, or browser settings. Please check your
connection, disable any ad blockers, or try using a different browser.
</div>
<script>
function loadScript(src) {
return new Promise((resolve, reject) => {
const script = document.createElement('script');
script.onload = resolve;
script.onerror = (event) => {
console.error('Script load error event:', event);
document.getElementById('loading-error').style.display = 'block';
loadingError.setAttribute('aria-hidden', 'false');
reject(
new Error(
`Failed to load script: ${src}, Please contact the service administrator.`
)
);
};
script.src = src;
document.body.appendChild(script);
});
}
loadScript('/_fs-ch-1T1wmsGaOgGaSxcX/errors.js')
.then(() => {
const script = document.createElement('script');
script.src = '/_fs-ch-1T1wmsGaOgGaSxcX/script.js?reload=true';
script.onerror = (event) => {
console.error('Script load error event:', event);
const errorMsg = new Error(
`Failed to load script: ${script.src}. Please contact the service administrator.`
);
console.error(errorMsg);
handleScriptError();
};
document.body.appendChild(script);
})
.catch((error) => {
console.error(error);
});
</script>
</body>
</html>
Open service 2a04:4e42:400::347:443 · drewbell.net
2025-12-19 14:05
HTTP/1.1 200 OK
Connection: close
Content-Length: 17846
etag: W/"45b6-gT9L4anLSYxV5H7Eiptqb6Ru7gw"
x-content-type-options: nosniff
content-type: text/html; charset=utf-8
cache-control: public, max-age=0
Accept-Ranges: bytes
Age: 0
Date: Fri, 19 Dec 2025 14:05:26 GMT
X-Served-By: cache-ams2100122-AMS, cache-ams21023-AMS, cache-sjc1000128-SJC
X-Cache: MISS, MISS, MISS
X-Cache-Hits: 0, 0, 0
Vary: Accept-Encoding
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Page title: Drew Bell
<!DOCTYPE html>
<html lang="en" class="is-color-default">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Drew Bell</title>
<link rel="preload" as="style" href="/assets/built/screen.css?v=21178adbca">
<link rel="preload" as="script" href="/assets/built/main.min.js?v=21178adbca">
<link rel="stylesheet" type="text/css" href="/assets/built/screen.css?v=21178adbca">
<script>
// Function to set the theme
function setTheme(theme) {
document.documentElement.setAttribute('data-theme', theme);
localStorage.setItem('theme', theme);
updateThemeToggleIcon(theme);
}
// Function to get the user's color scheme preference
function getColorScheme() {
return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}
// Function to update theme toggle icon
function updateThemeToggleIcon(theme) {
const toggle = document.querySelector('.gh-theme-toggle');
if (toggle) {
toggle.setAttribute('data-theme', theme);
}
}
// Function to toggle theme
function toggleTheme() {
const currentTheme = document.documentElement.getAttribute('data-theme');
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
setTheme(newTheme);
}
// Get the theme setting from Ghost
var themeSetting = 'system';
var savedTheme = localStorage.getItem('theme');
// Initialize theme based on settings
if (themeSetting === 'user') {
// Use saved preference if available, otherwise system preference
if (savedTheme) {
setTheme(savedTheme);
} else {
setTheme(getColorScheme());
}
} else if (themeSetting === 'light') {
setTheme('light');
} else if (themeSetting === 'dark') {
setTheme('dark');
} else if (themeSetting === 'system') {
setTheme(getColorScheme());
}
// Add click handler to theme toggles
document.addEventListener('DOMContentLoaded', function() {
const themeToggles = document.querySelectorAll('.gh-theme-toggle');
themeToggles.forEach(toggle => {
toggle.addEventListener('click', function() {
if (themeSetting === 'user') {
toggleTheme();
}
});
});
});
// Listen for changes in system color scheme
if (themeSetting === 'system') {
window.matchMedia('(prefers-color-scheme: dark)').addListener((e) => {
setTheme(e.matches ? 'dark' : 'light');
});
}
</script>
<meta name="description" content="Thoughts, stories and ideas.">
<link rel="canonical" href="https://www.drewbell.net/">
<meta name="referrer" content="no-referrer-when-downgrade">
<meta property="og:site_name" content="Drew Bell">
<meta property="og:type" content="website">
<meta property="og:title" content="Drew Bell">
<meta property="og:description" content="Thoughts, stories and ideas.">
<meta property="og:url" content="https://www.drewbell.net/">
<meta property="og:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta property="article:publisher" content="https://www.facebook.com/ghost">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Drew Bell">
<meta name="twitter:description" content="Thoughts, stories and ideas.">
<meta name="twitter:url" content="https://www.drewbell.net/">
<meta name="twitter:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta name="twitter:site" content="@ghost">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" conte
Open service 2a04:4e42:600::347:80 · drewbell.net
2025-12-19 14:05
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://drewbell.net/ Accept-Ranges: bytes Date: Fri, 19 Dec 2025 14:05:25 GMT X-Served-By: cache-fra-eddf8230030-FRA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1766153125.133613,VS0,VE92 X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 151.101.1.91:443 · www.drewbell.net
2025-12-19 14:05
HTTP/1.1 200 OK
Connection: close
set-cookie: _fs_ch_st_FSBmUei20MqUiJb9=AcR-c7a5iDcy5rJ1BBLSIOKdVGm3mpZKFTUDhYn9dsGqU4LMNJ-4pXQ3eRSfR3lhvflBj9l5vN6UYbCOMxokIndgQwIP7EssXDrlzo8FJYiCwjXTTQN5jeRoW3C-NPAMR4vTma4bo90sIibb3NnQwJfRbD5qQptgFaecOOF2GHDxZVAZ1eBAuLYURWiiVaqCpaFrUFstuPZr3w28w6m3fxbHGbXbvBKgotRfSl31MiuO_jR7e_IzQZMdresJrUSZEyS1lHBLX9svbpPmtLOt3X_GYbwMpjiSpkW2KV30m4LsPcV1OfFfyRpKN_NVruv-o7vvahjk9twQ6woTwPQ4Nnpzq8txikhpVLsuAf_RAZe8wDcU1ErBO2TRd65jPLjAm7iJFgEEkbIcQ3-KSw==; Max-Age=10; HttpOnly; Path=/
content-type: text/html; charset=utf-8
cache-control: private, no-store
Accept-Ranges: bytes
Date: Fri, 19 Dec 2025 14:05:25 GMT
X-Served-By: cache-ams2100128-AMS, cache-ams2100102-AMS, cache-fra-eddf8230161-FRA
X-Cache: MISS, MISS
X-Cache-Hits: 0, 0
Vary: Accept-Encoding
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
transfer-encoding: chunked
Page title: Client Challenge
<!DOCTYPE html>
<html lang="en">
<head>
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; img-src 'self' data:; media-src 'self' data:; object-src 'none'; style-src 'self' 'sha256-o4vzfmmUENEg4chMjjRP9EuW9ucGnGIGVdbl8d0SHQQ='; script-src 'self' 'sha256-KXex2o39zxtnzVWK4H5rW07g2+BlwSPtn+aguzsWkNg=';"
/>
<link
href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/inter-var.woff2"
rel="preload"
as="font"
type="font/woff2"
crossorigin
/>
<link href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/styles.css" rel="stylesheet" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Client Challenge</title>
<style>
#loading-error {
font-size: 16px;
font-family: 'Inter', sans-serif;
margin-top: 10px;
margin-left: 10px;
display: none;
}
</style>
</head>
<body>
<noscript>
<div class="noscript-container">
<div class="noscript-content">
<img
src="/_fs-ch-1T1wmsGaOgGaSxcX/assets/errorIcon.svg"
alt=""
role="presentation"
class="error-icon"
/>
<span class="noscript-span"
>JavaScript is disabled in your browser.</span
>
<p>Please enable JavaScript to proceed.</p>
</div>
</div>
</noscript>
<div id="loading-error" role="alert" aria-live="polite">
A required part of this site couldn’t load. This may be due to a browser
extension, network issues, or browser settings. Please check your
connection, disable any ad blockers, or try using a different browser.
</div>
<script>
function loadScript(src) {
return new Promise((resolve, reject) => {
const script = document.createElement('script');
script.onload = resolve;
script.onerror = (event) => {
console.error('Script load error event:', event);
document.getElementById('loading-error').style.display = 'block';
loadingError.setAttribute('aria-hidden', 'false');
reject(
new Error(
`Failed to load script: ${src}, Please contact the service administrator.`
)
);
};
script.src = src;
document.body.appendChild(script);
});
}
loadScript('/_fs-ch-1T1wmsGaOgGaSxcX/errors.js')
.then(() => {
const script = document.createElement('script');
script.src = '/_fs-ch-1T1wmsGaOgGaSxcX/script.js?reload=true';
script.onerror = (event) => {
console.error('Script load error event:', event);
const errorMsg = new Error(
`Failed to load script: ${script.src}. Please contact the service administrator.`
);
console.error(errorMsg);
handleScriptError();
};
document.body.appendChild(script);
})
.catch((error) => {
console.error(error);
});
</script>
</body>
</html>
Open service 151.101.129.91:443 · www.drewbell.net
2025-12-19 14:05
HTTP/1.1 200 OK
Connection: close
set-cookie: _fs_ch_st_FSBmUei20MqUiJb9=Ae2TJji3abdXFfQcCfXpUA9QHzDUNhFD74DT3xa6q72E6FrdaaGdV41rD1mmrq1hszsl0xeom61eCTGyMiWizsTEH9oKQ9n_htx-4IcdKjpaDTineRSv-Cg77j-f6Cn9Rkuzhrzq-9mzBkW9DuUkeRqGxNNzF8GYS5_JyDb6arp_aHzOPn0Ldq-uCoxGDU2a_jjLVsjml8f7rN73bov1ZY-Xfpv9n_3OG_urE5XF8cjobRNdtHUfZ5WlIgk6zIzWW3nWvKkDCu2_qtB8S_kQbIVeqmdS0zRCym6QzOy_6_dd60jOEai-lYhdK_Qz5M-SA7G046tj3rqEGimBI5SWknpv_WH6pAgyvuuYkb3TN8zVmkG1M--qx8XGlKdBPi0ZtjyrbDmpPgPL6NWn; Max-Age=10; HttpOnly; Path=/
content-type: text/html; charset=utf-8
cache-control: private, no-store
Accept-Ranges: bytes
Date: Fri, 19 Dec 2025 14:05:25 GMT
X-Served-By: cache-ams2100104-AMS, cache-ams21062-AMS, cache-fra-eddf8230130-FRA
X-Cache: MISS, MISS
X-Cache-Hits: 0, 0
Vary: Accept-Encoding
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
transfer-encoding: chunked
Page title: Client Challenge
<!DOCTYPE html>
<html lang="en">
<head>
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; img-src 'self' data:; media-src 'self' data:; object-src 'none'; style-src 'self' 'sha256-o4vzfmmUENEg4chMjjRP9EuW9ucGnGIGVdbl8d0SHQQ='; script-src 'self' 'sha256-KXex2o39zxtnzVWK4H5rW07g2+BlwSPtn+aguzsWkNg=';"
/>
<link
href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/inter-var.woff2"
rel="preload"
as="font"
type="font/woff2"
crossorigin
/>
<link href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/styles.css" rel="stylesheet" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Client Challenge</title>
<style>
#loading-error {
font-size: 16px;
font-family: 'Inter', sans-serif;
margin-top: 10px;
margin-left: 10px;
display: none;
}
</style>
</head>
<body>
<noscript>
<div class="noscript-container">
<div class="noscript-content">
<img
src="/_fs-ch-1T1wmsGaOgGaSxcX/assets/errorIcon.svg"
alt=""
role="presentation"
class="error-icon"
/>
<span class="noscript-span"
>JavaScript is disabled in your browser.</span
>
<p>Please enable JavaScript to proceed.</p>
</div>
</div>
</noscript>
<div id="loading-error" role="alert" aria-live="polite">
A required part of this site couldn’t load. This may be due to a browser
extension, network issues, or browser settings. Please check your
connection, disable any ad blockers, or try using a different browser.
</div>
<script>
function loadScript(src) {
return new Promise((resolve, reject) => {
const script = document.createElement('script');
script.onload = resolve;
script.onerror = (event) => {
console.error('Script load error event:', event);
document.getElementById('loading-error').style.display = 'block';
loadingError.setAttribute('aria-hidden', 'false');
reject(
new Error(
`Failed to load script: ${src}, Please contact the service administrator.`
)
);
};
script.src = src;
document.body.appendChild(script);
});
}
loadScript('/_fs-ch-1T1wmsGaOgGaSxcX/errors.js')
.then(() => {
const script = document.createElement('script');
script.src = '/_fs-ch-1T1wmsGaOgGaSxcX/script.js?reload=true';
script.onerror = (event) => {
console.error('Script load error event:', event);
const errorMsg = new Error(
`Failed to load script: ${script.src}. Please contact the service administrator.`
);
console.error(errorMsg);
handleScriptError();
};
document.body.appendChild(script);
})
.catch((error) => {
console.error(error);
});
</script>
</body>
</html>
Open service 151.101.1.91:80 · drewbell.net
2025-12-19 14:05
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://drewbell.net/ Accept-Ranges: bytes Date: Fri, 19 Dec 2025 14:05:25 GMT X-Served-By: cache-fra-eddf8230100-FRA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1766153125.016502,VS0,VE70 X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 2a04:4e42:600::347:443 · drewbell.net
2025-12-19 14:05
HTTP/1.1 200 OK
Connection: close
Content-Length: 17846
content-type: text/html; charset=utf-8
etag: W/"45b6-gT9L4anLSYxV5H7Eiptqb6Ru7gw"
cache-control: public, max-age=0
x-content-type-options: nosniff
Accept-Ranges: bytes
Date: Fri, 19 Dec 2025 14:05:25 GMT
X-Served-By: cache-ams2100106-AMS, cache-ams2100100-AMS, cache-vie6358-VIE
X-Cache: MISS, MISS, MISS
X-Cache-Hits: 0, 0, 0
Vary: Accept-Encoding
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Page title: Drew Bell
<!DOCTYPE html>
<html lang="en" class="is-color-default">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Drew Bell</title>
<link rel="preload" as="style" href="/assets/built/screen.css?v=21178adbca">
<link rel="preload" as="script" href="/assets/built/main.min.js?v=21178adbca">
<link rel="stylesheet" type="text/css" href="/assets/built/screen.css?v=21178adbca">
<script>
// Function to set the theme
function setTheme(theme) {
document.documentElement.setAttribute('data-theme', theme);
localStorage.setItem('theme', theme);
updateThemeToggleIcon(theme);
}
// Function to get the user's color scheme preference
function getColorScheme() {
return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}
// Function to update theme toggle icon
function updateThemeToggleIcon(theme) {
const toggle = document.querySelector('.gh-theme-toggle');
if (toggle) {
toggle.setAttribute('data-theme', theme);
}
}
// Function to toggle theme
function toggleTheme() {
const currentTheme = document.documentElement.getAttribute('data-theme');
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
setTheme(newTheme);
}
// Get the theme setting from Ghost
var themeSetting = 'system';
var savedTheme = localStorage.getItem('theme');
// Initialize theme based on settings
if (themeSetting === 'user') {
// Use saved preference if available, otherwise system preference
if (savedTheme) {
setTheme(savedTheme);
} else {
setTheme(getColorScheme());
}
} else if (themeSetting === 'light') {
setTheme('light');
} else if (themeSetting === 'dark') {
setTheme('dark');
} else if (themeSetting === 'system') {
setTheme(getColorScheme());
}
// Add click handler to theme toggles
document.addEventListener('DOMContentLoaded', function() {
const themeToggles = document.querySelectorAll('.gh-theme-toggle');
themeToggles.forEach(toggle => {
toggle.addEventListener('click', function() {
if (themeSetting === 'user') {
toggleTheme();
}
});
});
});
// Listen for changes in system color scheme
if (themeSetting === 'system') {
window.matchMedia('(prefers-color-scheme: dark)').addListener((e) => {
setTheme(e.matches ? 'dark' : 'light');
});
}
</script>
<meta name="description" content="Thoughts, stories and ideas.">
<link rel="canonical" href="https://www.drewbell.net/">
<meta name="referrer" content="no-referrer-when-downgrade">
<meta property="og:site_name" content="Drew Bell">
<meta property="og:type" content="website">
<meta property="og:title" content="Drew Bell">
<meta property="og:description" content="Thoughts, stories and ideas.">
<meta property="og:url" content="https://www.drewbell.net/">
<meta property="og:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta property="article:publisher" content="https://www.facebook.com/ghost">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Drew Bell">
<meta name="twitter:description" content="Thoughts, stories and ideas.">
<meta name="twitter:url" content="https://www.drewbell.net/">
<meta name="twitter:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta name="twitter:site" content="@ghost">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" conte
Open service 151.101.193.91:443 · drewbell.net
2025-12-19 14:05
HTTP/1.1 200 OK
Connection: close
set-cookie: _fs_ch_st_FSBmUei20MqUiJb9=AQIp01HFzwb573kuNIHK8gje6IQMPzEB32jlPBNv4iYLAwChJ_Rrp2UylTt30n2F0jk1za1GIof34EPzPGPaaaobo23zfsW3ivrdo4W_qHZvQvhIKW2FOrBzbC1yn1vVE1Zc_-V7gfDy_9hFi1tn429SLPcePkbAByRAr_HvNqVljyrwGqRWrRcNXMmz3UGSSvzjsftFIDYvFQ9TBNAJsDNTBmDBegvH45iSoYxAP6iwpoTa3GCH2Or0pvfjnHCEYiDfTyCrMPWIyd9LsEzLsSPJ_kEV0JCbzzHykG1MUQ6jB6zV4bNr4DhhR_RNrx_we6kAhioc9Kjh_q4lAZFefEpvH_nxvVLK1yDmHoVK3ZOnHGd0ZnOdHH97PGM3PHBdUaZM-rM3shBuVscHbsAM; Max-Age=10; HttpOnly; Path=/
content-type: text/html; charset=utf-8
cache-control: private, no-store
Accept-Ranges: bytes
Date: Fri, 19 Dec 2025 14:05:25 GMT
X-Served-By: cache-ams21027-AMS, cache-ams2100089-AMS, cache-fra-eddf8230120-FRA
X-Cache: MISS, MISS
X-Cache-Hits: 0, 0
Vary: Accept-Encoding
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
transfer-encoding: chunked
Page title: Client Challenge
<!DOCTYPE html>
<html lang="en">
<head>
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; img-src 'self' data:; media-src 'self' data:; object-src 'none'; style-src 'self' 'sha256-o4vzfmmUENEg4chMjjRP9EuW9ucGnGIGVdbl8d0SHQQ='; script-src 'self' 'sha256-KXex2o39zxtnzVWK4H5rW07g2+BlwSPtn+aguzsWkNg=';"
/>
<link
href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/inter-var.woff2"
rel="preload"
as="font"
type="font/woff2"
crossorigin
/>
<link href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/styles.css" rel="stylesheet" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Client Challenge</title>
<style>
#loading-error {
font-size: 16px;
font-family: 'Inter', sans-serif;
margin-top: 10px;
margin-left: 10px;
display: none;
}
</style>
</head>
<body>
<noscript>
<div class="noscript-container">
<div class="noscript-content">
<img
src="/_fs-ch-1T1wmsGaOgGaSxcX/assets/errorIcon.svg"
alt=""
role="presentation"
class="error-icon"
/>
<span class="noscript-span"
>JavaScript is disabled in your browser.</span
>
<p>Please enable JavaScript to proceed.</p>
</div>
</div>
</noscript>
<div id="loading-error" role="alert" aria-live="polite">
A required part of this site couldn’t load. This may be due to a browser
extension, network issues, or browser settings. Please check your
connection, disable any ad blockers, or try using a different browser.
</div>
<script>
function loadScript(src) {
return new Promise((resolve, reject) => {
const script = document.createElement('script');
script.onload = resolve;
script.onerror = (event) => {
console.error('Script load error event:', event);
document.getElementById('loading-error').style.display = 'block';
loadingError.setAttribute('aria-hidden', 'false');
reject(
new Error(
`Failed to load script: ${src}, Please contact the service administrator.`
)
);
};
script.src = src;
document.body.appendChild(script);
});
}
loadScript('/_fs-ch-1T1wmsGaOgGaSxcX/errors.js')
.then(() => {
const script = document.createElement('script');
script.src = '/_fs-ch-1T1wmsGaOgGaSxcX/script.js?reload=true';
script.onerror = (event) => {
console.error('Script load error event:', event);
const errorMsg = new Error(
`Failed to load script: ${script.src}. Please contact the service administrator.`
);
console.error(errorMsg);
handleScriptError();
};
document.body.appendChild(script);
})
.catch((error) => {
console.error(error);
});
</script>
</body>
</html>
Open service 151.101.129.91:443 · drewbell.net
2025-12-19 14:05
HTTP/1.1 200 OK
Connection: close
set-cookie: _fs_ch_st_FSBmUei20MqUiJb9=AXlsdtyCeLV_uIehAM2vgBQ2sZHfG6ziRjmohE7aNBxmFS2N2TVWtYY-o23a67aRCnlrcfq5A10NrTcQdsT2YcgPuU9AkswHEfvEBLb9P0jVRys-voLkLqmsHzoaPz2buHwZugUStpiyItnc9FxzdxV7IPJjYSyFP5wvuhGM-3TUphHjqSrUuxcEGlE2HOjh1NR_fmaRW3qBiVe9G4kxyA12UtMopAgHm96sh2ve3gxVzm4Pix-S0o6iZuV317KacJMMlK0TNziPZxLAuL9X6Yz19dkKmFXKdbB4g-yNrXaSD1jd92lakvwu0uYIfAUKcIQ0FMin2_zpc41YS7Dv1cAvNB89PFDbb_TEhRyx896qOP9YY2UKfEng1p6vNt5ByBRkVhlmXNk22JXTcp2s; Max-Age=10; HttpOnly; Path=/
content-type: text/html; charset=utf-8
cache-control: private, no-store
Accept-Ranges: bytes
Date: Fri, 19 Dec 2025 14:05:25 GMT
X-Served-By: cache-ams21062-AMS, cache-ams21051-AMS, cache-fra-eddf8230166-FRA
X-Cache: MISS, MISS
X-Cache-Hits: 0, 0
Vary: Accept-Encoding
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
transfer-encoding: chunked
Page title: Client Challenge
<!DOCTYPE html>
<html lang="en">
<head>
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; img-src 'self' data:; media-src 'self' data:; object-src 'none'; style-src 'self' 'sha256-o4vzfmmUENEg4chMjjRP9EuW9ucGnGIGVdbl8d0SHQQ='; script-src 'self' 'sha256-KXex2o39zxtnzVWK4H5rW07g2+BlwSPtn+aguzsWkNg=';"
/>
<link
href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/inter-var.woff2"
rel="preload"
as="font"
type="font/woff2"
crossorigin
/>
<link href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/styles.css" rel="stylesheet" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Client Challenge</title>
<style>
#loading-error {
font-size: 16px;
font-family: 'Inter', sans-serif;
margin-top: 10px;
margin-left: 10px;
display: none;
}
</style>
</head>
<body>
<noscript>
<div class="noscript-container">
<div class="noscript-content">
<img
src="/_fs-ch-1T1wmsGaOgGaSxcX/assets/errorIcon.svg"
alt=""
role="presentation"
class="error-icon"
/>
<span class="noscript-span"
>JavaScript is disabled in your browser.</span
>
<p>Please enable JavaScript to proceed.</p>
</div>
</div>
</noscript>
<div id="loading-error" role="alert" aria-live="polite">
A required part of this site couldn’t load. This may be due to a browser
extension, network issues, or browser settings. Please check your
connection, disable any ad blockers, or try using a different browser.
</div>
<script>
function loadScript(src) {
return new Promise((resolve, reject) => {
const script = document.createElement('script');
script.onload = resolve;
script.onerror = (event) => {
console.error('Script load error event:', event);
document.getElementById('loading-error').style.display = 'block';
loadingError.setAttribute('aria-hidden', 'false');
reject(
new Error(
`Failed to load script: ${src}, Please contact the service administrator.`
)
);
};
script.src = src;
document.body.appendChild(script);
});
}
loadScript('/_fs-ch-1T1wmsGaOgGaSxcX/errors.js')
.then(() => {
const script = document.createElement('script');
script.src = '/_fs-ch-1T1wmsGaOgGaSxcX/script.js?reload=true';
script.onerror = (event) => {
console.error('Script load error event:', event);
const errorMsg = new Error(
`Failed to load script: ${script.src}. Please contact the service administrator.`
);
console.error(errorMsg);
handleScriptError();
};
document.body.appendChild(script);
})
.catch((error) => {
console.error(error);
});
</script>
</body>
</html>
Open service 151.101.65.91:443 · drewbell.net
2025-12-19 14:05
HTTP/1.1 200 OK
Connection: close
set-cookie: _fs_ch_st_FSBmUei20MqUiJb9=AUbaEe23NjjsYsp_2vup5jL3dbd7S0HocSqJtNSx5Y3yb5FddkWQCCm1VB8OFDYxDjdLdV6JrGBO7z4favZCVq12e6pbwm9lDifHEny4TN9VpESaddnb18amMcPIWWAWP6aR4Kkv-K43GD3Sdj5O2lIdYDKFogstsWnefOYYzBV53e7m7kf46ChjLBU-VxLWu-c2SEhQY5neEgzOOWMt4Zu403xHrBUbApWVw6jSiNkzmCuiD-c_HXy2cfgROq95xqyjQs2593_v2b51zmFqlgo0lq1iNcux4099deBEJ6YLi-YCJmBZ9qiJTYGRIGeH9R3zGtyFmbWqOPZ1TvabMT4GG15sFoG4W4BNfb-mxWtVbRrpako-fvY_qGjVcyHh5VT4ucmfYFAub-dQCmTX; Max-Age=10; HttpOnly; Path=/
content-type: text/html; charset=utf-8
cache-control: private, no-store
Accept-Ranges: bytes
Date: Fri, 19 Dec 2025 14:05:25 GMT
X-Served-By: cache-ams21034-AMS, cache-ams21074-AMS, cache-vie6360-VIE
X-Cache: MISS, MISS
X-Cache-Hits: 0, 0
Vary: Accept-Encoding
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
transfer-encoding: chunked
Page title: Client Challenge
<!DOCTYPE html>
<html lang="en">
<head>
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; img-src 'self' data:; media-src 'self' data:; object-src 'none'; style-src 'self' 'sha256-o4vzfmmUENEg4chMjjRP9EuW9ucGnGIGVdbl8d0SHQQ='; script-src 'self' 'sha256-KXex2o39zxtnzVWK4H5rW07g2+BlwSPtn+aguzsWkNg=';"
/>
<link
href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/inter-var.woff2"
rel="preload"
as="font"
type="font/woff2"
crossorigin
/>
<link href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/styles.css" rel="stylesheet" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Client Challenge</title>
<style>
#loading-error {
font-size: 16px;
font-family: 'Inter', sans-serif;
margin-top: 10px;
margin-left: 10px;
display: none;
}
</style>
</head>
<body>
<noscript>
<div class="noscript-container">
<div class="noscript-content">
<img
src="/_fs-ch-1T1wmsGaOgGaSxcX/assets/errorIcon.svg"
alt=""
role="presentation"
class="error-icon"
/>
<span class="noscript-span"
>JavaScript is disabled in your browser.</span
>
<p>Please enable JavaScript to proceed.</p>
</div>
</div>
</noscript>
<div id="loading-error" role="alert" aria-live="polite">
A required part of this site couldn’t load. This may be due to a browser
extension, network issues, or browser settings. Please check your
connection, disable any ad blockers, or try using a different browser.
</div>
<script>
function loadScript(src) {
return new Promise((resolve, reject) => {
const script = document.createElement('script');
script.onload = resolve;
script.onerror = (event) => {
console.error('Script load error event:', event);
document.getElementById('loading-error').style.display = 'block';
loadingError.setAttribute('aria-hidden', 'false');
reject(
new Error(
`Failed to load script: ${src}, Please contact the service administrator.`
)
);
};
script.src = src;
document.body.appendChild(script);
});
}
loadScript('/_fs-ch-1T1wmsGaOgGaSxcX/errors.js')
.then(() => {
const script = document.createElement('script');
script.src = '/_fs-ch-1T1wmsGaOgGaSxcX/script.js?reload=true';
script.onerror = (event) => {
console.error('Script load error event:', event);
const errorMsg = new Error(
`Failed to load script: ${script.src}. Please contact the service administrator.`
);
console.error(errorMsg);
handleScriptError();
};
document.body.appendChild(script);
})
.catch((error) => {
console.error(error);
});
</script>
</body>
</html>
Open service 151.101.193.91:80 · www.drewbell.net
2025-12-19 14:05
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Retry-After: 0 Location: https://www.drewbell.net/ Accept-Ranges: bytes Date: Fri, 19 Dec 2025 14:05:25 GMT X-Served-By: cache-rtm-ehrd2290029-RTM X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1766153125.005369,VS0,VE1 X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1 Referrer-Policy: no-referrer-when-downgrade Expect-CT: enforce,max-age=30 Permissions-Policy: geolocation=(), camera=(), microphone=() Strict-Transport-Security: max-age=31557600 alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
Open service 151.101.1.91:443 · drewbell.net
2025-12-19 14:05
HTTP/1.1 200 OK
Connection: close
set-cookie: _fs_ch_st_FSBmUei20MqUiJb9=AaKiZOlx8TGiP-t-ITlokihhyOgogYGaB38xhiKEsFHuuTIbVweT9_wYI0RotuFjHa_J1EJwM_hMWzETF5pLHMVOWZXbUDbYm4onTMUbY48bg3qJaGXKSsqiWPlzpD0oHT0xx6Zg34A06gzEKezBq52YlhginC799xQozmhKQhEnVIWieAl_PLKHSaMtZSVZT8dsErgpJr3A7oN6NYuYgq-AqS-ar-uDAsjC63t3Bb-Z4IjT_PQukvG-O1jOM2Wxlmpjui6tmXU0fIlhYRCke96Xi4k2cfBY-s01qz1sDInvpiZdQk1p8h0881pOnFFWJTvsBk_qt1O3U4KuYM8XJok6kBO2YtSmyj3l6BiQ830hQyh1XGz9S2surYHHfgL8Q1rHw6gW_DlyNyrhXw==; Max-Age=10; HttpOnly; Path=/
content-type: text/html; charset=utf-8
cache-control: private, no-store
Accept-Ranges: bytes
Date: Fri, 19 Dec 2025 14:05:25 GMT
X-Served-By: cache-ams2100120-AMS, cache-ams21073-AMS, cache-fra-eddf8230034-FRA
X-Cache: MISS, MISS
X-Cache-Hits: 0, 0
Vary: Accept-Encoding
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1
Referrer-Policy: no-referrer-when-downgrade
Expect-CT: enforce,max-age=30
Permissions-Policy: geolocation=(), camera=(), microphone=()
Strict-Transport-Security: max-age=31557600
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
transfer-encoding: chunked
Page title: Client Challenge
<!DOCTYPE html>
<html lang="en">
<head>
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; img-src 'self' data:; media-src 'self' data:; object-src 'none'; style-src 'self' 'sha256-o4vzfmmUENEg4chMjjRP9EuW9ucGnGIGVdbl8d0SHQQ='; script-src 'self' 'sha256-KXex2o39zxtnzVWK4H5rW07g2+BlwSPtn+aguzsWkNg=';"
/>
<link
href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/inter-var.woff2"
rel="preload"
as="font"
type="font/woff2"
crossorigin
/>
<link href="/_fs-ch-1T1wmsGaOgGaSxcX/assets/styles.css" rel="stylesheet" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Client Challenge</title>
<style>
#loading-error {
font-size: 16px;
font-family: 'Inter', sans-serif;
margin-top: 10px;
margin-left: 10px;
display: none;
}
</style>
</head>
<body>
<noscript>
<div class="noscript-container">
<div class="noscript-content">
<img
src="/_fs-ch-1T1wmsGaOgGaSxcX/assets/errorIcon.svg"
alt=""
role="presentation"
class="error-icon"
/>
<span class="noscript-span"
>JavaScript is disabled in your browser.</span
>
<p>Please enable JavaScript to proceed.</p>
</div>
</div>
</noscript>
<div id="loading-error" role="alert" aria-live="polite">
A required part of this site couldn’t load. This may be due to a browser
extension, network issues, or browser settings. Please check your
connection, disable any ad blockers, or try using a different browser.
</div>
<script>
function loadScript(src) {
return new Promise((resolve, reject) => {
const script = document.createElement('script');
script.onload = resolve;
script.onerror = (event) => {
console.error('Script load error event:', event);
document.getElementById('loading-error').style.display = 'block';
loadingError.setAttribute('aria-hidden', 'false');
reject(
new Error(
`Failed to load script: ${src}, Please contact the service administrator.`
)
);
};
script.src = src;
document.body.appendChild(script);
});
}
loadScript('/_fs-ch-1T1wmsGaOgGaSxcX/errors.js')
.then(() => {
const script = document.createElement('script');
script.src = '/_fs-ch-1T1wmsGaOgGaSxcX/script.js?reload=true';
script.onerror = (event) => {
console.error('Script load error event:', event);
const errorMsg = new Error(
`Failed to load script: ${script.src}. Please contact the service administrator.`
);
console.error(errorMsg);
handleScriptError();
};
document.body.appendChild(script);
})
.catch((error) => {
console.error(error);
});
</script>
</body>
</html>