Files
nexus/sreweekly/articles/99/05-the-aws-cloud-goes-underground-at-re-invent.html
2026-09-12 17:23:01 +08:00

1778 lines
137 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel='stylesheet' href='https://cloudtweaks.com/wp-content/plugins/breakdance/plugin/themeless/normalize.min.css'>
<title>The AWS Cloud Goes Underground at re:Invent – CloudTweaks</title>
<!-- The SEO Framework by Sybre Waaijer -->
<meta name="robots" content="max-snippet:-1,max-image-preview:large,max-video-preview:-1" />
<link rel="canonical" href="https://cloudtweaks.com/2017/11/aws-cloud-goes-underground-reinvent/" />
<meta name="description" content="As you wander through the AWS re:Invent campus, take a minute to think about your expectations for all of the elements that need to come together…" />
<meta property="og:type" content="article" />
<meta property="og:locale" content="en_US" />
<meta property="og:site_name" content="CloudTweaks" />
<meta property="og:title" content="The AWS Cloud Goes Underground at re:Invent – CloudTweaks" />
<meta property="og:description" content="As you wander through the AWS re:Invent campus, take a minute to think about your expectations for all of the elements that need to come together… Starting with the location, my colleagues have chosen…" />
<meta property="og:url" content="https://cloudtweaks.com/2017/11/aws-cloud-goes-underground-reinvent/" />
<meta property="og:image" content="https://cloudtweaks.com/wp-content/uploads/2017/11/aws-event.jpg" />
<meta property="og:image:width" content="450" />
<meta property="og:image:height" content="244" />
<meta property="og:image:alt" content="Aws Event" />
<meta property="og:image" content="https://cloudtweaks.com/wp-content/uploads/2017/11/aws-test.png" />
<meta property="article:published_time" content="2017-11-24T14:55:12+00:00" />
<meta property="article:modified_time" content="2024-09-27T09:33:03+00:00" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="The AWS Cloud Goes Underground at re:Invent – CloudTweaks" />
<meta name="twitter:description" content="As you wander through the AWS re:Invent campus, take a minute to think about your expectations for all of the elements that need to come together… Starting with the location, my colleagues have chosen…" />
<meta name="twitter:image" content="https://cloudtweaks.com/wp-content/uploads/2017/11/aws-event.jpg" />
<meta name="twitter:image:alt" content="Aws Event" />
<script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"WebSite","@id":"https://cloudtweaks.com/#/schema/WebSite","url":"https://cloudtweaks.com/","name":"CloudTweaks","inLanguage":"en-US","potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://cloudtweaks.com/search/{search_term_string}/"},"query-input":"required name=search_term_string"},"publisher":{"@type":"Organization","@id":"https://cloudtweaks.com/#/schema/Organization","name":"CloudTweaks","url":"https://cloudtweaks.com/","sameAs":"https://twitter.com/cloudtweaks/","logo":"https://cloudtweaks.com/wp-content/uploads/2019/04/cropped-snip-logo.png"}},{"@type":"WebPage","@id":"https://cloudtweaks.com/2017/11/aws-cloud-goes-underground-reinvent/","url":"https://cloudtweaks.com/2017/11/aws-cloud-goes-underground-reinvent/","name":"The AWS Cloud Goes Underground at re:Invent – CloudTweaks","description":"As you wander through the AWS re:Invent campus, take a minute to think about your expectations for all of the elements that need to come together…","inLanguage":"en-US","isPartOf":{"@id":"https://cloudtweaks.com/#/schema/WebSite"},"breadcrumb":{"@type":"BreadcrumbList","@id":"https://cloudtweaks.com/#/schema/BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":"https://cloudtweaks.com/","name":"CloudTweaks"},{"@type":"ListItem","position":2,"item":"https://cloudtweaks.com/category/cloud-computing/","name":"Category: Cloud Computing"},{"@type":"ListItem","position":3,"name":"The AWS Cloud Goes Underground at re:Invent"}]},"potentialAction":{"@type":"ReadAction","target":"https://cloudtweaks.com/2017/11/aws-cloud-goes-underground-reinvent/"},"datePublished":"2017-11-24T14:55:12+00:00","dateModified":"2024-09-27T09:33:03+00:00","author":{"@type":"Person","@id":"https://cloudtweaks.com/#/schema/Person/f403cab85ff7e936489caf7da9cce600","name":"Cloud Syndicate","description":"Welcome to the &#039;Cloud Syndicate,&#039; a curated community featuring short-term guest contributors, curated resources, and syndication partners covering diverse technology topics. Connect your technology article or news feed to our syndication network for..."}}]}</script>
<!-- / The SEO Framework by Sybre Waaijer | 23.44ms meta | 2.57ms boot -->
<style id="wp-img-auto-sizes-contain-inline-css">
img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}
/*# sourceURL=wp-img-auto-sizes-contain-inline-css */
</style>
<link rel='stylesheet' id='audioigniter-css' href='https://cloudtweaks.com/wp-content/plugins/audioigniter/player/build/style.css?ver=2.0.4' media='all' />
<script id="breeze-prefetch-js-extra">
var breeze_prefetch = {"local_url":"https://cloudtweaks.com","ignore_remote_prefetch":"1","ignore_list":["wp-admin/","wp-json/","wp-admin","wp-login.php"]};
//# sourceURL=breeze-prefetch-js-extra
</script>
<script id="breeze-prefetch-js" src="https://cloudtweaks.com/wp-content/plugins/breeze/assets/js/js-front-end/breeze-prefetch-links.min.js?ver=2.5.13"></script>
<script id="jquery-core-js" src="https://cloudtweaks.com/wp-includes/js/jquery/jquery.min.js?ver=3.7.1"></script>
<script id="jquery-migrate-js" src="https://cloudtweaks.com/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1"></script>
<link rel="https://api.w.org/" href="https://cloudtweaks.com/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://cloudtweaks.com/wp-json/wp/v2/posts/61369" /><style type="text/css">.ai-wrap {
background-color: #0a0a0a;
}
.ai-wrap .ai-volume-bar {
border-right-color: #0a0a0a }
.ai-wrap .ai-track-btn,
.ai-wrap .ai-track-control {
border-left-color: #0a0a0a }
.ai-wrap,
.ai-wrap .ai-btn,
.ai-wrap .ai-track-btn {
color: #ffffff;
}
.ai-wrap .ai-btn svg,
.ai-wrap .ai-track-no-thumb svg,
.ai-wrap .ai-track-btn svg {
fill: #ffffff;
}
.ai-wrap .ai-audio-control,
.ai-wrap .ai-audio-control:hover,
.ai-wrap .ai-audio-control:focus,
.ai-wrap .ai-track-progress,
.ai-wrap .ai-volume-bar.ai-volume-bar-active::before,
.ai-wrap .ai-track:hover,
.ai-wrap .ai-track.ai-track-active,
.ai-wrap .ai-btn.ai-btn-active {
background-color: #000000;
}
.ai-wrap .ai-scroll-wrap > div:last-child div {
background-color: #000000 !important;
}
.ai-wrap .ai-btn:hover,
.ai-wrap .ai-btn:focus,
.ai-wrap .ai-footer a,
.ai-wrap .ai-footer a:hover {
color: #000000;
}
.ai-wrap .ai-btn:hover svg,
.ai-wrap .ai-btn:focus svg {
fill: #000000;
}
.ai-wrap .ai-audio-control,
.ai-wrap .ai-track:hover,
.ai-wrap .ai-track.ai-track-active,
.ai-wrap .ai-track.ai-track-active .ai-track-btn,
.ai-wrap .ai-track:hover .ai-track-btn,
.ai-wrap .ai-btn.ai-btn-active {
color: #000000;
}
.ai-wrap .ai-audio-control svg,
.ai-wrap .ai-track.ai-track-active .ai-track-btn svg,
.ai-wrap .ai-track:hover .ai-track-btn svg,
.ai-wrap .ai-btn.ai-btn-active svg {
fill: #000000;
}
.ai-wrap .ai-track-progress-bar,
.ai-wrap .ai-volume-bar,
.ai-wrap .ai-btn,
.ai-wrap .ai-btn:hover,
.ai-wrap .ai-btn:focus,
.ai-wrap .ai-track,
.ai-wrap .ai-track-no-thumb {
background-color: #000000;
}
.ai-wrap .ai-scroll-wrap > div:last-child {
background-color: #000000;
}
.ai-wrap .ai-footer {
border-top-color: #000000;
}
.ai-wrap.ai-is-loading .ai-control-wrap-thumb::after,
.ai-wrap.ai-is-loading .ai-track-title::after,
.ai-wrap.ai-is-loading .ai-track-subtitle::after {
background: linear-gradient(to right, #000000 8%, #000000 18%, #000000 33%);
}
.ai-control-wrap .ai-btn,
.ai-control-wrap .ai-btn:hover,
.ai-player-buttons .ai-btn,
.ai-player-buttons .ai-btn:hover,
.ai-wrap .ai-volume-bar {
background-color: #ffffff;
}
.ai-control-wrap .ai-audio-control,
.ai-control-wrap .ai-audio-control:hover,
.ai-control-wrap .ai-audio-control:focus,
.ai-control-wrap .ai-btn.ai-btn-active,
.ai-wrap .ai-volume-bar.ai-volume-bar-active::before {
background-color: #efefef;
}
.ai-control-wrap .ai-btn,
.ai-control-wrap .ai-btn:hover,
.ai-player-buttons .ai-btn,
.ai-player-buttons .ai-btn:hover {
color: #000000;
}
.ai-control-wrap .ai-btn svg,
.ai-control-wrap .ai-btn:hover svg {
fill: #000000;
}
.ai-wrap .ai-track-progress-bar {
background-color: #000000;
}
.ai-wrap .ai-track-progress {
background-color: #ffffff;
}
.ai-wrap .ai-track {
background-color: #000000;
}
.ai-wrap .ai-track,
.ai-wrap .ai-track-btn {
color: #ffffff;
}
.ai-wrap .ai-track-btn svg {
fill: #ffffff;
}
.ai-wrap .ai-track:hover,
.ai-wrap .ai-track.ai-track-active {
background-color: #000000;
}
.ai-wrap .ai-track:hover,
.ai-wrap .ai-track.ai-track-active {
color: #ffffff;
}
.ai-wrap .ai-track:hover .ai-track-btn svg,
.ai-wrap .ai-track.ai-track-active .ai-track-btn svg {
fill: #ffffff;
}
.ai-wrap .ai-track-btn {
background-color: #000000;
}
.ai-wrap .ai-track-btn {
color: #ffffff;
}
.ai-wrap .ai-track-btn svg,
.ai-wrap .ai-track:hover .ai-track-btn svg,
.ai-wrap .ai-track.ai-track-active .ai-track-btn svg {
fill: #ffffff;
}</style><link rel="icon" href="https://cloudtweaks.com/wp-content/uploads/2026/07/cropped-logo-ct-32x32.webp" sizes="32x32" />
<link rel="icon" href="https://cloudtweaks.com/wp-content/uploads/2026/07/cropped-logo-ct-192x192.webp" sizes="192x192" />
<link rel="apple-touch-icon" href="https://cloudtweaks.com/wp-content/uploads/2026/07/cropped-logo-ct-180x180.webp" />
<meta name="msapplication-TileImage" content="https://cloudtweaks.com/wp-content/uploads/2026/07/cropped-logo-ct-270x270.webp" />
<!-- [HEADER ASSETS] -->
<link rel="stylesheet" href="https://cloudtweaks.com/wp-content/uploads/breakdance/css/post-136923-defaults.css?v=d16bc4c621114ab7dcc3cbfa53c6d4c7" />
<link rel="stylesheet" href="https://cloudtweaks.com/wp-content/uploads/breakdance/css/post-140342-defaults.css?v=65c889b292f71574a59c23ba5ca74713" />
<link rel="stylesheet" href="https://cloudtweaks.com/wp-content/uploads/breakdance/css/post-137942-defaults.css?v=d16bc4c621114ab7dcc3cbfa53c6d4c7" />
<link rel="stylesheet" href="https://cloudtweaks.com/wp-content/uploads/breakdance/css/global-settings.css?v=c1989f1aa52137d4e136920e5d77754e" />
<link rel="stylesheet" href="https://cloudtweaks.com/wp-content/uploads/breakdance/css/presets.css?v=0d7d30805cb74fc31ecd56f9e57ba030" />
<link rel="stylesheet" href="https://cloudtweaks.com/wp-content/uploads/breakdance/css/selectors.css?v=7d1d9b34a5ee8438100fa0507ea13de8" />
<link rel="stylesheet" href="https://cloudtweaks.com/wp-content/uploads/breakdance/css/post-136923.css?v=178af059d53a870f38d3cdf423d6730f" />
<link rel="stylesheet" href="https://cloudtweaks.com/wp-content/uploads/breakdance/css/post-140342.css?v=0689af0cd05b303502209b6e421146c1" />
<link rel="stylesheet" href="https://cloudtweaks.com/wp-content/uploads/breakdance/css/post-137942.css?v=9e5a05deed847a1efb03dcc1d811d6ab" />
<!-- [/EOF HEADER ASSETS] -->
<meta name="google-site-verification" content="nibOwRloZpO965wSUR7UWmV2fKmqf7p3JQhGqbJqGrs" />
</head>
<body class="wp-singular post-template-default single single-post postid-61369 single-format-standard wp-theme-breakdance-zero breakdance">
<section class="bde-section-136923-187 bde-section">
<div class="section-container"><div class="bde-code-block-136923-188 bde-code-block">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
<link rel="stylesheet" href="/ctw-nav.css">
<div id="ctw-nav-override">
<!-- TOP BAR -->
<div class="ctw-topbar">
<div class="ctw-container ctw-topbar-inner">
<div class="ctw-topbar-left">
<span><strong class="ctw-highlight">50,000+</strong> enterprise professionals read CloudTweaks monthly</span>
</div>
<div class="ctw-topbar-right">
<a href="https://cloudtweaks.com/newsletter-subscribe/">Newsletter</a>
<a href="https://contact.cloudtweaks.com/">Write for us</a>
<a href="https://cloudtweaks.com/about-us/">About us</a>
</div>
</div>
</div>
<!-- HEADER -->
<header class="ctw-header" role="banner">
<div class="ctw-container ctw-header-inner">
<!-- LOGO -->
<a href="https://cloudtweaks.com/" class="ctw-logo" aria-label="CloudTweaks home">
<img class="br-lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA0OTggMTA2Jz48L3N2Zz4=" data-breeze="https://cloudtweaks.com/wp-content/uploads/2026/09/CloudTweaks-Logo-3.webp" alt="CloudTweaks" width="498" height="106">
</a>
<!-- PRIMARY NAVIGATION -->
<nav class="ctw-nav" aria-label="Primary">
<ul class="ctw-menu">
<li><a href="https://cloudtweaks.com/category/cloud-computing/">Cloud</a></li>
<li><a href="https://cloudtweaks.com/category/artificial-intelligence/">AI</a></li>
<li><a href="https://cloudtweaks.com/category/security/">Security</a></li>
<li><a href="https://cloudtweaks.com/category/devops/">DevOps</a></li>
<li class="ctw-dropdown">
<button class="ctw-dropdown-toggle" aria-expanded="false" aria-controls="ctw-more-menu">
More
<span class="ctw-chevron" aria-hidden="true">
<svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"/></svg>
</span>
</button>
<ul class="ctw-dropdown-menu" id="ctw-more-menu">
<li>
<a href="https://cloudtweaks.com/interviews/">
<span class="ctw-dd-icon" aria-hidden="true">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg>
</span>
<span class="ctw-dd-text">
<span class="ctw-dd-title">Interviews</span>
<span class="ctw-dd-desc">In-depth conversations</span>
</span>
</a>
</li>
<li>
<a href="https://cloudtweaks.com/podcasts/">
<span class="ctw-dd-icon" aria-hidden="true">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"/><path d="M19 10v2a7 7 0 0 1-14 0v-2"/><line x1="12" y1="19" x2="12" y2="23"/><line x1="8" y1="23" x2="16" y2="23"/></svg>
</span>
<span class="ctw-dd-text">
<span class="ctw-dd-title">Podcasts</span>
<span class="ctw-dd-desc">Listen to expert insights</span>
</span>
</a>
</li>
<li>
<a href="https://cloudtweaks.com/cloudpulse/">
<span class="ctw-dd-icon" aria-hidden="true">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/></svg>
</span>
<span class="ctw-dd-text">
<span class="ctw-dd-title">CloudPulse</span>
<span class="ctw-dd-desc">Trends, news and analysis</span>
</span>
</a>
</li>
<li>
<a href="https://tools.cloudtweaks.com/">
<span class="ctw-dd-icon" aria-hidden="true">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="7" height="7"/><rect x="14" y="3" width="7" height="7"/><rect x="14" y="14" width="7" height="7"/><rect x="3" y="14" width="7" height="7"/></svg>
</span>
<span class="ctw-dd-text">
<span class="ctw-dd-title">Tools Directory</span>
<span class="ctw-dd-desc">Compare 527 cloud tools</span>
</span>
</a>
</li>
</ul>
</li>
</ul>
</nav>
<!-- ACTIONS: SEARCH + CTA -->
<div class="ctw-actions">
<form class="ctw-search-wrap" role="search" action="https://cloudtweaks.com/" method="get">
<span class="ctw-search-icon" aria-hidden="true">
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
</span>
<label for="ctw-search-input" class="ctw-visually-hidden">Search CloudTweaks</label>
<input type="search" class="ctw-search" id="ctw-search-input" name="s" placeholder="Search CloudTweaks..." autocomplete="off">
<kbd class="ctw-search-kbd" aria-hidden="true">/</kbd>
<button type="submit" class="ctw-visually-hidden">Search</button>
</form>
<a href="https://cloudtweaks.com/branded-content-partnerships/" class="ctw-btn">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 11l13-7v18L3 15H1a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1h2z"/><path d="M17 9a4 4 0 0 1 0 6"/></svg>
Advertise with us
</a>
</div>
</div>
</header>
<!-- MOBILE NAV -->
<nav class="ctw-mobile-nav" aria-label="Sections">
<ul>
<li><a href="https://cloudtweaks.com/category/cloud-computing/">Cloud</a></li>
<li><a href="https://cloudtweaks.com/category/artificial-intelligence/">AI</a></li>
<li><a href="https://cloudtweaks.com/category/security/">Security</a></li>
<li><a href="https://cloudtweaks.com/category/devops/">DevOps</a></li>
<li><a href="https://cloudtweaks.com/interviews/">Interviews</a></li>
<li><a href="https://cloudtweaks.com/podcasts/">Podcasts</a></li>
<li><a href="https://cloudtweaks.com/cloudpulse/">CloudPulse</a></li>
<li><a href="https://tools.cloudtweaks.com/">Tools</a></li>
</ul>
</nav>
</div><!-- /#ctw-nav-override -->
<script src="/ctw-nav.js" defer></script>
</div></div>
</section><section class="bde-section-140342-814 bde-section">
<div class="section-container"><div class="bde-code-block-140342-815 bde-code-block">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=DM+Serif+Display:ital@0;1&display=swap" rel="stylesheet">
<article
id="ctw-article-hero"
class="ctw-hero ctw-cat--internet-of-things"
aria-label="Article header"
>
<div class="ctw-hero__inner">
<div class="ctw-cat-pills">
<a href="https://cloudtweaks.com/category/internet-of-things/"
class="ctw-cat-pill ctw-cat-pill--internet-of-things"
aria-label="Category: Internet of Things">
<span class="ctw-cat-pill__dot" aria-hidden="true"></span>
Internet of Things </a>
<a href="https://cloudtweaks.com/category/cloud-computing/"
class="ctw-cat-pill ctw-cat-pill--cloud-computing"
aria-label="Category: Cloud Computing">
<span class="ctw-cat-pill__dot" aria-hidden="true"></span>
Cloud Computing </a>
</div>
<h1 class="ctw-hero__title">The AWS Cloud Goes Underground at re:Invent</h1>
<div class="ctw-hero__metarow">
<div class="ctw-hero__metarow-left">
<a href="https://cloudtweaks.com/author/the-cloud-syndicate/" class="ctw-avatar" aria-label="Cloud Syndicate">
<img class="br-lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAzMiAzMic+PC9zdmc+" data-breeze="https://cloudtweaks.com/wp-content/uploads/2017/11/aws-event-150x150.jpg" src="https://cloudtweaks.com/wp-content/uploads/2017/11/aws-event-150x150.jpg"
alt="Cloud Syndicate"
width="32" height="32" loading="eager" decoding="async">
</a>
<a href="https://cloudtweaks.com/author/the-cloud-syndicate/" class="ctw-author-name">
Cloud Syndicate </a>
<span class="ctw-metarow__sep" aria-hidden="true">·</span>
<time datetime="2017-11-24T09:55:12-05:00" class="ctw-byline__date">
Nov 24, 2017 </time>
<span class="ctw-metarow__sep" aria-hidden="true">·</span>
<span class="ctw-readtime">
<svg width="11" height="11" 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="10"/><polyline points="12 6 12 12 16 14"/>
</svg>
3 min read </span>
</div>
<div class="ctw-share" aria-label="Share this article">
<span class="ctw-share__label" aria-hidden="true">Share</span>
<a href="https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcloudtweaks.com%2F2017%2F11%2Faws-cloud-goes-underground-reinvent%2F"
class="ctw-share__btn ctw-share__btn--linkedin"
target="_blank" rel="noopener noreferrer"
aria-label="Share on LinkedIn">
<svg width="12" height="12" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
<path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z"/>
<rect x="2" y="9" width="4" height="12"/>
<circle cx="4" cy="4" r="2"/>
</svg>
</a>
<a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fcloudtweaks.com%2F2017%2F11%2Faws-cloud-goes-underground-reinvent%2F&#038;text=The%20AWS%20Cloud%20Goes%20Underground%20at%20re%3AInvent"
class="ctw-share__btn ctw-share__btn--x"
target="_blank" rel="noopener noreferrer"
aria-label="Share on X">
<svg width="11" height="11" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
<path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/>
</svg>
</a>
<button class="ctw-share__btn ctw-share__btn--copy"
data-url="https://cloudtweaks.com/2017/11/aws-cloud-goes-underground-reinvent/"
aria-label="Copy link to clipboard"
type="button">
<svg class="ctw-icon-copy" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/>
<path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/>
</svg>
<svg class="ctw-icon-check" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<polyline points="20 6 9 17 4 12"/>
</svg>
</button>
</div>
</div>
<div class="ctw-hero__rule" aria-hidden="true"></div>
</div>
</article>
<link rel="stylesheet" href="/ctw-article-hero.css">
<script src="/ctw-article-hero.js" defer></script>
</div></div>
</section><section class="bde-section-140342-828 bde-section">
<div class="section-container"><div class="bde-columns-140342-882 bde-columns"><div class="bde-column-140342-883 bde-column">
<div class="bde-code-block-140342-866 bde-code-block">
<div class="ctw-body ctw-body--dropcap">
<p>As you wander through the AWS re:Invent campus, take a minute to think about your expectations for all of the elements that need to come together…</p>
<p>Starting with the location, my colleagues have chosen the best venues, designed the sessions, picked the speakers, laid out the menu, selected the color schemes, programmed or printed all of the signs, and much more, all with the goal of creating an optimal learning environment for you and tens of thousands of other AWS customers.</p>
<p>However, as is often the case, the part that you can see is just a part of the picture. Behind the scenes, people, processes, plans, and systems come together to put all of this infrastructure in to place and to make it run so smoothly that you don’t usually notice it.</p>
<p>Today I would like to tell you about a mission-critical aspect of the re:Invent infrastructure that is actually underground. In addition to providing great Wi-Fi for your phones, tablets, cameras, laptops, and other devices, we need to make sure that a myriad of events, from the live-streamed keynotes, to the WorkSpaces-powered hands-on labs, are well-connected to each other and to the Internet. With events running at hotels up and down the Las Vegas Strip, reliable, low-latency connectivity is essential!</p>
<p><strong>Thank You CenturyLink / Level3</strong></p>
<p>Over the years we have been working with the great folks at Level3 to make this happen. They recently became part of CenturyLink and are now the Official Network Sponsor of re:Invent, responsible for the network fiber, circuits, and services that tie the re:Invent campus together.</p>
<p>To make this happen, they set up two miles of dark fiber beneath the Strip, routed to multiple Availability Zones in two separate AWS Regions. The Sands Expo Center is equipped with redundant 10 gigabit connections and the other venues (Aria, MGM, Mirage, and Wynn) are each provisioned for 2 to 10 gigabits, meaning that over half of the Strip is enabled for Direct Connect. According to the IT manager at one of the facilities, this may be the largest temporary hybrid network ever configured in Las Vegas.</p>
<p>On the Wi-Fi side, showNets is plugged in to the same network; your devices are talking directly to Direct Connect access points (how cool is that?).</p>
<p>Here’s a simplified illustration of how it all fits together:</p>
<p><img class="alignnone size-full wp-image-61371 br-lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA4OTAgNDUyJz48L3N2Zz4=" data-breeze="https://cloudtweaks.com/wp-content/uploads/2017/11/aws-test.png" loading="lazy" decoding="async" alt="" width="890" height="452" data-brsrcset="https://cloudtweaks.com/wp-content/uploads/2017/11/aws-test.png 890w, https://cloudtweaks.com/wp-content/uploads/2017/11/aws-test-300x152.png 300w, https://cloudtweaks.com/wp-content/uploads/2017/11/aws-test-768x390.png 768w" data-brsizes="auto, (max-width: 890px) 100vw, 890px" /></p>
<p>The CenturyLink team will be onsite at re:Invent and will be tweeting live network stats throughout the week.</p>
<p>I hope you have enjoyed this quick look behind the scenes and beneath the street!</p>
<p>By Jeff Barr, AWS Blog</p>
</div>
</div>
</div><div class="bde-column-140342-884 bde-column">
<div class="bde-shortcode-140342-885 bde-shortcode"><!--ctiq:sidebar:v2--><!--ctiq:dates internal=none--><!--ctiq:generated 2026-09-11T03:15:27.694Z--><!--ctiq:gate enabled=0 internal=0/0 technology=0/40 dropped_no_overlap=0 dropped_generic=0 label_entity=0 label_tag=0--><style>.ctx-panel{
--ctx-panel-bg:#F7F8FA;--ctx-card-bg:#FFFFFF;--ctx-card-hover:#F4F6F8;--ctx-panel-border:#E1E5E9;
--ctx-card-border:#E5E8EC;--ctx-divider:#E7EAEE;
/* ink-3 was #7A828C. MEASURED, not eyeballed, per the Part 6 checklist:
3.83:1 against the card and 3.72:1 against the panel ground — under the
4.5:1 AA floor, and none of the type set in it is large enough to qualify
for the 3:1 large-text exception (the biggest is 12.5px, the smallest is a
9.5px small-caps label). Every secondary line on the panel was failing:
the descriptor, the section sublabels, the tool blurb, the evidence label,
the SHARED TOPIC kicker, the browse dates, the search placeholder.
#6A727C is 4.87:1 on the card and 4.58:1 on the panel. Changed on the
variable rather than on the dozen rules that read it. */
--ctx-ink:#16191D;--ctx-ink-2:#545C66;--ctx-ink-3:#6A727C;
--ctx-accent:#1550D4;
/* --- THE DARK HEADER -----------------------------------------------------
The heading, subtitle, search field and topic row sit on a dark block; the
results below it do not. Chrome is dark, content stays editorial.
ITS OWN INK TOKENS, NOT THE PANEL'S. --ctx-ink-3 was darkened to #6A727C
specifically to clear 4.5:1 on the LIGHT panel, and reusing it here would
put a 2.2:1 grey on charcoal — regressing that work in the one place it
cannot be seen from the rule that fixed it. Every value below is measured
against both grounds rather than picked to look right:
on #222934 slate (shipped) on #1A1D21 charcoal
white 14.64:1 white 16.91:1
ink-2 #A8B0BC 6.69:1 ink-2 #A8B0BC 7.73:1
accent #8FB4FF 7.07:1 accent #8FB4FF 8.17:1
The divider is 1.47:1 and that is fine — it is a hairline, not text.
--ctx-pad is the panel's own padding lifted into a variable. The dark block
has no wrapper element (head, form and nav are three siblings), so it
bleeds to the panel edge with a negative margin of exactly this size. One
variable means the 520px breakpoint cannot drift out of step with it, which
is the failure mode when the two are written as literals in two places. */
--ctx-pad:20px;
/* SLATE, NOT THE NEAR-BLACK THE MOCKUP SHOWED, and the reason is the article
hero rather than the panel. Rendered in place, #1A1D21 sits close enough to
the hero's #000 to read as a failed attempt to match it — two dark blocks a
shade apart, with a white gap between them, look like a mistake in a way
that two clearly different surfaces do not. #222934 reads as a deliberate
second surface. Both clear AA on every value below; this is a judgement
about the page, not about contrast, and reverting it is this one value. */
--ctx-header-bg:#222934;
--ctx-header-ink:#FFFFFF;
--ctx-header-ink-2:#A8B0BC;
--ctx-header-accent:#8FB4FF;
--ctx-internal:#1F8A4C;--ctx-technology:#1F7A8A;--ctx-notice:#C2650B;
/* The accents above are EDGE colours and are not safe as text. Measured
against white: #1F8A4C is 4.37:1, below the 4.5:1 AA floor for body copy.
Promoting the shared-context line into the accent needed a darker pair, so
each accent has an -ink twin used for TYPE only: 7.03:1, 7.29:1, 6.09:1.
Never set type in the plain accent; never set a border in the -ink. */
--ctx-internal-ink:#14663A;--ctx-technology-ink:#155F6B;--ctx-notice-ink:#96500A;
/* ---------------------------------------------------------------------------
THE SITE'S TYPE, NOT THE OPERATING SYSTEM'S.
This was the bare ui-sans-serif / system-ui / -apple-system / Segoe UI
stack — which is to say the panel rendered in whatever face the READER'S
MACHINE supplied, beside a page setting its headings in Manrope and its
prose in a licensed serif. It read as a widget bolted onto the article
rather than part of the publication, and it read DIFFERENTLY per reader,
which is why it survived every visual pass: on a Mac it is San Francisco,
on Windows Segoe UI, and neither is wrong enough to notice.
Manrope and Inter are not chosen here — they are what the site already
runs. wordpress-plugin/breakdance-homepage-live/homepage.css says so in as
many words: "Headings: Manrope 700-800, tight tracking", with Inter for
body and UI. The panel now speaks the same two.
DISPLAY vs SANS, split the way the site splits them. A card headline IS an
article headline, so it takes the heading face; labels, figures, blurbs and
the search field are interface and take the UI face.
THE SERIF IS DELIBERATELY ABSENT. It is the READING voice — prose a reader
settles into — and the panel is navigation. A serif card headline promises
an essay and delivers a link, and the 8.5px small-caps labels would be
illegible in it. Matching the HEADINGS is the closer relationship anyway,
since these cards are headlines.
AND NOT the inherit keyword, which was the obvious move and is wrong: the panel sits
inside the post template, so inheriting pulls the body SERIF into every
label and figure. The faces are named.
The old stack stays as the fallback tail, so a page that has not loaded
Manrope or Inter renders exactly as it does today — this can look right or
change nothing, never worse. */
--ctx-display:'Manrope',ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
--ctx-sans:'Inter',ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
background:var(--ctx-panel-bg);border:1px solid var(--ctx-panel-border);border-radius:12px;
box-shadow:0 8px 24px rgba(16,24,40,.035);padding:20px;
font-family:var(--ctx-sans);color:var(--ctx-ink);-webkit-font-smoothing:antialiased}
.ctx-panel *{box-sizing:border-box}
/* UPRIGHT, enforced on every element, not inherited. The host theme is free to
set font-style:italic on a broad ancestor (body, .breakdance, the article
column) OR directly on every element (a global universal or i,em-style rule),
and this fragment has no control over what it is dropped into. Setting it on
the container alone is not enough: a theme rule that targets a descendant
DIRECTLY (a span label, a card link) beats an inherited value, so the panel
went italic on exactly the spans and links — the CONTEXT MATCH kicker, the
headlines, the percentages, the topic links — while the container read
normal. The panel uses no italic of its own, so forcing normal everywhere is
safe. !important and the (0,1,0) .ctx-panel star specificity are the same
defence the reset above already uses; font-style was simply missing from it. */
.ctx-panel,.ctx-panel *{font-style:normal!important}
/* ---------------------------------------------------------------------------
HOST-THEME ARMOUR. THE PANEL RENDERS INSIDE SOMEONE ELSE'S STYLESHEET.
Reported from the live site: CLOUDTWEAKS ANALYSIS and FROM THE TOOLS
DIRECTORY rendered at roughly three times their size, while EXPLORE ANOTHER
TOPIC directly above them was correct. The difference is the ELEMENT, not the
CSS: the topic label is a <span> and the section labels are <h4>. A theme
that styles .entry-content h4 (specificity 0,1,1) beats an unscoped
.ctx-section-label (0,1,0), so the host won font-size and margin while the
panel still won letter-spacing and text-transform — which is exactly the
half-broken result that appeared.
It also explains why staging looked right and live did not. Nothing about the
panel changed; the theme around it did.
Two layers, and both are needed:
- this reset neutralises whatever the host says about the tags the panel
emits (h1-h6 and p — the only two it uses that themes style heavily);
- every rule that then styles one of those tags is scoped .ctx-panel .x
(0,2,0) so it outranks this reset AND a typical theme selector.
!important on both layers because specificity alone cannot be relied on
against an unknown stylesheet: a theme is free to use an id or a deeper
descendant chain, and this fragment has no control over what it is dropped
into. It is scoped entirely within .ctx-panel, so nothing outside the panel
is affected.
font-family is var(--ctx-sans), never inherit — inheriting would pull the
host article's serif reading face into every 10px label, which is the thing
the type tests forbid outright. */
.ctx-panel h1,.ctx-panel h2,.ctx-panel h3,.ctx-panel h4,.ctx-panel h5,.ctx-panel h6,
.ctx-panel p{margin:0!important;padding:0!important;border:0!important;
background:none!important;font-family:var(--ctx-sans)!important;font-size:100%!important;
font-weight:400!important;line-height:1.4!important;letter-spacing:normal!important;
text-transform:none!important;color:inherit!important;text-align:left!important}
/* --- THE DARK BLOCK, BUILT FROM THREE SIBLINGS ---------------------------
.ctx-head, .ctx-ask and .ctx-topics are already consecutive children of
.ctx-panel — the pills have sat directly under the search box since they
moved out of the footer. So this is paint, not a move: no wrapper element,
no markup change, no renderer change.
...
THE VERTICAL MARGINS BETWEEN THEM HAD TO GO. They were 8px, 10px and -4px,
and a margin carries no background — each one would have shown as a white
stripe straight across the dark block. The spacing moves into padding,
which does. The only margin left is the last one, and that gap is meant to
be light: it is where the header ends and the results begin.
...
The radius is 11px against the panel's 12px, because the panel's 1px border
sits outside it — matching 12 to 12 leaves a hairline of panel background
visible in the corner. */
.ctx-head,.ctx-ask,.ctx-topics{background:var(--ctx-header-bg);
margin-left:calc(-1 * var(--ctx-pad));margin-right:calc(-1 * var(--ctx-pad));
padding-left:var(--ctx-pad);padding-right:var(--ctx-pad)}
/* WHICHEVER COMES FIRST TAKES THE TOP, and it is written as three selectors
rather than one because the composition varies: the search box renders only
when search is configured, and the topic row only when its pre-rendered
store exists. Pinning the top edge to .ctx-head alone would leave a white
band above the block on any panel that ships without one. */
.ctx-panel>.ctx-head:first-child,.ctx-panel>.ctx-ask:first-child,
.ctx-panel>.ctx-topics:first-child{margin-top:calc(-1 * var(--ctx-pad));
padding-top:var(--ctx-pad);border-radius:11px 11px 0 0}
/* And whichever comes LAST hands the gap to the results, for the same reason:
the block's bottom edge is not always the same element. */
.ctx-head+[data-ctx-results],.ctx-ask+[data-ctx-results],
.ctx-topics+[data-ctx-results]{margin-top:12px}
/* LONGHAND MARGINS, AND THAT IS LOAD-BEARING. A margin:0 shorthand here would
reset the negative left/right margins the group rule above sets, because
this rule comes after it. It did, first time round: the block stopped bleeding to the
panel edge and the topic row silently lost 40px of width, which pushed it to
two lines and broke the one-line rule the gap value was chosen for. */
.ctx-head{margin-top:0;margin-bottom:0;padding-bottom:9px}
/* The panel's own name, in the site's heading face. 18px, not 19: Manrope runs
optically larger than the system stack at the same size, and this sat a step
too close to the article's own H2 before the face changed. */
.ctx-panel .ctx-title{font-family:var(--ctx-display)!important;font-size:18px!important;font-weight:700!important;letter-spacing:-.02em!important;line-height:1.25!important;margin:0!important;color:var(--ctx-header-ink)!important}
.ctx-panel .ctx-descriptor{font-size:12.5px!important;line-height:1.45!important;color:var(--ctx-header-ink-2)!important;margin:2px 0 0!important}
.ctx-section{margin-top:24px;border-top:1px solid var(--ctx-divider)}
/* Tools & Services is the ONE section that sends the reader off cloudtweaks.com,
so the seam above it is heavier than the hairline between editorial sections.
The card grammar is untouched — three sections that looked like three
different products is the failure this panel was rebuilt out of. The break is
in the SEAM, not in the cards. */
.ctx-section--tools{margin-top:28px;border-top:2px solid var(--ctx-divider);padding-top:4px}
/* ---------------------------------------------------------------------------
THE TOP SECTION IS NAMED BY THE RENDERER, NOT GUESSED AT BY THE CASCADE.
This was .ctx-section:first-of-type, and :first-of-type cannot see what a
reader sees. It counts SECTION elements among their siblings, and
[data-ctx-internal] wraps the analysis section in a <div> — so the first
<section> child of [data-ctx-results] is whatever comes AFTER the analysis
block, not the block at the top of the panel.
Reported as "From the tools directory has minimal spacing above it", and
that is exactly what it was: with no tool card through the gate, the
suggestion section is the first <section> among its siblings, so it took
margin-top:0, border-top:0 and a label with no 16px above it — flush against
the analysis card above it, with no divider. The same rule hit "More from
CloudTweaks", and Industry Context whenever Tools & Services was empty.
The previous round patched ONE symptom: .ctx-section.ctx-section--tools was
doubled purely to out-specify (0,2,0), which fixed the tools seam and left
every other section still mis-flushed. The selector was the defect, so the
selector goes — CLAUDE.md rule 15, fix it where every consumer benefits.
panelSections() now marks the block that is genuinely first. All three rules
here are (0,1,0), so source order decides and --flush is last: a tools
section that really is at the top loses its heavy seam, which is correct.
--------------------------------------------------------------------------- */
.ctx-section--flush{margin-top:0;border-top:0;padding-top:0}
/* The heading carries the section's own accent, tying it to the edge on its
cards. -ink, not the raw accent: 7.29:1 against the panel, where the edge
colour would be 3.9:1 on 10px uppercase type. */
.ctx-section--tools .ctx-section-label{color:var(--ctx-technology-ink)}
/* TRACKING: .11em, down from .13em, and the SAME value the topic-row label
uses — those two were .13 and .12 for no reason anyone could name, which is
two settings for one typographic decision.
10px uppercase needs positive tracking to stay legible, so this is a trim
rather than a removal: the usual band for small caps at this size is roughly
.08-.12em and .13 sat just outside the top of it, which is what read as
"technical". Below about .10em at 700 weight the letterforms start to close
up, so this is the bottom of the useful range, not the middle. */
.ctx-panel .ctx-section-label{font-size:10px!important;font-weight:700!important;letter-spacing:.11em!important;text-transform:uppercase!important;color:var(--ctx-ink-2)!important;margin:16px 0 0!important;line-height:1.4!important}
.ctx-panel .ctx-section--flush .ctx-section-label{margin-top:0!important}
.ctx-panel .ctx-section-sub{font-size:11.5px!important;line-height:1.45!important;color:var(--ctx-ink-3)!important;margin:2px 0 4px!important}
/* ---------------------------------------------------------------------------
A SECTION HEADING WITH NO SUBLABEL UNDER IT.
Reported as "Answering cloud hosting needs spacing below it". Every editorial
section carries a .ctx-section-sub, whose 12px bottom margin is what actually
separates the heading from the cards — the label itself has no bottom margin
at all. Search mode has no sublabel (the heading already states the selection
rule), so the first card sat directly on the heading's baseline.
Adjacent-sibling, so it fires ONLY when nothing came between them: a section
that has a sublabel is untouched, and the 12px matches that sublabel's own
margin rather than inventing a second spacing value. */
.ctx-section-label + .ctx-list{margin-top:4px}
.ctx-section-label + .ctx-note{margin-top:10px}
.ctx-list{display:flex;flex-direction:column;gap:9px}
/* The tint is a background-IMAGE over the card colour, not a background
colour, so the two compose instead of one replacing the other and a card
with no section modifier still lands on white rather than transparent. */
/* FLAT, AND THAT IS THE POINT. This was radius 8px + a 5px rail + a 1px border
+ a 4% shadow, and that BUNDLE — not the rail on its own — is the thing that
reads as a component library rather than as a publication's own module. The
rail predates the convention; the rounded, shadowed, generously-railed card
is the convention.
So: radius 8 -> 3, the resting shadow deleted outright, the rail 5px -> 2px.
Three of the four conventions gone.
WHAT DELIBERATELY STAYS is the 1px neutral border and the rail's COLOUR. The
border is the boundary that says this module is not the article it sits
inside — the panel renders into a WordPress theme, and without it the host
page's own styling reads as continuous with the results. The rail is not
decoration either: green is CloudTweaks analysis, teal is tools, orange is
external, and at 2px it stops being a design element and becomes what it
always was, a colour code. The section headings say the same thing in words,
so the rail is reinforcement rather than the only signal — but it is the
thing that makes the row scannable without reading. */
.ctx-card{display:block;padding:10px 15px;background-color:var(--ctx-card-bg);
background-image:linear-gradient(var(--ctx-tint,transparent),var(--ctx-tint,transparent));
border:1px solid var(--ctx-card-border);border-left:2px solid var(--ctx-edge,var(--ctx-card-border));
border-radius:3px;
text-decoration:none;color:inherit;
transition:border-color .16s ease,background-color .16s ease}
/* THE WHOLE CARD IS THE CONTROL, and now it says so. It has always been one <a>
with the headline as its accessible name, so the arrow was never the click
target — but nothing at rest or on hover made that legible, and a reader who
thinks the arrow is the button aims at a 10px glyph.
Three small things, none of them dramatic: the border darkens to the section's
own accent, the ground shifts to --ctx-card-hover, and the arrow slides 3px in
the direction it points.
IT USED TO LIFT 1px AND DEEPEN A SHADOW, and both went with the flattening.
A card that sits flat at rest and turns into a floating component the moment
it is touched is the same convention arriving late, so hover had to lose its
depth along with the resting state. A background shift carries the affordance
without reintroducing it. Focus gets the identical treatment —
:focus-visible is listed alongside :hover on every one of them, so a keyboard
user sees the same card respond, on top of the outline ring. */
.ctx-card:hover,.ctx-card:focus-visible{border-color:var(--ctx-edge-soft,var(--ctx-card-border));
background-color:var(--ctx-card-hover)}
.ctx-card:focus-visible{outline:2px solid var(--ctx-accent);outline-offset:2px}
/* NO TINT, §4.1. The accent used to arrive four ways at once on the same card —
left rail, a wash across the whole background, the shared-topic term and the
percentage — and four encodings of one fact reads as a success notification
rather than a relationship indicator. Three of the four are now one: the rail
is the card's identity, the term and the figure are where the colour carries
meaning, and the background is the panel's own white.
Depth did NOT come from the wash and does not go with it. The card still has
a 1px border, a 1px shadow and a 5px rail against a #F7F8FA panel ground —
the tint was the least of the four things separating a card from the page.
--ctx-tint is kept as a variable rather than deleted: .ctx-card--search still
sets its own background-image, and the sponsored modifier still needs a way
to say "no accent at all". */
.ctx-card--internal{--ctx-edge:var(--ctx-internal);--ctx-edge-ink:var(--ctx-internal-ink);--ctx-edge-soft:#82B99C}
.ctx-card--technology{--ctx-edge:var(--ctx-technology);--ctx-edge-ink:var(--ctx-technology-ink);--ctx-edge-soft:#82B5BB}
/* A paid slot gets no accent and no tint. The colour is the engine's voice. */
.ctx-card--sponsored{--ctx-edge:var(--ctx-ink-3);--ctx-edge-ink:var(--ctx-ink-2);--ctx-edge-soft:#A7BDC4;--ctx-tint:transparent}
/* SEARCH RESULTS ONLY, and scoped so nothing here can reach a matched card.
A search list is four or five cards carrying a headline and a date and
nothing else, where a matched card also carries the shared-context anchor.
At the shared tint that thinner card read as a flat green block, and five of
them read as a wall of one colour.
The tint becomes a real vertical gradient — strongest at the top edge where
it meets the accent rule, gone by two-thirds down — so the card reads as
paper catching light rather than a filled rectangle. Same hue, less of it.
The border does more of the work instead, which is what gives the edge its
crispness.
THIS SURVIVES §4.1 and the rest of the tints did not. The rule §4.1 is about
is one fact encoded four times on the same card — rail, wash, shared-topic
term, percentage. A search card carries no shared-topic term and no
percentage, so the count here is two, and the wash is the only thing giving
a card with a headline and a date any depth at all. Removing it returns
exactly the flat row that was reported. */
.ctx-card--search{--ctx-tint:transparent;
background-image:linear-gradient(180deg,rgba(31,138,76,.05) 0%,rgba(31,138,76,.014) 58%,rgba(31,138,76,0) 100%);
padding:12px 15px 11px}
/* NOT the --lead headline. That weight exists for a card whose headline is the
only thing carrying it, and it is right for one or two results — but a search
returns five, and five 15.5px/600 headlines stacked read as a wall of bold
rather than a list to scan. Lighter and slightly smaller, so the eye moves
down the list instead of stopping on each row. The headline is still the
loudest thing on its own card; it is just no longer shouting on all five. */
.ctx-card--search .ctx-headline{font-size:14.5px;font-weight:500;letter-spacing:-.004em}
/* A 1px lift, and only here. The rest of the panel deliberately does not move
on hover, but these cards are the one list a reader actively scans rather
than reads, and the lift plus the accent edge is what makes the row under
the cursor feel picked up rather than merely tinted. */
@media (hover:hover){
.ctx-card--search{transition:border-color .15s ease,background-color .15s ease}
.ctx-card--search:hover{border-color:var(--ctx-internal);background-color:var(--ctx-card-hover)}
}
/* Reduced motion keeps every STATE and drops every MOVEMENT. The CARD no longer
moves at all — its lift and its hover shadow went with the flattening, and
what marks hover now is a border and a background, neither of which is
motion. So the only travel left to suppress is the 3px arrow slide.
The card selectors stay in this block deliberately: they are cheap, and they
are the guard if a lift is ever reintroduced above without this being
revisited. The blanket transition-duration override at the end of this sheet
cannot do the job on its own: it makes a transform instant, not absent. */
@media (prefers-reduced-motion:reduce){
.ctx-card:hover,.ctx-card:focus-visible,.ctx-card--search:hover{transform:none}
.ctx-card:hover .ctx-action,.ctx-card:focus-visible .ctx-action,
.ctx-topic-pill::before{transition:none}
}
/* THE ANCHOR. Largest type on the card, in the section accent, first in the
reading order. The kicker above it is the quietest thing here — it names
what the line IS without competing with it. */
.ctx-shared{display:block;margin:0 0 8px}
.ctx-shared-label{display:block;font-size:9.5px;font-weight:700;letter-spacing:.12em;
text-transform:uppercase;color:var(--ctx-ink-3);margin:0 0 2px}
.ctx-shared-term{display:block;font-size:16px;font-weight:650;line-height:1.3;
letter-spacing:-.011em;color:var(--ctx-edge-ink,var(--ctx-ink));text-wrap:pretty}
/* Tool-card form: the reason, under the thing it is a reason for. One line,
inline, well below the vendor name in weight — never the 16px anchor, which
made "Kubernetes" look like the subject and Crossplane like a footnote. */
/* font-size AND line-height on the BLOCK, not just on the spans inside it.
The label is 9.5px and the term is 11.5px, but this block inherited 16px from
the panel, so its line box was being set by an invisible 16px strut — ~19px
of height for 12px of type, on every card. Sizing the block itself is the
single largest thing the density pass found, and it changes nothing visible:
both children set their own size. */
/* 3px, and it was 1px for about ten minutes. The density pass took this to the
floor and the title lost its breathing room — a headline's descenders sitting
directly on a small-caps label is the difference between editorial and
cramped, and the brief protects the title explicitly. The 5-8% target is met
without this 2px, so it goes back. */
.ctx-shared--compact{margin:3px 0 0;font-size:12px;line-height:1.25}
/* THE CONCEPT OUTWEIGHS ITS LABEL. This is the line that separates the panel
from an ordinary "Related Articles" widget, so the thing the reader should
read is "Data sovereignty", not "SHARED TOPIC:". 8.5px/600 grey small-caps
against 12px/650 in the section accent: three sizes apart and a full weight
apart, with the label's letter-spacing carrying the small-caps register so it
still reads as a label rather than as the start of the sentence. */
.ctx-shared--compact .ctx-shared-label{display:inline;font-size:8.5px;font-weight:600;
letter-spacing:.09em;color:var(--ctx-ink-3);margin:0}
.ctx-shared--compact .ctx-shared-term{display:inline;font-size:12px;font-weight:650;
letter-spacing:-.005em}
/* Second, and no longer the loudest thing on the card. Still the link. */
.ctx-headline{display:block;font-family:var(--ctx-display);font-size:14px;font-weight:450;line-height:1.35;
color:var(--ctx-ink);text-wrap:pretty;
overflow:hidden;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}
/* With no shared-context line above it the headline IS the anchor, so it keeps
its old weight. Two states this covers: search mode, where the reader's query
is the explanation, and gate-off mode, where a card may carry no label. A
demoted headline under nothing at all just reads as a quiet card. */
.ctx-card--lead .ctx-headline{font-size:15.5px;font-weight:600;letter-spacing:-.01em}
/* NO COLOUR CHANGE ON THE HEADLINE. It used to turn accent blue on hover,
which was the right signal back when the card gave no other feedback — and it
is the wrong one now: the border, the 1px lift and the travelling arrow
already say the whole card is the control, and a blue headline inside a
green-edged card was both the loudest of the four and a colour clash. Three
quiet signals beat four loud ones. The rows that have no card treatment keep
theirs (see .ctx-browse-item and .ctx-suggest). */
/* Kept, and deliberately quiet — it is the only thing on the card that says a
judgement was made, so removing it would leave a list where an assessment
belongs. It sits IN the footer rather than on its own line, which is what
drops its prominence without dropping the signal. */
/* 9.5px/.07em -> 9px/.05em, and it clips honestly when it still does not fit.
§4.2 wants the label quieter than the value, and this one was also six pixels
too wide for the tool card's footer at the sidebar's real width — the logo
takes 48px out of that row — so "CONTEXT MATCH" was rendering as
"CONTEXT MATC" with no ellipsis and no way to tell it apart from a bug.
The ellipsis is the floor, not the fix: at 320px the row is genuinely too
narrow and truncation there should read as deliberate. */
.ctx-evidence{font-size:9px;font-weight:500;letter-spacing:.05em;text-transform:uppercase;
color:var(--ctx-ink-3);white-space:nowrap;min-width:0;overflow:hidden;text-overflow:ellipsis}
/* THE LABEL, EXPLICITLY QUIETER THAN THE FIGURE. 8.5px/500 against 12.5px/700 —
a 4px size difference and two weight steps, so the eye lands on "91%" and
picks up "CONTEXT MATCH" second. They stay on one baseline with a 4px space,
which is what keeps them reading as one statement rather than two facts.
No bars, no dials, no meters, no varying green: 91 / 87 / 84 are ranked by
the numerals and nothing here amplifies four points into a visual difference.
(Deliberately avoiding the g-word: the stylesheet ships inside the fragment
and a test greps the whole thing for the vocabulary of a dashboard.) */
.ctx-evidence-label{font-size:8.5px;font-weight:500;color:var(--ctx-ink-3)}
/* The figure sits in the section accent, in the slot the tier label held. It is
SUPPORTING EVIDENCE, not the headline — the anchor above it is 16px and this
is 11.5px, so the card still reads anchor first. -ink, never the edge colour:
the raw accent is 4.37:1 and fails AA on type this size. */
.ctx-evidence-num{font-size:12.5px;font-weight:700;letter-spacing:-.01em;
color:var(--ctx-edge-ink,var(--ctx-ink-2));font-variant-numeric:tabular-nums}
/* NO WRAPPING. The action is pinned right and the evidence/meta group shrinks
into whatever is left. Allowing the footer to wrap made the line break on
card LENGTH: "STRONG MATCH · CloudTweaks" pushed the action onto its own row
while the shorter "RELATED" did not, so two cards in one section disagreed
about their own layout. */
/* 10px -> 6px, §4.3. The named target: "tighten the gap between the
shared-topic row and the context-match row". Nothing above it moves —
the headline keeps its line-height and its space, which the spec protects
explicitly. */
.ctx-foot{display:flex;align-items:baseline;gap:8px;margin:3px 0 0;line-height:1.15;flex-wrap:nowrap}
.ctx-foot-text{display:flex;align-items:baseline;gap:8px;min-width:0;overflow:hidden;white-space:nowrap}
.ctx-foot-sep{color:var(--ctx-card-border);flex:none}
.ctx-meta{font-size:11px;color:var(--ctx-ink-3);letter-spacing:-.002em;overflow:hidden;text-overflow:ellipsis}
.ctx-action{margin-left:auto;font-size:12px;font-weight:600;color:var(--ctx-accent);white-space:nowrap;display:inline-flex;align-items:center;gap:4px}
/* The verb-less form (§4.3). Baseline alignment is what positions the action
against the percentage beside it, and an inline-flex box with no text has no
baseline of its own — it aligns on its bottom margin edge, which dropped the
glyph below the figure. Aligning the FLEX box on centre and nudging it puts
the arrow on the figure's optical line. */
/* line-height:0 as well as the alignment: with no text in it, a 12px font-size
still gave this box a ~14px line box, so an empty span was setting the height
of the whole footer row on every internal card. The glyph is 10px and now
measures 10px. */
/* ink-2, not ink-3. Reported as "the arrows are extremely subtle" — they are
the only click affordance on an internal card, since §4.3 removed the verb.
#6A727C is 4.87:1 on the card, which passes for TYPE and is thin for a 10px
two-stroke glyph carrying the whole "this is a control" signal; #545C66 is
7.0:1 and reads at a glance.
COLOUR, NOT SIZE, and that is the constraint rather than the preference: the
glyph is 10px with line-height:0 because an empty 12px .ctx-action span was
otherwise setting the height of the footer row on every internal card (see
the note above). Growing it re-inflates that row. Darkening costs nothing and
changes no geometry. */
.ctx-action--glyph{align-self:center;position:relative;top:1px;line-height:0;
color:var(--ctx-ink-2)}
/* 3px, in the direction the glyph points. The internal arrow travels right and
the outbound diagonal travels up-and-right, which keeps the movement reading
as "this way" rather than as decoration. Applied to .ctx-action so the tool
card's "View listing →" moves with its verb. */
.ctx-action{transition:color .16s ease,transform .16s ease}
.ctx-card:hover .ctx-action--glyph,.ctx-card:focus-visible .ctx-action--glyph{color:var(--ctx-accent)}
.ctx-card:hover .ctx-action,.ctx-card:focus-visible .ctx-action{transform:translateX(3px)}
.ctx-tool-row{display:flex;gap:11px;align-items:flex-start}
/* THE LETTERMARK ALWAYS EXISTS, UNDERNEATH THE IMAGE.
The mark is a favicon resolved from the vendor's domain by a third party, so
it fails in ways nothing here can predict — no favicon, a request blocked by
a content blocker, a reader offline. Two attempts that do NOT work, both
tried: alt="" paints nothing and leaves an empty 36px box, and alt text is
not rendered by a box with fixed dimensions and object-fit. So the initials
are a real element beneath the image, and the image hides itself if it fails
to load. With scripting off this is exactly the behaviour that shipped
before — an empty box — so it is a strict improvement, never a regression. */
.ctx-tool-initials{position:absolute;inset:0;display:grid;place-items:center}
.ctx-tool-img{position:relative;width:100%;height:100%;object-fit:contain;background:var(--ctx-panel-bg)}
/* 36px -> 30px, §11. The mark is identification, not branding: the priority on
this card is the vendor name, then why it is here, then what it is. A 36px
mark beside a 15.5px name was the largest object on the card and read as
promotional — and it was also what squeezed the footer until the match label
truncated. Small enough to identify, not large enough to sell. */
.ctx-tool-logo{position:relative;flex:none;width:30px;height:30px;border-radius:7px;overflow:hidden;display:grid;place-items:center;
background:var(--ctx-panel-bg);box-shadow:inset 0 0 0 1px rgba(16,24,40,.07);font-size:11px;font-weight:700;color:var(--ctx-ink-3)}
.ctx-tool-body{flex:1;min-width:0}
/* Category terms, not prose. This used to carry the directory's product
description, which ran six lines on some vendors and pushed the card's own
footer off the screen. Clamped as well as shortened: the line is generated
from stored fields, and a field nobody has looked at is exactly where a
surprise sentence comes from. */
.ctx-blurb{display:block;font-size:11.5px;line-height:1.45;color:var(--ctx-ink-3);margin:5px 0 0;
overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
/* --- Verified tier ---------------------------------------------------------
A TEXT MARK WITH A RULE, NOT A PILL. The match tier is our opinion of
relevance and stays quiet; VERIFIED is a checkable claim about a third party
and is allowed to be legible. A filled badge would put the two in the same
visual class and make the panel read as a dashboard, which is the thing this
card grammar is built to avoid. */
.ctx-vendor{display:flex;align-items:baseline;gap:7px;flex-wrap:wrap}
.ctx-verified{font-size:9px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;
color:var(--ctx-technology-ink);border-bottom:1.5px solid var(--ctx-technology);
padding-bottom:1px;line-height:1;white-space:nowrap}
.ctx-verified--sponsored{color:var(--ctx-ink-2);border-bottom-color:var(--ctx-ink-3)}
/* The structured facts a verification actually covers. Plain rows, label and
value, because a reader checking a claim needs to read it, not decode it. */
.ctx-facts{display:block;margin:8px 0 0;font-size:11.5px;line-height:1.5;color:var(--ctx-ink-2)}
.ctx-fact{display:block}
.ctx-fact-key{color:var(--ctx-ink-3)}
.ctx-verified-on{display:block;margin:6px 0 0;font-size:10.5px;color:var(--ctx-ink-3)}
/* --- Fallback ("More from CloudTweaks") ------------------------------------
Deliberately NOT a matched card: no accent edge, no tint, no shared context,
no tier. It carries a date because recency IS the reason it is here, which is
the same rule that removed dates from the matched cards above. A reader must
never have to work out which of the two kinds of section they are looking at. */
.ctx-section--browse .ctx-section-label{color:var(--ctx-ink-3)}
.ctx-browse{display:flex;flex-direction:column;gap:0}
.ctx-browse-item{display:flex;align-items:baseline;gap:10px;padding:9px 0;
border-top:1px solid var(--ctx-divider);text-decoration:none;color:inherit}
.ctx-browse-item:first-child{border-top:0}
.ctx-browse-title{font-family:var(--ctx-display);font-size:13px;font-weight:500;line-height:1.4;color:var(--ctx-ink);text-wrap:pretty}
.ctx-browse-item:hover .ctx-browse-title{color:var(--ctx-accent)}
.ctx-browse-item:focus-visible{outline:2px solid var(--ctx-accent);outline-offset:2px}
.ctx-browse-date{margin-left:auto;flex:none;font-size:11px;color:var(--ctx-ink-3);white-space:nowrap}
/* --- the single general tool ------------------------------------------------
Deliberately NOT .ctx-card: no accent edge, no tint, no card shadow. A row
on the panel ground, the same visual weight as a browse item, so it cannot
be read as a gated result. It keeps a logo and the category line because
those say what the thing IS; everything that would say why it is here is
absent, which is the point. */
.ctx-suggest{display:flex;align-items:flex-start;gap:10px;padding:10px 0 2px;
border-top:1px solid var(--ctx-divider);text-decoration:none;color:inherit}
.ctx-suggest:focus-visible{outline:2px solid var(--ctx-accent);outline-offset:2px}
.ctx-suggest-logo{position:relative;flex:none;width:30px;height:30px;border-radius:7px;overflow:hidden;
display:grid;place-items:center;background:var(--ctx-panel-bg);
box-shadow:inset 0 0 0 1px rgba(16,24,40,.07);font-size:10px;font-weight:700;color:var(--ctx-ink-3)}
.ctx-suggest-body{flex:1;min-width:0}
.ctx-suggest-name{display:block;font-family:var(--ctx-display);font-size:13px;font-weight:600;line-height:1.35;color:var(--ctx-ink)}
.ctx-suggest:hover .ctx-suggest-name{color:var(--ctx-accent)}
/* Wraps rather than ellipsing. A single nowrap line clipped "encryption-as-a-
service" to "encryptio…", which reads as a rendering fault rather than as a
deliberate truncation. */
.ctx-suggest-cats{display:block;font-size:11px;line-height:1.4;color:var(--ctx-ink-3);
overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.ctx-suggest-action{flex:none;margin-left:auto;padding-top:1px;font-size:11.5px;font-weight:600;color:var(--ctx-accent);
white-space:nowrap;display:inline-flex;align-items:center;gap:4px}
/* THE SEARCH FIELD IS THE PANEL'S ONE INPUT and it read as a disabled-looking
grey box: a 1px hairline on a background barely distinct from the panel
itself, sitting above cards with 5px coloured edges. It lost every contrast
contest on its own module.
Weight comes from the same places the cards get it — a real border, a white
ground against the panel's grey, and height — not from a new colour or a
filled button. */
/* §13: present, not dominant. It was carrying a 1.5px border and 44px of height
against cards whose own border is 1px, which made the panel's one input the
heaviest object above the fold — a chatbot prompt rather than a search field.
1px border, 40px tall, a softer shadow and a tighter icon gutter. It keeps a
real border and a white ground against the panel's grey, so it is still
obviously an input; it just stops out-weighting the results it returns.
40px, not less: this is a tap target as well as a field. */
.ctx-ask{margin-top:0;margin-bottom:0;padding-bottom:11px}
.ctx-ask-box{display:flex;align-items:center;gap:9px;border:1px solid #CBD3DC;border-radius:8px;
background:var(--ctx-card-bg);padding:0 12px;min-height:36px;
box-shadow:0 1px 2px rgba(16,24,40,.03);
transition:border-color .15s ease,box-shadow .15s ease}
.ctx-ask-box:hover{border-color:#AEB9C6}
.ctx-ask-box:focus-within{border-color:var(--ctx-header-accent);box-shadow:0 0 0 3px rgba(143,180,255,.35)}
.ctx-panel[data-ctx-mode="search"] .ctx-ask-box{border-color:#b9cbf5}
/* AND THE FOCUSED CASE OF IT, because the rule above outranks :focus-within.
Search mode is two classes and an attribute; the focus rule is one class and
a pseudo-class, so while a search is on screen the focused field reverted to
the resting mode tint and lost the header accent. The glow always survived —
the mode rule sets no box-shadow — so focus stayed visible and only its
border disagreed with itself, which is why this reads as a polish item
rather than a broken focus state. Caught in review; measured in Chromium
after the 150ms transition settles, because reading it immediately returns a
mid-animation value and looks like a different bug. */
.ctx-panel[data-ctx-mode="search"] .ctx-ask-box:focus-within{border-color:var(--ctx-header-accent)}
.ctx-ask-icon{display:grid;place-items:center;color:var(--ctx-ink-3);flex-shrink:0;transition:color .15s ease}
.ctx-ask-box:focus-within .ctx-ask-icon{color:var(--ctx-accent)}
.ctx-ask-input{flex:1;min-width:0;border:0;outline:0;background:transparent;font:inherit;font-size:13.5px;color:var(--ctx-ink);padding:9px 0}
.ctx-ask-input::placeholder{color:var(--ctx-ink-3)}
.ctx-ask-input::-webkit-search-cancel-button{-webkit-appearance:none;appearance:none}
.ctx-ask-spin{width:12px;height:12px;flex-shrink:0;border:2px solid var(--ctx-divider);border-top-color:var(--ctx-accent);border-radius:50%;animation:ctxSpin .7s linear infinite;display:none}
.ctx-panel[data-ctx-busy="1"] .ctx-ask-spin{display:block}
@keyframes ctxSpin{to{transform:rotate(360deg)}}
.ctx-ask-clear{flex-shrink:0;border:0;background:transparent;color:var(--ctx-ink-3);display:none;place-items:center;padding:4px;border-radius:5px;cursor:pointer;font:inherit}
.ctx-panel[data-ctx-mode="search"] .ctx-ask-clear{display:grid}
.ctx-ask-clear:hover{color:var(--ctx-ink);background:var(--ctx-divider)}
.ctx-ask-clear:focus-visible{outline:2px solid var(--ctx-accent);outline-offset:1px}
.ctx-panel .ctx-note{margin:7px 2px 0!important;font-size:11.5px!important;color:var(--ctx-ink-3)!important;line-height:1.45!important}
/* ---------------------------------------------------------------------------
SEARCH IS RUNNING IN A REDUCED MODE, and says so.
A STATUS LINE, NOT AN ERROR BANNER. Nothing is broken when this shows: the
results underneath it are real keyword matches, and the reader's job is to
read them slightly differently, not to go away and come back. Red, an icon
and a filled alert box would all overstate it and would sit louder on the
page than the editorial content it introduces.
The amber is the EXTERNAL accent already in the palette, reused rather than
invented — the one colour on the panel that already means "from somewhere
other than the usual place". Type is set in its -ink twin (6.09:1); the
plain accent appears only on the left rule, per the palette note above.
ABOVE the first section and OUTSIDE it, so the section stays flush to the
top of the panel in the ordinary case where no notice renders and this rule
never applies. Its bottom margin is what separates the two. */
.ctx-status{margin:0 0 14px;padding:8px 11px;border-left:3px solid var(--ctx-notice);
border-radius:0 6px 6px 0;background:#FDF6EE;
font-size:11.5px;line-height:1.5;color:var(--ctx-notice-ink)}
/* A fault or a switch rather than a spent allowance — quieter still, because
there is nothing for anyone to do about it and it clears itself. */
.ctx-status--degraded{border-left-color:var(--ctx-divider);background:var(--ctx-panel-bg);color:var(--ctx-ink-3)}
.ctx-echo{display:inline;margin-left:7px;text-transform:none;letter-spacing:-.005em;font-weight:600;color:var(--ctx-ink-2)}
.ctx-panel .ctx-attribution{margin:20px 0 0!important;padding-top:14px!important;
border-top:1px solid var(--ctx-divider)!important;
font-size:11px!important;color:var(--ctx-ink-3)!important;line-height:1.45!important;
display:flex;align-items:center;gap:7px;flex-wrap:wrap}
/* --- Topic pills -------------------------------------------------------
TEXT LINKS WITH A RULE, NOT PILLS — same grammar as .ctx-verified above:
a filled, coloured badge reads as a tag cloud, which the brief explicitly
rules out, and it would put a navigation control in the same visual class
as the panel's editorial content.
AT THE TOP, under the search box, and with no top rule. The row began
below the footer, on the reasoning that it is a way OUT of the panel
rather than part of it — but the footer is where a reader looks last, and
this is a control they need to FIND. It belongs with the search box: both
are ways of asking a different question. The divider went with the move;
it separated the row from the footer usefully, and here it would cut the
panel in half between two controls that belong to each other. Spacing
does the grouping now. */
/* The seam below this row separates a navigation control from the panel's first
editorial section, so it is wider than the gap between two sections. Spacing
only — no container, no background block, no rule. */
/* THE RUN-UP TO THE FIRST RESULT, TUNED AGAINST A MEASUREMENT.
Panel top to the first card was 255px and is now 203px — a 20% cut, the
bottom of the 20-30% asked for. What produced it: the search box's own
"SEARCH BY MEANING" label removed entirely (a whole layer, 20px), and every
gap above the first card retightened.
THE ONE GAP DELIBERATELY LEFT LOOSER IS THIS ONE. 13px below the topic row
against 8px between the search box and it: search and topics are two ways of
asking the same question and should group, while the step down to
CLOUDTWEAKS ANALYSIS is where the introduction ends and the results begin.
Equal gaps everywhere read as one undifferentiated stack, which is what a
tightening pass most easily breaks. Spacing does that work here — no rule,
no divider, no block. */
.ctx-topics{margin-top:0;margin-bottom:0;padding-bottom:15px}
/* .11em, matching .ctx-section-label exactly. Same size, same weight, same
case, same job — two values was an accident, not a distinction. */
/* .11em, matching .ctx-section-label exactly. Same size, same weight, same
case, same job — two values was an accident, not a distinction.
The search box briefly carried a matching label; it was removed to shorten
the run-up to the first result, so this is the topic row's rule again. */
.ctx-topics-label{display:block;font-size:10px;font-weight:700;letter-spacing:.11em;
text-transform:uppercase;color:var(--ctx-header-ink-2);margin:0 0 5px}
/* Row rhythm comes from a real row gap again, not from padding on the links.
The touch target moved to a pseudo-element (below), so the row can be as
tight as the type wants while the tappable area stays 44px. Those were the
same box before, which forced a 44px row pitch and made this block twice the
height of the content it introduces — and it is meant to be LIGHTER than the
results below it, not heavier. */
/* 12px, NOT 18px, AND THE ROW HOLDING ONE LINE IS THE REASON.
Measured in Chromium against the real fragment: the five labels are 226px of
type, so the row needs 226 + four gaps. At 18px that is 297px and wraps to
two lines below a 340px panel; at 12px it is 274px and holds one line from
320px — the narrowest phone still in real use, and narrower than any sidebar
column this is likely to sit in.
UNCONDITIONAL rather than scoped to a breakpoint, because the constraint is
the PANEL's width and a media query only knows the VIEWPORT's. Those are the
same number on mobile, where the panel stacks full width, and are not on
desktop, where a 320px sidebar column sits inside a 1400px window — a
viewport rule would miss exactly that case. One value everywhere beats a
rule that is right on phones and silently wrong in a narrow sidebar.
Below ~300px it cannot fit at any gap and is allowed to wrap. */
.ctx-topics-list{display:flex;flex-wrap:wrap;gap:13px 12px}
/* EDITORIAL TAXONOMY, NOT NAVIGATION.
The permanent underline read as a website nav bar: five underlined links in a
row is the visual grammar of a menu, and this is a list of subjects. It is
gone at rest. What marks the row instead is weight and a near-black neutral —
legibly different from the ink-2/ink-3 body copy around it without being
decorated.
On interaction, a thin rule GROWS from the centre and the colour shifts, so
hover and focus are the same event. Both states are on :focus-visible as well
as :hover, which is the whole point: a keyboard user and a touch user get
what a mouse user gets, and nothing here is hover-only.
NOT pills. No background, no radius, no border box. */
/* A <button>, so no script failure can turn a topic switch into a page load —
see topicPillRow(). The first two lines are the reset that makes a button
look like the text link this used to be: buttons inherit neither the panel's
font nor its colour, and carry a UA background, border and padding that
would otherwise render this row as five grey chips. */
.ctx-topic-pill{position:relative;display:inline-block;padding:1px 0;margin:0;
background:none;border:0;border-radius:0;font-family:var(--ctx-sans);text-align:left;
appearance:none;-webkit-appearance:none;cursor:pointer;
font-size:12.5px;font-weight:600;letter-spacing:-.006em;color:var(--ctx-header-ink);
text-decoration:none;white-space:nowrap;transition:color .16s ease}
/* THE TOUCH TARGET, AND IT IS INVISIBLE. 44x44 centred on the link however
short the word is — "AI" is 18px of type and would otherwise be an 18px
target. A pseudo-element rather than padding or min-width, because both of
those move the text and stretch the gaps, which is what made the row read as
individually positioned links rather than one deliberate group. Adjacent
targets overlap slightly in the gutters and the later element wins there; no
pill's own text is ever inside another pill's target. */
.ctx-topic-pill::after{content:"";position:absolute;left:50%;top:50%;
transform:translate(-50%,-50%);width:calc(100% + 20px);min-width:44px;height:44px}
/* The rule that appears. Drawn from the centre out so it reads as a response
rather than as an underline being switched on. */
.ctx-topic-pill::before{content:"";position:absolute;left:50%;bottom:-3px;
width:0;height:1.5px;background:var(--ctx-header-accent);transform:translateX(-50%);
transition:width .18s ease}
.ctx-topic-pill:hover,.ctx-topic-pill:focus-visible{color:var(--ctx-header-accent)}
.ctx-topic-pill:hover::before,.ctx-topic-pill:focus-visible::before{width:100%}
.ctx-topic-pill:focus-visible{outline:2px solid var(--ctx-header-accent);outline-offset:4px;border-radius:2px}
.ctx-topic-pill[aria-current]{color:var(--ctx-header-accent)}
.ctx-topic-pill[aria-current]::before{width:100%}
[data-ctx-internal][aria-busy="true"]{opacity:.55;pointer-events:none}
/* THIS OVERRIDE ATE THE FIRST DENSITY PASS and is the reason it is called out
here. .ctx-card's own padding went 14 -> 12 for §4.3, and the saving showed
up at 768px and nowhere else: every width the sidebar actually renders at is
below 520px, where this rule was still setting 13px. A density change made
only on the base rule is a density change the reader never sees. */
@media (max-width:520px){.ctx-panel{padding:16px;--ctx-pad:16px}.ctx-card{padding:9px 13px}
.ctx-card--search{padding:9px 13px 8px}}
/* THE TOOL CARD'S FOOTER, AND ONLY THAT ONE. Measured at 320px: the analysis
and industry cards hold "91% CONTEXT MATCH" in full, and the tool card has
65px for a 123px line — because a 36px mark plus its gutter comes out of that
row and "View listing" (which is the one verb that survived §4.3, and stays)
takes another 93px. Something has to give at that width, and it is the label
rather than the figure: §4.2's own ordering, and the three cards directly
above it are still printing the label in full against identical numbers. */
@media (max-width:360px){.ctx-card--technology .ctx-evidence-label{display:none}
/* And the industry card came out ONE PIXEL over at 320px — 123px of label into
122px of room, which text-overflow renders as a lost character plus an
ellipsis. 8px -> 6px on the two footer gaps buys four, which is the whole
problem. Not a general density change: it is scoped to the width where it was
measured. */
.ctx-foot,.ctx-foot-text{gap:6px}}
@media (prefers-reduced-motion:reduce){.ctx-panel *{transition-duration:.001ms!important}.ctx-ask-spin{animation:none}}</style><aside class="ctx-panel" aria-label="Related insights" data-ctx-search-base="https://news-intelligence-ricks-projects-5e8f9a01.vercel.app/api/panel/search?article=61369"><form class="ctx-ask" method="get" action="https://cloudtweaks.com/" role="search" data-ctx-search><div class="ctx-ask-box"><span class="ctx-ask-icon"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="11" cy="11" r="7"/><path d="m20 20-3.5-3.5"/></svg></span><input class="ctx-ask-input" type="search" name="s" placeholder="Try: how do I secure AI agents?" aria-label="Search by meaning" autocomplete="off" spellcheck="false"><span class="ctx-ask-spin" aria-hidden="true"></span><button class="ctx-ask-clear" type="button" data-ctx-clear aria-label="Clear search and return to this article's context" title="Back to this article's context"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" aria-hidden="true"><path d="M18 6 6 18M6 6l12 12"/></svg></button></div><p class="ctx-note" data-ctx-note hidden></p></form><nav class="ctx-topics" aria-label="Explore another topic" data-ctx-topics><span class="ctx-topics-label">Explore another topic</span><span class="ctx-topics-list"><button type="button" class="ctx-topic-pill" data-ctx-topic-pill data-ctx-topic-index="0">Security</button><button type="button" class="ctx-topic-pill" data-ctx-topic-pill data-ctx-topic-index="1">DevOps</button><button type="button" class="ctx-topic-pill" data-ctx-topic-pill data-ctx-topic-index="2">Big Data</button><button type="button" class="ctx-topic-pill" data-ctx-topic-pill data-ctx-topic-index="3">Cloud</button></span></nav><div data-ctx-results><div data-ctx-internal></div><section class="ctx-section ctx-section--browse"><h4 class="ctx-section-label">From the tools directory</h4><p class="ctx-section-sub">Suggested by topic, not a matched result</p><a class="ctx-suggest" href="https://tools.cloudtweaks.com/company/launchdarkly"><span class="ctx-suggest-logo" aria-hidden="true"><span class="ctx-tool-initials">LA</span><img class="ctx-tool-img br-lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAzMCAzMCc+PC9zdmc+" data-breeze="https://img.logo.dev/launchdarkly.com?token=pk_IJhEYcgOS9OLrQePvH-zUg&amp;size=128&amp;format=png" alt="" width="30" height="30" loading="lazy" decoding="async" referrerpolicy="no-referrer" onerror="this.style.display=&#39;none&#39;" onload="if(this.naturalWidth&lt;8)this.style.display=&#39;none&#39;"></span><span class="ctx-suggest-body"><span class="ctx-suggest-name">LaunchDarkly</span><span class="ctx-suggest-cats">Feature flags · experimentation</span></span><span class="ctx-suggest-action">View listing <svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span></a></section><section class="ctx-section ctx-section--browse"><h4 class="ctx-section-label">More from CloudTweaks</h4><p class="ctx-section-sub">Recent articles, not matched to this one</p><div class="ctx-browse"><a class="ctx-browse-item" href="https://cloudtweaks.com/2026/09/aws-azure-and-google-cloud-whats-different-about-their-mcp-servers/" data-ctx-browse="1"><span class="ctx-browse-title">AWS, Azure and Google Cloud: What’s Different About Their MCP Servers</span><span class="ctx-browse-date">September 2026</span></a><a class="ctx-browse-item" href="https://cloudtweaks.com/2026/09/ai-agent-security-problem-sandboxes-cannot-solve/" data-ctx-browse="1"><span class="ctx-browse-title">The AI Agent Security Problem Sandboxes Cannot Solve</span><span class="ctx-browse-date">September 2026</span></a><a class="ctx-browse-item" href="https://cloudtweaks.com/2026/09/market-paying-for-judgment-most-talent-systems-still-buy-tasks/" data-ctx-browse="1"><span class="ctx-browse-title">The Market Is Paying for Judgment. Most Talent Systems Still Buy Tasks.</span><span class="ctx-browse-date">September 2026</span></a><a class="ctx-browse-item" href="https://cloudtweaks.com/2026/09/episode-29-ai-agents-are-coming-for-the-enterprise-stack/" data-ctx-browse="1"><span class="ctx-browse-title">Episode 29: AI Agents Are Coming for the Enterprise Stack</span><span class="ctx-browse-date">September 2026</span></a></div></section></div><p class="ctx-attribution"><span>Powered by CloudTweaks Context</span></p><div data-ctx-topic-store hidden><div data-ctx-topic-index="0"><section class="ctx-section ctx-section--flush"><h4 class="ctx-section-label">Security</h4><p class="ctx-section-sub">More articles in this topic</p><div class="ctx-list"><a class="ctx-card ctx-card--internal ctx-card--lead" href="https://cloudtweaks.com/2026/07/monitoring-vs-observability-which-catches-unknown-failures-first/" data-ctx-browse="1"><span class="ctx-headline">Monitoring vs Observability: Which Catches Unknown Failures First</span><span class="ctx-shared ctx-shared--compact"><span class="ctx-shared-label">Covers:</span> <span class="ctx-shared-term">Monitoring</span></span><span class="ctx-foot"><span class="ctx-foot-text"></span><span class="ctx-action ctx-action--glyph"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span></span></a><a class="ctx-card ctx-card--internal ctx-card--lead" href="https://cloudtweaks.com/2026/08/detecting-deepfakes-proving-authenticity/" data-ctx-browse="1"><span class="ctx-headline">The Future of Trust Isn’t Detecting Deepfakes. It’s Proving Authenticity</span><span class="ctx-shared ctx-shared--compact"><span class="ctx-shared-label">Covers:</span> <span class="ctx-shared-term">Digital Signatures</span></span><span class="ctx-foot"><span class="ctx-foot-text"></span><span class="ctx-action ctx-action--glyph"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span></span></a><a class="ctx-card ctx-card--internal ctx-card--lead" href="https://cloudtweaks.com/2026/09/aws-azure-and-google-cloud-whats-different-about-their-mcp-servers/" data-ctx-browse="1"><span class="ctx-headline">AWS, Azure and Google Cloud: What’s Different About Their MCP Servers</span><span class="ctx-shared ctx-shared--compact"><span class="ctx-shared-label">Covers:</span> <span class="ctx-shared-term">Model Context Protocol</span></span><span class="ctx-foot"><span class="ctx-foot-text"></span><span class="ctx-action ctx-action--glyph"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span></span></a><a class="ctx-card ctx-card--internal ctx-card--lead" href="https://cloudtweaks.com/2026/08/zero-trust-people-workloads-ai-agents/" data-ctx-browse="1"><span class="ctx-headline">Zero Trust Was Built for People and Workloads. AI Agents Strain Its Identity Layer.</span><span class="ctx-shared ctx-shared--compact"><span class="ctx-shared-label">Covers:</span> <span class="ctx-shared-term">NIST SP 800-207</span></span><span class="ctx-foot"><span class="ctx-foot-text"></span><span class="ctx-action ctx-action--glyph"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span></span></a><a class="ctx-card ctx-card--internal ctx-card--lead" href="https://cloudtweaks.com/2026/08/dedicated-hosting-healthcare-finance/" data-ctx-browse="1"><span class="ctx-headline">Dedicated Hosting for Healthcare and Finance: What It Simplifies and What It Doesn’t</span><span class="ctx-shared ctx-shared--compact"><span class="ctx-shared-label">Covers:</span> <span class="ctx-shared-term">Dedicated Hosting</span></span><span class="ctx-foot"><span class="ctx-foot-text"></span><span class="ctx-action ctx-action--glyph"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span></span></a></div></section></div><div data-ctx-topic-index="1"><section class="ctx-section ctx-section--flush"><h4 class="ctx-section-label">DevOps</h4><p class="ctx-section-sub">More articles in this topic</p><div class="ctx-list"><a class="ctx-card ctx-card--internal ctx-card--lead" href="https://cloudtweaks.com/2026/08/your-ai-coding-agent/" data-ctx-browse="1"><span class="ctx-headline">Your AI Coding Agent Isn’t One Thing: Four Ways It Actually Runs</span><span class="ctx-shared ctx-shared--compact"><span class="ctx-shared-label">Covers:</span> <span class="ctx-shared-term">Zero Data Retention</span></span><span class="ctx-foot"><span class="ctx-foot-text"></span><span class="ctx-action ctx-action--glyph"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span></span></a><a class="ctx-card ctx-card--internal ctx-card--lead" href="https://cloudtweaks.com/2026/08/managed-vs-self-managed-kubernetes-in-2026-true-cost-and-control/" data-ctx-browse="1"><span class="ctx-headline">Managed vs Self-Managed Kubernetes in 2026: True Cost and Control</span><span class="ctx-shared ctx-shared--compact"><span class="ctx-shared-label">Covers:</span> <span class="ctx-shared-term">FedRAMP</span></span><span class="ctx-foot"><span class="ctx-foot-text"></span><span class="ctx-action ctx-action--glyph"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span></span></a><a class="ctx-card ctx-card--internal ctx-card--lead" href="https://cloudtweaks.com/2026/09/ai-container-images-for-enterprise-ai/" data-ctx-browse="1"><span class="ctx-headline">Leading AI-Ready Container Images and Platforms for Enterprise AI</span><span class="ctx-shared ctx-shared--compact"><span class="ctx-shared-label">Covers:</span> <span class="ctx-shared-term">PyTorch</span></span><span class="ctx-foot"><span class="ctx-foot-text"></span><span class="ctx-action ctx-action--glyph"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span></span></a><a class="ctx-card ctx-card--internal ctx-card--lead" href="https://cloudtweaks.com/2026/05/reality-of-containers-in-2026-beyond-docker-hype/" data-ctx-browse="1"><span class="ctx-headline">The Reality of Containers in 2026: Beyond Docker Hype</span><span class="ctx-shared ctx-shared--compact"><span class="ctx-shared-label">Covers:</span> <span class="ctx-shared-term">Software bill of materials</span></span><span class="ctx-foot"><span class="ctx-foot-text"></span><span class="ctx-action ctx-action--glyph"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span></span></a><a class="ctx-card ctx-card--internal ctx-card--lead" href="https://cloudtweaks.com/2025/10/cloud-management-platforms/" data-ctx-browse="1"><span class="ctx-headline">Cloud Management Platforms: The Backbone of Modern Cloud Optimization</span><span class="ctx-shared ctx-shared--compact"><span class="ctx-shared-label">Covers:</span> <span class="ctx-shared-term">Cloud Management Platforms</span></span><span class="ctx-foot"><span class="ctx-foot-text"></span><span class="ctx-action ctx-action--glyph"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span></span></a></div></section></div><div data-ctx-topic-index="2"><section class="ctx-section ctx-section--flush"><h4 class="ctx-section-label">Big Data</h4><p class="ctx-section-sub">More articles in this topic</p><div class="ctx-list"><a class="ctx-card ctx-card--internal ctx-card--lead" href="https://cloudtweaks.com/2026/08/surge-in-cloud-migration/" data-ctx-browse="1"><span class="ctx-headline">M&amp;A Is Quietly Driving a Surge in Cloud Migration</span><span class="ctx-shared ctx-shared--compact"><span class="ctx-shared-label">Covers:</span> <span class="ctx-shared-term">Directory Sync</span></span><span class="ctx-foot"><span class="ctx-foot-text"></span><span class="ctx-action ctx-action--glyph"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span></span></a><a class="ctx-card ctx-card--internal ctx-card--lead" href="https://cloudtweaks.com/2026/07/why-and-how-to-prioritize-transparency-in-data-modernization-projects/" data-ctx-browse="1"><span class="ctx-headline">Why and How to Prioritize Transparency In Data Modernization Projects</span><span class="ctx-shared ctx-shared--compact"><span class="ctx-shared-label">Covers:</span> <span class="ctx-shared-term">Data Modernization</span></span><span class="ctx-foot"><span class="ctx-foot-text"></span><span class="ctx-action ctx-action--glyph"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span></span></a><a class="ctx-card ctx-card--internal ctx-card--lead" href="https://cloudtweaks.com/2026/08/social-media-management-tools-b2b/" data-ctx-browse="1"><span class="ctx-headline">6 Leading Social Media Management Tools for B2B SaaS in 2026</span><span class="ctx-shared ctx-shared--compact"><span class="ctx-shared-label">Covers:</span> <span class="ctx-shared-term">Agorapulse</span></span><span class="ctx-foot"><span class="ctx-foot-text"></span><span class="ctx-action ctx-action--glyph"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span></span></a><a class="ctx-card ctx-card--internal ctx-card--lead" href="https://cloudtweaks.com/2026/05/identity-new-foundation-cloud-migration/" data-ctx-browse="1"><span class="ctx-headline">Identity Is the New Foundation for Cloud Migration</span><span class="ctx-shared ctx-shared--compact"><span class="ctx-shared-label">Covers:</span> <span class="ctx-shared-term">Zero Trust</span></span><span class="ctx-foot"><span class="ctx-foot-text"></span><span class="ctx-action ctx-action--glyph"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span></span></a><a class="ctx-card ctx-card--internal ctx-card--lead" href="https://cloudtweaks.com/2026/05/6-robust-solutions-for-global-tax-compliance/" data-ctx-browse="1"><span class="ctx-headline">6 Robust Solutions for Global Tax Compliance</span><span class="ctx-shared ctx-shared--compact"><span class="ctx-shared-label">Covers:</span> <span class="ctx-shared-term">Global Business Engine</span></span><span class="ctx-foot"><span class="ctx-foot-text"></span><span class="ctx-action ctx-action--glyph"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span></span></a></div></section></div><div data-ctx-topic-index="3"><section class="ctx-section ctx-section--flush"><h4 class="ctx-section-label">Cloud</h4><p class="ctx-section-sub">More articles in this topic</p><div class="ctx-list"><a class="ctx-card ctx-card--internal ctx-card--lead" href="https://cloudtweaks.com/2026/08/how-to-choose-a-microsoft-365-migration-platform/" data-ctx-browse="1"><span class="ctx-headline">How to Choose a Microsoft 365 Migration Platform as Migration Scope Expands</span><span class="ctx-shared ctx-shared--compact"><span class="ctx-shared-label">Covers:</span> <span class="ctx-shared-term">Active Directory</span></span><span class="ctx-foot"><span class="ctx-foot-text"></span><span class="ctx-action ctx-action--glyph"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span></span></a><a class="ctx-card ctx-card--internal ctx-card--lead" href="https://cloudtweaks.com/2026/06/the-true-cost-of-hipaa-non-compliance-for-healthcare/" data-ctx-browse="1"><span class="ctx-headline">The True Cost of HIPAA Non-Compliance for Healthcare</span><span class="ctx-shared ctx-shared--compact"><span class="ctx-shared-label">Covers:</span> <span class="ctx-shared-term">HIPAA</span></span><span class="ctx-foot"><span class="ctx-foot-text"></span><span class="ctx-action ctx-action--glyph"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span></span></a><a class="ctx-card ctx-card--internal ctx-card--lead" href="https://cloudtweaks.com/2025/10/making-the-cloud-work-smarter/" data-ctx-browse="1"><span class="ctx-headline">Cloud Optimization: The Science of Making the Cloud Work Smarter</span><span class="ctx-shared ctx-shared--compact"><span class="ctx-shared-label">Covers:</span> <span class="ctx-shared-term">infrastructure as code</span></span><span class="ctx-foot"><span class="ctx-foot-text"></span><span class="ctx-action ctx-action--glyph"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span></span></a><a class="ctx-card ctx-card--internal ctx-card--lead" href="https://cloudtweaks.com/2025/06/us-cloud-hosting-leaders/" data-ctx-browse="1"><span class="ctx-headline">USA Cloud Hosting Leaders: Enterprise, Mid-Sized, and Small Business Solutions</span><span class="ctx-shared ctx-shared--compact"><span class="ctx-shared-label">Covers:</span> <span class="ctx-shared-term">IBM Cloud</span></span><span class="ctx-foot"><span class="ctx-foot-text"></span><span class="ctx-action ctx-action--glyph"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span></span></a><a class="ctx-card ctx-card--internal ctx-card--lead" href="https://cloudtweaks.com/2025/06/erp-deployment-comparing-on-premise-solutions/" data-ctx-browse="1"><span class="ctx-headline">ERP Deployment in 2025: Comparing Cloud, Hybrid, and On-Premise Solutions</span><span class="ctx-shared ctx-shared--compact"><span class="ctx-shared-label">Covers:</span> <span class="ctx-shared-term">CCPA</span></span><span class="ctx-foot"><span class="ctx-foot-text"></span><span class="ctx-action ctx-action--glyph"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span></span></a></div></section></div></div></aside><script>(function(){ var panels=document.querySelectorAll('.ctx-panel:not([data-ctx-init])'); for(var i=0;i<panels.length;i++)init(panels[i]); function init(panel){ panel.setAttribute('data-ctx-init','1'); initSearch(panel); initTopics(panel); } function initSearch(panel){ var form=panel.querySelector('[data-ctx-search]'); var input=form&&form.querySelector('.ctx-ask-input'); var note=form&&form.querySelector('[data-ctx-note]'); var results=panel.querySelector('[data-ctx-results]'); var clear=panel.querySelector('[data-ctx-clear]'); if(!form||!input||!results)return; var base=panel.getAttribute('data-ctx-search-base'); if(!base)return; var original=results.innerHTML,memo={},timer=null,ctrl=null,last=''; function busy(on){panel.setAttribute('data-ctx-busy',on?'1':'0');} function reset(){ if(timer){clearTimeout(timer);timer=null;} if(ctrl){ctrl.abort();ctrl=null;} last='';busy(false);panel.removeAttribute('data-ctx-mode'); results.innerHTML=original;if(note){note.hidden=true;note.textContent='';} var cp=panel.querySelectorAll('[data-ctx-topic-pill][aria-current]'); for(var k=0;k<cp.length;k++)cp[k].removeAttribute('aria-current'); } function show(html){results.innerHTML=html;panel.setAttribute('data-ctx-mode','search');} function fail(){busy(false);if(note){note.hidden=false;note.textContent='Search is unavailable right now.';}} function run(q){ if(memo[q]!==undefined){show(memo[q]);busy(false);return;} if(ctrl)ctrl.abort(); ctrl=(typeof AbortController!=='undefined')?new AbortController():null; var mine=ctrl,expired=false; var to=setTimeout(function(){expired=true;if(mine)mine.abort();else fail();},8000); busy(true); fetch(base+(base.indexOf('?')>-1?'&':'?')+'q='+encodeURIComponent(q),{signal:mine?mine.signal:undefined,credentials:'omit'}) .then(function(r){return r.ok?r.text():Promise.reject(r.status);}) .then(function(html){clearTimeout(to);if(q!==last)return;memo[q]=html;show(html);busy(false);}) .catch(function(e){clearTimeout(to);if(e&&e.name==='AbortError'&&!expired)return;fail();}); } function schedule(){ var q=input.value.trim(); if(timer)clearTimeout(timer); if(q===''){reset();return;} if(q.length<3){last=q;return;} last=q;timer=setTimeout(function(){run(q);},400); } input.addEventListener('input',schedule); form.addEventListener('submit',function(e){ e.preventDefault(); var q=input.value.trim(); if(q.length>=3){if(timer)clearTimeout(timer);last=q;run(q);} }); if(clear)clear.addEventListener('click',function(){input.value='';reset();input.focus();}); input.addEventListener('keydown',function(e){if(e.key==='Escape'){input.value='';reset();}}); } function initTopics(panel){ var nav=panel.querySelector('[data-ctx-topics]'); if(!nav)return; var store=panel.querySelector('[data-ctx-topic-store]'); if(!store)return; var pills=nav.querySelectorAll('[data-ctx-topic-pill]'); function setActive(pill){ for(var j=0;j<pills.length;j++)pills[j].removeAttribute('aria-current'); if(pill)pill.setAttribute('aria-current','true'); } for(var i=0;i<pills.length;i++){ (function(pill){ pill.addEventListener('click',function(e){ var t=panel.querySelector('[data-ctx-internal]'); if(!t)return; var idx=pill.getAttribute('data-ctx-topic-index'); var block=store.querySelector('[data-ctx-topic-index="'+idx+'"]'); if(!block)return; e.preventDefault(); if(t.getAttribute('data-ctx-original')==null)t.setAttribute('data-ctx-original',t.innerHTML); var cur=t.getAttribute('data-ctx-active'); if(cur===idx){t.removeAttribute('data-ctx-active');setActive(null);t.innerHTML=t.getAttribute('data-ctx-original');return;} t.setAttribute('data-ctx-active',idx);setActive(pill); t.innerHTML=block.innerHTML; }); })(pills[i]); } } })();</script></div><img class="bde-image2-140342-887 bde-image2 br-lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAwIDAnPjwvc3ZnPg==" data-breeze="https://cloudtweaks.com/wp-content/uploads/2023/10/microservices-comic.jpeg" loading="lazy" data-brsrcset="https://cloudtweaks.com/wp-content/uploads/2023/10/microservices-comic.jpeg 1034w, https://cloudtweaks.com/wp-content/uploads/2023/10/microservices-comic-300x279.jpeg 300w, https://cloudtweaks.com/wp-content/uploads/2023/10/microservices-comic-1024x951.jpeg 1024w, https://cloudtweaks.com/wp-content/uploads/2023/10/microservices-comic-768x713.jpeg 768w" data-brsizes="(max-width: 1034px) 100vw, 1034px"><div class="bde-code-block-140342-886 bde-code-block">
<aside class="ctiv-mod" aria-label="Expert interviews"><p class="ctiv-head">Expert Interviews</p><p class="ctiv-sub">Recent conversations from CloudTweaks</p><div class="ctiv-list"><a class="ctiv-row" href="https://cloudtweaks.com/2026/06/vault-inside-interview-fius-professor-zhu/"><span class="ctiv-face" data-ctiv-initials="TV"><img class="ctiv-img br-lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA0OCA0OCc+PC9zdmc+" data-breeze="https://cloudtweaks.com/wp-content/uploads/2026/06/Weidong-Zhu-150x150.jpg" alt="" loading="lazy" decoding="async" width="48" height="48"></span><span class="ctiv-body"><span class="ctiv-title">The Vault Inside the Drive: A Tech Industry Interview with FIU’s Professor Zhu</span><p class="ctiv-meta">Assistant Professor, Florida International University, cis.fiu.edu</p></span></a><a class="ctiv-row" href="https://cloudtweaks.com/2026/06/asset-intelligence-before-ai-teqtivitys-hiren-hasmukh/"><span class="ctiv-face" data-ctiv-initials="AI"><img class="ctiv-img br-lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA0OCA0OCc+PC9zdmc+" data-breeze="https://cloudtweaks.com/wp-content/uploads/2026/05/Hiren-Hasmukh-150x150.jpg" alt="" loading="lazy" decoding="async" width="48" height="48"></span><span class="ctiv-body"><span class="ctiv-title">Asset Intelligence Before AI: Teqtivity’s Hiren Hasmukh</span><p class="ctiv-meta">CEO &amp; Founder, teqtivity.com</p></span></a><a class="ctiv-row" href="https://cloudtweaks.com/2026/06/interview-gregg-willsky-ai-security-enterprise-risk/"><span class="ctiv-face" data-ctiv-initials="IW"><img class="ctiv-img br-lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA0OCA0OCc+PC9zdmc+" data-breeze="https://cloudtweaks.com/wp-content/uploads/2026/06/gregg-150x150.jpg" alt="" loading="lazy" decoding="async" width="48" height="48"></span><span class="ctiv-body"><span class="ctiv-title">Interview with Gregg Willsky on AI, Security, and Enterprise Risk</span><p class="ctiv-meta">Principal Analyst, Globaldata</p></span></a></div><a class="ctiv-all" href="https://cloudtweaks.com/category/interviews/">View all interviews &rarr;</a></aside>
</div>
</div></div></div>
</section><section class="bde-section-140342-867 bde-section">
<div class="section-container"><div class="bde-code-block-140342-868 bde-code-block">
<aside class="ctw-author" aria-label="About the author">
<div class="ctw-author__inner">
<div class="ctw-author__avatar"><img class="avatar avatar-192 photo br-lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxOTIgMTkyJz48L3N2Zz4=" data-breeze="https://cloudtweaks.com/wp-content/uploads/2026/07/logo-ct.webp" alt="Cloud Syndicate" width="192" height="192" /></div>
<div class="ctw-author__content">
<p class="ctw-author__eyebrow">About the author</p>
<h2 class="ctw-author__name">Cloud Syndicate</h2>
<p class="ctw-author__bio">Welcome to the 'Cloud Syndicate,' a curated community featuring short-term guest contributors, curated resources, and syndication partners covering diverse technology topics. Connect your technology article or news feed to our syndication network for broader visibility. Explore the intersections of Cloud computing, Cybersecurity, Big Data, and AI through insightful articles and engaging podcasts. Stay ahead in the dynamic world of technology with our platform for thought leadership and industry news.
<a href="https://cloudtweaks.com/contact/">Join us</a> as we delve into the latest trends and innovations.</p>
<a class="ctw-author__more" href="https://cloudtweaks.com/author/the-cloud-syndicate/" rel="author">
More from Cloud Syndicate <span aria-hidden="true">&rarr;</span>
</a>
</div>
</div>
</aside>
</div></div>
</section><section class="bde-section-137942-258 bde-section">
<div class="section-container"><div class="bde-code-block-137942-259 bde-code-block">
<footer id="ctw-footer" role="contentinfo">
<div class="ctw-footer__inner">
<div class="ctw-footer__main">
<!-- ── Col 1: Brand ── -->
<div class="ctw-footer__brand">
<a class="ctw-footer__logo" href="https://cloudtweaks.com" aria-label="CloudTweaks home">
<img class="br-lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAwIDAnPjwvc3ZnPg==" data-breeze="https://cloudtweaks.com/wp-content/uploads/2026/07/Logo-B-CT.webp" src="https://cloudtweaks.com/wp-content/uploads/2026/07/Logo-B-CT.webp"
alt="CloudTweaks" loading="lazy" decoding="async" />
</a>
<p class="ctw-footer__desc">
Independent analysis and expert perspectives on cloud, AI and
security, helping technology teams find what actually works in
production.
</p>
<!-- Follow us on LinkedIn -->
<div class="ctw-footer__follow">
<span class="ctw-footer__follow-label">
Follow us on LinkedIn
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" 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>
</span>
<a class="ctw-footer__social" href="https://linkedin.com/company/cloudtweaks" target="_blank" rel="noopener noreferrer" aria-label="CloudTweaks on LinkedIn">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg>
</a>
</div>
</div>
<!-- ── Col 2: Content ── -->
<div class="ctw-footer__col">
<p class="ctw-footer__col-label">Content</p>
<ul class="ctw-footer__links">
<li><a href="https://cloudtweaks.com/the-authority-circle/">Authority Circle</a></li>
<li><a href="https://cloudtweaks.com/thought-leaders/">Expert Insights</a></li>
<li><a href="https://cloudtweaks.com/interviews/">Interviews</a></li>
<li><a href="https://cloudtweaks.com/podcasts/">Podcasts</a></li>
</ul>
</div>
<!-- ── Col 3: Resources ── -->
<div class="ctw-footer__col">
<p class="ctw-footer__col-label">Resources</p>
<ul class="ctw-footer__links">
<li><a href="https://cloudtweaks.com/cloudpulse/">Cloud Pulse</a></li>
<li><a href="https://cloudtweaks.com/intelligence-hub/">Intelligence Hub</a></li>
<li><a href="https://cloudtweaks.com/tech-terminology/">Tech Terminology</a></li>
<li><a href="https://tools.cloudtweaks.com">Tools Directory</a></li>
</ul>
</div>
<!-- ── Col 4: Connect ── -->
<div class="ctw-footer__col">
<p class="ctw-footer__col-label">Connect</p>
<ul class="ctw-footer__links">
<li><a href="https://cloudtweaks.com/about-us/">About Us</a></li>
<li><a href="https://cloudtweaks.com/branded-content-partnerships/">Brand Partners</a></li>
<li><a href="https://cloudtweaks.com/newsletter-subscribe/">Subscribe</a></li>
<li><a href="https://contact.cloudtweaks.com">Contact</a></li>
</ul>
</div>
</div><!-- /.ctw-footer__main -->
<!-- ── Bottom bar ── -->
<div class="ctw-footer__bottom">
<p class="ctw-footer__copyright">
&copy; 2009&ndash;2026 <strong>CloudTweaks</strong>&nbsp;&middot; All rights reserved.
</p>
<nav class="ctw-footer__legal" aria-label="Legal links">
<a href="https://cloudtweaks.com/privacy-policy/">Privacy Policy</a>
<span class="ctw-footer__sep" aria-hidden="true"></span>
<a href="https://cloudtweaks.com/cookie-policy/">Cookie Policy</a>
<span class="ctw-footer__sep" aria-hidden="true"></span>
<a href="https://cloudtweaks.com/services/">Services</a>
<span class="ctw-footer__sep" aria-hidden="true"></span>
<a href="https://contact.cloudtweaks.com">Contact</a>
</nav>
<div class="ctw-footer__since">
<svg width="12" height="12" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 2l2.4 7.4H22l-6.2 4.5 2.4 7.4L12 17l-6.2 4.3 2.4-7.4L2 9.4h7.6z"/></svg>
Trusted cloud coverage since 2009
</div>
</div>
</div>
</footer>
</div></div>
</section> <script type="speculationrules">
{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/plugins/breakdance/plugin/themeless/themes/breakdance-zero/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
</script>
<style id="global-styles-inline-css">
:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,0) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}.wp-block-button{--wp--preset--dimension--25: 25%;--wp--preset--dimension--50: 50%;--wp--preset--dimension--75: 75%;--wp--preset--dimension--100: 100%;}:where(body) { margin: 0; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
/*# sourceURL=global-styles-inline-css */
</style>
<script id="wpil-frontend-script-js-extra">
var wpilFrontend = {"ajaxUrl":"/wp-admin/admin-ajax.php","postId":"61369","postType":"post","openInternalInNewTab":"0","openExternalInNewTab":"1","disableClicks":"0","openLinksWithJS":"0","trackAllElementClicks":"1","clicksI18n":{"imageNoText":"Image in link: No Text","imageText":"Image Title: ","noText":"No Anchor Text Found"}};
//# sourceURL=wpil-frontend-script-js-extra
</script>
<script id="wpil-frontend-script-js" src="https://cloudtweaks.com/wp-content/plugins/link-whisper-premium/js/frontend.min.js?ver=1787388580"></script>
<script id="audioigniter-js-extra">
var aiStrings = {"play_title":"Play %s","pause_title":"Pause %s","previous":"Previous track","next":"Next track","toggle_list_repeat":"Toggle track listing repeat","toggle_track_repeat":"Toggle track repeat","toggle_list_visible":"Toggle track listing visibility","buy_track":"Buy this track","download_track":"Download this track","volume_up":"Volume Up","volume_down":"Volume Down","open_track_lyrics":"Open track lyrics","set_playback_rate":"Set playback rate","skip_forward":"Skip forward","skip_backward":"Skip backward","shuffle":"Shuffle"};
var aiStats = {"enabled":"","apiUrl":"https://cloudtweaks.com/wp-json/audioigniter/v1"};
var ai_pro_front_scripts = {"multi_sound_disabled":"1","typography_disabled":"","statistics_enabled":""};
//# sourceURL=audioigniter-js-extra
</script>
<script id="audioigniter-js" src="https://cloudtweaks.com/wp-content/plugins/audioigniter/player/build/app.js?ver=2.0.4"></script>
<script id="breeze-lazy-js" src="https://cloudtweaks.com/wp-content/plugins/breeze/assets/js/js-front-end/breeze-lazy-load.min.js?ver=2.5.13"></script>
<script id="breeze-lazy-js-after">
document.addEventListener("DOMContentLoaded", function () {
if ( "function" !== typeof window.LazyLoad && "function" !== typeof LazyLoad ) {
return;
}
var breezeLazyLoad = window.LazyLoad || LazyLoad;
window.lazyLoadInstance = new breezeLazyLoad({
elements_selector: ".br-lazy",
data_src: "breeze",
data_srcset: "brsrcset",
data_sizes: "brsizes",
class_loaded: "br-loaded",
threshold: 300,
});
});
//# sourceURL=breeze-lazy-js-after
</script>
<script src='https://cloudtweaks.com/wp-content/plugins/breakdance/plugin/global-scripts/breakdance-utils.js?bd_ver=2.8.0-rc.1' defer></script>
<script>document.addEventListener('DOMContentLoaded', function(){ if (!window.BreakdanceFrontend) {
window.BreakdanceFrontend = {}
}
window.BreakdanceFrontend.data = {"homeUrl":"https:\/\/cloudtweaks.com","ajaxUrl":"https:\/\/cloudtweaks.com\/wp-admin\/admin-ajax.php","elementsPluginUrl":"https:\/\/cloudtweaks.com\/wp-content\/plugins\/breakdance\/subplugins\/breakdance-elements\/","BASE_BREAKPOINT_ID":"breakpoint_base","breakpoints":[{"id":"breakpoint_base","label":"Desktop","defaultPreviewWidth":"100%"},{"id":"breakpoint_tablet_landscape","label":"Tablet Landscape","defaultPreviewWidth":1024,"maxWidth":1119},{"id":"breakpoint_tablet_portrait","label":"Tablet Portrait","defaultPreviewWidth":768,"maxWidth":1023},{"id":"breakpoint_phone_landscape","label":"Phone Landscape","defaultPreviewWidth":480,"maxWidth":767},{"id":"breakpoint_phone_portrait","label":"Phone Portrait","defaultPreviewWidth":400,"maxWidth":479}],"subscriptionMode":"pro"} }) </script>
<script>document.addEventListener('DOMContentLoaded', function(){
/**
* CloudTweaks Navigation — v4.1
*
* Fixes from v3:
* - Supports any number of dropdowns (v3 grabbed only the first with
* querySelector, so adding a second menu would have silently failed).
* - aria-expanded now stays in sync with the mouse. In v3 the CSS opened
* the menu on :hover while aria-expanded stayed "false", so screen
* reader users were told the menu was closed while it was on screen.
* - Menu closes when focus tabs out of it, not just on outside click.
* - Implements the "/" shortcut. The <kbd>/</kbd> hint was in the search
* box markup but nothing ever listened for the key.
* - Escape from the toggle itself now closes and keeps focus.
* - Home/End jump to first/last item. ArrowDown wraps.
*
* REQUIRED CSS CHANGE: delete this line from ctw-nav.css so the hover
* state and the ARIA state can't disagree —
* #ctw-nav-override .ctw-dropdown:hover .ctw-dropdown-menu,
* Leave the :focus-within and [aria-expanded="true"] selectors in place.
*/
(function () {
"use strict";
function init() {
var nav = document.getElementById("ctw-nav-override");
if (!nav) return;
/* ------------------------------------------------------------
DROPDOWNS
------------------------------------------------------------ */
var dropdowns = nav.querySelectorAll(".ctw-dropdown");
Array.prototype.forEach.call(dropdowns, function (dropdown) {
var toggle = dropdown.querySelector(".ctw-dropdown-toggle");
var menu = dropdown.querySelector(".ctw-dropdown-menu");
if (!toggle || !menu) return;
var links = menu.querySelectorAll("a");
// Tracks whether the menu is open only because the pointer is over it,
// as opposed to being deliberately pinned open by a click or key.
var hoverOpen = false;
function setOpen(open) {
if (!open) hoverOpen = false;
toggle.setAttribute("aria-expanded", open ? "true" : "false");
}
function isOpen() {
return toggle.getAttribute("aria-expanded") === "true";
}
/* --- Pointer ---
A mouse user hovers the toggle (which opens the menu) and then
clicks it. Naively toggling here would read "already open" and
shut the menu on the very click meant to use it. So a click on a
hover-opened menu pins it instead. */
toggle.addEventListener("click", function (e) {
e.preventDefault();
e.stopPropagation();
if (hoverOpen) {
hoverOpen = false;
toggle.setAttribute("aria-expanded", "true");
return;
}
setOpen(!isOpen());
});
dropdown.addEventListener("mouseenter", function () {
if (!isOpen()) hoverOpen = true;
toggle.setAttribute("aria-expanded", "true");
});
dropdown.addEventListener("mouseleave", function () {
// Don't yank the menu away from a keyboard user who is inside it.
// Note this checks the MENU, not the whole dropdown: focus resting
// on the toggle after a click should not stop a hover-opened menu
// from closing when the pointer leaves.
if (menu.contains(document.activeElement)) return;
if (hoverOpen) setOpen(false);
});
/* --- Toggle keyboard --- */
toggle.addEventListener("keydown", function (e) {
if (e.key === "ArrowDown") {
e.preventDefault();
setOpen(true);
if (links.length) links[0].focus();
} else if (e.key === "ArrowUp") {
e.preventDefault();
setOpen(true);
if (links.length) links[links.length - 1].focus();
} else if (e.key === "Escape") {
setOpen(false);
}
});
/* --- Menu item keyboard --- */
Array.prototype.forEach.call(links, function (link, i) {
link.addEventListener("keydown", function (e) {
switch (e.key) {
case "ArrowDown":
e.preventDefault();
(links[i + 1] || links[0]).focus();
break;
case "ArrowUp":
e.preventDefault();
if (i === 0) toggle.focus();
else links[i - 1].focus();
break;
case "Home":
e.preventDefault();
links[0].focus();
break;
case "End":
e.preventDefault();
links[links.length - 1].focus();
break;
case "Escape":
e.preventDefault();
setOpen(false);
toggle.focus();
break;
}
});
});
/* --- Close when focus leaves the whole dropdown --- */
dropdown.addEventListener("focusout", function () {
window.setTimeout(function () {
if (!dropdown.contains(document.activeElement)) setOpen(false);
}, 0);
});
/* --- Close on outside click --- */
document.addEventListener("click", function (e) {
if (!dropdown.contains(e.target)) setOpen(false);
});
});
/* ------------------------------------------------------------
"/" FOCUSES SEARCH
------------------------------------------------------------ */
var search = document.getElementById("ctw-search-input");
if (search) {
document.addEventListener("keydown", function (e) {
if (e.key !== "/" || e.metaKey || e.ctrlKey || e.altKey) return;
var t = e.target;
var tag = t && t.tagName ? t.tagName.toLowerCase() : "";
if (
tag === "input" ||
tag === "textarea" ||
tag === "select" ||
(t && t.isContentEditable)
) {
return;
}
e.preventDefault();
search.focus();
search.select();
});
}
}
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", init);
} else {
init();
}
})();
}) </script>
<script>document.addEventListener('DOMContentLoaded', function(){
/**
* CloudTweaks — Article
* File: ctw-article-hero.js
* Handles: share popups, copy to clipboard
*
* The reading progress bar has been removed.
*/
(function () {
"use strict";
document.addEventListener("DOMContentLoaded", function () {
var hero = document.getElementById("ctw-article-hero");
if (!hero) return;
/* ── 1. SHARE POPUPS ─────────────────────────────────────── */
hero.querySelectorAll(".ctw-share__btn--linkedin, .ctw-share__btn--x")
.forEach(function (link) {
link.addEventListener("click", function (e) {
e.preventDefault();
var url = link.getAttribute("href");
if (!url) return;
var w = 620, h = 480;
var left = Math.round((window.screen.width - w) / 2);
var top = Math.round((window.screen.height - h) / 2);
window.open(url, "ctw-share",
"width=" + w + ",height=" + h +
",left=" + left + ",top=" + top +
",toolbar=0,menubar=0,location=0,status=0,scrollbars=1,resizable=1"
);
});
});
/* ── 2. COPY TO CLIPBOARD ────────────────────────────────── */
var copyBtn = hero.querySelector(".ctw-share__btn--copy");
if (copyBtn) {
copyBtn.addEventListener("click", function () {
var url = copyBtn.getAttribute("data-url") || window.location.href;
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(url)
.then(function () { showCopied(copyBtn); })
.catch(function () { fallbackCopy(url, copyBtn); });
} else {
fallbackCopy(url, copyBtn);
}
});
}
function fallbackCopy(text, btn) {
var el = document.createElement("textarea");
el.value = text;
el.setAttribute("readonly", "");
el.style.cssText = "position:fixed;top:-9999px;left:-9999px;opacity:0;";
document.body.appendChild(el);
el.focus(); el.select();
try { document.execCommand("copy"); showCopied(btn); } catch (e) {}
document.body.removeChild(el);
}
function showCopied(btn) {
btn.classList.add("is-copied");
btn.setAttribute("aria-label", "Link copied!");
setTimeout(function () {
btn.classList.remove("is-copied");
btn.setAttribute("aria-label", "Copy link to clipboard");
}, 2000);
}
});
}());
}) </script>
<script>document.addEventListener('DOMContentLoaded', function(){
}) </script>
<script>document.addEventListener('DOMContentLoaded', function(){
/* ============================================================
BREAKDANCE CODE BLOCK — pane 3 of 3: JavaScript
OPTIONAL. The module is complete without it. Leave this pane empty and
everything still works — the rows, the links, the initials for posts with
no featured image, all of it is server-rendered and arrives finished.
The one thing it fixes is the case PHP cannot see: a featured image that
IS set but whose file 404s or is blocked. WordPress reports a URL for it,
so the server has no way to know, and the reader gets a broken-image icon
inside a 48px circle. This swaps that for the guest's initials — the same
lettermark a post with no image gets — so the two failures look identical
instead of one of them looking broken.
NO <script> TAG. Breakdance wraps this pane for you; adding one emits a
literal <script> into the page body.
============================================================ */
( function () {
'use strict';
function lettermark( face ) {
var initials = face.getAttribute( 'data-ctiv-initials' ) || '';
var mark = document.createElement( 'span' );
mark.className = 'ctiv-mark';
mark.textContent = initials;
face.textContent = '';
face.appendChild( mark );
}
function check( img ) {
var face = img.parentNode;
if ( ! face || ! face.classList || ! face.classList.contains( 'ctiv-face' ) ) {
return;
}
// complete && naturalWidth === 0 is the only reliable read of "this
// already failed". An 'error' listener attached after the fact never
// fires, and images in a sidebar are frequently done loading before
// this runs.
if ( img.complete ) {
if ( 0 === img.naturalWidth ) {
lettermark( face );
}
return;
}
img.addEventListener( 'error', function () {
lettermark( face );
}, { once: true } );
}
function run() {
var imgs = document.querySelectorAll( '.ctiv-mod .ctiv-img' );
for ( var i = 0; i < imgs.length; i++ ) {
check( imgs[ i ] );
}
}
if ( 'loading' === document.readyState ) {
document.addEventListener( 'DOMContentLoaded', run, { once: true } );
} else {
run();
}
}() );
}) </script>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-88WKS3MX5Z"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-88WKS3MX5Z');
</script> </body>
</html>
<!-- Cache served by breeze CACHE - Last modified: Fri, 11 Sep 2026 03:15:27 GMT -->