Varnish
tcp/80
openresty
tcp/443
Open service 2a04:4e42::775:443 · www.tom-cox.com
2026-01-26 00:10
HTTP/1.1 200 OK
Connection: close
Content-Length: 51832
server: openresty
content-type: text/html; charset=utf-8
etag: W/"ca78-oWoqwPpk7vqnTMOQehGERZNv9a8"
cache-control: public, max-age=0
status: 200 OK
via: 1.1 varnish, 1.1 varnish, 1.1 varnish
Accept-Ranges: bytes
Date: Mon, 26 Jan 2026 00:10:19 GMT
Age: 213090
X-Served-By: cache-ams2100103-AMS, cache-ams2100084-AMS, cache-sin-wsat1880042-SIN
X-Cache: MISS, HIT, HIT
X-Cache-Hits: 0, 25, 1
X-Timer: S1769386219.145715,VS0,VE1
Vary: Cookie, Accept-Encoding
x-request-id: 829009ca-c1ae-4358-b479-3be91ad55c8a
Ghost-Fastly: true;production
Alt-Svc: clear
Page title: Tom Coxlock-1lock-1lock-1
<!DOCTYPE html>
<html lang="en">
<head>
<title>Tom Cox</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="preload" as="style" href="https://www.tom-cox.com/assets/built/screen.css?v=0ab07083e8">
<link rel="preload" as="script" href="https://www.tom-cox.com/assets/built/source.js?v=0ab07083e8">
<link rel="preload" as="font" type="font/woff2" href="https://www.tom-cox.com/assets/fonts/inter-roman.woff2?v=0ab07083e8" crossorigin="anonymous">
<style>
@font-face {
font-family: "Inter";
font-style: normal;
font-weight: 100 900;
font-display: optional;
src: url(https://www.tom-cox.com/assets/fonts/inter-roman.woff2?v=0ab07083e8) 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="https://www.tom-cox.com/assets/built/screen.css?v=0ab07083e8">
<style>
:root {
--background-color: #fef3d0
}
</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="New writing by bestselling author Tom Cox.">
<link rel="icon" href="https://www.tom-cox.com/content/images/size/w256h256/format/jpeg/2025/08/7b113121-1005-4c5a-b1df-a3d0d4c3fdd5_951x951-2.jpg" type="image/jpeg">
<link rel="canonical" href="https://www.tom-cox.com/">
<meta name="referrer" content="no-referrer-when-downgrade">
<link rel="next" href="https://www.tom-cox.com/page/2/">
<meta property="og:site_name" content="Tom Cox">
<meta property="og:type" content="website">
<meta property="og:title" content="Tom Cox">
<meta property="og:description" content="New writing by bestselling author Tom Cox.">
<meta property="og:url" content="https://www.tom-cox.com/">
<meta property="og:image" content="https://www.tom-cox.com/content/images/size/w1200/2025/09/81AC915B-59FB-4A6C-84B0-B24A8ABCB769-3-1.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Tom Cox">
<meta name="twitter:description" content="New writing by bestselling author Tom Cox.">
<meta name="twitter:url" content="https://www.tom-cox.com/">
<meta name="twitter:image" content="https://www.tom-cox.com/content/images/size/w1200/2025/09/81AC915B-59FB-4A6C-84B0-B24A8ABCB769-3-1.jpg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="871">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"publisher": {
"@type": "Organization",
"name": "Tom Cox",
"url": "https://www.tom-cox.com/",
"logo": {
"@type": "ImageObject",
"url": "https://www.tom-cox.com/content/images/size/w256h256/format/jpeg/2025/08/7b113121-1005-4c5a-b1df-a3d0d4c3fdd5_951x951-2.jpg",
"width": 60,
"height": 60
}
},
"url": "https://www.tom-cox.com/",
"name": "T
Open service 151.101.195.7:443 · www.tom-cox.com
2026-01-26 00:10
HTTP/1.1 200 OK
Connection: close
Content-Length: 51832
server: openresty
content-type: text/html; charset=utf-8
etag: W/"ca78-oWoqwPpk7vqnTMOQehGERZNv9a8"
cache-control: public, max-age=0
status: 200 OK
via: 1.1 varnish, 1.1 varnish, 1.1 varnish
Accept-Ranges: bytes
Date: Mon, 26 Jan 2026 00:10:19 GMT
Age: 213090
X-Served-By: cache-ams2100103-AMS, cache-ams2100084-AMS, cache-bom-vanm7210062-BOM
X-Cache: MISS, HIT, HIT
X-Cache-Hits: 0, 48, 1
X-Timer: S1769386219.325830,VS0,VE1
Vary: Cookie, Accept-Encoding
x-request-id: d38d0426-f3cf-482f-966f-9942d02e7675
Ghost-Fastly: true;production
Alt-Svc: clear
Page title: Tom Coxlock-1lock-1lock-1
<!DOCTYPE html>
<html lang="en">
<head>
<title>Tom Cox</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="preload" as="style" href="https://www.tom-cox.com/assets/built/screen.css?v=0ab07083e8">
<link rel="preload" as="script" href="https://www.tom-cox.com/assets/built/source.js?v=0ab07083e8">
<link rel="preload" as="font" type="font/woff2" href="https://www.tom-cox.com/assets/fonts/inter-roman.woff2?v=0ab07083e8" crossorigin="anonymous">
<style>
@font-face {
font-family: "Inter";
font-style: normal;
font-weight: 100 900;
font-display: optional;
src: url(https://www.tom-cox.com/assets/fonts/inter-roman.woff2?v=0ab07083e8) 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="https://www.tom-cox.com/assets/built/screen.css?v=0ab07083e8">
<style>
:root {
--background-color: #fef3d0
}
</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="New writing by bestselling author Tom Cox.">
<link rel="icon" href="https://www.tom-cox.com/content/images/size/w256h256/format/jpeg/2025/08/7b113121-1005-4c5a-b1df-a3d0d4c3fdd5_951x951-2.jpg" type="image/jpeg">
<link rel="canonical" href="https://www.tom-cox.com/">
<meta name="referrer" content="no-referrer-when-downgrade">
<link rel="next" href="https://www.tom-cox.com/page/2/">
<meta property="og:site_name" content="Tom Cox">
<meta property="og:type" content="website">
<meta property="og:title" content="Tom Cox">
<meta property="og:description" content="New writing by bestselling author Tom Cox.">
<meta property="og:url" content="https://www.tom-cox.com/">
<meta property="og:image" content="https://www.tom-cox.com/content/images/size/w1200/2025/09/81AC915B-59FB-4A6C-84B0-B24A8ABCB769-3-1.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Tom Cox">
<meta name="twitter:description" content="New writing by bestselling author Tom Cox.">
<meta name="twitter:url" content="https://www.tom-cox.com/">
<meta name="twitter:image" content="https://www.tom-cox.com/content/images/size/w1200/2025/09/81AC915B-59FB-4A6C-84B0-B24A8ABCB769-3-1.jpg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="871">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"publisher": {
"@type": "Organization",
"name": "Tom Cox",
"url": "https://www.tom-cox.com/",
"logo": {
"@type": "ImageObject",
"url": "https://www.tom-cox.com/content/images/size/w256h256/format/jpeg/2025/08/7b113121-1005-4c5a-b1df-a3d0d4c3fdd5_951x951-2.jpg",
"width": 60,
"height": 60
}
},
"url": "https://www.tom-cox.com/",
"name": "T
Open service 151.101.131.7:80 · www.tom-cox.com
2026-01-26 00:10
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://www.tom-cox.com/ Accept-Ranges: bytes Date: Mon, 26 Jan 2026 00:10:19 GMT Via: 1.1 varnish X-Served-By: cache-lga21950-LGA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1769386219.090624,VS0,VE1 x-request-id: 81c045d2-248d-4a66-bfb7-9ce6d5ad2958 Ghost-Fastly: true;production Alt-Svc: clear
Open service 151.101.67.7:443 · www.tom-cox.com
2026-01-26 00:10
HTTP/1.1 200 OK
Connection: close
Content-Length: 51832
server: openresty
content-type: text/html; charset=utf-8
etag: W/"ca78-oWoqwPpk7vqnTMOQehGERZNv9a8"
cache-control: public, max-age=0
status: 200 OK
via: 1.1 varnish, 1.1 varnish, 1.1 varnish
Accept-Ranges: bytes
Date: Mon, 26 Jan 2026 00:10:19 GMT
Age: 213089
X-Served-By: cache-ams2100103-AMS, cache-ams2100084-AMS, cache-fra-eddf8230062-FRA
X-Cache: MISS, MISS, HIT
X-Cache-Hits: 0, 0, 1
X-Timer: S1769386219.093672,VS0,VE5
Vary: Cookie, Accept-Encoding
x-request-id: 0818e214-505f-467e-9d38-6b9dbc78d241
Ghost-Fastly: true;production
Alt-Svc: clear
Page title: Tom Coxlock-1lock-1lock-1
<!DOCTYPE html>
<html lang="en">
<head>
<title>Tom Cox</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="preload" as="style" href="https://www.tom-cox.com/assets/built/screen.css?v=0ab07083e8">
<link rel="preload" as="script" href="https://www.tom-cox.com/assets/built/source.js?v=0ab07083e8">
<link rel="preload" as="font" type="font/woff2" href="https://www.tom-cox.com/assets/fonts/inter-roman.woff2?v=0ab07083e8" crossorigin="anonymous">
<style>
@font-face {
font-family: "Inter";
font-style: normal;
font-weight: 100 900;
font-display: optional;
src: url(https://www.tom-cox.com/assets/fonts/inter-roman.woff2?v=0ab07083e8) 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="https://www.tom-cox.com/assets/built/screen.css?v=0ab07083e8">
<style>
:root {
--background-color: #fef3d0
}
</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="New writing by bestselling author Tom Cox.">
<link rel="icon" href="https://www.tom-cox.com/content/images/size/w256h256/format/jpeg/2025/08/7b113121-1005-4c5a-b1df-a3d0d4c3fdd5_951x951-2.jpg" type="image/jpeg">
<link rel="canonical" href="https://www.tom-cox.com/">
<meta name="referrer" content="no-referrer-when-downgrade">
<link rel="next" href="https://www.tom-cox.com/page/2/">
<meta property="og:site_name" content="Tom Cox">
<meta property="og:type" content="website">
<meta property="og:title" content="Tom Cox">
<meta property="og:description" content="New writing by bestselling author Tom Cox.">
<meta property="og:url" content="https://www.tom-cox.com/">
<meta property="og:image" content="https://www.tom-cox.com/content/images/size/w1200/2025/09/81AC915B-59FB-4A6C-84B0-B24A8ABCB769-3-1.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Tom Cox">
<meta name="twitter:description" content="New writing by bestselling author Tom Cox.">
<meta name="twitter:url" content="https://www.tom-cox.com/">
<meta name="twitter:image" content="https://www.tom-cox.com/content/images/size/w1200/2025/09/81AC915B-59FB-4A6C-84B0-B24A8ABCB769-3-1.jpg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="871">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"publisher": {
"@type": "Organization",
"name": "Tom Cox",
"url": "https://www.tom-cox.com/",
"logo": {
"@type": "ImageObject",
"url": "https://www.tom-cox.com/content/images/size/w256h256/format/jpeg/2025/08/7b113121-1005-4c5a-b1df-a3d0d4c3fdd5_951x951-2.jpg",
"width": 60,
"height": 60
}
},
"url": "https://www.tom-cox.com/",
"name": "T
Open service 2a04:4e42:200::775:443 · www.tom-cox.com
2026-01-26 00:10
HTTP/1.1 200 OK
Connection: close
Content-Length: 51832
server: openresty
content-type: text/html; charset=utf-8
etag: W/"ca78-oWoqwPpk7vqnTMOQehGERZNv9a8"
cache-control: public, max-age=0
status: 200 OK
via: 1.1 varnish, 1.1 varnish, 1.1 varnish
Accept-Ranges: bytes
Date: Mon, 26 Jan 2026 00:10:19 GMT
Age: 213090
X-Served-By: cache-ams2100103-AMS, cache-ams2100084-AMS, cache-lga21990-LGA
X-Cache: MISS, HIT, HIT
X-Cache-Hits: 0, 12, 1
X-Timer: S1769386219.052158,VS0,VE2
Vary: Cookie, Accept-Encoding
x-request-id: be31369d-7126-4843-a844-71b54cf009b7
Ghost-Fastly: true;production
Alt-Svc: clear
Page title: Tom Coxlock-1lock-1lock-1
<!DOCTYPE html>
<html lang="en">
<head>
<title>Tom Cox</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="preload" as="style" href="https://www.tom-cox.com/assets/built/screen.css?v=0ab07083e8">
<link rel="preload" as="script" href="https://www.tom-cox.com/assets/built/source.js?v=0ab07083e8">
<link rel="preload" as="font" type="font/woff2" href="https://www.tom-cox.com/assets/fonts/inter-roman.woff2?v=0ab07083e8" crossorigin="anonymous">
<style>
@font-face {
font-family: "Inter";
font-style: normal;
font-weight: 100 900;
font-display: optional;
src: url(https://www.tom-cox.com/assets/fonts/inter-roman.woff2?v=0ab07083e8) 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="https://www.tom-cox.com/assets/built/screen.css?v=0ab07083e8">
<style>
:root {
--background-color: #fef3d0
}
</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="New writing by bestselling author Tom Cox.">
<link rel="icon" href="https://www.tom-cox.com/content/images/size/w256h256/format/jpeg/2025/08/7b113121-1005-4c5a-b1df-a3d0d4c3fdd5_951x951-2.jpg" type="image/jpeg">
<link rel="canonical" href="https://www.tom-cox.com/">
<meta name="referrer" content="no-referrer-when-downgrade">
<link rel="next" href="https://www.tom-cox.com/page/2/">
<meta property="og:site_name" content="Tom Cox">
<meta property="og:type" content="website">
<meta property="og:title" content="Tom Cox">
<meta property="og:description" content="New writing by bestselling author Tom Cox.">
<meta property="og:url" content="https://www.tom-cox.com/">
<meta property="og:image" content="https://www.tom-cox.com/content/images/size/w1200/2025/09/81AC915B-59FB-4A6C-84B0-B24A8ABCB769-3-1.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Tom Cox">
<meta name="twitter:description" content="New writing by bestselling author Tom Cox.">
<meta name="twitter:url" content="https://www.tom-cox.com/">
<meta name="twitter:image" content="https://www.tom-cox.com/content/images/size/w1200/2025/09/81AC915B-59FB-4A6C-84B0-B24A8ABCB769-3-1.jpg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="871">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"publisher": {
"@type": "Organization",
"name": "Tom Cox",
"url": "https://www.tom-cox.com/",
"logo": {
"@type": "ImageObject",
"url": "https://www.tom-cox.com/content/images/size/w256h256/format/jpeg/2025/08/7b113121-1005-4c5a-b1df-a3d0d4c3fdd5_951x951-2.jpg",
"width": 60,
"height": 60
}
},
"url": "https://www.tom-cox.com/",
"name": "T
Open service 151.101.67.7:80 · www.tom-cox.com
2026-01-26 00:10
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://www.tom-cox.com/ Accept-Ranges: bytes Date: Mon, 26 Jan 2026 00:10:19 GMT Via: 1.1 varnish X-Served-By: cache-rtm-ehrd2290031-RTM X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1769386219.008956,VS0,VE0 x-request-id: 832faa92-cf27-4a71-ae05-7e582db9735f Ghost-Fastly: true;production Alt-Svc: clear
Open service 151.101.3.7:443 · www.tom-cox.com
2026-01-26 00:10
HTTP/1.1 200 OK
Connection: close
Content-Length: 51832
server: openresty
content-type: text/html; charset=utf-8
etag: W/"ca78-oWoqwPpk7vqnTMOQehGERZNv9a8"
cache-control: public, max-age=0
status: 200 OK
via: 1.1 varnish, 1.1 varnish, 1.1 varnish
Accept-Ranges: bytes
Date: Mon, 26 Jan 2026 00:10:19 GMT
Age: 213090
X-Served-By: cache-ams2100103-AMS, cache-ams2100084-AMS, cache-yyz4565-YYZ
X-Cache: MISS, HIT, HIT
X-Cache-Hits: 0, 23, 1
X-Timer: S1769386219.003582,VS0,VE3
Vary: Cookie, Accept-Encoding
x-request-id: f7827c76-7ea9-4425-844c-ac03425a275a
Ghost-Fastly: true;production
Alt-Svc: clear
Page title: Tom Coxlock-1lock-1lock-1
<!DOCTYPE html>
<html lang="en">
<head>
<title>Tom Cox</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="preload" as="style" href="https://www.tom-cox.com/assets/built/screen.css?v=0ab07083e8">
<link rel="preload" as="script" href="https://www.tom-cox.com/assets/built/source.js?v=0ab07083e8">
<link rel="preload" as="font" type="font/woff2" href="https://www.tom-cox.com/assets/fonts/inter-roman.woff2?v=0ab07083e8" crossorigin="anonymous">
<style>
@font-face {
font-family: "Inter";
font-style: normal;
font-weight: 100 900;
font-display: optional;
src: url(https://www.tom-cox.com/assets/fonts/inter-roman.woff2?v=0ab07083e8) 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="https://www.tom-cox.com/assets/built/screen.css?v=0ab07083e8">
<style>
:root {
--background-color: #fef3d0
}
</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="New writing by bestselling author Tom Cox.">
<link rel="icon" href="https://www.tom-cox.com/content/images/size/w256h256/format/jpeg/2025/08/7b113121-1005-4c5a-b1df-a3d0d4c3fdd5_951x951-2.jpg" type="image/jpeg">
<link rel="canonical" href="https://www.tom-cox.com/">
<meta name="referrer" content="no-referrer-when-downgrade">
<link rel="next" href="https://www.tom-cox.com/page/2/">
<meta property="og:site_name" content="Tom Cox">
<meta property="og:type" content="website">
<meta property="og:title" content="Tom Cox">
<meta property="og:description" content="New writing by bestselling author Tom Cox.">
<meta property="og:url" content="https://www.tom-cox.com/">
<meta property="og:image" content="https://www.tom-cox.com/content/images/size/w1200/2025/09/81AC915B-59FB-4A6C-84B0-B24A8ABCB769-3-1.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Tom Cox">
<meta name="twitter:description" content="New writing by bestselling author Tom Cox.">
<meta name="twitter:url" content="https://www.tom-cox.com/">
<meta name="twitter:image" content="https://www.tom-cox.com/content/images/size/w1200/2025/09/81AC915B-59FB-4A6C-84B0-B24A8ABCB769-3-1.jpg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="871">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"publisher": {
"@type": "Organization",
"name": "Tom Cox",
"url": "https://www.tom-cox.com/",
"logo": {
"@type": "ImageObject",
"url": "https://www.tom-cox.com/content/images/size/w256h256/format/jpeg/2025/08/7b113121-1005-4c5a-b1df-a3d0d4c3fdd5_951x951-2.jpg",
"width": 60,
"height": 60
}
},
"url": "https://www.tom-cox.com/",
"name": "T
Open service 2a04:4e42:200::775:80 · www.tom-cox.com
2026-01-26 00:10
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://www.tom-cox.com/ Accept-Ranges: bytes Date: Mon, 26 Jan 2026 00:10:18 GMT Via: 1.1 varnish X-Served-By: cache-pao-kpao1770028-PAO X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1769386219.919897,VS0,VE1 x-request-id: 57e82951-fccc-423f-b5c7-424eb85228e6 Ghost-Fastly: true;production Alt-Svc: clear
Open service 2a04:4e42:600::775:80 · www.tom-cox.com
2026-01-26 00:10
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://www.tom-cox.com/ Accept-Ranges: bytes Date: Mon, 26 Jan 2026 00:10:18 GMT Via: 1.1 varnish X-Served-By: cache-sin-wsss1830095-SIN X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1769386219.912031,VS0,VE1 x-request-id: 89fc34d2-ecdd-4060-82b5-2cf945333beb Ghost-Fastly: true;production Alt-Svc: clear
Open service 151.101.131.7:443 · www.tom-cox.com
2026-01-26 00:10
HTTP/1.1 200 OK
Connection: close
Content-Length: 51832
server: openresty
content-type: text/html; charset=utf-8
etag: W/"ca78-oWoqwPpk7vqnTMOQehGERZNv9a8"
cache-control: public, max-age=0
status: 200 OK
via: 1.1 varnish, 1.1 varnish, 1.1 varnish
Accept-Ranges: bytes
Date: Mon, 26 Jan 2026 00:10:18 GMT
Age: 213090
X-Served-By: cache-ams2100103-AMS, cache-ams2100084-AMS, cache-lga21938-LGA
X-Cache: MISS, HIT, HIT
X-Cache-Hits: 0, 12, 1
X-Timer: S1769386219.955863,VS0,VE5
Vary: Cookie, Accept-Encoding
x-request-id: 20df05e4-f789-45a0-9f2d-60be9498d929
Ghost-Fastly: true;production
Alt-Svc: clear
Page title: Tom Coxlock-1lock-1lock-1
<!DOCTYPE html>
<html lang="en">
<head>
<title>Tom Cox</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="preload" as="style" href="https://www.tom-cox.com/assets/built/screen.css?v=0ab07083e8">
<link rel="preload" as="script" href="https://www.tom-cox.com/assets/built/source.js?v=0ab07083e8">
<link rel="preload" as="font" type="font/woff2" href="https://www.tom-cox.com/assets/fonts/inter-roman.woff2?v=0ab07083e8" crossorigin="anonymous">
<style>
@font-face {
font-family: "Inter";
font-style: normal;
font-weight: 100 900;
font-display: optional;
src: url(https://www.tom-cox.com/assets/fonts/inter-roman.woff2?v=0ab07083e8) 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="https://www.tom-cox.com/assets/built/screen.css?v=0ab07083e8">
<style>
:root {
--background-color: #fef3d0
}
</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="New writing by bestselling author Tom Cox.">
<link rel="icon" href="https://www.tom-cox.com/content/images/size/w256h256/format/jpeg/2025/08/7b113121-1005-4c5a-b1df-a3d0d4c3fdd5_951x951-2.jpg" type="image/jpeg">
<link rel="canonical" href="https://www.tom-cox.com/">
<meta name="referrer" content="no-referrer-when-downgrade">
<link rel="next" href="https://www.tom-cox.com/page/2/">
<meta property="og:site_name" content="Tom Cox">
<meta property="og:type" content="website">
<meta property="og:title" content="Tom Cox">
<meta property="og:description" content="New writing by bestselling author Tom Cox.">
<meta property="og:url" content="https://www.tom-cox.com/">
<meta property="og:image" content="https://www.tom-cox.com/content/images/size/w1200/2025/09/81AC915B-59FB-4A6C-84B0-B24A8ABCB769-3-1.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Tom Cox">
<meta name="twitter:description" content="New writing by bestselling author Tom Cox.">
<meta name="twitter:url" content="https://www.tom-cox.com/">
<meta name="twitter:image" content="https://www.tom-cox.com/content/images/size/w1200/2025/09/81AC915B-59FB-4A6C-84B0-B24A8ABCB769-3-1.jpg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="871">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"publisher": {
"@type": "Organization",
"name": "Tom Cox",
"url": "https://www.tom-cox.com/",
"logo": {
"@type": "ImageObject",
"url": "https://www.tom-cox.com/content/images/size/w256h256/format/jpeg/2025/08/7b113121-1005-4c5a-b1df-a3d0d4c3fdd5_951x951-2.jpg",
"width": 60,
"height": 60
}
},
"url": "https://www.tom-cox.com/",
"name": "T
Open service 2a04:4e42:400::775:80 · www.tom-cox.com
2026-01-26 00:10
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://www.tom-cox.com/ Accept-Ranges: bytes Date: Mon, 26 Jan 2026 00:10:18 GMT Via: 1.1 varnish X-Served-By: cache-fra-eddf8230159-FRA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1769386219.882460,VS0,VE1 x-request-id: a08be54b-669d-47ec-915d-d7dc1f3d708f Ghost-Fastly: true;production Alt-Svc: clear
Open service 2a04:4e42:400::775:443 · www.tom-cox.com
2026-01-26 00:10
HTTP/1.1 200 OK
Connection: close
Content-Length: 51832
server: openresty
content-type: text/html; charset=utf-8
etag: W/"ca78-oWoqwPpk7vqnTMOQehGERZNv9a8"
cache-control: public, max-age=0
status: 200 OK
via: 1.1 varnish, 1.1 varnish, 1.1 varnish
Accept-Ranges: bytes
Date: Mon, 26 Jan 2026 00:10:18 GMT
Age: 213089
X-Served-By: cache-ams2100103-AMS, cache-ams2100084-AMS, cache-fra-eddf8230164-FRA
X-Cache: MISS, MISS, HIT
X-Cache-Hits: 0, 0, 1
X-Timer: S1769386219.881072,VS0,VE4
Vary: Cookie, Accept-Encoding
x-request-id: 96f60e48-4f6c-488f-b44f-ffff9cae68c1
Ghost-Fastly: true;production
Alt-Svc: clear
Page title: Tom Coxlock-1lock-1lock-1
<!DOCTYPE html>
<html lang="en">
<head>
<title>Tom Cox</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="preload" as="style" href="https://www.tom-cox.com/assets/built/screen.css?v=0ab07083e8">
<link rel="preload" as="script" href="https://www.tom-cox.com/assets/built/source.js?v=0ab07083e8">
<link rel="preload" as="font" type="font/woff2" href="https://www.tom-cox.com/assets/fonts/inter-roman.woff2?v=0ab07083e8" crossorigin="anonymous">
<style>
@font-face {
font-family: "Inter";
font-style: normal;
font-weight: 100 900;
font-display: optional;
src: url(https://www.tom-cox.com/assets/fonts/inter-roman.woff2?v=0ab07083e8) 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="https://www.tom-cox.com/assets/built/screen.css?v=0ab07083e8">
<style>
:root {
--background-color: #fef3d0
}
</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="New writing by bestselling author Tom Cox.">
<link rel="icon" href="https://www.tom-cox.com/content/images/size/w256h256/format/jpeg/2025/08/7b113121-1005-4c5a-b1df-a3d0d4c3fdd5_951x951-2.jpg" type="image/jpeg">
<link rel="canonical" href="https://www.tom-cox.com/">
<meta name="referrer" content="no-referrer-when-downgrade">
<link rel="next" href="https://www.tom-cox.com/page/2/">
<meta property="og:site_name" content="Tom Cox">
<meta property="og:type" content="website">
<meta property="og:title" content="Tom Cox">
<meta property="og:description" content="New writing by bestselling author Tom Cox.">
<meta property="og:url" content="https://www.tom-cox.com/">
<meta property="og:image" content="https://www.tom-cox.com/content/images/size/w1200/2025/09/81AC915B-59FB-4A6C-84B0-B24A8ABCB769-3-1.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Tom Cox">
<meta name="twitter:description" content="New writing by bestselling author Tom Cox.">
<meta name="twitter:url" content="https://www.tom-cox.com/">
<meta name="twitter:image" content="https://www.tom-cox.com/content/images/size/w1200/2025/09/81AC915B-59FB-4A6C-84B0-B24A8ABCB769-3-1.jpg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="871">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"publisher": {
"@type": "Organization",
"name": "Tom Cox",
"url": "https://www.tom-cox.com/",
"logo": {
"@type": "ImageObject",
"url": "https://www.tom-cox.com/content/images/size/w256h256/format/jpeg/2025/08/7b113121-1005-4c5a-b1df-a3d0d4c3fdd5_951x951-2.jpg",
"width": 60,
"height": 60
}
},
"url": "https://www.tom-cox.com/",
"name": "T
Open service 2a04:4e42::775:80 · www.tom-cox.com
2026-01-26 00:10
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://www.tom-cox.com/ Accept-Ranges: bytes Date: Mon, 26 Jan 2026 00:10:18 GMT Via: 1.1 varnish X-Served-By: cache-fra-eddf8230171-FRA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1769386219.856443,VS0,VE0 x-request-id: 7e65fec5-763c-4515-96c0-2165da8022f6 Ghost-Fastly: true;production Alt-Svc: clear
Open service 151.101.195.7:80 · www.tom-cox.com
2026-01-26 00:10
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://www.tom-cox.com/ Accept-Ranges: bytes Date: Mon, 26 Jan 2026 00:10:18 GMT Via: 1.1 varnish X-Served-By: cache-lcy-egml8630089-LCY X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1769386219.860730,VS0,VE0 x-request-id: b42c3d1c-6407-4b02-9050-20b88b76f620 Ghost-Fastly: true;production Alt-Svc: clear
Open service 151.101.3.7:80 · www.tom-cox.com
2026-01-26 00:10
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://www.tom-cox.com/ Accept-Ranges: bytes Date: Mon, 26 Jan 2026 00:10:18 GMT Via: 1.1 varnish X-Served-By: cache-fra-eddf8230156-FRA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1769386219.848396,VS0,VE0 x-request-id: cd56e76f-9bef-4541-b642-9445b6669b5b Ghost-Fastly: true;production Alt-Svc: clear
Open service 2a04:4e42:600::775:443 · www.tom-cox.com
2026-01-26 00:10
HTTP/1.1 200 OK
Connection: close
Content-Length: 51832
server: openresty
content-type: text/html; charset=utf-8
etag: W/"ca78-oWoqwPpk7vqnTMOQehGERZNv9a8"
cache-control: public, max-age=0
status: 200 OK
via: 1.1 varnish, 1.1 varnish, 1.1 varnish
Accept-Ranges: bytes
Age: 213089
Date: Mon, 26 Jan 2026 00:10:18 GMT
X-Served-By: cache-ams2100103-AMS, cache-ams2100084-AMS, cache-lcy-egml8630098-LCY
X-Cache: MISS, HIT, MISS
X-Cache-Hits: 0, 49, 0
X-Timer: S1769386219.859866,VS0,VE8
Vary: Cookie, Accept-Encoding
x-request-id: 982b7cca-5f2f-4d39-992e-29dd9314f8c3
Ghost-Fastly: true;production
Alt-Svc: clear
Page title: Tom Coxlock-1lock-1lock-1
<!DOCTYPE html>
<html lang="en">
<head>
<title>Tom Cox</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="preload" as="style" href="https://www.tom-cox.com/assets/built/screen.css?v=0ab07083e8">
<link rel="preload" as="script" href="https://www.tom-cox.com/assets/built/source.js?v=0ab07083e8">
<link rel="preload" as="font" type="font/woff2" href="https://www.tom-cox.com/assets/fonts/inter-roman.woff2?v=0ab07083e8" crossorigin="anonymous">
<style>
@font-face {
font-family: "Inter";
font-style: normal;
font-weight: 100 900;
font-display: optional;
src: url(https://www.tom-cox.com/assets/fonts/inter-roman.woff2?v=0ab07083e8) 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="https://www.tom-cox.com/assets/built/screen.css?v=0ab07083e8">
<style>
:root {
--background-color: #fef3d0
}
</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="New writing by bestselling author Tom Cox.">
<link rel="icon" href="https://www.tom-cox.com/content/images/size/w256h256/format/jpeg/2025/08/7b113121-1005-4c5a-b1df-a3d0d4c3fdd5_951x951-2.jpg" type="image/jpeg">
<link rel="canonical" href="https://www.tom-cox.com/">
<meta name="referrer" content="no-referrer-when-downgrade">
<link rel="next" href="https://www.tom-cox.com/page/2/">
<meta property="og:site_name" content="Tom Cox">
<meta property="og:type" content="website">
<meta property="og:title" content="Tom Cox">
<meta property="og:description" content="New writing by bestselling author Tom Cox.">
<meta property="og:url" content="https://www.tom-cox.com/">
<meta property="og:image" content="https://www.tom-cox.com/content/images/size/w1200/2025/09/81AC915B-59FB-4A6C-84B0-B24A8ABCB769-3-1.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Tom Cox">
<meta name="twitter:description" content="New writing by bestselling author Tom Cox.">
<meta name="twitter:url" content="https://www.tom-cox.com/">
<meta name="twitter:image" content="https://www.tom-cox.com/content/images/size/w1200/2025/09/81AC915B-59FB-4A6C-84B0-B24A8ABCB769-3-1.jpg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="871">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"publisher": {
"@type": "Organization",
"name": "Tom Cox",
"url": "https://www.tom-cox.com/",
"logo": {
"@type": "ImageObject",
"url": "https://www.tom-cox.com/content/images/size/w256h256/format/jpeg/2025/08/7b113121-1005-4c5a-b1df-a3d0d4c3fdd5_951x951-2.jpg",
"width": 60,
"height": 60
}
},
"url": "https://www.tom-cox.com/",
"name": "T