1<!DOCTYPE html> 2<html lang="en" data-theme="Fancy" data-font="Neco / Switzer"> 3<head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <title>Tom Frazier | The Long Arc | The Idea Chose You | AI, Bitcoin & Startup Strategies</title> 7 <link rel="preload" as="style" href="https://www.tomfrazier.com/assets/built/style.css?v=xyeqQ_TVRX1HZg3m"> 8<link rel="preload" as="script" href="https://www.tomfrazier.com/assets/built/global.js?v=Pxny4Whd8be1LHeY"> 9 <link rel="preload" as="font" type="font/woff2" href="https://www.tomfrazier.com/assets/fonts/neco.woff2?v=l64MUfYbeyeVP67j" crossorigin="anonymous"> 10<style> 11 @font-face { 12 font-family: "Neco"; 13 font-style: normal; 14 font-weight: 400 700; 15 font-display: swap; 16 src: url(https://www.tomfrazier.com/assets/fonts/neco.woff2?v=l64MUfYbeyeVP67j) format('woff2'); 17 } 18</style> <link rel="preload" as="font" type="font/woff2" href="https://www.tomfrazier.com/assets/fonts/switzer.woff2?v=0b-AH_saYJbe9wp8" crossorigin="anonymous"> 19<style> 20 @font-face { 21 font-family: "Switzer"; 22 font-style: normal; 23 font-weight: 400 700; 24 font-display: swap; 25 src: url(https://www.tomfrazier.com/assets/fonts/switzer.woff2?v=0b-AH_saYJbe9wp8) format('woff2'); 26 } 27</style><link rel="stylesheet" type="text/css" href="https://www.tomfrazier.com/assets/built/style.css?v=xyeqQ_TVRX1HZg3m"> 28
28<script> 29 try { 30 if (localStorage.darkMode === "true" || (!("darkMode" in localStorage) && window.matchMedia("(prefers-color-scheme: dark)").matches)) { 31 document.documentElement.classList.add("dark"); 32 } 33 } catch (_) {} 34 </script>
34 35 <meta name="description" content="My public notebook of long-term thinking. Ideas Iâm curious about, lessons Iâm learning, and the principles Iâm pressure-testing over time."> 36 <link rel="icon" href="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w256h256/2026/05/icon-512-maskable.png" type="image/png"> 37 <link rel="canonical" href="https://www.tomfrazier.com/"> 38 <meta name="referrer" content="no-referrer-when-downgrade"> 39 <link rel="next" href="https://www.tomfrazier.com/page/2/"> 40 41 <meta property="og:site_name" content="Tom Frazier | The Long Arc â AI, Bitcoin & Startup"> 42 <meta property="og:type" content="website"> 43 <meta property="og:title" content="The Long Arc by Tom Frazier"> 44 <meta property="og:description" content="My public notebook of long-term thinking. Ideas Iâm curious about, lessons Iâm learning, and the principles Iâm pressure-testing over time."> 45 <meta property="og:url" content="https://www.tomfrazier.com/"> 46 <meta property="og:image" content="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1200/2026/05/[email protected]"> 47 <meta name="twitter:card" content="summary_large_image"> 48 <meta name="twitter:title" content="The Long Arc by Tom Frazier"> 49 <meta name="twitter:description" content="My public notebook of long-term thinking. Ideas Iâm curious about, lessons Iâm learning, and the principles Iâm pressure-testing over time."> 50 <meta name="twitter:url" content="https://www.tomfrazier.com/"> 51 <meta name="twitter:image" content="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1200/2026/05/[email protected]"> 52 <meta name="twitter:site" content="@tomfrazier"> 53 <meta property="og:image:width" content="1200"> 54 <meta property="og:image:height" content="630"> 55 56
56<script type="application/ld+json"> 57{ 58 "@context": "https://schema.org", 59 "@type": "WebSite", 60 "publisher": { 61 "@type": "Organization", 62 "name": "Tom Frazier | The Long Arc â AI, Bitcoin & Startup", 63 "url": "https://www.tomfrazier.com/", 64 "logo": { 65 "@type": "ImageObject", 66 "url": "https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/2026/06/logo-tomfrazier-light-header.png" 67 } 68 }, 69 "url": "https://www.tomfrazier.com/", 70 "name": "Tom Frazier | The Long Arc â AI, Bitcoin & Startup", 71 "image": { 72 "@type": "ImageObject", 73 "url": "https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/2026/03/Frazier_7253-small-3-1.jpeg", 74 "width": 1147, 75 "height": 1147 76 }, 77 "mainEntityOfPage": "https://www.tomfrazier.com/", 78 "description": "My public notebook of long-term thinking. Ideas Iâm curious about, lessons Iâm learning, and the principles Iâm pressure-testing over time." 79} 80 </script>
80 81 82 <meta name="generator" content="Ghost 6.68"> 83 <link rel="alternate" type="application/rss+xml" title="Tom Frazier | The Long Arc â AI, Bitcoin & Startup" href="https://www.tomfrazier.com/rss/"> 84
84<script defer src="https://cdn.jsdelivr.net/ghost/portal@~2.71/umd/portal.min.js" data-i18n="true" data-ghost="https://www.tomfrazier.com/" data-key="8a44318de0c96d9988088066c6" data-api="https://tom-frazier.ghost.io/ghost/api/content/" data-locale="en" crossorigin="anonymous"></script>
84 85
85<script defer src="https://cdn.jsdelivr.net/ghost/sodo-search@~1.8/umd/sodo-search.min.js" data-key="8a44318de0c96d9988088066c6" data-styles="https://cdn.jsdelivr.net/ghost/sodo-search@~1.8/umd/main.css" data-sodo-search="https://tom-frazier.ghost.io/" data-locale="en" crossorigin="anonymous"></script>
85 86
86<script defer src="https://cdn.jsdelivr.net/ghost/announcement-bar@~1.1/umd/announcement-bar.min.js" data-announcement-bar="https://www.tomfrazier.com/" data-api-url="https://www.tomfrazier.com/members/api/announcement/" crossorigin="anonymous"></script>
86 87 <link href="https://www.tomfrazier.com/webmentions/receive/" rel="webmention"> 88
88<script defer src="/public/member-attribution.min.js?v=AKG4hWena9j3yX3I"></script>
88 89
89<script defer src="/public/ghost-stats.min.js?v=vFcCUf6ZQ0Hyhc8h" data-stringify-payload="false" data-datasource="analytics_events" data-storage="localStorage" data-host="https://www.tomfrazier.com/.ghost/analytics/api/v1/page_hit" tb_site_uuid="55ddb45d-694f-462b-9dc8-c6c46460a521" tb_post_uuid="undefined" tb_post_type="null" tb_member_uuid="undefined" tb_member_status="undefined" tb_gift_link=""></script>
89<style>:root {--ghost-accent-color: #E2741D;}</style> 90 <meta name="google-site-verification" content="JEWw23u3aeE--RnVlUcK3hWVKDUSAv1jg4_yLSkAyTg" /> 91<!-- Google Tag Manager -->
92<script>
vendor: 327 bytes, lines 92-96
92(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 93new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 94j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 95'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 96})(window,document,'script','dataLayer','
96GTM-5T6JRMGN
vendor: 3 bytes, line 96
96');
96</script>
96 97<!-- End Google Tag Manager --> 98 99<style> 100/* === Tom Frazier â Fancy theme, brand palette === */ 101:root:is([data-theme="Fancy"]) { 102 /* Light */ 103 --base: #B5560F; /* ember, deepened so links stay legible on paper */ 104 --primary: #F2EDE3; /* Paper */ 105 --secondary: #E6DFD0; 106 --tertiary: #DAD1BF; 107 --heading: #231F20; /* Ink */ 108 --text: #231F20; 109 --meta: #6F675E; 110 --submenu: #231F20; 111 --submenu-text: #F2EDE3; 112 --border: var(--secondary); 113 --overlay: #231F20; 114 --shadow: #231F20; 115 --link: #B5560F; 116 117 /* Dark */ 118 --dark-primary: #231F20; /* Ink */ 119 --dark-secondary: #2D2928; 120 --dark-tertiary: #38332F; 121 --dark-heading: #F2EDE3; /* Paper */ 122 --dark-text: #F2EDE3; 123 --dark-meta: #A79E91; 124 --dark-submenu: #2D2928; 125 --dark-submenu-text: var(--dark-text); 126 --dark-border: var(--dark-tertiary); 127 --dark-link: #E2741D; /* bright ember on ink */ 128 129 /* Callouts â warmed + muted to sit with the brand */ 130 --color-blue: #4C6B7A; /* info */ 131 --color-green: #6E7F57; /* success */ 132 --color-yellow: #D6A33C; /* note */ 133 --color-red: #C0502E; /* warning */ 134 --color-pink: #C0727B; 135 --color-purple: #836C8E; 136} 137 138/* Highlight (==text==) â was neon yellow */ 139.prose mark { 140 background-color: rgba(226, 116, 29, .30); /* ember tint */ 141 color: inherit; 142} 143</style> 144 145<style> 146/* ââ Alt-Quote (Blockquote Alt) override ââââââââââââââââââ */ 147 148.kg-blockquote-alt { 149 font-size: 1.5rem; /* text-2xl â below h2's text-3xl */ 150 line-height: 1.4; 151 color: color-mix(in srgb, var(--heading) 62%, var(--primary) 38%); 152 /* font-family and font-weight intentionally untouched â inherits 153 heading utility already applied by the theme */ 154} 155 156@media (min-width: 640px) { 157 .kg-blockquote-alt { 158 font-size: 1.75rem; /* sm: text-[1.75rem] â still below h2 */ 159 } 160} 161 162/* Curly double quotes via pseudo-elements */ 163.kg-blockquote-alt::before { 164 content: "\201C"; /* " */ 165} 166 167.kg-blockquote-alt::after { 168 content: "\201D"; /* " */ 169} 170</style> 171 172<!-- License definitions -->
173<script> 174(function () { 175 const path = window.location.pathname.toLowerCase().replace(/\/$/, ""); 176 177 const isHome = path === ""; 178 const isRestricted = 179 isHome || 180 path.includes("operators-edge") || 181 path.startsWith("/about") || 182 path.startsWith("/contact") || 183 path.startsWith("/media-kit") || 184 path.startsWith("/faq/who-is-tom-frazier") || 185 path.startsWith("/satoshi-settlement") || 186 path.startsWith("/the-idea-chose-you") || 187 path.startsWith("/advance-reader") || 188 path.startsWith("/arc-access") || 189 path.startsWith("/private-reader-page") || 190 path.startsWith("/the-idea-chose-you-founders-field-kit") || 191 path.startsWith("/book-buyer-earn-the-build-bundle") || 192 path.startsWith("/execution-is-scaling-faster-than-judgment"); 193 194 if (!isRestricted) { 195 const script = document.createElement("script"); 196 script.type = "application/ld+json"; 197 script.text = JSON.stringify({ 198 "@context": "https://schema.org", 199 "@type": "CreativeWork", 200 "license": "https://creativecommons.org/licenses/by/4.0/" 201 }); 202 document.head.appendChild(script); 203 } 204 205 document.documentElement.classList.add( 206 isRestricted ? "license-restricted" : "license-ccby" 207 ); 208})(); 209</script>
209 210 211<style> 212 .post-tag, 213 .tag-sm, 214 .tag, 215 .gh-tag, 216 .gh-card-tag, 217 [class*="tag"] a { 218 text-transform: uppercase; 219 letter-spacing: 0.06em; 220 } 221 222 .kg-callout-card a,.gh-content .kg-callout-card a { 223 text-decoration: underline !important; 224 text-underline-offset: 0.12em; 225 } 226 227 .kg-callout-card a:hover, 228 .gh-content .kg-callout-card a:hover { 229 text-decoration: underline !important; 230 } 231 232 header.navbar a[href*="/the-idea-chose-you"] { 233 display: inline-flex; 234 align-items: center; 235 justify-content: center; 236 padding: 0.45rem 0.9rem; 237 margin-left: 0.6rem; 238 border-radius: 999px; 239 border: 2px solid #E2741D; 240 color: #E2741D; 241 background: transparent; 242 text-decoration: none; 243 font-weight: 600; 244 line-height: 1; 245 box-sizing: border-box; 246 transition: all 0.15s ease; 247 } 248 249 header.navbar a[href*="/the-idea-chose-you"]:focus-visible, 250 footer a[href*="/the-idea-chose-you"]:focus-visible, 251 .navbar .nav a[href*="/the-idea-chose-you"]:focus-visible { 252 outline: 2px solid #E2741D; 253 outline-offset: 2px; 254 } 255 256 header.navbar a[href*="/the-idea-chose-you"]:hover, .navbar .nav a[href*="/the-idea-chose-you"]:hover { 257 background: #E2741D; 258 color: #fff; 259 } 260 261 footer a[href*="/the-idea-chose-you"]:hover { 262 background: transparent; 263 color: #E2741D; 264 text-decoration: underline; 265 } 266 267 268 @media (max-width: 768px) { 269 footer nav, 270 footer .nav, 271 footer ul { 272 display: flex; 273 justify-content: center; 274 align-items: center; 275 gap: 1.5rem; 276 flex-wrap: wrap; 277 } 278 279 footer li, 280 footer .nav-item { 281 display: flex; 282 align-items: center; 283 justify-content: center; 284 margin: 0; 285 } 286 287 footer a[href*="/the-idea-chose-you"] { 288 display: inline-flex; 289 align-items: center; 290 justify-content: center; 291 padding: 0.45rem 0.9rem; 292 margin: 0; 293 border-radius: 999px; 294 border: 2px solid #E2741D; 295 color: #E2741D; 296 background: transparent; 297 text-decoration: none; 298 font-weight: 600; 299 line-height: 1; 300 box-sizing: border-box; 301 vertical-align: middle; 302 transition: all 0.15s ease; 303 } 304 305 .navbar .nav a[href*="/the-idea-chose-you"] { 306 display: inline-flex; 307 align-items: center; 308 justify-content: center; 309 padding: 0.55rem 1rem; 310 margin-top: 0.6rem; 311 border-radius: 999px; 312 border: 2px solid #E2741D; 313 color: #E2741D; 314 background: transparent; 315 text-decoration: none; 316 font-weight: 600; 317 line-height: 1; 318 box-sizing: border-box; 319 transition: all 0.15s ease; 320 } 321 } 322 323 .cc-license-global { 324 font-size: 0.85rem; 325 color: #6b7280; 326 text-align: center; 327 margin-top: 40px; 328 } 329 330 .cc-license-global a { 331 color: inherit; 332 text-decoration: underline; 333 } 334</style> 335 336<!-- Alli snippet -->
337<script type="text/javascript" src="data:text/javascript;base64, 338LyogQWxsaSBBSSB3aWRnZXQgZm9yIHRvbWZyYXppZXIuY29tICovCihmdW5jdGlvbiAodyxkLHMsbyxmLGpzLGZqcykge3dbJ0FsbGlKU1dpZGdldCddPW87d1tvXSA9IHdbb10gfHwgZnVuY3Rpb24gKCkgeyAod1tvXS5xID0gd1tvXS5xIHx8IFtdKS5wdXNoKGFyZ3VtZW50cykgfTtqcyA9IGQuY3JlYXRlRWxlbWVudChzKSwgZmpzID0gZC5nZXRFbGVtZW50c0J5VGFnTmFtZShzKVswXTtqcy5pZCA9IG87IGpzLnNyYyA9IGY7IGpzLmFzeW5jID0gMTsgZmpzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGpzLCBmanMpO30od2luZG93LCBkb2N1bWVudCwgJ3NjcmlwdCcsICdhbGxpJywgJ2h0dHBzOi8vc3RhdGljLmFsbGlhaS5jb20vd2lkZ2V0L3YxLmpzJykpO2FsbGkoJ2luaXQnLCAnc2l0ZV9IVDJBcGJBWmplWGkyWkxkJyk7YWxsaSgnb3B0aW1pemUnLCAnYWxsJyk7"></script>
338 339</head> 340<body class="bg-primary font-body text-text font-weight-body"> 341 <div class="viewport"> 342 <header class="navbar relative z-50 pt-4 sm:pt-8"> 343 <a class="skip-link" href="#main">Skip to content</a> 344 <div class="container"> 345 <div class="grid items-center gap-x-6 w-full lg:grid-cols-[1fr_auto_1fr]"> 346 <nav class=" justify-self-start flex w-full not-lg:hidden"> 347 <ul class="flex items-center gap-x-6"> 348 <li><a class="text-decoration not-submenu:font-medium" href="https://www.tomfrazier.com/the-idea-chose-you/" >The Idea Chose You</a></li> 349 <li><a class="text-decoration not-submenu:font-medium" href="https://tomfrazier.com/about/" >About Tom</a></li> 350 351 </ul> 352 353 </nav> 354 <div class=" justify-self-center grid-cols-[1fr_auto_1fr] items-center gap-x-4 w-full not-lg:grid"> 355 <div class="justify-self-start lg:hidden"> 356 <button class="icon-sm var-secondary" aria-label="Menu" data-menu-toggle> 357 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M4 6l16 0" /><path d="M4 12l16 0" /><path d="M4 18l16 0" /></svg></button> </div> 358 <div class="justify-self-center"> 359 <a class="group/logo flex items-center h-logo" href="https://www.tomfrazier.com"> 360 <img 361 class="block w-auto h-full transition-opacity group-hover/logo:opacity-85 dark:hidden" 362 src="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/2026/06/logo-tomfrazier-light-header.png" 363 width="180" 364 height="60" 365 alt="Tom Frazier | The Long Arc â AI, Bitcoin & Startup" 366 fetchpriority="high" 367 loading="eager" 368> <img 369 class="block w-auto h-full transition-opacity group-hover/logo:opacity-85 hidden dark:block" 370 src="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/2026/06/logo-tomfrazier-dark-header.png" 371 width="180" 372 height="60" 373 alt="Tom Frazier | The Long Arc â AI, Bitcoin & Startup" 374 fetchpriority="high" 375 loading="lazy" 376></a> </div> 377 <div class="justify-self-end flex items-center gap-x-4 lg:hidden"> 378 <button class="relative flex justify-center items-center size-8 text-xl transition-opacity hover:opacity-85 not-lg:hidden" aria-label="Dark Mode" data-theme-toggle> 379 <span class="transition-opacity will-change-[opacity] duration-300 dark:opacity-0"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 12m-4 0a4 4 0 1 0 8 0a4 4 0 1 0 -8 0" /><path d="M3 12h1m8 -9v1m8 8h1m-9 8v1m-6.4 -15.4l.7 .7m12.1 -.7l-.7 .7m0 11.4l.7 .7m-12.1 -.7l-.7 .7" /></svg></span> 380 <span class="absolute opacity-0 transition-opacity duration-300 will-change-[opacity] dark:opacity-100"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" /><path d="M17 4a2 2 0 0 0 2 2a2 2 0 0 0 -2 2a2 2 0 0 0 -2 -2a2 2 0 0 0 2 -2" /><path d="M19 11h2m-1 -1v2" /></svg></span> 381 </button> 382 <button class="icon-sm var-secondary" aria-label="Search" data-ghost-search><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 10m-7 0a7 7 0 1 0 14 0a7 7 0 1 0 -14 0" /><path d="M21 21l-6 -6" /></svg></button> </div> 383 </div> 384 <div class="justify-self-end flex items-center gap-x-4 not-lg:hidden"> 385 <button class="relative flex justify-center items-center size-8 text-xl transition-opacity hover:opacity-85 not-lg:hidden" aria-label="Dark Mode" data-theme-toggle>
386 <span class="transition-opacity will-change-[opacity] duration-300 dark:opacity-0"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 12m-4 0a4 4 0 1 0 8 0a4 4 0 1 0 -8 0" /><path d="M3 12h1m8 -9v1m8 8h1m-9 8v1m-6.4 -15.4l.7 .7m12.1 -.7l-.7 .7m0 11.4l.7 .7m-12.1 -.7l-.7 .7" /></svg></span> 387 <span class="absolute opacity-0 transition-opacity duration-300 will-change-[opacity] dark:opacity-100"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" /><path d="M17 4a2 2 0 0 0 2 2a2 2 0 0 0 -2 2a2 2 0 0 0 -2 -2a2 2 0 0 0 2 -2" /><path d="M19 11h2m-1 -1v2" /></svg></span> 388 </button> 389 <button class="icon-sm var-secondary" aria-label="Search" data-ghost-search><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 10m-7 0a7 7 0 1 0 14 0a7 7 0 1 0 -14 0" /><path d="M21 21l-6 -6" /></svg></button> <div class="flex items-center gap-x-6"> 390 <a class="btn-sm var-primary" href="#/portal/signup" data-portal="signup">Subscribe</a> 391 </div> 392 </div> 393 </div> 394 </div> 395</header> <main class="py-20 md:py-32" id="main"> 396 397 <div class="container"> 398 <div class="space-y-20 md:space-y-32"> 399 <div> 400 <div class="max-w-xl mx-auto"> 401 <div class="flex flex-col items-center gap-8 text-center"> 402 <picture class="block size-48 bg-secondary rounded-fancy overflow-hidden"> 403 <source 404 srcset="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/avif/2026/03/Frazier_7253-small-3-1.jpeg 320w, 405 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w640/format/avif/2026/03/Frazier_7253-small-3-1.jpeg 640w" 406 sizes="192px" 407 type="image/avif" 408 > 409 <img 410 class="size-full object-cover" 411 srcset="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/webp/2026/03/Frazier_7253-small-3-1.jpeg 320w, 412 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w640/format/webp/2026/03/Frazier_7253-small-3-1.jpeg 640w" 413 sizes="192px" 414 src="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/webp/2026/03/Frazier_7253-small-3-1.jpeg" 415 alt="The Long Arc" 416 fetchpriority="high" 417 loading="eager" 418 > 419</picture> <div class="space-y-6"> 420 <div class="space-y-4"> 421 <h1 class="heading-4xl md:heading-5xl"> 422 The Long Arc 423 </h1> 424 <p class="text-lg"> 425 My public notebook of long-term thinking. Ideas Iâm curious about, lessons Iâm learning, and the principles Iâm pressure-testing over time. 426 </p> 427 </div> 428 <div class="flex justify-center flex-wrap items-center gap-4 not-has-child:hidden"> 429</div> 430 </div> 431 </div> 432 </div> 433</div> </div> 434 </div> 435 436 437<style> 438/* ââ Theses Section (full-bleed wrapper, matches .thesis-section) ââ */ 439.theses-section { 440 background: 441 radial-gradient(ellipse at 65% 50%, 442 color-mix(in srgb, var(--color-accent) 7%, transparent) 0%, 443 transparent 65%), 444 var(--color-secondary); 445 border-top: 1px solid color-mix(in srgb, var(--color-accent) 22%, transparent); 446 border-bottom: 1px solid color-mix(in srgb, var(--color-accent) 22%, transparent); 447 padding: 4rem 0; 448 margin: 2rem 0 4rem 0; 449} 450 451/* ââ Section label ââ */ 452.theses-label { 453 font-family: var(--font-body); 454 font-size: 0.7rem; 455 letter-spacing: 0.14em; 456 text-transform: uppercase; 457 color: var(--color-heading, #1a1a1a); 458 font-weight: 500; 459 display: block; 460 margin-bottom: 1.5rem; 461} 462 463/* ââ Shell / responsive ââ */ 464thesis-selector { display: block; font-family: inherit; } 465thesis-selector * { box-sizing: border-box; } 466 467.ts-desktop { display: none; } 468.ts-mobile { 469 display: grid; 470 grid-auto-flow: column; 471 grid-auto-columns: 85%; 472 gap: 12px; 473 overflow-x: auto; 474 scroll-snap-type: x mandatory; 475 scroll-behavior: smooth; 476 padding: 4px 4px 16px; 477 scrollbar-width: none; 478} 479.ts-mobile::-webkit-scrollbar { display: none; } 480 481@media (min-width: 768px) { 482 .ts-desktop { display: grid; } 483 .ts-mobile { display: none; } 484} 485 486/* ââ Desktop grid â hero left, sidebar right ââ */ 487.ts-grid { 488 grid-template-columns: 1fr 300px; 489 align-items: stretch; 490 border-radius: var(--radius-custom, 0.75rem); 491 overflow: hidden; 492 border: 1px solid var(--color-border, rgba(0,0,0,0.08)); 493 background: var(--color-primary, #fff); 494 min-height: 460px; 495} 496 497/* ââ Hero (left panel) ââ */ 498.ts-hero { 499 position: relative; 500 overflow: hidden; 501 background: var(--color-overlay, #1a1a1a); 502 text-decoration: none; 503 color: #fff; 504 display: block; 505 min-height: 460px; 506} 507.ts-hero-img { 508 position: absolute; 509 inset: 0; 510 background-size: cover; 511 background-position: center; 512 background-color: var(--color-overlay, #1a1a1a); 513 transition: transform 0.75s cubic-bezier(0.25, 0.46, 0.45, 0.94); 514} 515.ts-hero:hover .ts-hero-img { transform: scale(1.05); } 516.ts-hero::after { 517 content: ''; 518 position: absolute; 519 inset: 0; 520 background: linear-gradient( 521 to bottom, 522 rgba(0,0,0,0.08) 0%, 523 rgba(0,0,0,0.15) 35%, 524 rgba(0,0,0,0.72) 100% 525 ); 526} 527 528/* ââ Pill ââ */ 529.ts-pill { 530 position: absolute; 531 top: 1.75rem; 532 left: 2rem; 533 z-index: 2; 534 display: inline-flex; 535 align-items: center; 536 padding: 0.25rem 1rem; 537 border-radius: 9999px; 538 background: color-mix(in srgb, var(--color-overlay) 10%, transparent); 539 backdrop-filter: blur(12px) saturate(150%); 540 -webkit-backdrop-filter: blur(12px) saturate(150%); 541 font-family: var(--font-body); 542 font-size: 0.68rem; 543 letter-spacing: 0.13em; 544 text-transform: uppercase; 545 color: rgba(255,255,255,0.92); 546 font-weight: 500; 547 white-space: nowrap; 548} 549 550/* ââ Hero body ââ */ 551.ts-hero-body { 552 position: absolute; 553 left: 2rem; 554 right: 2rem; 555 bottom: 2rem; 556 z-index: 2; 557 display: flex; 558 flex-direction: column; 559 gap: 0.75rem; 560} 561.ts-hero-title { 562 font-family: var(--font-heading); 563 font-size: clamp(1.6rem, 3vw, 2.25rem); 564 line-height: 1.08; 565 letter-spacing: -0.03em; 566 color: #fff;
567 font-weight: var(--font-weight-weight-heading); 568 margin: 0; 569 max-width: 22ch; 570 text-shadow: 0 1px 14px rgba(0,0,0,0.4); 571} 572.ts-hero-excerpt { 573 font-size: clamp(0.875rem, 1.4vw, 1rem); 574 line-height: 1.6; 575 color: rgba(255,255,255,0.75); 576 margin: 0; 577 max-width: 54ch; 578} 579.ts-read-btn { 580 display: inline-flex; 581 align-items: center; 582 gap: 6px; 583 background: #fff; 584 align-self: flex-start; 585 color: #1a1a1a; 586 padding: 11px 20px; 587 border-radius: 999px; 588 font-size: 12px; 589 font-weight: 500; 590 letter-spacing: 0.01em; 591 margin-top: 0.25rem; 592 text-decoration: none; 593 transition: background 0.15s ease; 594} 595.ts-hero:hover .ts-read-btn, 596.ts-card:hover .ts-read-btn { background: #f3f3f3; } 597.ts-read-btn svg { width: 1em; height: 1em; flex-shrink: 0; } 598 599/* ââ Sidebar (right panel) ââ */ 600.ts-sidebar { 601 background: color-mix(in srgb, var(--color-secondary) 70%, var(--color-overlay)); 602 padding: 1.5rem 1.5rem 1.5rem 1.5rem; 603 overflow-y: auto; 604 border-left: 1px solid var(--color-border, rgba(0,0,0,0.06)); 605 display: flex; 606 flex-direction: column; 607} 608.ts-sidebar-title { 609 font-size: 10px; 610 letter-spacing: 0.14em; 611 text-transform: uppercase; 612 color: #fff; 613 font-weight: 500; 614 padding-bottom: 12px; 615 border-bottom: 1px solid var(--color-border, rgba(0,0,0,0.08)); 616 margin-bottom: 10px; 617} 618.ts-item { 619 display: block; 620 width: 100%; 621 text-align: left; 622 background: transparent; 623 border: none; 624 padding: 18px 10px; 625 border-bottom: 1px solid var(--color-border, rgba(0,0,0,0.05)); 626 cursor: pointer; 627 position: relative; 628 transition: background 0.15s ease; 629 font: inherit; 630 color: inherit; 631 border-radius: 0; 632} 633.ts-item:last-child { border-bottom: none; } 634.ts-item:hover { background: var(--color-tertiary, rgba(0,0,0,0.03)); border-radius: 8px; } 635.ts-item-pill { 636 font-size: 9px; 637 letter-spacing: 0.14em; 638 text-transform: uppercase; 639 color: var(--color-meta, rgba(0,0,0,0.55)); 640 font-weight: 500; 641 margin-bottom: 4px; 642} 643.ts-item-title { 644 font-size: 14px; 645 line-height: 1.4; 646 color: var(--color-heading, #1a1a1a); 647 font-weight: 500; 648} 649.ts-item-active { 650 background: var(--color-primary, #fff); 651 border-radius: 8px; 652 box-shadow: 0 1px 4px rgba(0,0,0,0.06); 653} 654.ts-item-active::before { 655 content: ''; 656 position: absolute; 657 left: -6px; 658 top: 50%; 659 transform: translateY(-50%); 660 width: 0; 661 height: 0; 662 border-top: 7px solid transparent; 663 border-bottom: 7px solid transparent; 664 border-right: 7px solid var(--color-primary, #fff); 665} 666 667/* ââ Mobile cards ââ */ 668.ts-card { 669 scroll-snap-align: start; 670 position: relative; 671 aspect-ratio: 4 / 5; 672 overflow: hidden; 673 background: var(--color-overlay, #1a1a1a); 674 text-decoration: none; 675 color: #fff; 676 border-radius: var(--radius-custom, 0.75rem); 677 display: block; 678} 679.ts-card-img { 680 position: absolute; 681 inset: 0; 682 background-size: cover; 683 background-position: center; 684 background-color: var(--color-overlay, #1a1a1a); 685} 686.ts-card::after { 687 content: ''; 688 position: absolute; 689 inset: 0; 690 background: linear-gradient(to bottom, rgba(0,0,0,0.08) 0%, rgba(0,0,0,0.15) 35%, rgba(0,0,0,0.72) 100%); 691} 692.ts-card-body { 693 position: absolute; 694 left: 1.5rem; 695 right: 1.5rem; 696 bottom: 1.5rem; 697 z-index: 2; 698 display: flex; 699 flex-direction: column; 700 gap: 0.75rem; 701} 702.ts-card-title { 703 font-family: var(--font-heading); 704 font-size: 1.375rem; 705 line-height: 1.2; 706 font-weight: 500; 707 margin: 0; 708 color: #fff; 709 text-shadow: 0 1px 14px rgba(0,0,0,0.5); 710} 711.ts-ic { width: 1em; height: 1em; flex: none; } 712</style> 713 714
715<script>window.__tsImg_ai = "https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1024/format/webp/2026/05/thesis-clean-20260522-133355-7a0cbdc2.jpg";</script>
715 716 717 718
719<script>window.__tsImg_econ = "https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1024/format/webp/2026/03/image-clean-20260308-232057-efc0fa1f.png";</script>
719 720 721 722
723<script>window.__tsImg_ops = "https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1024/format/webp/2026/03/image-clean-20260308-231232-be9b30cc-1.png";</script>
723 724 725
726<script>window.__tsImg_ticy = "https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/2026/08/ticy-clean-20260819-090530-ffdc8193.jpg";</script>
726 727
728<script> 729window.THESES_DATA = [ 730 { 731 pill: 'My AI Thesis', 732 title: 'Execution Is Scaling Faster Than Judgment', 733 excerpt: 'The agents are working. What the metrics don\'t capture is direction.', 734 url: '/execution-is-scaling-faster-than-judgment/', 735 image: window.__tsImg_ai || '', 736 cta: 'Read my full argument' 737 }, 738 { 739 pill: 'My Economic Thesis', 740 title: 'The Satoshi Settlement Is Coming', 741 excerpt: 'The dollar has held the world\'s reserve currency crown longer than any empire before it. What comes next is mathematics.', 742 url: '/satoshi-settlement/', 743 image: window.__tsImg_econ || '', 744 cta: 'Read my position' 745 }, 746 { 747 pill: 'My Business Thesis', 748 title: 'Builders Beat Spectators', 749 excerpt: 'Real advantage comes from execution, judgment, cadence, and decision systems. Not from watching the game.', 750 url: '/operators-edge/', 751 image: window.__tsImg_ops || '', 752 cta: 'Explore my series' 753 }, 754 { 755 pill: 'My Book', 756 title: 'The Idea Chose You', 757 excerpt: 'It didn\'t arrive by accident. Twenty-two decisions, made in order, are what you owe the idea that picked you. A playbook built for the AI era.', 758 url: '/the-idea-chose-you/', 759 image: window.__tsImg_ticy || '', 760 cta: 'See the playbook' 761 } 762]; 763</script>
763 764
765<script> 766(function () { 767 'use strict'; 768 769 class ThesisSelector extends HTMLElement { 770 connectedCallback() { 771 if (document.readyState === 'loading') { 772 document.addEventListener('DOMContentLoaded', this._init.bind(this), { once: true }); 773 } else { 774 this._init(); 775 } 776 } 777 _init() { 778 if (this._inited) return; 779 this._inited = true; 780 this.items = window.THESES_DATA || []; 781 this.activeIndex = 0; 782 if (!this.items.length) return; 783 this.render(); 784 } 785 render() { 786 const active = this.items[this.activeIndex]; 787 this.innerHTML = 788 '<div class="ts-desktop ts-grid">' + renderHero(active) + renderSidebar(this.items, this.activeIndex) + '</div>' + 789 '<div class="ts-mobile">' + this.items.map(renderMobileCard).join('') + '</div>'; 790 const me = this; 791 this.querySelectorAll('.ts-item').forEach(function (btn) { 792 btn.addEventListener('click', function (e) { 793 e.preventDefault(); 794 const idx = parseInt(this.getAttribute('data-i'), 10); 795 if (idx === me.activeIndex) return; 796 me.activeIndex = idx; 797 me.render(); 798 }); 799 }); 800 } 801 } 802 803 function renderHero(item) { 804 return '<a class="ts-hero" href="' + escAttr(item.url) + '">' + 805 '<div class="ts-hero-img" style="background-image:url(\'' + escAttr(item.image) + '\')"></div>' + 806 '<span class="ts-pill">' + esc(item.pill) + '</span>' + 807 '<div class="ts-hero-body">' + 808 '<h2 class="ts-hero-title">' + esc(item.title) + '</h2>' + 809 '<p class="ts-hero-excerpt">' + esc(item.excerpt) + '</p>' + 810 '<span class="ts-read-btn">' + esc(item.cta) + 811 '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true" class="ts-ic"><path fill-rule="evenodd" d="M3 10a.75.75 0 01.75-.75h10.638L10.23 5.29a.75.75 0 111.04-1.08l5.5 5.25a.75.75 0 010 1.08l-5.5 5.25a.75.75 0 11-1.04-1.08l4.158-3.96H3.75A.75.75 0 013 10z" clip-rule="evenodd"/></svg>' + 812 '</span>' + 813 '</div>' + 814 '</a>'; 815 } 816
817 function renderSidebar(items, activeIndex) { 818 let html = '<aside class="ts-sidebar"><div class="ts-sidebar-title">Where I stand</div>'; 819 items.forEach(function (it, i) { 820 html += '<button type="button" class="ts-item' + (i === activeIndex ? ' ts-item-active' : '') + '" data-i="' + i + '">' + 821 '<div class="ts-item-pill">' + esc(it.pill) + '</div>' + 822 '<div class="ts-item-title">' + esc(it.title) + '</div>' + 823 '</button>'; 824 }); 825 return html + '</aside>'; 826 } 827 828 function renderMobileCard(item) { 829 return '<a class="ts-card" href="' + escAttr(item.url) + '">' + 830 '<div class="ts-card-img" style="background-image:url(\'' + escAttr(item.image) + '\')"></div>' + 831 '<span class="ts-pill">' + esc(item.pill) + '</span>' + 832 '<div class="ts-card-body">' + 833 '<h2 class="ts-card-title">' + esc(item.title) + '</h2>' + 834 '<span class="ts-read-btn">' + esc(item.cta) + 835 '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true" class="ts-ic"><path fill-rule="evenodd" d="M3 10a.75.75 0 01.75-.75h10.638L10.23 5.29a.75.75 0 111.04-1.08l5.5 5.25a.75.75 0 010 1.08l-5.5 5.25a.75.75 0 11-1.04-1.08l4.158-3.96H3.75A.75.75 0 013 10z" clip-rule="evenodd"/></svg>' + 836 '</span>' + 837 '</div>' + 838 '</a>'; 839 } 840 841 function esc(s) { return String(s == null ? '' : s).replace(/[&<>"']/g, function(c) { return {'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]; }); } 842 function escAttr(s) { return String(s == null ? '' : s).replace(/"/g, '"'); } 843 844 if (!customElements.get('thesis-selector')) customElements.define('thesis-selector', ThesisSelector); 845})(); 846</script>
846 847 848<section class="theses-section"> 849 <div class="container"> 850 <span class="theses-label">Core Convictions</span> 851 <thesis-selector></thesis-selector> 852 </div> 853</section> 854 855 <div class="container"> 856 <div class="space-y-20 md:space-y-32"> 857 <div> 858 <div class="space-y-12 md:space-y-20"> 859 <div class="grid gap-4 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4" data-feed> 860 <article class="group relative flex flex-col w-full aspect-custom bg-secondary overflow-hidden text-white rounded-custom"> 861 <picture class="block size-full z-5 transition-opacity group-hover:opacity-85"> 862 <source 863 srcset="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/avif/2026/05/faster-clean-20260521-184734-a1fc77b5-1.jpg 320w, 864 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w640/format/avif/2026/05/faster-clean-20260521-184734-a1fc77b5-1.jpg 640w, 865 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1024/format/avif/2026/05/faster-clean-20260521-184734-a1fc77b5-1.jpg 1024w" 866 sizes="(min-width: 1024px) 320px, (min-width: 768px) 33vw, (min-width: 640px) 50vw, 100vw" 867 type="image/avif" 868 > 869 <img 870 class="size-full object-cover" 871 srcset="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/webp/2026/05/faster-clean-20260521-184734-a1fc77b5-1.jpg 320w, 872 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w640/format/webp/2026/05/faster-clean-20260521-184734-a1fc77b5-1.jpg 640w, 873 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1024/format/webp/2026/05/faster-clean-20260521-184734-a1fc77b5-1.jpg 1024w" 874 sizes="(min-width: 1024px) 320px, (min-width: 768px) 33vw, (min-width: 640px) 50vw, 100vw" 875 src="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/webp/2026/05/faster-clean-20260521-184734-a1fc77b5-1.jpg" 876 alt="Your Agents Moving Faster Than Your Judgment Is A Problem" 877 fetchpriority="high" 878 loading="lazy" 879 > 880</picture> <div class="absolute inset-0 bg-linear-to-t from-black/50 from-0% to-transparent to-70% z-10"></div> 881 <div class="absolute inset-0 flex flex-col justify-between gap-6 p-6 z-15"> 882 <div class="flex items-center gap-x-2"> 883 <a class="tag-sm var-blur z-10 hover:opacity-100" href="https://www.tomfrazier.com/tag/leadership/">Leadership</a> 884 </div> 885 <div class="space-y-1"> 886 <h2 class="heading-2xl text-current"> 887 <a class="block after:absolute after:inset-0 after:z-5" href="/ai-agents-lag-leadership-judgment/">Your Agents Moving Faster Than Your Judgment Is A Problem</a> 888 </h2> 889 <time class="block text-sm text-current/80" datetime="2026-09-29T11:16:21-07:00">Sep 29, 2026</time> 890 </div> 891 </div> 892</article> <article class="group relative flex flex-col w-full aspect-custom bg-secondary overflow-hidden text-white rounded-custom"> 893 <picture class="block size-full z-5 transition-opacity group-hover:opacity-85"> 894 <source 895 srcset="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/avif/2026/09/content-market-fit-clean-20260914-132116-746530ed-1.jpg 320w, 896 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w640/format/avif/2026/09/content-market-fit-clean-20260914-132116-746530ed-1.jpg 640w, 897 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1024/format/avif/2026/09/content-market-fit-clean-20260914-132116-746530ed-1.jpg 1024w" 898 sizes="(min-width: 1024px) 320px, (min-width: 768px) 33vw, (min-width: 640px) 50vw, 100vw" 899 type="image/avif" 900 > 901 <img 902 class="size-full object-cover" 903 srcset="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/webp/2026/09/content-market-fit-clean-20260914-132116-746530ed-1.jpg 320w, 904 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w640/format/webp/2026/09/content-market-fit-clean-20260914-132116-746530ed-1.jpg 640w, 905 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1024/format/webp/2026/09/content-market-fit-clean-20260914-132116-746530ed-1.jpg 1024w" 906 sizes="(min-width: 1024px) 320px, (min-width: 768px) 33vw, (min-width: 640px) 50vw, 100vw" 907 src="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/webp/2026/09/content-market-fit-clean-20260914-132116-746530ed-1.jpg" 908 alt="Content Market Fit Is Cheaper Than Product Market Fit." 909 fetchpriority="high" 910 loading="lazy" 911 > 912</picture> <div class="absolute inset-0 bg-linear-to-t from-black/50 from-0% to-transparent to-70% z-10"></div> 913 <div class="absolute inset-0 flex flex-col justify-between gap-6 p-6 z-15"> 914 <div class="flex items-center gap-x-2"> 915 <a class="tag-sm var-blur z-10 hover:opacity-100" href="https://www.tomfrazier.com/tag/entrepreneur/">Entrepreneur</a> 916 </div> 917 <div class="space-y-1"> 918 <h2 class="heading-2xl text-current"> 919 <a class="block after:absolute after:inset-0 after:z-5" href="/content-market-fit-before-product-market-fit/">Content Market Fit Is Cheaper Than Product Market Fit.</a> 920 </h2> 921 <time class="block text-sm text-current/80" datetime="2026-09-15T08:34:50-07:00">Sep 15, 2026</time> 922 </div> 923 </div> 924</article> <article class="group relative flex flex-col w-full aspect-custom bg-secondary overflow-hidden text-white rounded-custom"> 925 <picture class="block size-full z-5 transition-opacity group-hover:opacity-85"> 926 <source 927 srcset="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/avif/2026/09/ambassador-threshold-clean-20260903-115153-98b66284-1.jpg 320w, 928 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w640/format/avif/2026/09/ambassador-threshold-clean-20260903-115153-98b66284-1.jpg 640w, 929 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1024/format/avif/2026/09/ambassador-threshold-clean-20260903-115153-98b66284-1.jpg 1024w" 930 sizes="(min-width: 1024px) 320px, (min-width: 768px) 33vw, (min-width: 640px) 50vw, 100vw" 931 type="image/avif" 932 > 933 <img 934 class="size-full object-cover" 935 srcset="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/webp/2026/09/ambassador-threshold-clean-20260903-115153-98b66284-1.jpg 320w, 936 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w640/format/webp/2026/09/ambassador-threshold-clean-20260903-115153-98b66284-1.jpg 640w, 937 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1024/format/webp/2026/09/ambassador-threshold-clean-20260903-115153-98b66284-1.jpg 1024w" 938 sizes="(min-width: 1024px) 320px, (min-width: 768px) 33vw, (min-width: 640px) 50vw, 100vw" 939 src="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/webp/2026/09/ambassador-threshold-clean-20260903-115153-98b66284-1.jpg" 940 alt="Dre & Druckenmiller Just Crossed AI'
940s Ambassador Threshold" 941 fetchpriority="high" 942 loading="lazy" 943 > 944</picture> <div class="absolute inset-0 bg-linear-to-t from-black/50 from-0% to-transparent to-70% z-10"></div> 945 <div class="absolute inset-0 flex flex-col justify-between gap-6 p-6 z-15"> 946 <div class="flex items-center gap-x-2"> 947 <a class="tag-sm var-blur z-10 hover:opacity-100" href="https://www.tomfrazier.com/tag/ai/">AI</a> 948 </div> 949 <div class="space-y-1"> 950 <h2 class="heading-2xl text-current"> 951 <a class="block after:absolute after:inset-0 after:z-5" href="/ai-acceptance-dre-druckenmiller/">Dre & Druckenmiller Just Crossed AI's Ambassador Threshold</a> 952 </h2> 953 <time class="block text-sm text-current/80" datetime="2026-09-03T12:07:31-07:00">Sep 03, 2026</time> 954 </div> 955 </div> 956</article> <article class="group relative flex flex-col w-full aspect-custom bg-secondary overflow-hidden text-white rounded-custom"> 957 <picture class="block size-full z-5 transition-opacity group-hover:opacity-85"> 958 <source 959 srcset="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/avif/2026/05/execution-clean-20260521-200848-6e78763f-1.jpg 320w, 960 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w640/format/avif/2026/05/execution-clean-20260521-200848-6e78763f-1.jpg 640w, 961 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1024/format/avif/2026/05/execution-clean-20260521-200848-6e78763f-1.jpg 1024w" 962 sizes="(min-width: 1024px) 320px, (min-width: 768px) 33vw, (min-width: 640px) 50vw, 100vw" 963 type="image/avif" 964 > 965 <img 966 class="size-full object-cover" 967 srcset="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/webp/2026/05/execution-clean-20260521-200848-6e78763f-1.jpg 320w, 968 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w640/format/webp/2026/05/execution-clean-20260521-200848-6e78763f-1.jpg 640w, 969 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1024/format/webp/2026/05/execution-clean-20260521-200848-6e78763f-1.jpg 1024w" 970 sizes="(min-width: 1024px) 320px, (min-width: 768px) 33vw, (min-width: 640px) 50vw, 100vw" 971 src="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/webp/2026/05/execution-clean-20260521-200848-6e78763f-1.jpg" 972 alt="Agents Solved Execution. Nobody Told Your Company." 973 fetchpriority="high" 974 loading="lazy" 975 > 976</picture> <div class="absolute inset-0 bg-linear-to-t from-black/50 from-0% to-transparent to-70% z-10"></div> 977 <div class="absolute inset-0 flex flex-col justify-between gap-6 p-6 z-15"> 978 <div class="flex items-center gap-x-2"> 979 <a class="tag-sm var-blur z-10 hover:opacity-100" href="https://www.tomfrazier.com/tag/leadership/">Leadership</a> 980 </div> 981 <div class="space-y-1"> 982 <h2 class="heading-2xl text-current"> 983 <a class="block after:absolute after:inset-0 after:z-5" href="/ai-agents-solved-execution-leadership-bottleneck/">Agents Solved Execution. Nobody Told Your Company.</a> 984 </h2> 985 <time class="block text-sm text-current/80" datetime="2026-08-25T17:07:49-07:00">Aug 25, 2026</time> 986 </div> 987 </div> 988</article> <article class="group relative flex flex-col w-full aspect-custom bg-secondary overflow-hidden text-white rounded-custom"> 989 <picture class="block size-full z-5 transition-opacity group-hover:opacity-85"> 990 <source 991 srcset="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/avif/2026/08/founder-paycheck-clean-20260821-121852-f25efa97-1.jpg 320w, 992 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w640/format/avif/2026/08/founder-paycheck-clean-20260821-121852-f25efa97-1.jpg 640w, 993 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1024/format/avif/2026/08/founder-paycheck-clean-20260821-121852-f25efa97-1.jpg 1024w" 994 sizes="(min-width: 1024px) 320px, (min-width: 768px) 33vw, (min-width: 640px) 50vw, 100vw" 995 type="image/avif" 996 > 997 <img 998 class="size-full object-cover" 999 srcset="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/webp/2026/08/founder-paycheck-clean-20260821-121852-f25efa97-1.jpg 320w, 1000 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w640/format/webp/2026/08/founder-paycheck-clean-20260821-121852-f25efa97-1.jpg 640w, 1001 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1024/format/webp/2026/08/founder-paycheck-clean-20260821-121852-f25efa97-1.jpg 1024w" 1002 sizes="(min-width: 1024px) 320px, (min-width: 768px) 33vw, (min-width: 640px) 50vw, 100vw" 1003 src="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/webp/2026/08/founder-paycheck-clean-20260821-121852-f25efa97-1.jpg" 1004 alt="The Capital Path Should Pay You Too" 1005 fetchpriority="high" 1006 loading="lazy" 1007 > 1008</picture> <div class="absolute inset-0 bg-linear-to-t from-black/50 from-0% to-transparent to-70% z-10"></div> 1009 <div class="absolute inset-0 flex flex-col justify-between gap-6 p-6 z-15"> 1010 <div class="flex items-center gap-x-2"> 1011 <a class="tag-sm var-blur z-10 hover:opacity-100" href="https://www.tomfrazier.com/tag/entrepreneur/">Entrepreneur</a> 1012 </div> 1013 <div class="space-y-1"> 1014 <h2 class="heading-2xl text-current"> 1015 <a class="block after:absolute after:inset-0 after:z-5" href="/should-founders-pay-themselves/">The Capital Path Should Pay You Too</a> 1016 </h2> 1017 <time class="block text-sm text-current/80" datetime="2026-08-21T17:27:21-07:00">Aug 21, 2026</time> 1018 </div> 1019 </div> 1020</article> <article class="group relative flex flex-col w-full aspect-custom bg-secondary overflow-hidden text-white rounded-custom"> 1021 <picture class="block size-full z-5 transition-opacity group-hover:opacity-85"> 1022 <source 1023 srcset="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/avif/2026/08/volume-scaling-clean-20260818-111517-3260a0c7-1.jpg 320w, 1024 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w640/format/avif/2026/08/volume-scaling-clean-20260818-111517-3260a0c7-1.jpg 640w, 1025 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1024/format/avif/2026/08/volume-scaling-clean-20260818-111517-3260a0c7-1.jpg 1024w" 1026 sizes="(min-width: 1024px) 320px, (min-width: 768px) 33vw, (min-width: 640px) 50vw, 100vw" 1027 type="image/avif" 1028 > 1029 <img 1030 class="size-full object-cover" 1031 srcset="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/webp/2026/08/volume-scaling-clean-20260818-111517-3260a0c7-1.jpg 320w, 1032 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w640/format/webp/2026/08/volume-scaling-clean-20260818-111517-3260a0c7-1.jpg 640w, 1033 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1024/format/webp/2026/08/volume-scaling-clean-20260818-111517-3260a0c7-1.jpg 1024w" 1034 sizes="(min-width: 1024px) 320px, (min-width: 768px) 33vw, (min-width: 640px) 50vw, 100vw" 1035 src="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/webp/2026/08/volume-scaling-clean-20260818-111517-3260a0c7-1.jpg" 1036 alt="Volume Scaling: AI'
1036s First Killer App With Three Dimensions" 1037 fetchpriority="high" 1038 loading="lazy" 1039 > 1040</picture> <div class="absolute inset-0 bg-linear-to-t from-black/50 from-0% to-transparent to-70% z-10"></div> 1041 <div class="absolute inset-0 flex flex-col justify-between gap-6 p-6 z-15"> 1042 <div class="flex items-center gap-x-2"> 1043 <a class="tag-sm var-blur z-10 hover:opacity-100" href="https://www.tomfrazier.com/tag/ai/">AI</a> 1044 </div> 1045 <div class="space-y-1"> 1046 <h2 class="heading-2xl text-current"> 1047 <a class="block after:absolute after:inset-0 after:z-5" href="/agentic-ai-killer-app-volume-scaling/">Volume Scaling: AI's First Killer App With Three Dimensions</a> 1048 </h2> 1049 <time class="block text-sm text-current/80" datetime="2026-08-18T11:43:40-07:00">Aug 18, 2026</time> 1050 </div> 1051 </div> 1052</article> <article class="group relative flex flex-col w-full aspect-custom bg-secondary overflow-hidden text-white rounded-custom"> 1053 <picture class="block size-full z-5 transition-opacity group-hover:opacity-85"> 1054 <source 1055 srcset="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/avif/2026/08/eu-marking-clean-20260813-142925-83c8a200-1.jpg 320w, 1056 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w640/format/avif/2026/08/eu-marking-clean-20260813-142925-83c8a200-1.jpg 640w, 1057 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1024/format/avif/2026/08/eu-marking-clean-20260813-142925-83c8a200-1.jpg 1024w" 1058 sizes="(min-width: 1024px) 320px, (min-width: 768px) 33vw, (min-width: 640px) 50vw, 100vw" 1059 type="image/avif" 1060 > 1061 <img 1062 class="size-full object-cover" 1063 srcset="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/webp/2026/08/eu-marking-clean-20260813-142925-83c8a200-1.jpg 320w, 1064 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w640/format/webp/2026/08/eu-marking-clean-20260813-142925-83c8a200-1.jpg 640w, 1065 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1024/format/webp/2026/08/eu-marking-clean-20260813-142925-83c8a200-1.jpg 1024w" 1066 sizes="(min-width: 1024px) 320px, (min-width: 768px) 33vw, (min-width: 640px) 50vw, 100vw" 1067 src="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/webp/2026/08/eu-marking-clean-20260813-142925-83c8a200-1.jpg" 1068 alt="Marking Is Not the Story" 1069 fetchpriority="high" 1070 loading="lazy" 1071 > 1072</picture> <div class="absolute inset-0 bg-linear-to-t from-black/50 from-0% to-transparent to-70% z-10"></div> 1073 <div class="absolute inset-0 flex flex-col justify-between gap-6 p-6 z-15"> 1074 <div class="flex items-center gap-x-2"> 1075 <a class="tag-sm var-blur z-10 hover:opacity-100" href="https://www.tomfrazier.com/tag/eu-ai-act/">EU AI Act</a> 1076 </div> 1077 <div class="space-y-1"> 1078 <h2 class="heading-2xl text-current"> 1079 <a class="block after:absolute after:inset-0 after:z-5" href="/eu-ai-act-marking-ownership-infrastructure/">Marking Is Not the Story</a> 1080 </h2> 1081 <time class="block text-sm text-current/80" datetime="2026-08-13T14:54:25-07:00">Aug 13, 2026</time> 1082 </div> 1083 </div> 1084</article> <article class="group relative flex flex-col w-full aspect-custom bg-secondary overflow-hidden text-white rounded-custom"> 1085 <picture class="block size-full z-5 transition-opacity group-hover:opacity-85"> 1086 <source 1087 srcset="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/avif/2026/08/playbook-clean-20260812-101949-27dd0ef6-5.jpg 320w, 1088 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w640/format/avif/2026/08/playbook-clean-20260812-101949-27dd0ef6-5.jpg 640w, 1089 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1024/format/avif/2026/08/playbook-clean-20260812-101949-27dd0ef6-5.jpg 1024w" 1090 sizes="(min-width: 1024px) 320px, (min-width: 768px) 33vw, (min-width: 640px) 50vw, 100vw" 1091 type="image/avif" 1092 > 1093 <img 1094 class="size-full object-cover" 1095 srcset="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/webp/2026/08/playbook-clean-20260812-101949-27dd0ef6-5.jpg 320w, 1096 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w640/format/webp/2026/08/playbook-clean-20260812-101949-27dd0ef6-5.jpg 640w, 1097 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1024/format/webp/2026/08/playbook-clean-20260812-101949-27dd0ef6-5.jpg 1024w" 1098 sizes="(min-width: 1024px) 320px, (min-width: 768px) 33vw, (min-width: 640px) 50vw, 100vw" 1099 src="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/webp/2026/08/playbook-clean-20260812-101949-27dd0ef6-5.jpg" 1100 alt="The Old Startup Playbook Is Dead. Sequence Is the Only Thing Left." 1101 fetchpriority="high" 1102 loading="lazy" 1103 > 1104</picture> <div class="absolute inset-0 bg-linear-to-t from-black/50 from-0% to-transparent to-70% z-10"></div> 1105 <div class="absolute inset-0 flex flex-col justify-between gap-6 p-6 z-15"> 1106 <div class="flex items-center gap-x-2"> 1107 <a class="tag-sm var-blur z-10 hover:opacity-100" href="https://www.tomfrazier.com/tag/startup/">Startup</a> 1108 </div> 1109 <div class="space-y-1"> 1110 <h2 class="heading-2xl text-current"> 1111 <a class="block after:absolute after:inset-0 after:z-5" href="/the-old-startup-playbook-is-dead/">The Old Startup Playbook Is Dead. Sequence Is the Only Thing Left.</a> 1112 </h2> 1113 <time class="block text-sm text-current/80" datetime="2026-08-12T10:24:01-07:00">Aug 12, 2026</time> 1114 </div> 1115 </div> 1116</article> </div> 1117 <div class="flex justify-center" data-pagination> 1118 <button class="btn-md var-primary" data-next="/page/2/">
1119 <span class="transition-opacity will-change-[opacity] loading:opacity-0">Load More</span> 1120 <span class="absolute text-xl opacity-0 transition-opacity will-change-[opacity] loading:opacity-100"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="animate-spin"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 3a9 9 0 1 0 9 9" /></svg></span> 1121 </button> 1122 </div> 1123 1124</div> </div> 1125 <div> 1126 <div class="group relative w-full bg-secondary overflow-hidden py-20 px-6 rounded-custom md:py-32 md:px-12"> 1127 <div class="absolute inset-0"> 1128 <figure class="block size-full"> 1129 <source 1130 srcset="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/avif/2026/07/tom-frazier-pattern-nodefield.jpg 320w, 1131 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w640/format/avif/2026/07/tom-frazier-pattern-nodefield.jpg 640w, 1132 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1024/format/avif/2026/07/tom-frazier-pattern-nodefield.jpg 1024w, 1133 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1280/format/avif/2026/07/tom-frazier-pattern-nodefield.jpg 1280w, 1134 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1920/format/avif/2026/07/tom-frazier-pattern-nodefield.jpg 1920w" 1135 sizes="(min-width: 1024px) 1024px, 100vw" 1136 type="image/avif" 1137 > 1138 <img 1139 class="size-full object-cover" 1140 srcset="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w320/format/webp/2026/07/tom-frazier-pattern-nodefield.jpg 320w, 1141 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w640/format/webp/2026/07/tom-frazier-pattern-nodefield.jpg 640w, 1142 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1024/format/webp/2026/07/tom-frazier-pattern-nodefield.jpg 1024w, 1143 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1280/format/webp/2026/07/tom-frazier-pattern-nodefield.jpg 1280w, 1144 https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1920/format/webp/2026/07/tom-frazier-pattern-nodefield.jpg 1920w" 1145 sizes="(min-width: 1024px) 1024px, 100vw" 1146 src="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/size/w1024/format/webp/2026/07/tom-frazier-pattern-nodefield.jpg" 1147 alt="Join The Long Arc" 1148 fetchpriority="high" 1149 loading="eager" 1150 > 1151</figure> <div class="absolute inset-0 bg-overlay/34 z-1"></div> 1152 </div> 1153 <div class="relative flex flex-col items-center gap-y-8 w-full max-w-xl mx-auto z-20 text-white"> 1154 <div class="space-y-4 text-center"> 1155 <h2 class="heading-3xl md:heading-4xl text-white!"> 1156 Join The Long Arc 1157 </h2> 1158 <p class="text-lg"> 1159 Public long-term thinking. When I publish something worth keeping, youâll get it here. Enter your email, then click the confirmation link. 1160 </p> 1161 </div> 1162 <form class="flex gap-1 w-full max-w-md bg-primary p-1 mx-auto rounded-full inset-ring inset-ring-transparent transition-shadow error:inset-ring-red/50 success:pointer-events-none" data-members-form> 1163 <input class="flex-1 w-full bg-transparent px-4 text-lg text-text placeholder:opacity-60 focus:outline-none" name="email" type="email" placeholder="Enter your email" autocomplete="email" required data-members-email> 1164 <button class="relative btn-base var-primary *:transition-opacity" type="submit" aria-label="Subscribe">
1165 <span class="loading:opacity-0 success:opacity-0">Subscribe</span> 1166 <span class="absolute opacity-0 loading:opacity-100"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="animate-spin"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 3a9 9 0 1 0 9 9" /></svg></span> 1167 <span class="absolute opacity-0 success:opacity-100"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 12l5 5l10 -10" /></svg></span> 1168 </button> 1169</form> </div> 1170 </div> 1171 </div> 1172 </div> 1173 </div> 1174 1175</main> 1176 1177 <footer class="footer"> 1178 <div class="container"> 1179 <div class="text-center space-y-12 md:space-y-20"> 1180 <div class="flex flex-col items-center gap-y-8"> 1181 <a class="group/logo flex items-center h-logo" href="https://www.tomfrazier.com"> 1182 <img 1183 class="block w-auto h-full transition-opacity group-hover/logo:opacity-85 dark:hidden" 1184 src="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/2026/06/logo-tomfrazier-light-header.png" 1185 width="180" 1186 height="60" 1187 alt="Tom Frazier | The Long Arc â AI, Bitcoin & Startup" 1188 fetchpriority="high" 1189 loading="eager" 1190> <img 1191 class="block w-auto h-full transition-opacity group-hover/logo:opacity-85 hidden dark:block" 1192 src="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/2026/06/logo-tomfrazier-dark-header.png" 1193 width="180" 1194 height="60" 1195 alt="Tom Frazier | The Long Arc â AI, Bitcoin & Startup" 1196 fetchpriority="high" 1197 loading="lazy" 1198></a> <div class="flex justify-center flex-wrap items-center gap-4 not-has-child:hidden"> 1199</div> 1200 <nav class="flex justify-center flex-wrap gap-y-2 gap-x-6 not-has-child:hidden"> 1201 <a class="font-medium hover:underline" href="https://www.tomfrazier.com/the-idea-chose-you/">The Idea Chose You</a> 1202 <a class="font-medium hover:underline" href="https://tomfrazier.com/operators-edge/">The Operator's Edge</a> 1203 <a class="font-medium hover:underline" href="https://www.tomfrazier.com/llm-usage/">LLM Usage</a> 1204 <a class="font-medium hover:underline" href="https://www.tomfrazier.com/contact/">Contact</a> 1205 <a class="font-medium hover:underline" href="https://www.tomfrazier.com/media-kit/">Media Kit</a> 1206 <a class="font-medium hover:underline" href="https://tomfrazier.com/about/">About Tom</a> 1207 </nav> 1208 1209 </div> 1210 <div class="flex justify-center items-center pb-8"> 1211 <p class="text-center a:text-decoration"> 1212 © 2026 Tom Frazier 1213 </p> 1214 </div> 1215 </div> 1216 </div> 1217</footer> </div> 1218 <div class="group fixed inset-0 z-50 bg-linear-to-br from-overlay/20 to-overlay/10 backdrop-blur-2xs invisible opacity-0 transition-[visibility,opacity] duration-300 not-lg:aria-expanded:visible not-lg:aria-expanded:opacity-100" aria-expanded="false" data-mobile-menu> 1219 <div class="flex flex-col size-full bg-primary overflow-hidden" data-sidebar> 1220 <div class="grid grid-cols-[1fr_auto_1fr] items-center gap-x-4 py-4 px-4 sm:py-8"> 1221 <div class="justify-self-start"> 1222 <button class="icon-sm var-secondary" aria-label="Close" data-menu-toggle> 1223 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M18 6l-12 12" /><path d="M6 6l12 12" /></svg></button> </div> 1224 <div class="justify-self-center"> 1225 <a class="group/logo flex items-center h-logo" href="https://www.tomfrazier.com"> 1226 <img 1227 class="block w-auto h-full transition-opacity group-hover/logo:opacity-85 dark:hidden" 1228 src="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/2026/06/logo-tomfrazier-light-header.png" 1229 width="180" 1230 height="60" 1231 alt="Tom Frazier | The Long Arc â AI, Bitcoin & Startup" 1232 fetchpriority="high" 1233 loading="lazy" 1234> <img 1235 class="block w-auto h-full transition-opacity group-hover/logo:opacity-85 hidden dark:block" 1236 src="https://storage.ghost.io/c/55/dd/55ddb45d-694f-462b-9dc8-c6c46460a521/content/images/2026/06/logo-tomfrazier-dark-header.png" 1237 width="180" 1238 height="60" 1239 alt="Tom Frazier | The Long Arc â AI, Bitcoin & Startup" 1240 fetchpriority="high" 1241 loading="lazy" 1242></a> </div> 1243 <div class="justify-self-end flex items-center gap-x-4 lg:hidden"> 1244 <button class="relative flex justify-center items-center size-8 text-xl transition-opacity hover:opacity-85 " aria-label="Dark Mode" data-theme-toggle>
1245 <span class="transition-opacity will-change-[opacity] duration-300 dark:opacity-0"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 12m-4 0a4 4 0 1 0 8 0a4 4 0 1 0 -8 0" /><path d="M3 12h1m8 -9v1m8 8h1m-9 8v1m-6.4 -15.4l.7 .7m12.1 -.7l-.7 .7m0 11.4l.7 .7m-12.1 -.7l-.7 .7" /></svg></span> 1246 <span class="absolute opacity-0 transition-opacity duration-300 will-change-[opacity] dark:opacity-100"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" /><path d="M17 4a2 2 0 0 0 2 2a2 2 0 0 0 -2 2a2 2 0 0 0 -2 -2a2 2 0 0 0 2 -2" /><path d="M19 11h2m-1 -1v2" /></svg></span> 1247 </button> 1248 <button class="icon-sm var-secondary" aria-label="Search" data-ghost-search><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 10m-7 0a7 7 0 1 0 14 0a7 7 0 1 0 -14 0" /><path d="M21 21l-6 -6" /></svg></button> </div> 1249 </div> 1250 <div class="flex-1 flex flex-col gap-y-4 p-4 pt-0 overflow-hidden sm:gap-y-8"> 1251 <div class="flex-1 overflow-hidden group-aria-expanded:animate-fade-in-up"> 1252 <div class="relative flex flex-col justify-center h-full overflow-hidden"> 1253 <div class="absolute top-0 inset-x-0 h-6 bg-linear-to-b from-primary to-transparent pointer-events-none"></div> 1254 <nav class="max-h-full overflow-hidden overflow-y-auto py-4" aria-label="Menu"> 1255 <ul class="heading-xl text-current text-center space-y-3"> 1256 <li><a class="text-decoration" href="https://www.tomfrazier.com/the-idea-chose-you/">The Idea Chose You</a></li> 1257 <li><a class="text-decoration" href="https://tomfrazier.com/about/">About Tom</a></li> 1258 </ul> 1259 1260 </nav> 1261 <div class="absolute bottom-0 inset-x-0 h-6 bg-linear-to-t from-primary to-transparent pointer-events-none"></div> 1262 </div> 1263 </div> 1264 <a class="btn-md var-primary w-full" href="#/portal/signup" data-portal="signup">Subscribe</a> 1265 </div> 1266 </div> 1267</div>
1267<script src="https://www.tomfrazier.com/assets/built/global.js?v=Pxny4Whd8be1LHeY"></script>
1267 1268 <!-- Google Tag Manager (noscript) -->
vendor: 68 bytes, lines 1268-1269
1268 1269<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
1269GTM-5T6JRMGN
vendor: 83 bytes, lines 1269-1270
1269" 1270height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
1271<!-- End Google Tag Manager (noscript) --> 1272 1273<div class="cc-license-global license-ccby-only"> 1274 Licensed under 1275 <a href="https://creativecommons.org/licenses/by/4.0/" target="_blank" rel="license noopener noreferrer"> 1276 CC BY 4.0 1277 </a>. 1278</div> 1279 1280<style> 1281.license-restricted .license-ccby-only { 1282 display: none; 1283} 1284 1285.gh-portal-powered { 1286 display:none; 1287} 1288</style> 1289 1290 1291<!-- Delphi popup modal --> 1292<!-- 1293<div id="delphi-modal" style="display:none;position:fixed; inset:0;background:rgba(0,0,0,0.6);z-index:9999; align-items:center; justify-content:center;"> 1294 <div style="background:#fff; max-width:900px; width:95%; height:80vh;border-radius:8px; overflow:hidden; position:relative;"> 1295 <button id="delphi-close" style="position:absolute; top:8px; right:12px;border:none; background:transparent; font-size:24px; cursor:pointer;">Ã</button> 1296 <iframe src="https://www.delphi.ai/tomfrazier" style="border:0; width:100%; height:100%;" loading="lazy"></iframe> 1297 </div> 1298</div> 1299--> 1300<!--
1301<script> 1302 (function () { 1303 const openPopup = function (e) { 1304 if (e) e.preventDefault(); 1305 const modal = document.getElementById('delphi-modal'); 1306 if (modal) modal.style.display = 'flex'; 1307 }; 1308 1309 const closePopup = function () { 1310 const modal = document.getElementById('delphi-modal'); 1311 if (modal) modal.style.display = 'none'; 1312 }; 1313 1314 document.addEventListener('click', function (e) { 1315 const target = e.target.closest('[data-delphi-popup], .nav-ask-tom a'); 1316 if (target) openPopup(e); 1317 }); 1318 1319 document.addEventListener('DOMContentLoaded', function () { 1320 const closeBtn = document.getElementById('delphi-close'); 1321 const modal = document.getElementById('delphi-modal'); 1322 if (closeBtn) closeBtn.addEventListener('click', closePopup); 1323 if (modal) { 1324 modal.addEventListener('click', function (e) { 1325 if (e.target === modal) closePopup(); 1326 }); 1327 } 1328 }); 1329 })(); 1330</script>
1330 1331--> 1332 1333<!-- custom module for series content -->
1334<script> 1335 window.PHASE_ARTICLES_CONFIG = { 1336 apiUrl: 'https://tom-frazier.ghost.io', 1337 apiKey: 'ef11a8085150e691a7320ac48d' 1338 }; 1339</script>
1339 1340 1341<style> 1342phase-articles { display: block; margin: 0 0 6rem 0; font-family: inherit; } 1343phase-articles * { box-sizing: border-box; } 1344phase-articles placeholders, phase-articles placeholder { display: none; } 1345 1346.pa-empty-subscribe { background: none; border: none; padding: 0; font: inherit; font-size: inherit; color: inherit; letter-spacing: inherit; text-decoration: underline; cursor: pointer; } 1347 1348/* Wide layout â promote out of Fancy's narrow `regular` canvas column. */ 1349.canvas > phase-articles { grid-column: wide; } 1350.canvas > phase-articles[width="regular"] { grid-column: regular; } 1351.canvas > phase-articles[width="full"] { grid-column: full; } 1352 1353.pa-shell { width: 100%; } 1354.pa-status-row { display: flex; justify-content: flex-end; margin-bottom: 0.75rem; padding: 0 2px; } 1355.pa-status { font-size: 12px; color: var(--color-meta, rgba(0,0,0,0.55)); letter-spacing: 0.02em; } 1356 1357phase-articles .pa-desktop { display: none; } 1358phase-articles .pa-mobile { display: grid; grid-auto-flow: column; grid-auto-columns: 85%; gap: 12px; overflow-x: auto; scroll-snap-type: x mandatory; scroll-behavior: smooth; padding: 4px 4px 16px; scrollbar-width: none; } 1359phase-articles .pa-mobile::-webkit-scrollbar { display: none; } 1360@media (min-width: 768px) { 1361 phase-articles .pa-desktop { display: grid; } 1362 phase-articles .pa-mobile { display: none; } 1363} 1364 1365.pa-grid { grid-template-columns: 1fr 340px; align-items: stretch; max-height: 600px; border-radius: var(--radius-custom, 12px); overflow: hidden; border: 1px solid var(--color-border, rgba(0,0,0,0.08)); background: var(--color-primary, #fff); } 1366 1367.pa-hero { position: relative; min-height: 420px; overflow: hidden; background: var(--color-overlay, #1a1a1a); text-decoration: none; color: #fff; display: block; } 1368.pa-hero-img { position: absolute; inset: 0; background-size: cover; background-position: center; background-color: var(--color-overlay, #1a1a1a); transition: transform 0.6s ease; } 1369.pa-hero:hover .pa-hero-img { transform: scale(1.04); } 1370.pa-hero-soon { cursor: default; } 1371.pa-hero-soon:hover .pa-hero-img { transform: none; } 1372.pa-pill { position: absolute; top: 22px; left: 24px; z-index: 2; display: inline-flex; align-items: center; gap: 5px; font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; color: #fff; font-weight: 500; padding: 6px 14px; background: rgba(255,255,255,0.18); backdrop-filter: blur(10px) saturate(180%); -webkit-backdrop-filter: blur(10px) saturate(180%); border-radius: 999px; border: 0.5px solid rgba(255,255,255,0.28); } 1373.pa-hero-body { position: absolute; left: 30px; right: 30px; bottom: 28px; z-index: 2; } 1374.pa-hero-title { font-family: var(--font-heading, Georgia, 'Times New Roman', serif); font-size: 32px; line-height: 1.18; font-weight: 500; margin: 0 0 20px; max-width: 86%; color: #fff; text-shadow: 0 1px 14px rgba(0,0,0,0.5); } 1375.pa-read-btn { display: inline-flex; align-items: center; gap: 6px; background: #fff; color: #1a1a1a; border: none; padding: 11px 20px; border-radius: 999px; font-size: 12px; font-weight: 500; cursor: pointer; transition: background 0.15s ease; } 1376.pa-hero:hover .pa-read-btn, .pa-card:hover .pa-read-btn { background: #f3f3f3; } 1377.pa-soon-tag { display: inline-flex; align-items: center; gap: 6px; border: 1px solid rgba(255,255,255,0.45); color: #fff; padding: 10px 18px; border-radius: 999px; font-size: 12px; font-weight: 500; } 1378 1379.pa-sidebar { background: var(--color-secondary, #fafaf8); padding: 20px 20px 20px 22px; overflow-y: auto; border-left: 1px solid var(--color-border, rgba(0,0,0,0.06)); } 1380.pa-sidebar-title { font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--color-meta, rgba(0,0,0,0.55)); font-weight: 500; padding-bottom: 12px; border-bottom: 1px solid var(--color-border, rgba(0,0,0,0.08)); margin-bottom: 10px; } 1381.pa-item { display: block; width: 100%; text-align: left; background: transparent; border: none; padding: 13px 8px; border-bottom: 1px solid var(--color-border, rgba(0,0,0,0.05)); cursor: pointer; position: relative; transition: background 0.15s ease; font: inherit; color: inherit; } 1382.pa-item:last-child { border-bottom: none; } 1383.pa-item:hover { background: var(--color-tertiary, rgba(0,0,0,0.03)); } 1384.pa-item-pill { display: flex; align-items: center; gap: 5px; font-size: 9px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--color-meta, rgba(0,0,0,0.55)); font-weight: 500; margin-bottom: 4px; } 1385.pa-item-title { font-size: 14px; line-height: 1.4; color: var(--color-heading, #1a1a1a); font-weight: 500; } 1386.pa-item-soon .pa-item-title { color: var(--color-meta, rgba(0,0,0,0.55)); } 1387.pa-item-active { background: var(--color-primary, #fff); border-radius: 8px; box-shadow: 0 1px 4px rgba(0,0,0,0.06); } 1388.pa-item-active::before { content: ''; position: absolute; left: -6px; top: 50%; transform: translateY(-50%); width: 0; height: 0; border-top: 7px solid transparent; border-bottom: 7px solid transparent; border-right: 7px solid var(--color-primary, #fff); } 1389.pa-item-active:hover::before { border-right-color: var(--color-tertiary, rgba(0,0,0,0.03)); } 1390 1391.pa-card { scroll-snap-align: start; position: relative; aspect-ratio: 4 / 5; overflow: hidden; background: var(--color-overlay, #1a1a1a); text-decoration: none; color: #fff; border-radius: var(--radius-custom, 12px); display: block; } 1392.pa-card-img { position: absolute; inset: 0; background-size: cover; background-position: center; background-color: var(--color-overlay, #1a1a1a); } 1393.pa-card-body { position: absolute; left: 22px; right: 22px; bottom: 22px; z-index: 2; } 1394.pa-card-title { font-family: var(--font-heading, Georgia, 'Times New Roman', serif); font-size: 22px; line-height: 1.2; font-weight: 500; margin: 0 0 16px; color: #fff; text-shadow: 0 1px 14px rgba(0,0,0,0.5); } 1395 1396.pa-ic { width: 1em; height: 1em; flex: none; } 1397 1398.pa-empty { border: 1px solid var(--color-border, rgba(0,0,0,0.08)); border-radius: var(--radius-custom, 12px); padding: 32px 24px; text-align: center; background: var(--color-secondary, #fafaf8); color: var(--color-meta, rgba(0,0,0,0.6)); font-size: 14px; letter-spacing: 0.01em; display: flex; align-items: center; justify-content: center; gap: 10px; } 1399.pa-loading { padding: 40px 24px; text-align: center; color: var(--color-meta, rgba(0,0,0,0.35)); font-size: 13px; } 1400 1401.pa-new-badge { display: inline-flex; align-items: center; font-size: 8px; font-weight: 800; letter-spacing: 0.13em; text-transform: uppercase; padding: 3px 7px; border-radius: 4px; vertical-align: middle; } 1402.pa-pill .pa-new-badge { background: #fff; color: #1a1a1a; margin-left: 8px; } 1403.pa-item-pill .pa-new-badge { background: var(--color-new, #e8420b); color: #fff; margin-left: 6px; } 1404</style> 1405
1406<script> 1407(function () { 1408 'use strict'; 1409 1410 const _paReg = {}; 1411 const _paTmr = {}; 1412 1413 class PhaseArticles extends HTMLElement { 1414 connectedCallback() { 1415 if (document.readyState === 'loading') { 1416 document.addEventListener('DOMContentLoaded', this._init.bind(this), { once: true }); 1417 } else { this._init(); } 1418 } 1419 _init() { 1420 if (this._inited) return; 1421 this._inited = true; 1422 this.placeholders = this._parsePlaceholders(); 1423 this.series = this.getAttribute('series') || ''; 1424 this.phase = this.getAttribute('phase') || ''; 1425 this.status = this.getAttribute('status') || ''; 1426 this.items = []; 1427 this.activeIndex = 0; 1428 const cfg = window.PHASE_ARTICLES_CONFIG; 1429 if (!cfg || !cfg.apiUrl || !cfg.apiKey) { console.error('[phase-articles] Missing PHASE_ARTICLES_CONFIG'); return; } 1430 if (!this.series || !this.phase) { console.error('[phase-articles] Missing series or phase', this); return; } 1431 this.renderLoading(); 1432 this._fetch(cfg); 1433 } 1434 _parsePlaceholders() { 1435 const nodes = this.querySelectorAll('placeholder'); 1436 const out = []; 1437 for (let i = 0; i < nodes.length; i++) { 1438 const el = nodes[i]; 1439 const step = parseInt(el.getAttribute('step') || el.getAttribute('id') || '0', 10); 1440 if (!step) continue; 1441 out.push({ step: step, slug: (el.getAttribute('slug') || '').trim().replace(/^\/+|\/+$/g, ''), title: el.getAttribute('title') || '', image: (el.getAttribute('image') || '').trim() }); 1442 } 1443 out.sort((a, b) => a.step - b.step); 1444 return out; 1445 } 1446 async _fetch(cfg) { 1447 let posts = [];
1448 try { 1449 const filter = encodeURIComponent('tag:' + this.series + '+tag:' + this.phase); 1450 const url = cfg.apiUrl.replace(/\/$/, '') + '/ghost/api/content/posts/?key=' + encodeURIComponent(cfg.apiKey) + '&filter=' + filter + '&include=tags,authors&limit=all'; 1451 const res = await fetch(url); 1452 if (!res.ok) throw new Error('API ' + res.status); 1453 const data = await res.json(); 1454 posts = (data.posts || []).map(p => { 1455 const orderTag = (p.tags || []).find(t => /^#?\d+$/.test(t.name || '')); 1456 p._order = orderTag ? parseInt(orderTag.name.replace('#',''), 10) : 999; 1457 return p; 1458 }).sort((a, b) => a._order - b._order); 1459 } catch (e) { 1460 console.error('[phase-articles] Fetch failed:', e); 1461 } 1462 this.items = this._buildItems(posts); 1463 if (!this.items.length) return this.renderEmpty(); 1464 const firstLive = this.items.findIndex(it => it.type === 'live'); 1465 this.activeIndex = firstLive < 0 ? 0 : firstLive; 1466 this.render(); 1467 1468 // Cross-phase NEW badge coordination 1469 const newestLive = this.items 1470 .filter(it => it.type === 'live') 1471 .reduce((best, it) => { 1472 const d = new Date(it.post.published_at || 0); 1473 return (!best || d > best.d) ? { d: d, id: it.post.id } : best; 1474 }, null); 1475 const _s = this.series; 1476 if (!_paReg[_s]) _paReg[_s] = []; 1477 _paReg[_s].push({ instance: this, newestLive: newestLive }); 1478 clearTimeout(_paTmr[_s]); 1479 _paTmr[_s] = setTimeout(() => _resolveNew(_s), 50); 1480 } 1481 _buildItems(posts) { 1482 if (!this.placeholders.length) { 1483 return posts.map(p => ({ type: 'live', step: p._order, post: p })); 1484 } 1485 const bySlug = {}; 1486 posts.forEach(p => { bySlug[p.slug] = p; }); 1487 const used = {}; 1488 const items = this.placeholders.map(ph => { 1489 const post = ph.slug ? bySlug[ph.slug] : null; 1490 if (post) { used[post.slug] = true; return { type: 'live', step: ph.step, post: post }; } 1491 return { type: 'soon', step: ph.step, title: ph.title, image: ph.image }; 1492 }); 1493 posts.forEach(p => { if (!used[p.slug]) items.push({ type: 'live', step: p._order, post: p }); }); 1494 return items; 1495 } 1496 renderLoading() { this.innerHTML = '<div class="pa-shell"><div class="pa-loading">Loadingâ¦</div></div>'; } 1497 renderEmpty() { 1498 if (!this.status) { this.innerHTML = ''; return; } 1499 this.innerHTML = '<div class="pa-shell"><div class="pa-empty">' + icon('clock') + '<span>' + esc(this.status) + ' · <button class="pa-empty-subscribe" type="button">Get notified</button></span></div></div>'; 1500 const btn = this.querySelector('.pa-empty-subscribe'); 1501 if (btn) { 1502 btn.addEventListener('click', function () { 1503 const targets = document.querySelectorAll('.kg-card.kg-signup-card.kg-width-regular'); 1504 const target = targets[targets.length - 1]; 1505 if (target) target.scrollIntoView({ behavior: 'smooth', block: 'center' }); 1506 }); 1507 } 1508 } 1509 render() { 1510 if (!this.items.length) return this.renderEmpty(); 1511 const status = this.status || (this.items.length + ' article' + (this.items.length !== 1 ? 's' : '')); 1512 const active = this.items[this.activeIndex] || this.items[0]; 1513 this.innerHTML = '<div class="pa-shell">' + 1514 (status ? '<div class="pa-status-row"><span class="pa-status">' + esc(status) + '</span></div>' : '') + 1515 '<div class="pa-desktop pa-grid">' + renderHero(active) + renderSidebar(this.items, this.activeIndex) + '</div>' + 1516 '<div class="pa-mobile">' + this.items.map(renderMobileCard).join('') + '</div>' + 1517 '</div>'; 1518 const me = this; 1519 const btns = this.querySelectorAll('.pa-item'); 1520 for (let i = 0; i < btns.length; i++) { 1521 btns[i].addEventListener('click', function (e) { 1522 e.preventDefault(); 1523 const idx = parseInt(this.getAttribute('data-i'), 10); 1524 if (idx === me.activeIndex) return; 1525 me.activeIndex = idx; 1526 me.render(); 1527 }); 1528 } 1529 } 1530 } 1531
1532 function _resolveNew(series) { 1533 const entries = _paReg[series] || []; 1534 let winDate = null, winId = null; 1535 entries.forEach(function(e) { 1536 if (e.newestLive && (!winDate || e.newestLive.d > winDate)) { 1537 winDate = e.newestLive.d; 1538 winId = e.newestLive.id; 1539 } 1540 }); 1541 entries.forEach(function(e) { 1542 e.instance.items.forEach(function(it) { 1543 it._isNew = it.type === 'live' && it.post.id === winId; 1544 }); 1545 e.instance.render(); 1546 }); 1547 } 1548 1549 function newBadge(item) { 1550 return item._isNew ? '<span class="pa-new-badge">New</span>' : ''; 1551 } 1552 1553 function pillText(item) { 1554 const s = item.step && item.step < 999 ? item.step : '?'; 1555 return 'Step ' + s; 1556 } 1557 function renderHero(item) { 1558 if (item.type === 'soon') { 1559 return '<div class="pa-hero pa-hero-soon"><div class="pa-hero-img"' + (item.image ? ' style="background-image:url(\'' + escAttr(item.image) + '\')"' : '') + '></div><span class="pa-pill">' + esc(pillText(item)) + newBadge(item) + '</span><div class="pa-hero-body"><h3 class="pa-hero-title">' + esc(item.title) + '</h3><span class="pa-soon-tag">' + icon('clock') + 'Coming soon</span></div></div>'; 1560 } 1561 const p = item.post, img = p.feature_image || ''; 1562 return '<a class="pa-hero" href="' + escAttr(p.url) + '"><div class="pa-hero-img"' + (img ? ' style="background-image:url(\'' + escAttr(img) + '\')"' : '') + '></div><span class="pa-pill">' + esc(pillText(item)) + newBadge(item) + '</span><div class="pa-hero-body"><h3 class="pa-hero-title">' + esc(p.title) + '</h3><span class="pa-read-btn">Read more ' + icon('arrow') + '</span></div></a>'; 1563 }
1564 function renderSidebar(items, activeIndex) { 1565 let html = '<aside class="pa-sidebar"><div class="pa-sidebar-title">In this phase</div>'; 1566 for (let i = 0; i < items.length; i++) { 1567 const item = items[i], soon = item.type === 'soon'; 1568 const title = soon ? item.title : item.post.title; 1569 html += '<button type="button" class="pa-item' + (soon ? ' pa-item-soon' : '') + (i === activeIndex ? ' pa-item-active' : '') + '" data-i="' + i + '"><div class="pa-item-pill">' + (soon ? icon('clock') : '') + esc(pillText(item)) + newBadge(item) + '</div><div class="pa-item-title">' + esc(title) + '</div></button>'; 1570 } 1571 return html + '</aside>'; 1572 } 1573 function renderMobileCard(item) { 1574 if (item.type === 'soon') { 1575 return '<div class="pa-card pa-card-soon"><div class="pa-card-img"' + (item.image ? ' style="background-image:url(\'' + escAttr(item.image) + '\')"' : '') + '></div><span class="pa-pill">' + esc(pillText(item)) + newBadge(item) + '</span><div class="pa-card-body"><h3 class="pa-card-title">' + esc(item.title) + '</h3><span class="pa-soon-tag">' + icon('clock') + 'Coming soon</span></div></div>'; 1576 } 1577 const p = item.post, img = p.feature_image || ''; 1578 return '<a class="pa-card" href="' + escAttr(p.url) + '"><div class="pa-card-img"' + (img ? ' style="background-image:url(\'' + escAttr(img) + '\')"' : '') + '></div><span class="pa-pill">' + esc(pillText(item)) + newBadge(item) + '</span><div class="pa-card-body"><h3 class="pa-card-title">' + esc(p.title) + '</h3><span class="pa-read-btn">Read more ' + icon('arrow') + '</span></div></a>'; 1579 } 1580 function icon(name) { 1581 if (name === 'arrow') return '<svg class="pa-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><line x1="5" y1="12" x2="19" y2="12"/><polyline points="12 5 19 12 12 19"/></svg>'; 1582 return '<svg class="pa-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="9"/><polyline points="12 7 12 12 15 14"/></svg>'; 1583 } 1584 function esc(s) { return String(s == null ? '' : s).replace(/[&<>"']/g, c => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c])); } 1585 function escAttr(s) { return String(s == null ? '' : s).replace(/"/g, '"'); } 1586 1587 if (!customElements.get('phase-articles')) customElements.define('phase-articles', PhaseArticles); 1588})(); 1589</script>
1589 1590 1591<!-- custom module for subscribe popup -->
1592<script> 1593(() => { 1594 const STORAGE_KEY = 'ghost_portal_last_shown_at'; 1595 const DELAY_MS = 15000; 1596 const SCROLL_THRESHOLD = 0.5; 1597 const EXIT_TOP_THRESHOLD = 10; 1598 const COOLDOWN_MS = 3 * 24 * 60 * 60 * 1000; 1599 1600 // Exact paths to exclude 1601 const EXCLUDED_PATHS = [ 1602 '/', 1603 '/about', 1604 '/contact', 1605 '/advance-reader', 1606 '/private-reader-page' 1607 ]; 1608 1609 // Optional: exclude whole path groups 1610 const EXCLUDED_PREFIXES = [ 1611 '/ghost/', 1612 '/members/' 1613 ]; 1614 1615 let popupTriggered = false; 1616 let timerId = null; 1617 1618 function normalizePath(path) { 1619 if (!path) return '/'; 1620 return path.length > 1 ? path.replace(/\/+$/, '') : path; 1621 } 1622 1623 function isExcludedPage() { 1624 const path = normalizePath(window.location.pathname); 1625 1626 if (EXCLUDED_PATHS.includes(path)) { 1627 return true; 1628 } 1629 1630 return EXCLUDED_PREFIXES.some(prefix => path.startsWith(prefix)); 1631 } 1632 1633 function isDesktopPointer() { 1634 return window.matchMedia('(pointer: fine)').matches; 1635 } 1636 1637 function getLastShownAt() { 1638 try { 1639 const value = localStorage.getItem(STORAGE_KEY); 1640 return value ? parseInt(value, 10) : 0; 1641 } catch (e) { 1642 return 0; 1643 } 1644 } 1645 1646 function isCooldownActive() { 1647 const lastShownAt = getLastShownAt(); 1648 return lastShownAt && (Date.now() - lastShownAt < COOLDOWN_MS); 1649 } 1650 1651 function markShownNow() { 1652 popupTriggered = true; 1653 try { 1654 localStorage.setItem(STORAGE_KEY, String(Date.now())); 1655 } catch (e) {} 1656 } 1657 1658 async function isMember() { 1659 try { 1660 const response = await fetch(`${location.origin}/members/api/member/`, { 1661 credentials: 'same-origin' 1662 }); 1663 return response.status === 200; 1664 } catch (e) { 1665 return false; 1666 } 1667 } 1668 1669 function cleanup() { 1670 if (timerId) { 1671 clearTimeout(timerId); 1672 timerId = null; 1673 } 1674 window.removeEventListener('scroll', onScroll, passiveScrollOptions); 1675 document.removeEventListener('mouseout', onMouseOut); 1676 } 1677 1678 async function openPortal() { 1679 if (popupTriggered || isCooldownActive()) return; 1680 1681 const member = await isMember(); 1682 if (member) return; 1683 1684 markShownNow(); 1685 cleanup(); 1686 1687 const a = document.createElement('a'); 1688 a.href = '#/portal'; 1689 a.style.display = 'none'; 1690 document.body.appendChild(a); 1691 a.click(); 1692 a.remove(); 1693 } 1694 1695 function getScrollProgress() { 1696 const scrollTop = window.scrollY || window.pageYOffset || 0; 1697 const docHeight = Math.max( 1698 document.body.scrollHeight, 1699 document.documentElement.scrollHeight, 1700 document.body.offsetHeight, 1701 document.documentElement.offsetHeight, 1702 document.body.clientHeight, 1703 document.documentElement.clientHeight 1704 ); 1705 const winHeight = window.innerHeight; 1706 const scrollable = docHeight - winHeight; 1707 1708 if (scrollable <= 0) return 0; 1709 return scrollTop / scrollable; 1710 } 1711 1712 function onScroll() { 1713 if (popupTriggered || isCooldownActive()) return; 1714 if (getScrollProgress() >= SCROLL_THRESHOLD) { 1715 openPortal(); 1716 } 1717 } 1718 1719 function onMouseOut(event) { 1720 if (popupTriggered || isCooldownActive()) return; 1721 if (!isDesktopPointer()) return; 1722 1723 const leavingTop = 1724 event.clientY <= EXIT_TOP_THRESHOLD && 1725 !event.relatedTarget && 1726 !event.toElement; 1727 1728 if (leavingTop) { 1729 openPortal(); 1730 } 1731 } 1732 1733 const passiveScrollOptions = { passive: true }; 1734 1735 function init() { 1736 if (isExcludedPage()) return; 1737 if (isCooldownActive()) return; 1738 1739 timerId = setTimeout(() => { 1740 openPortal(); 1741 }, DELAY_MS); 1742 1743 window.addEventListener('scroll', onScroll, passiveScrollOptions); 1744 1745 if (isDesktopPointer()) { 1746 document.addEventListener('mouseout', onMouseOut); 1747 } 1748 } 1749 1750 if (document.readyState === 'loading') { 1751 document.addEventListener('DOMContentLoaded', init); 1752 } else { 1753 init(); 1754 } 1755})(); 1756</script>
1756 1757</body> 1758</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.