PageSourceSearch

https://zop.dev/pricing

html zop.dev collected 2026-10-03 19:46:47 UTC 207,423 bytes, 1,228 lines download raw bytes

1<!DOCTYPE html><html lang="en" data-theme="dark"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"><meta name="theme-color" content="#F58549"><meta name="color-scheme" content="dark light"><meta name="referrer" content="strict-origin-when-cross-origin"><meta http-equiv="content-language" content="en"><meta name="format-detection" content="telephone=no"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><meta name="apple-mobile-web-app-title" content="zopdev"><meta name="application-name" content="zopdev"><meta name="msapplication-TileColor" content="#F58549"><!-- Pre-paint theme bootstrap — keep inline + synchronous to avoid flash.
2         Verbatim from website/index.html line 6. -->
2<script>(function(){try{var t=localStorage.getItem('zop-theme');if(t==='light'||t==='dark')document.documentElement.setAttribute('data-theme',t);}catch(e){}})();</script>
2<!-- Loader gate · pre-paint, sets `loader-skip` on <html> when the loader
3         should NOT play this load. Skips on:
4           (1) `zd-loader-shown-v2` cookie set (1-day fixed window from first
5               display — survives tab close, shared across tabs in the same
6               browser profile)
7           (2) automated browsers (Lighthouse / headless Chrome) — the brand
8               intro animation otherwise tanks LCP/FCP on every audit run.
9               Real users still see the loader on first visit.
10           (3) mobile viewports (≤768px) — on a cold, network-throttled mobile
11               load the full-screen overlay is the only thing painted for the
12               2720ms intro, so Chrome floors LCP at the loader-removal time
13               (≥2.72s) — confirmed by SpeedVitals (which can't be UA-detected).
14               Painting the hero at opacity:1 behind the overlay does NOT save
15               it under those real conditions. On phones the brand intro is
16               skipped via a SEPARATE `no-loader-mobile` class so the hero
17               paints immediately. It is intentionally NOT `loader-skip`, which
18               doubles as the "automated audit" signal that gates recurring
19               tickers (LiveOpsStrip / pricing) — those must keep running for
20               real mobile users. Desktop is unchanged (loader still plays).
21         Cookie is the sole cadence authority: reloads, pull-to-refresh, and
22         `location.reload()` are NOT force-skipped. A reload with an expired
23         cookie plays the loader and arms a fresh 24h window.
24         Cookie is written only on first display (`!seen && !isAutomated`) so
25         the 24h timer counts from first show and is NOT refreshed on later
26         visits — daily visitors see the intro at most once per day.
27         CSS rule `html.loader-skip .zop-loader{display:none !important}` hides
28         it instantly. -->
28<script>(function(){try{var seen=/(?:^|;\s*)zd-loader-shown-v2=1(?:;|$)/.test(document.cookie||'');var ua=(navigator.userAgent||'');var isAutomated=navigator.webdriver===true||/HeadlessChrome|Lighthouse|chrome-lighthouse|Googlebot|bingbot|PageSpeed|GTmetrix|Pingdom/i.test(ua);var isMobile=false;try{isMobile=!!(window.matchMedia&&window.matchMedia('(max-width: 768px)').matches);}catch(e){}if(seen||isAutomated){document.documentElement.classList.add('loader-skip');}if(isMobile){document.documentElement.classList.add('no-loader-mobile');}if(!seen&&!isAutomated){try{document.cookie='zd-loader-shown-v2=1; max-age=86400; path=/; SameSite=Lax';}catch(e){}}}catch(e){}})();</script>
28<style>html.zdu-gated{visibility:hidden}</style>
28<script>// University login gate — a classic (non-module) script, inlined into <head> by
29// UniversityBase via `?raw` so it runs before first paint. It can't import, so
30// loggedIn()/expired() duplicate hasSession()/isTokenExpired() in
31// university-client.mjs — that module is the source of truth; keep them in step
32// (a mismatch loops: the gate sends you to login, login sends you back).
33//
34// Public: the landing page, the certifications overview, certificate verify,
35// and login (+ its OAuth callbacks). Every other /resources/university page,
36// the glossary included, needs a session.
37//
38// This is a sign-up gate, NOT access control. It runs only in the browser and
39// checks a token's `exp` without verifying its signature, while the lesson HTML
40// and the Pagefind index stay static and public: JS off, a curl, or a hand-made
41// zdu_auth all read every page. Never rely on it to protect content; anything
42// that must be private needs a server-side check. Gated pages carry `noindex`
43// (UniversityLayout, plus the pages that pass it) so search engines skip them too.
44(function () {
45  var BASE = '/resources/university';
46
47  function expired(token) {
48    try {
49      var part = token.split('.')[1].replace(/-/g, '+').replace(/_/g, '/');
50      part += '='.repeat((4 - (part.length % 4)) % 4);
51      var exp = JSON.parse(atob(part)).exp;
52      return !exp || exp - 30 <= Math.floor(Date.now() / 1000);
53    } catch (e) { return true; }
54  }
55
56  function loggedIn() {
57    try {
58      var v = JSON.parse(localStorage.getItem('zdu_auth')) || {};
59      if (typeof v.access === 'string' && !expired(v.access)) return true;
60      return typeof v.refresh === 'string' && !expired(v.refresh);
61    } catch (e) { return false; }
62  }
63
64  function isGated(pathname) {
65    var p = pathname.replace(/\/+$/, '');
66    if (p.indexOf(BASE + '/') !== 0) return false;
67    // The certifications overview is public on its own; its tier pages aren't.
68    if (p === BASE + '/certifications') return false;
69    return ['/certifications/verify', '/login'].every(function (pub) {
70      return p !== BASE + pub && p.indexOf(BASE + pub + '/') !== 0;
71    });
72  }
73
74  function loginUrl(url) {
75    return BASE + '/login?next=' + encodeURIComponent(url.pathname + url.search + url.hash);
76  }
77
78  // Mirrors sanitizeNextPath() in university-client.mjs (open-redirect guard).
79  function safeNext(raw) {
80    var n = String(raw || '');
81    if (n.indexOf(BASE + '/') === 0 && n.indexOf('//') !== 0 && n.indexOf(BASE + '/login') !== 0) return n;
82    return BASE + '/account';
83  }
84
85  // A signed-in visitor sent to login (e.g. the hero's "Continue learning")
86  // goes straight on, before the sign-in form paints, by the same rule as a
87  // fresh login (afterLoginPath in university-profile.mjs): the account page,
88  // unless `next` is a certification exam. The post-OAuth profile step
89  // (?step=profile) is the one login view a session should see.
90  function afterLogin(next) {
91    return /^\/resources\/university\/certifications\/[^\/?#]+\/exam\/?$/.test(next) ? next : BASE + '/account';
92  }
93  function skipLogin(url) {
94    if (url.pathname.replace(/\/+$/, '') !== BASE + '/login' || !loggedIn()) return null;
95    var q = new URLSearchParams(url.search);
96    return q.get('step') === 'profile' ? null : afterLogin(safeNext(q.get('next')));
97  }
98
99  // Hide before redirecting so the gated page never paints. Only set on the
100  // way out, so a logged-in page (or a JS error before this) is never hidden.
101  function check() {
102    var to = skipLogin(location);
103    if (!to && (!isGated(location.pathname) || loggedIn())) return;
104    document.documentElement.classList.add('zdu-gated');
105    location.replace(to || loginUrl(location));
106  }
107
108  check();
109  // Back/forward restores from bfcache without re-running scripts.
110  addEventListener('pageshow', function (e) { if (e.persisted) check(); });
111  // ClientRouter soft-navs don't re-run this (same script text is deduped), so
112  // gate them before the swap. Back/forward has already moved the URL: replace.
113  document.addEventListener('astro:before-preparation', function (e) {
114    var to = skipLogin(e.to);
115    if (!to && (!isGated(e.to.pathname) || loggedIn())) return;
116    e.preventDefault();
117    location[e.navigationType === 'traverse' ? 'replace' : 'assign'](to || loginUrl(e.to));
118  });
119})();
120</script>
120<title>zopnight Pricing · Free under $2,000/mo · 5% of cloud spend above</title><meta name="description" content="zopnight pricing: free under $2,000/month cloud spend, 5% of cloud spend above, custom above $50,000. A percentage of your cloud bill — not per user, not per seat, not per account."><meta name="robots" content="index, follow"><link rel="canonical" href="https://zop.dev/pricing"><link rel="alternate" type="application/rss+xml" title="ZopDev Blog" href="https://zop.dev/resources/blogs/rss.xml"><link rel="alternate" type="text/markdown" title="Markdown source" href="https://zop.dev/pricing.md"><link rel="alternate" hreflang="x-default" href="https://zop.dev/pricing"><link rel="alternate" hreflang="en" href="https://zop.dev/pricing"><meta property="og:image" content="https://zop.dev/og/pricing.png"><meta property="og:type" content="website"><meta property="og:locale" content="en_US"><meta property="og:title" content="zopnight Pricing · Free under $2,000/mo · 5% of cloud spend above"><meta property="og:description" content="Free under $2,000/mo cloud spend. 5% above. Custom above $50,000. Not per seat, not per user, not per account."><meta property="og:url" content="https://zop.dev/pricing"><meta property="og:site_name" content="ZopDev"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:site" content="@zopdev"><meta name="twitter:title" content="zopnight Pricing · A percentage of your cloud spend"><meta name="twitter:description" content="Free under $2,000/mo. 5% of cloud spend above. Custom above $50,000. Transparent, outcome-based."><meta name="twitter:image" content="https://zop.dev/og/pricing.png"><meta name="twitter:url" content="https://zop.dev/pricing">
120<script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"Product","name":"zopnight","description":"zopnight by zopdev. Continuous discovery and remediation for cloud sprawl. Pricing is a percentage of your total cloud spend across all connected accounts.","image":"https://zop.dev/og/pricing.png","brand":{"@type":"Brand","type":"Brand","name":"zopdev"},"offers":[{"@type":"Offer","name":"Starter","description":"Free under $2,000/month cloud spend. Full platform, unlimited cloud accounts, 30-day activity history.","price":"0","priceCurrency":"USD","availability":"https://schema.org/InStock","url":"https://zop.dev/pricing#starter"},{"@type":"Offer","name":"Pro","description":"5% of total cloud spend for tenants above $2,000/month. Everything in Starter plus 6-month activity history.","priceCurrency":"USD","availability":"https://schema.org/InStock","url":"https://zop.dev/pricing#pro"},{"@type":"Offer","name":"Enterprise","description":"Custom pricing for tenants above $50,000/month cloud spend. Volume discounts, dedicated success, self-hosted options.","priceCurrency":"USD","availability":"https://schema.org/InStock","url":"https://zop.dev/pricing#enterprise"}]}]}</script>
120<link rel="dns-prefetch" href="https://www.googletagmanager.com">
120<script>(function(w,d,s,l,i){w[l]=w[l]||[];var EV=['pointerdown','keydown','touchstart','scroll','mousemove'],t;
121    function g(){if(w.__gtmLoaded)return;w.__gtmLoaded=1;clearTimeout(t);EV.forEach(function(e){w.removeEventListener(e,g)});
122    w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
123    j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
124    'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);}
125    function arm(){EV.forEach(function(e){w.addEventListener(e,g,{once:true,passive:true})});t=setTimeout(g,5000);}
126    d.readyState==='complete'?arm():w.addEventListener('load',arm,{once:true});
127    })(window,document,'script','dataLayer','GTM-MH6P3J34');</script>
127 <meta name="astro-view-transitions-enabled" content="true"><meta name="astro-view-transitions-fallback" content="swap">
127<script type="module" src="/_astro/ClientRouter.astro_astro_type_script_index_0_lang.BfWw3Bhu.js"></script>
127<meta name="zop-spa-scope" content="root">
127<script type="module" src="/_astro/PostHogAnalytics.astro_astro_type_script_index_0_lang.BM6QIxDr.js"></script>
127<script type="module" src="/_astro/WebEvents.astro_astro_type_script_index_0_lang.BpcGAQTv.js"></script>
127<link rel="icon" type="image/svg+xml" href="/favicon.svg"><link rel="manifest" href="/site.webmanifest"><!-- Google Fonts CDN — verbatim port from website/index.html line ~47-49.
128         Restored from self-hosted woff2 to recover pixel parity with the
129         reference (self-hosted subset had subtly different hinting/AA, which
130         showed up as widespread text-pixel diff at 1440 dark even when
131         layout was identical). The previous local @font-face declarations
132         in src/styles/marketing/tokens.css have been disabled (commented
133         out) so they don't shadow the CDN-loaded faces.
134         NOTE (caveat): this re-adds the cross-origin RTT we removed during
135         the Phase 1 close-the-loop — Lighthouse perf may regress slightly. --><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link rel="preconnect" href="https://storage.googleapis.com" crossorigin><link rel="preload" as="font" type="font/woff2" crossorigin href="https://fonts.gstatic.com/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7W0Q5nw.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="https://fonts.gstatic.com/s/spacegrotesk/v22/V8mDoQDjQSkFtoMM3T6r8E7mPbF4C_k3HqU.woff2"><!-- Defer Google Fonts CSS to remove it from the render-blocking
136         critical path. The preload tags above already warm the woff2
137         cache, so the deferred CSS resolves fonts from cache as soon as
138         the stylesheet parses. `display=swap` (in the URL) keeps the
139         FOUT brief; system-ui fallback bridges the < ~100ms window. --><link rel="preload" as="style" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Space+Grotesk:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap" onload="this.onload=null;this.rel='stylesheet'"><noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Space+Grotesk:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap"></noscript><link rel="stylesheet" href="/_astro/MarketingLayout.CC5YkZI6.css">
140<style>.pricing-tier__features[data-astro-cid-dd5txfcy] .pricing-tier__check[data-astro-cid-dd5txfcy]{background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14' fill='none' stroke='%237FB236' stroke-width='2' stroke-linecap='square'><path d='M2.5 7.5l3 3 6-7'/></svg>")}.pricing-tier__features[data-astro-cid-dd5txfcy][data-featured=true] .pricing-tier__check[data-astro-cid-dd5txfcy]{background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14' fill='none' stroke='%23F58549' stroke-width='2' stroke-linecap='square'><path d='M2.5 7.5l3 3 6-7'/></svg>")}
141.faq-list summary{display:flex;align-items:center;justify-content:space-between;gap:16px;cursor:pointer;list-style:none}.faq-list summary::-webkit-details-marker{display:none}.faq-list .faq-q{flex:1 1 auto;min-width:0}.faq-list .faq-chevron{flex:0 0 auto}.faq-list .faq-body{display:grid;grid-template-rows:0fr;overflow:hidden;transition:grid-template-rows .25s ease}.faq-list details[open]>.faq-body{grid-template-rows:1fr}.faq-list .faq-body>*{min-height:0}.faq-list .faq-body>p{margin:0}
142</style>
143<link rel="stylesheet" href="/_astro/pricing@[email protected]">
144<style>.esc-msg[data-astro-cid-qzbwtgpp].ok{color:var(--zop-green)}.esc-msg[data-astro-cid-qzbwtgpp].err{color:var(--err)}.esc-note[data-astro-cid-qzbwtgpp]{margin:12px 0 0;color:var(--ink-3);line-height:1.5}.esc-msg[data-astro-cid-qzbwtgpp]{margin:6px 0 0}
145</style>
145<script type="module" src="/_astro/page.hxieZTNw.js"></script>
145</head> <body>  <svg data-astro-transition-persist="svg-defs" width="0" height="0" style="position:absolute" aria-hidden="true"> <defs> <symbol id="mark-zopdev" viewBox="0 0 32 32"> <rect x="0" y="0" width="16" height="16" fill="var(--logo-blue, #2A4494)"></rect> <rect x="16" y="0" width="16" height="16" fill="var(--zop-orange, #F58549)"></rect> <rect x="16" y="16" width="16" height="16" fill="var(--zop-green, #7FB236)"></rect> </symbol> <symbol id="mark-zopnight" viewBox="0 0 32 32"> <rect x="0" y="0" width="32" height="32" fill="var(--logo-blue, #2A4494)"></rect> <circle cx="16" cy="16" r="8" fill="#FFFFFF"></circle> </symbol> <symbol id="mark-zopday" viewBox="0 0 32 32"> <rect x="0" y="0" width="32" height="32" fill="var(--zop-orange, #F58549)"></rect> <circle cx="16" cy="16" r="8" fill="#FFFFFF"></circle> </symbol> <symbol id="mark-zopcloud" viewBox="0 0 32 32"> <rect width="32" height="32" fill="var(--logo-green, #7FB236)"></rect> <rect x="12" y="8" width="8" height="6" fill="#FFFFFF"></rect> <rect x="6" y="14" width="20" height="10" fill="#FFFFFF"></rect> </symbol> <symbol id="logo-zopdev" viewBox="27 105 3817 1365">  <path d="M27.0005 1250V1145.7157L279.1443 861.7128H30.2863V754H427.4279V858.2843L171.8557 1142.2872H432.4279V1250Z M732.8571 1262Q658.2858 1262 598.2859 1229.1429Q538.2859 1196.2858 503.2146 1137.3572Q468.1432 1078.4286 468.1432 1001.9838Q468.1432 924.5714 503.286 866.1428Q538.4288 807.7142 598.9287 774.8571Q659.4286 742 733.1311 742Q807.8571 742 867.7856 774.8571Q927.7141 807.7142 962.7854 866.1428Q997.8568 924.5714 997.8568 1001.9838Q997.8568 1078.4286 962.714 1137.3572Q927.5712 1196.2858 867.5713 1229.1429Q807.5714 1262 732.8571 1262ZM732.7416 1149.7159Q769.0004 1149.7159 798.8578 1133.2157Q828.7153 1116.7155 846.4298 1083.8986Q864.1443 1051.0816 864.1443 1002.4093Q864.1443 952.9995 846.0727 920.142Q828.0011 887.2845 798.5722 870.7843Q769.1432 854.2841 733.5714 854.2841Q697.9996 854.2841 667.9998 870.9116Q638 887.539 619.9278 920.055Q601.8557 952.5709 601.8557 1002.0838Q601.8557 1050.8577 619.5702 1083.7866Q637.2847 1116.7155 667.2537 1133.2157Q697.2227 1149.7159 732.7416 1149.7159Z M1042.5721 1470V754H1172.5703V824.5719Q1196.5703 791.7146 1236.2133 766.8573Q1275.8564 742 1338.1423 742Q1407.9996 742 1462.9996 776Q1517.9996 810 1549.7853 869Q1581.571 928 1581.571 1003Q1581.571 1077.1429 1549.7853 1136.0714Q1517.9996 1195 1462.9996 1228.5Q1407.9996 1262 1337.9995 1262Q1281.8564 1262 1240.2133 1241.0713Q1198.5703 1220.1425 1172.5703 1182.5708V1470ZM1309.2859 1148.7159Q1350.2863 1148.7159 1382.1437 1129.7157Q1414.0011 1110.7155 1431.8584 1077.7866Q1449.7157 1044.8577 1449.7157 1002.8571Q1449.7157 959.9995 1431.8584 926.5705Q1414.0011 893.1416 1382.1437 874.2129Q1350.2863 855.2841 1309.2859 855.2841Q1268.4285 855.2841 1236.9282 874.2129Q1205.4279 893.1416 1187.5706 926.142Q1169.7133 959.1423 1169.7133 1002Q1169.7133 1044.8577 1187.5706 1077.7866Q1205.4279 1110.7155 1236.9282 1129.7157Q1268.4285 1148.7159 1309.2859 1148.7159Z M1848.7148 1262Q1778.8575 1262 1723.4289 1228Q1668.0004 1194 1636.2147 1134.5714Q1604.429 1075.1429 1604.429 1001Q1604.429 926 1636.2147 867.5Q1668.0004 809 1723.5004 775.5Q1779.0004 742 1848.8577 742Q1905.0007 742 1946.7152 762.9287Q1988.4297 783.8575 2013.4297 821.4292V530H2143.4279V1250H2013.4297V1179.4281Q1990.2869 1212.1425 1950.7152 1237.0713Q1911.1436 1262 1848.7148 1262ZM1876.7141 1148.7159Q1917.7144 1148.7159 1949.1432 1129.7157Q1980.5721 1110.7155 1998.4294 1077.358Q2016.2867 1044.0005 2016.2867 1002Q2016.2867 959.1423 1998.4294 926.142Q1980.5721 893.1416 1949.1432 874.2129Q1917.7144 855.2841 1876.7141 855.2841Q1836.7137 855.2841 1804.7849 874.2129Q1772.856 893.1416 1754.9987 925.7134Q1737.1414 958.2852 1737.1414 1001.1429Q1737.1414 1044.0005 1754.9987 1077.358Q1772.856 1110.7155 1804.7849 1129.7157Q1836.7137 1148.7159 1876.7141 1148.7159Z M2446.1427 1262Q2370.1429 1262 2311.8573 1229.5Q2253.5717 1197 2220.8575 1139.3571Q2188.1432 1081.7142 2188.1432 1006.1427Q2188.1432 928.8569 2220.3575 869.1427Q2252.5717 809.4285 2311.0002 775.7142Q2369.4286 742 2446.4285 742Q2520.1427 742 2576.2854 774.0714Q2632.4281 806.1429 2663.7137 861.1428Q2694.9993 916.1427 2694.9993 985.571Q2694.9993 995.5
14571 2694.9993 1007.8567Q2694.9993 1020.1423 2693.1422 1033.2852H2281.5706V952.7144H2563.5726Q2560.5726 904.5708 2527.8579 875.999Q2495.1432 847.4272 2446.8569 847.4272Q2411.2852 847.4272 2381.2849 863.1416Q2351.2847 878.856 2333.713 910.4991Q2316.1414 942.1422 2316.1414 990.571V1019.2852Q2316.1414 1061.4288 2332.9988 1092.215Q2349.8562 1123.0011 2379.0708 1139.3584Q2408.2854 1155.7157 2445.2856 1155.7157Q2483.2861 1155.7157 2509.2865 1138.7154Q2535.2869 1121.7151 2548.7155 1093.7146H2680.9993Q2667.285 1141.2859 2634.428 1179.4287Q2601.571 1217.5715 2553.714 1239.7858Q2505.8569 1262 2446.1427 1262Z M2899.5726 1250 2717.2867 754H2853.7133L2979 1127.1445L3103.4296 754H3238.8562L3056.5703 1250Z" fill="currentColor"></path> <rect x="2994" y="105" width="425" height="425" fill="var(--logo-blue, #2A4494)"></rect> <rect x="3419" y="105" width="425" height="425" fill="var(--zop-orange, #F58549)"></rect> <rect x="3419" y="530" width="425" height="425" fill="var(--zop-green, #7FB236)"></rect> </symbol> </defs> </svg>  <!-- ============================================================
146     TETRIS LOADER · brand intro · runs at most once per 24h (cookie
147     `zd-loader-shown-v2` gate in MarketingLayout head). Tailwind utilities for responsive
148     sizing/layout; @keyframes + state-rules in <style is:global> below.
149     `inert` on the active loader blocks keyboard tab + AT from reaching
150     elements behind the overlay during the 2s intro.
151     ============================================================ --><div id="zop-loader" data-astro-transition-persist="zop-loader" class="zop-loader fixed inset-0 z-[9999] flex items-center justify-center px-6 sm:px-8 lg:px-0" aria-hidden="true" inert> <div class="zop-loader-stage flex flex-col items-center gap-3 sm:gap-4 lg:gap-5 xl:gap-6 text-[var(--ink)]"> <svg class="zop-logo-anim block h-12 w-auto sm:h-[60px] lg:h-[72px] xl:h-[84px] text-[var(--ink)]" viewBox="0 0 715 276" aria-label="zopdev" role="img"> <use href="#logo-zopdev"></use> </svg> <div class="zop-tagline mt-1 font-mono text-[10px] tracking-[0.14em] uppercase text-[var(--g-500)] opacity-0 sm:text-xs sm:tracking-[0.18em]">Continuous CloudOps</div> <!-- Compact loader beat under the tagline · second mirror of the
152         JS-driven progress fill via shared sibling state. --> <div class="zop-progress-track zop-progress-track--stage relative mt-3 h-2 w-44 overflow-hidden sm:mt-4 sm:w-52 lg:mt-5 lg:w-60 xl:w-72"><div class="zop-progress-fill block h-full w-0" id="zop-progress-stage"></div></div> </div> <!-- Viewport-bottom line bar · syncs with stage track via shared JS. --> <div class="zop-progress-track zop-progress-track--bottom absolute inset-x-0 bottom-0 h-0.5 overflow-hidden lg:h-[3px]"><div class="zop-progress-fill block h-full w-0" id="zop-progress"></div></div> </div> <!-- ============================================================
153     LOADER · cookie-gated. The head-level `zd-loader-shown-v2`
154     cookie gate lives in MarketingLayout.astro <head> so it runs
155     before paint. This component only renders the loader markup
156     + CSS + the post-paint animation IIFE.
157     Cookie has max-age=86400 (1 day) — the loader returns once
158     per 24h per browser profile.
159     ============================================================ --> 
159<script>
160(function(){
161  var l = document.getElementById('zop-loader');
162  if(!l) return;
163  /* Loader is `transition:persist`. On every SPA swap this script
164     re-executes; the persisted element keeps its `.done` class. We bail
165     the 2720ms intro replay but FIRST register a one-shot astro:page-load
166     handler so each new page's .hero-reveal / .hero / .globe-panel still
167     gets the entrance handoff (.go / .vis classes). Without this, hero
168     animations are stuck at opacity:0 on every nav after first load. */
169  if(l.classList.contains('done')){
170    if(!window.__zopHeroFlowInit){
171      window.__zopHeroFlowInit = true;
172      var refire = function(){
173        var h = document.querySelector('.hero-reveal'); if(h){ h.classList.add('go'); var hv=h.closest('.hero-v2'); if(hv) hv.classList.add('is-revealed'); }
174        var hs = document.querySelector('.hero');        if(hs) hs.classList.add('go');
175        var gp = document.querySelector('.globe-panel'); if(gp) gp.classList.add('vis');
176      };
177      refire();
178      document.addEventListener('astro:page-load', refire);
179    }
180    return;
181  }
182
183  var startTs = Date.now();
184  var heroFired = false;
185  var globeFired = false;
186
187  /* whenReady waits for DOMContentLoaded then fonts.ready, but races
188     fonts.ready against a 1500ms timeout so a slow/hanging font CDN
189     (rare iOS in-app webviews, jailed environments) can't block the
190     hero-reveal handoff forever. */
191  function whenReady(fn){
192    function done(){
193      if (document.fonts && document.fonts.ready) {
194        var bailout = new Promise(function(r){ setTimeout(r, 1500); });
195        Promise.race([document.fonts.ready, bailout]).then(fn, fn);
196      } else { fn(); }
197    }
198    if (document.readyState === 'loading') {
199      document.addEventListener('DOMContentLoaded', done, { once: true });
200    } else {
201      done();
202    }
203  }
204
205  function fireHero(){
206    if (heroFired) return;
207    heroFired = true;
208    var h = document.querySelector('.hero-reveal');
209    if(h){ h.classList.add('go'); var hv=h.closest('.hero-v2'); if(hv) hv.classList.add('is-revealed'); }
210    var heroSec = document.querySelector('.hero');
211    if(heroSec) heroSec.classList.add('go');
212  }
213  function fireGlobe(){
214    if (globeFired) return;
215    globeFired = true;
216    var gp = document.querySelector('.globe-panel');
217    if(gp) gp.classList.add('vis');
218  }
219  function finish(){
220    l.classList.add('done');
221    l.setAttribute('aria-hidden','true');
222    /* Strip `inert` so the loader's previous focus-blocking is released
223       once the overlay is gone (the underlying page becomes interactive). */
224    l.removeAttribute('inert');
225  }
226
227  /* ── bfcache restore ─────────────────────────────────────────────
228     Head pre-paint script does NOT re-run on bfcache; if the page is
229     restored mid-loader the overlay would still be visible. Force the
230     skip path on persisted pageshow events. */
231  window.addEventListener('pageshow', function(e){
232    if (e.persisted) {
233      document.documentElement.classList.add('loader-skip');
234      finish();
235      fireHero();
236      fireGlobe();
237    }
238  });
239
240  /* ── Skip path · `loader-skip` set by head script (`zd-loader-shown-v2`
241     cookie present, automation UA, iframe); `no-loader-mobile` set on
242     ≤768px viewports ──────────────────────────────────────────────────
243     CSS rules `html.loader-skip .zop-loader{display:none}` /
244     `html.no-loader-mobile .zop-loader{display:none}` already hide the
245     chassis. Fire post-loader handoffs immediately so the hero still
246     animates in cleanly. */
247  if(document.documentElement.classList.contains('loader-skip') ||
248     document.documentElement.classList.contains('no-loader-mobile')){
249    finish();
250    whenReady(function(){
251      fireHero();
252      /* Globe still waits ~2400ms after `.go` so it doesn't race the
253         headline reveal cascade. */
254      setTimeout(fireGlobe, 2400);
255    });
256    return;
257  }
258
259  if(window.matchMedia('(prefers-reduced-motion: reduce)').matches){
260    finish();
261    whenReady(function(){
262      fireHero();
263      fireGlobe();
264    });
265    return;
266  }
267
268  var prog = document.getElementById('zop-progress');
269  var progStage = document.getElementById('zop-progress-stage');
270  function setProg(w, color){
271    if(prog){
272      prog.style.width = w;
273      if(color) prog.style.background = color;
274    }
275    if(progStage){
276      progStage.style.width = w;
277    }
278  }
279
280  /* 2720ms timeline · capsules fill green at 800ms, hold for a ~1200ms
281     dwell so the user reads the "loaded" beat, then the CSS keyframe
282     slides the overlay up over a slow / calm 720ms starting at 2000ms.
283     JS finalises hero handoff at 2720ms — exactly when the slide
284     completes — so the overlay's `display:none` lands cleanly. */
285  setTimeout(function(){ setProg('40%'); }, 150);
286  setTimeout(function(){
287    l.classList.add('filled');
288    setProg('70%', 'var(--zop-orange)');
289  }, 600);
290  setTimeout(function(){
291    l.classList.add('is-reveal');
292    setProg('100%', 'var(--zop-green)');
293  }, 800);
294  setTimeout(function(){
295    finish();
296    fireHero();
297  }, 2720);
298  /* Globe fades in ~2400ms after the hero headline reveal kicks off.
299     hero.go fires at 2720ms → globe at 2720 + 2400 = 5120ms */
300  setTimeout(fireGlobe, 5120);
301
302  /* ── Tab-throttling recovery ─────────────────────────────────────
303     Background tabs throttle setTimeout to ~1Hz. The CSS keyframe
304     `zop-loader-out` is real-time and hides the overlay on schedule,
305     but the JS hero/globe handoff may not have fired. On visibility
306     return, fast-forward anything overdue. */
307  document.addEventListener('visibilitychange', function(){
308    if (document.visibilityState !== 'visible') return;
309    var elapsed = Date.now() - startTs;
310    if (elapsed >= 2720) { finish(); fireHero(); }
311    if (elapsed >= 5120) { fireGlobe(); }
312  });
313})();
314</script>
314 <!-- ============================================================
315     Loader styles · inline in website/index.html (NOT in
316     homepage-chrome.css), so they are mirrored verbatim here to
317     keep the component self-contained. `is:global` because the
318     selectors target ids/classes used by the markup above and by
319     consumers outside this component.
320     ============================================================ --> <a class="skip-to-main" href="#main-content">Skip to main content</a>    <nav class="nav" data-astro-transition-persist="nav"> <div class="nav-inner px-3 py-2 sm:px-4 sm:py-3 md:px-6 md:py-3 lg:px-8 lg:py-4 gap-2 sm:gap-3 md:gap-4 lg:gap-6"> <a href="/" class="logo-lockup sm min-h-11 inline-flex items-center max-w-[120px] sm:max-w-[140px] md:max-w-[160px] lg:max-w-none shrink-0" aria-label="zopdev"> <svg viewBox="0 0 715 276" class="max-w-full h-auto"><use href="#logo-zopdev"></use></svg> </a> <div class="nav-links lg:gap-4 xl:gap-6 2xl:gap-8 text-sm xl:text-base" id="nav-links"> <div class="nav-item" data-menu="product"> <a href="#">Product <span class="nav-caret" aria-hidden="true"></span></a> </div> <div class="nav-item" data-menu="solutions"> <a href="#">Solutions <span class="nav-caret" aria-hidden="true"></span></a> </div> <div class="nav-item" data-menu="opensource"> <a href="#">Open Source <span class="nav-caret" aria-hidden="true"></span></a> </div> <div class="nav-item" data-menu="resources"> <a href="#">Resources <span class="nav-caret" aria-hidden="true"></span></a> </div> <a href="/pricing">Pricing</a> <div class="nav-item" data-menu="company"> <a href="#">Company <span class="nav-caret" aria-hidden="true"></span></a> </div>   </div> <!-- Shared dropdown overlay. Content crossfades, panel slides left/right --> <div class="nav-overlay" id="nav-overlay" aria-hidden="true"> <div class="nav-panes" id="nav-panes"> <!-- ═══════ PRODUCT · 2 hero bentos + ZopCloud strip ═══════ --> <div class="nav-pane" data-pane="product"> <div class="np-bento np-bento--products-v2"> <!-- ZopNight · large hero with sidebar/topbar/stat dashboard peek
321                 sliding up on hover. Brand-blue accents. --> <a class="np-prod-card np-prod-card--night" data-product="zopnight" href="/zopnight"> <span class="np-prod-badge live">live</span> <div class="np-prod-head"> <div class="np-prod-title"><svg class="h-[22px] w-auto block" viewBox="-1125 530 4943.43 952" role="img" aria-label="zopnight" focusable="false"> <rect x="-1125" y="530" width="952" height="952" fill="var(--logo-blue, #2A4494)"></rect> <circle cx="-649" cy="1006" r="238" fill="#FFFFFF"></circle> <path d="M27.0005 1250V1145.7157L279.1443 861.7128H30.2863V754H427.4279V858.2843L171.8557 1142.2872H432.4279V1250Z M732.8571 1262Q658.2858 1262 598.2859 1229.1429Q538.2859 1196.2858 503.2146 1137.3572Q468.1432 1078.4286 468.1432 1001.9838Q468.1432 924.5714 503.286 866.1428Q538.4288 807.7142 598.9287 774.8571Q659.4286 742 733.1311 742Q807.8571 742 867.7856 774.8571Q927.7141 807.7142 962.7854 866.1428Q997.8568 924.5714 997.8568 1001.9838Q997.8568 1078.4286 962.714 1137.3572Q927.5712 1196.2858 867.5713 1229.1429Q807.5714 1262 732.8571 1262ZM732.7416 1149.7159Q769.0004 1149.7159 798.8578 1133.2157Q828.7153 1116.7155 846.4298 1083.8986Q864.1443 1051.0816 864.1443 1002.4093Q864.1443 952.9995 846.0727 920.142Q828.0011 887.2845 798.5722 870.7843Q769.1432 854.2841 733.5714 854.2841Q697.9996 854.2841 667.9998 870.9116Q638 887.539 619.9278 920.055Q601.8557 952.5709 601.8557 1002.0838Q601.8557 1050.8577 619.5702 1083.7866Q637.2847 1116.7155 667.2537 1133.2157Q697.2227 1149.7159 732.7416 1149.7159Z M1042.5721 1470V754H1172.5703V824.5719Q1196.5703 791.7146 1236.2133 766.8573Q1275.8564 742 1338.1423 742Q1407.9996 742 1462.9996 776Q1517.9996 810 1549.7853 869Q1581.571 928 1581.571 1003Q1581.571 1077.1429 1549.7853 1136.0714Q1517.9996 1195 1462.9996 1228.5Q1407.9996 1262 1337.9995 1262Q1281.8564 1262 1240.2133 1241.0713Q1198.5703 1220.1425 1172.5703 1182.5708V1470ZM1309.2859 1148.7159Q1350.2863 1148.7159 1382.1437 1129.7157Q1414.0011 1110.7155 1431.8584 1077.7866Q1449.7157 1044.8577 1449.7157 1002.8571Q1449.7157 959.9995 1431.8584 926.5705Q1414.0011 893.1416 1382.1437 874.2129Q1350.2863 855.2841 1309.2859 855.2841Q1268.4285 855.2841 1236.9282 874.2129Q1205.4279 893.1416 1187.5706 926.142Q1169.7133 959.1423 1169.7133 1002Q1169.7133 1044.8577 1187.5706 1077.7866Q1205.4279 1110.7155 1236.9282 1129.7157Q1268.4285 1148.7159 1309.2859 1148.7159Z M1623.7151 1250V754H1753.7133V828.8575Q1777.8562 788.85
32173 1819.8563 765.4286Q1861.8564 742 1917.7135 742Q2010.5704 742 2060.9991 800.4284Q2111.4277 858.8568 2111.4277 970.7139V1250H1981.4296V982.9995Q1981.4296 918.9989 1955.5007 885.4273Q1929.5719 851.8557 1874.8573 851.8557Q1822.2854 851.8557 1787.9994 889.2846Q1753.7133 926.7135 1753.7133 993.8571V1250Z M2173.1438 1250V754H2303.142V1250ZM2176.0004 671.8566V545.7144H2301.7139V671.8566Z M2636.8568 1482Q2573.4281 1482 2515.7854 1461.1428Q2458.1427 1440.2856 2418.0714 1395.7857Q2378.0002 1351.2858 2369.5715 1281.429H2498.5697Q2507.8557 1321.858 2545.2846 1345.7155Q2582.7135 1369.573 2634.2854 1369.573Q2671.7144 1369.573 2703.3576 1353.9299Q2735.0007 1338.2869 2753.858 1306.5722Q2772.7153 1274.8575 2772.7153 1226.1427V1163.9995Q2757.5724 1187.8568 2733.9295 1207.9284Q2710.2865 1228 2677.7149 1240.2859Q2645.1432 1252.5717 2602.7144 1252.5717Q2532.0002 1252.5717 2475.4287 1219.0003Q2418.8573 1185.4288 2386.2144 1127.2859Q2353.5715 1069.1431 2353.5715 996.7144Q2353.5715 924.2858 2386.2144 866.6429Q2418.8573 809 2475.4287 775.5Q2532.0002 742 2602.8573 742Q2659.8577 742 2703.7151 765.3574Q2747.5724 788.7148 2772.7153 823.2865V754H2902.7135V1219.2858Q2902.7135 1305.2856 2866.4279 1363.7856Q2830.1423 1422.2856 2769.7139 1452.1428Q2709.2854 1482 2636.8568 1482ZM2628.8568 1140.1447Q2671.5714 1140.1447 2703.3574 1121.1445Q2735.1434 1102.1443 2753.2151 1069.9297Q2771.2867 1037.715 2771.2867 997.5715Q2771.2867 956.4281 2753.2151 924.3563Q2735.1434 892.2845 2703.3574 873.7843Q2671.5714 855.2841 2628.8568 855.2841Q2586.9993 855.2841 2554.7847 873.7843Q2522.5701 892.2845 2504.4984 923.9277Q2486.4268 955.571 2486.4268 996.7144Q2486.4268 1036.8578 2504.4984 1069.5011Q2522.5701 1102.1443 2554.7847 1121.1445Q2586.9993 1140.1447 2628.8568 1140.1447Z M2964.1436 1250V530H3094.1418V829.1432Q3118.4276 789.0002 3161.4991 765.5001Q3204.5706 742 3259.4277 742Q3351.1418 742 3401.499 800.4284Q3451.8562 858.8568 3451.8562 970.7139V1250H3322.858V982.9995Q3322.858 918.9989 3297.5721 885.4273Q3272.2861 851.8557 3217.5715 851.8557Q3164.1425 851.8557 3129.1422 889.2846Q3094.1418 926.7135 3094.1418 993.8571V1250Z M3715.8564 1250Q3665.8568 1250 3631.6427 1238.2858Q3597.4286 1226.5715 3580.0716 1193.2146Q3562.7146 1159.8577 3562.7146 1097.1438V862.8557H3477.5717V754H3562.7146V621.0005H3692.7128V754H3818.4277V862.8557H3692.7128V1080.7153Q3692.7128 1105.5728 3697.7842 1118.1443Q3702.8557 1130.7159 3716.7843 1135.073Q3730.713 1139.4301 3755.2847 1139.4301H3814.5704V1250Z" fill="currentColor"></path> </svg></div> </div> <p class="np-prod-desc">Autonomous cloud governance + FinOps. AWS, Azure, GCP.</p> <span class="np-prod-cta">Explore <span class="brand-lc">zopnight</span> <span class="np-prod-arrow" aria-hidden="true">→</span></span> <!-- Dashboard peek · mini-mock of the ZopNight savings
322                   console (sidebar + monthly-savings hero number + stat
323                   tiles + breakdown chart). Hidden by translateY(70%);
324                   rises on hover so the user glimpses the real dashboard. --> <span class="np-prod-peek np-prod-peek--night" aria-hidden="true"> <span class="np-peek-side"> <span class="np-peek-brand"> <span class="np-peek-brand-mark"></span> <span class="np-peek-brand-name">zop<b>night</b></span> </span> <span class="np-peek-sec">Cloud Estate</span> <span class="np-peek-nav">Dashboard</span> <span class="np-peek-nav">Inventory</span> <span class="np-peek-sec">Optimization</span> <span class="np-peek-nav np-peek-nav--on">Recommendations</span> <span class="np-peek-nav">Schedules</span> <span class="np-peek-nav">Auto-Remediate</span> </span> <span class="np-peek-main"> <span class="np-peek-top"> <span class="np-peek-top-title">Monthly Savings</span> <span class="np-peek-pill">live</span> </span> <span class="np-peek-hero"> <span class="np-peek-hero-num">$42,180</span> <span class="np-peek-hero-delta">▲ 12.4%</span> </span> <span class="np-peek-stats"> <span class="np-peek-stat"><span class="np-peek-stat-k">Idle</span><span class="np-peek-stat-v">218</span></span> <span class="np-peek-stat"><span class="np-peek-stat-k">Scheduled</span><span class="np-peek-stat-v">73%</span></span> <span class="np-peek-stat"><span class="np-peek-stat-k">Verified</span><span class="np-peek-stat-v">$31k</span></span> </span> <span class="np-peek-chart"></span> </span> </span> </a> <!-- ZopDay · large hero with the Deployment Spaces console
325                 peek (sidebar + page-head + filter row + provider table).
326                 Brand-orange accents. --> <a class="np-prod-card np-prod-card--day" data-product="zopday" href="/zopday"> <span class="np-prod-badge live">live</span> <div class="np-prod-head"> <div class="np-prod-title">
326<svg class="h-[22px] w-auto block" viewBox="-1125 530 4407.43 952" role="img" aria-label="zopday" focusable="false"> <rect x="-1125" y="530" width="952" height="952" fill="var(--zop-orange, #F58549)"></rect> <circle cx="-649" cy="1006" r="238" fill="#FFFFFF"></circle> <path d="M27.0005 1250V1145.7157L279.1443 861.7128H30.2863V754H427.4279V858.2843L171.8557 1142.2872H432.4279V1250Z M732.8571 1262Q658.2858 1262 598.2859 1229.1429Q538.2859 1196.2858 503.2146 1137.3572Q468.1432 1078.4286 468.1432 1001.9838Q468.1432 924.5714 503.286 866.1428Q538.4288 807.7142 598.9287 774.8571Q659.4286 742 733.1311 742Q807.8571 742 867.7856 774.8571Q927.7141 807.7142 962.7854 866.1428Q997.8568 924.5714 997.8568 1001.9838Q997.8568 1078.4286 962.714 1137.3572Q927.5712 1196.2858 867.5713 1229.1429Q807.5714 1262 732.8571 1262ZM732.7416 1149.7159Q769.0004 1149.7159 798.8578 1133.2157Q828.7153 1116.7155 846.4298 1083.8986Q864.1443 1051.0816 864.1443 1002.4093Q864.1443 952.9995 846.0727 920.142Q828.0011 887.2845 798.5722 870.7843Q769.1432 854.2841 733.5714 854.2841Q697.9996 854.2841 667.9998 870.9116Q638 887.539 619.9278 920.055Q601.8557 952.5709 601.8557 1002.0838Q601.8557 1050.8577 619.5702 1083.7866Q637.2847 1116.7155 667.2537 1133.2157Q697.2227 1149.7159 732.7416 1149.7159Z M1042.5721 1470V754H1172.5703V824.5719Q1196.5703 791.7146 1236.2133 766.8573Q1275.8564 742 1338.1423 742Q1407.9996 742 1462.9996 776Q1517.9996 810 1549.7853 869Q1581.571 928 1581.571 1003Q1581.571 1077.1429 1549.7853 1136.0714Q1517.9996 1195 1462.9996 1228.5Q1407.9996 1262 1337.9995 1262Q1281.8564 1262 1240.2133 1241.0713Q1198.5703 1220.1425 1172.5703 1182.5708V1470ZM1309.2859 1148.7159Q1350.2863 1148.7159 1382.1437 1129.7157Q1414.0011 1110.7155 1431.8584 1077.7866Q1449.7157 1044.8577 1449.7157 1002.8571Q1449.7157 959.9995 1431.8584 926.5705Q1414.0011 893.1416 1382.1437 874.2129Q1350.2863 855.2841 1309.2859 855.2841Q1268.4285 855.2841 1236.9282 874.2129Q1205.4279 893.1416 1187.5706 926.142Q1169.7133 959.1423 1169.7133 1002Q1169.7133 1044.8577 1187.5706 1077.7866Q1205.4279 1110.7155 1236.9282 1129.7157Q1268.4285 1148.7159 1309.2859 1148.7159Z M1848.7148 1262Q1778.8575 1262 1723.4289 1228Q1668.0004 1194 1636.2147 1134.5714Q1604.429 1075.1429 1604.429 1001Q1604.429 926 1636.2147 867.5Q1668.0004 809 1723.5004 775.5Q1779.0004 742 1848.8577 742Q1905.0007 742 1946.7152 762.9287Q1988.4297 783.8575 2013.4297 821.4292V530H2143.4279V1250H2013.4297V1179.4281Q1990.2869 1212.1425 1950.7152 1237.0713Q1911.1436 1262 1848.7148 1262ZM1876.7141 1148.7159Q1917.7144 1148.7159 1949.1432 1129.7157Q1980.5721 1110.7155 1998.4294 1077.358Q2016.2867 1044.0005 2016.2867 1002Q2016.2867 959.1423 1998.4294 926.142Q1980.5721 893.1416 1949.1432 874.2129Q1917.7144 855.2841 1876.7141 855.2841Q1836.7137 855.2841 1804.7849 874.2129Q1772.856 893.1416 1754.9987 925.7134Q1737.1414 958.2852 1737.1414 1001.1429Q1737.1414 1044.0005 1754.9987 1077.358Q1772.856 1110.7155 1804.7849 1129.7157Q1836.7137 1148.7159 1876.7141 1148.7159Z M2375.7146 1262Q2319.7144 1262 2279.5715 1241.8571Q2239.4286 1221.7142 2218.143 1187.6428Q2196.8573 1153.5714 2196.8573 1113Q2196.8573 1035.2856 2252.9288 992.7141Q2309.0004 950.1427 2400.0005 950.1427Q2442.7148 950.1427 2474.0006 956.2141Q2505.2865 962.2856 2524.858 968.5714V945Q2524.858 892.9995 2495.3578 868.9276Q2465.8577 844.8558 2419.4286 844.8558Q2386.2852 844.8558 2360.3563 858.2132Q2334.4274 871.5706 2327.1416 906.2854H2204.4288Q2210.4288 853.1425 2240.1432 816.5712Q2269.8575 779.9998 2316.6432 760.9999Q2363.4288 742 2419.4286 742Q2530.1427 742 2592.4995 795.0715Q2654.8562 848.1431 2654.8562 945V1057.1445Q2654.8562 1094.8588 2659.3562 1113.0016Q2663.8562 1131.1443 2674.0705 1135.93Q2684.2849 1140.7157 2700.8564 1140.7157H2705.4279V1250H2676.7141Q2623.8571 1250 2588.7859 1235.9999Q2553.7146 1221.9998 2538.0005 1181.1423Q2512.5721 1216.1425 2471.6435 1239.0713Q2430.715 1262 2375.7146 1262ZM2404.9996 1162.5726Q2437.0002 1162.5726 2459.7149 1148.1437Q2482.4296 1133.7148 2497.2154 1108.5714Q2512.0013 1083.4281 2518.0011 1052.9991Q2497.4296 1046.8562 2469.6436 1041.2848Q2441.8577 1035.7133 2413.571
3267 1035.7133Q2375.2847 1035.7133 2351.5701 1053.428Q2327.8555 1071.1427 2327.8555 1102.4288Q2327.8555 1128.5721 2348.5701 1145.5724Q2369.2847 1162.5726 2404.9996 1162.5726Z M2731.5721 1470V1367.1442H2838.1432Q2853.0004 1367.1442 2862.8575 1363.4298Q2872.7146 1359.7155 2881.786 1348.0011Q2890.8575 1336.2867 2901.429 1311.0007L2943.8582 1217.5708L2937.4296 1274.9989L2721.1438 754H2862.2847L3000 1100.573L3143.5726 754H3282.4277L3018.1418 1355.7141Q3001.7131 1392.5714 2989.5703 1415.3571Q2977.4274 1438.1429 2965.1417 1449.7143Q2952.856 1461.2858 2936.2847 1465.6429Q2919.7133 1470 2894.4277 1470Z" fill="currentColor"></path> </svg></div> </div> <p class="np-prod-desc">Internal Developer Platform across AWS, GCP, Azure.</p> <span class="np-prod-cta">Explore <span class="brand-lc">zopday</span> <span class="np-prod-arrow" aria-hidden="true">→</span></span> <span class="np-prod-peek np-prod-peek--day" aria-hidden="true"> <span class="np-peek-side"> <span class="np-peek-brand"> <span class="np-peek-brand-mark"></span> <span class="np-peek-brand-name">zop<b>day</b></span> </span> <span class="np-peek-sec">Infrastructure</span> <span class="np-peek-nav">Provision</span> <span class="np-peek-nav">Datastore</span> <span class="np-peek-nav">Cluster</span> <span class="np-peek-sec">Deployment</span> <span class="np-peek-nav np-peek-nav--on">Spaces</span> <span class="np-peek-nav">Projects</span> </span> <span class="np-peek-main"> <span class="np-peek-top"> <span class="np-peek-top-title">Deployment Spaces</span> <span class="np-peek-pill">5 healthy</span> </span> <span class="np-peek-filters"> <span class="np-peek-chip np-peek-chip--on">All</span> <span class="np-peek-chip">Healthy</span> <span class="np-peek-chip">Issues</span> <span class="np-peek-chip">Pending</span> </span> <span class="np-peek-rows"> <span class="np-peek-row"><span class="np-peek-prov np-peek-prov--gcp">G</span><span class="np-peek-row-name">us-prod</span><span class="np-peek-row-dot"></span><span class="np-peek-row-tag">GCP</span></span> <span class="np-peek-row"><span class="np-peek-prov np-peek-prov--aws">aws</span><span class="np-peek-row-name">eu-prod</span><span class="np-peek-row-dot"></span><span class="np-peek-row-tag">AWS</span></span> <span class="np-peek-row"><span class="np-peek-prov np-peek-prov--aws">aws</span><span class="np-peek-row-name">eu-staging</span><span class="np-peek-row-dot"></span><span class="np-peek-row-tag">AWS</span></span> <span class="np-peek-row"><span class="np-peek-prov np-peek-prov--az">A</span><span class="np-peek-row-name">apac-prod</span><span class="np-peek-row-dot"></span><span class="np-peek-row-tag">AZ</span></span> </span> </span> </span> </a> <!-- ZopCloud · spans full width below as the product strip --> <a class="np-prod-strip" href="/zopcloud"> <span class="np-prod-strip-body"> <div class="np-prod-strip-title"><svg class="h-[20px] w-auto block" viewBox="-1125 530 5062.43 952" role="img" aria-label="zopcloud" focusable="false"> <rect x="-1125" y="530" width="952" height="952" fill="var(--logo-green, #7
326FB236)"></rect>  <rect x="-768" y="768" width="238" height="178.5" fill="#FFFFFF"></rect> <rect x="-946.5" y="946.5" width="595" height="297.5" fill="#FFFFFF"></rect>  <path d="M27.0005 1250V1145.7157L279.1443 861.7128H30.2863V754H427.4279V858.2843L171.8557 1142.2872H432.4279V1250Z M732.8571 1262Q658.2858 1262 598.2859 1229.1429Q538.2859 1196.2858 503.2146 1137.3572Q468.1432 1078.4286 468.1432 1001.9838Q468.1432 924.5714 503.286 866.1428Q538.4288 807.7142 598.9287 774.8571Q659.4286 742 733.1311 742Q807.8571 742 867.7856 774.8571Q927.7141 807.7142 962.7854 866.1428Q997.8568 924.5714 997.8568 1001.9838Q997.8568 1078.4286 962.714 1137.3572Q927.5712 1196.2858 867.5713 1229.1429Q807.5714 1262 732.8571 1262ZM732.7416 1149.7159Q769.0004 1149.7159 798.8578 1133.2157Q828.7153 1116.7155 846.4298 1083.8986Q864.1443 1051.0816 864.1443 1002.4093Q864.1443 952.9995 846.0727 920.142Q828.0011 887.2845 798.5722 870.7843Q769.1432 854.2841 733.5714 854.2841Q697.9996 854.2841 667.9998 870.9116Q638 887.539 619.9278 920.055Q601.8557 952.5709 601.8557 1002.0838Q601.8557 1050.8577 619.5702 1083.7866Q637.2847 1116.7155 667.2537 1133.2157Q697.2227 1149.7159 732.7416 1149.7159Z M1042.5721 1470V754H1172.5703V824.5719Q1196.5703 791.7146 1236.2133 766.8573Q1275.8564 742 1338.1423 742Q1407.9996 742 1462.9996 776Q1517.9996 810 1549.7853 869Q1581.571 928 1581.571 1003Q1581.571 1077.1429 1549.7853 1136.0714Q1517.9996 1195 1462.9996 1228.5Q1407.9996 1262 1337.9995 1262Q1281.8564 1262 1240.2133 1241.0713Q1198.5703 1220.1425 1172.5703 1182.5708V1470ZM1309.2859 1148.7159Q1350.2863 1148.7159 1382.1437 1129.7157Q1414.0011 1110.7155 1431.8584 1077.7866Q1449.7157 1044.8577 1449.7157 1002.8571Q1449.7157 959.9995 1431.8584 926.5705Q1414.0011 893.1416 1382.1437 874.2129Q1350.2863 855.2841 1309.2859 855.2841Q1268.4285 855.2841 1236.9282 874.2129Q1205.4279 893.1416 1187.5706 926.142Q1169.7133 959.1423 1169.7133 1002Q1169.7133 1044.8577 1187.5706 1077.7866Q1205.4279 1110.7155 1236.9282 1129.7157Q1268.4285 1148.7159 1309.2859 1148.7159Z M1864 1262Q1788.1431 1262 1729.6432 
3261228.6429Q1671.1432 1195.2858 1637.7861 1136.7858Q1604.429 1078.2858 1604.429 1002Q1604.429 925.5714 1637.7861 867.1428Q1671.1432 808.7142 1729.6432 775.3571Q1788.1431 742 1864 742Q1958.7141 742 2023.6424 791.7141Q2088.5708 841.4283 2107.1422 928.285H1970.287Q1961.0013 893.7131 1931.9295 873.5701Q1902.8577 853.427 1863.1429 853.427Q1828.5712 853.427 1799.7137 871.2129Q1770.8562 888.9987 1754.0703 921.8562Q1737.2843 954.7137 1737.2843 1002Q1737.2843 1048.2863 1754.0703 1082.0724Q1770.8562 1115.8584 1799.7137 1133.6443Q1828.5712 1151.4301 1863.1429 1151.4301Q1902.8577 1151.4301 1931.9295 1131.7156Q1961.0013 1112.0011 1970.287 1075.715H2107.1422Q2089.5708 1159.7146 2024.1424 1210.8573Q1958.7141 1262 1864 1262Z M2152.0009 1250V530H2281.9991V1250Z M2590.8571 1262Q2516.2858 1262 2456.2859 1229.1429Q2396.2859 1196.2858 2361.2146 1137.3572Q2326.1432 1078.4286 2326.1432 1001.9838Q2326.1432 924.5714 2361.286 866.1428Q2396.4288 807.7142 2456.9287 774.8571Q2517.4286 742 2591.1311 742Q2665.8571 742 2725.7856 774.8571Q2785.7141 807.7142 2820.7854 866.1428Q2855.8568 924.5714 2855.8568 1001.9838Q2855.8568 1078.4286 2820.714 1137.3572Q2785.5712 1196.2858 2725.5713 1229.1429Q2665.5714 1262 2590.8571 1262ZM2590.7416 1149.7159Q2627.0004 1149.7159 2656.8578 1133.2157Q2686.7153 1116.7155 2704.4298 1083.8986Q2722.1443 1051.0816 2722.1443 1002.4093Q2722.1443 952.9995 2704.0727 920.142Q2686.0011 887.2845 2656.5722 870.7843Q2627.1432 854.2841 2591.5714 854.2841Q2555.9996 854.2841 2525.9998 870.9116Q2496 887.539 2477.9278 920.055Q2459.8557 952.5709 2459.8557 1002.0838Q2459.8557 1050.8577 2477.5702 1083.7866Q2495.2847 1116.7155 2525.2537 1133.2157Q2555.2227 1149.7159 2590.7416 1149.7159Z M3074.1438 1262Q2989.144 1262 2939.7868 1203.5716Q2890.4296 1145.1432 2890.4296 1033.2861V754H3019.5706V1021.0005Q3019.5706 1085.0011 3044.0709 1118.5727Q3068.5712 1152.1443 3116.1429 1152.1443Q3168.7148 1152.1443 3198.0008 1114.7154Q3227.2869 1077.2865 3227.2869 1010.1429V754H3357.285V1250H3227.2869V1177.1425Q3205.2869 1216.2856 3167.1439 1239.1428Q3129.0009 1262 3074.1438 1262Z M3642.7148 1262Q3572.8575 1262 3517.4289 1228Q3462.0004 1194 3430.2147 1134.5714Q3398.429 1075.1429 3398.429 1001Q3398.429 926 3430.2147 867.5Q3462.0004 809 3517.5004 775.5Q3573.0004 742 3642.8577 742Q3699.0007 742 3740.7152 762.9287Q3782.4297 783.8575 3807.4297 821.4292V530H3937.4279V1250H3807.4297V1179.4281Q3784.2869 1212.1425 3744.7152 1237.0713Q3705.1436 1262 3642.7148 1262ZM3670.7141 1148.7159Q3711.7144 1148.7159 3743.1432 1129.7157Q3774.5721 1110.7155 3792.4294 1077.358Q3810.2867 1044.0005 3810.2867 1002Q3810.2867 959.1423 3792.4294 926.142Q3774.5721 893.1416 3743.1432 874.2129Q3711.7144 855.2841 3670.7141 855.2841Q3630.7137 855.2841 3598.7849 874.2129Q3566.856 893.1416 3548.9987 925.7134Q3531.1414 958.2852 3531.1414 1001.1429Q3531.1414 1044.0005 3548.9987 1077.358Q3566.856 1110.7155 3598.7849 1129.7157Q3630.7137 1148.7159 3670.7141 1148.7159Z" fill="currentColor"></path> </svg></div> <p class="np-prod-strip-desc">Push your repo, get a URL. No cloud account needed.</p> </span> <span class="np-prod-badge live">live</span> </a> </div> <div class="np-promo-row"> <span><strong>Live in 20 MCP clients</strong> · run zopnight from your MCP client</span> <a href="/developers">Try MCP →</a> </div> </div> <!-- ═══════ SOLUTIONS · ZopNight capabilities, grouped as the product's
327             own left nav groups them, so the menu and the app agree. Uses the
328             Resources pane's row + icon cells so both dropdowns read the same:
329             a 1px grid gap over --line with --paper cells is what draws the
330             hairlines, not borders on the cells. ═══════ --> <div class="nav-pane" data-pane="solutions"> <div class="np-bento np-bento--solutions"> <div class="np-sol-cols"> <div class="np-sol-col"> <span class="np-sol-head">Estate</span> <a class="np-res-row" href="/zopnight/architecture"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 20 20" fill="none"><path d="M10 3v4M10 13v4M4 10h4M12 10h4" stroke="currentColor" stroke-width="1.5"></path><circle cx="10" cy="10" r="2.4" stroke="currentColor" stroke-width="1.5"></circle><circle cx="10" cy="3" r="1.4" stroke="currentColor" stroke-width="1.5"></circle><circle cx="10" cy="17" r="1.4" stroke="currentColor" stroke-width="1.5"></circle></svg> </span>
331Architecture
332</a> <a class="np-res-row" href="/zopnight/globe-view"> <span class="np-res-row-icon">
332 <svg width="16" height="16" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="7" stroke="currentColor" stroke-width="1.5"></circle><path d="M3 10h14M10 3c2 2.4 2 11.6 0 14M10 3c-2 2.4-2 11.6 0 14" stroke="currentColor" stroke-width="1.5"></path></svg> </span>
333Globe view
334</a> <a class="np-res-row" href="/zopnight/auto-tagging"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 20 20" fill="none"><path d="M10 3H4v6l8 8 6-6-8-8z" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"></path><circle cx="7" cy="6" r="1.1" fill="currentColor"></circle></svg> </span>
335Auto tagging
336</a> <a class="np-res-row" href="/zopnight/resource-discovery"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="square" stroke-linejoin="miter"><path d="M3 8V3h5M16 3h5v5M21 16v5h-5M8 21H3v-5"></path><path d="M3 12h18"></path></svg> </span>
337Resource discovery
338</a> <a class="np-res-row" href="/zopnight/ownership-detection"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="square" stroke-linejoin="miter"><path d="M2.5 12S6 6 12 6s9.5 6 9.5 6-3.5 6-9.5 6-9.5-6-9.5-6Z"></path><circle cx="12" cy="12" r="2.6"></circle></svg> </span>
339Ownership detection
340</a> <a class="np-res-row" href="/zopnight/cloud-accounts"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="square" stroke-linejoin="miter"><path d="M10 14a4.5 4.5 0 0 0 6.4 0l2.6-2.6a4.5 4.5 0 0 0-6.4-6.4L11 6.7"></path><path d="M14 10a4.5 4.5 0 0 0-6.4 0L5 12.6a4.5 4.5 0 0 0 6.4 6.4l1.6-1.7"></path></svg> </span>
341Cloud accounts
342</a> <a class="np-res-row" href="/zopnight/openshift"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="square" stroke-linejoin="miter"><path d="m12 3 9 4.5-9 4.5-9-4.5Z"></path><path d="m3 12 9 4.5 9-4.5M3 16.5 12 21l9-4.5"></path></svg> </span>
343OpenShift
344</a> </div> <div class="np-sol-col"> <span class="np-sol-head">Automate</span> <a class="np-res-row" href="/zopnight/schedules"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="7" stroke="currentColor" stroke-width="1.5"></circle><path d="M10 6v4l3 2" stroke="currentColor" stroke-width="1.5" stroke-linecap="square"></path></svg> </span>
345Schedules
346</a> <a class="np-res-row" href="/zopnight/overrides"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 20 20" fill="none"><path d="M4 6h12M4 10h12M4 14h7" stroke="currentColor" stroke-width="1.5" stroke-linecap="square"></path><circle cx="14" cy="14" r="2.2" stroke="currentColor" stroke-width="1.5"></circle></svg> </span>
347Overrides
348</a> <a class="np-res-row" href="/zopnight/resource-groups"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="square" stroke-linejoin="miter"><path d="M4 4h4v4H4ZM16 16h4v4h-4Z"></path><path d="M8 6h5a3 3 0 0 1 3 3v9"></path></svg> </span>
349Resource groups
350</a> <a class="np-res-row" href="/zopnight/auto-scaling"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 20 20" fill="none"><path d="M5 13V7l3 3M15 7v6l-3-3" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"></path><path d="M3 16h14M3 4h14" stroke="currentColor" stroke-width="1.5" stroke-linecap="square"></path></svg> </span>
351Auto Scaling
352</a> <a class="np-res-row" href="/zopnight/event-readiness"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 20 20" fill="none"><path d="M3 5h14v12H3z" stroke="currentColor" stroke-width="1.5"></path><path d="M3 8h14M7 3v3M13 3v3" stroke="currentColor" stroke-width="1.5" stroke-linecap="square"></path></svg> </span>
353Event Readiness
354</a> <a class="np-res-row" href="/zopnight/auto-remediation"> <span class="np-res-row-icon">
354 <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="square" stroke-linejoin="miter"><path d="M13.5 2.5 4.5 13.5h6l-.5 8 9-11h-6Z"></path></svg> </span>
355Auto-remediation
356</a> <a class="np-res-row" href="/zopnight/notifications"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="square" stroke-linejoin="miter"><path d="M6.5 10a5.5 5.5 0 1 1 11 0c0 4 1.5 5.4 1.5 5.4H5S6.5 14 6.5 10Z"></path><path d="M10 18.4a2.2 2.2 0 0 0 4 0"></path></svg> </span>
357Notifications
358</a> <a class="np-res-row" href="/integrations"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="square" stroke-linejoin="miter"><circle cx="5" cy="6" r="2.2"></circle><circle cx="19" cy="6" r="2.2"></circle><circle cx="12" cy="18" r="2.2"></circle><path d="M6.6 7.6 10.6 16M17.4 7.6 13.4 16M7.2 6h9.6"></path></svg> </span>
359Integrations
360</a> </div> <div class="np-sol-col"> <span class="np-sol-head">Cost</span> <a class="np-res-row" href="/zopnight/cost-report"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 20 20" fill="none"><path d="M4 3h9l3 3v11H4z" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"></path><path d="M7 13v-3M10 13v-5M13 13v-2" stroke="currentColor" stroke-width="1.5" stroke-linecap="square"></path></svg> </span>
361Cost Report
362</a> <a class="np-res-row" href="/zopnight/showback"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="square" stroke-linejoin="miter"><path d="M4 5h16v14H4Z"></path><path d="M12 8.2v7.6M14 10c0-1-1-1.6-2-1.6s-2 .6-2 1.5.9 1.3 2 1.6 2 .7 2 1.6-1 1.5-2 1.5-2-.6-2-1.6"></path></svg> </span>
363Showback
364</a> <a class="np-res-row" href="/zopnight/team-budgets"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="square" stroke-linejoin="miter"><circle cx="12" cy="12" r="8.5"></circle><circle cx="12" cy="12" r="4"></circle><circle cx="12" cy="12" r="0.8" fill="currentColor" stroke="none"></circle></svg> </span>
365Team budgets
366</a> <a class="np-res-row" href="/zopnight/unit-economics"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="square" stroke-linejoin="miter"><path d="M3.5 18a9 9 0 1 1 17 0"></path><path d="M12 18 16.5 10.5"></path><path d="M3.5 18h3M17.5 18h3"></path></svg> </span>
367Unit economics
368</a> <a class="np-res-row" href="/zopnight/anomaly-detection"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="square" stroke-linejoin="miter"><path d="M12 3.5 21.5 20H2.5Z"></path><path d="M12 9.5v4.4M12 16.8v.6"></path></svg> </span>
369Anomaly detection
370</a> <a class="np-res-row" href="/zopnight/dashboards"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="square" stroke-linejoin="miter"><path d="M3 21h18"></path><path d="M6 21v-7M11 21V6M16 21v-10M21 21V9"></path></svg> </span>
371Dashboards
372</a> </div> <div class="np-sol-col"> <span class="np-sol-head">Govern</span> <a class="np-res-row" href="/zopnight/access-control"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="square" stroke-linejoin="miter"><path d="M5 10.5h14V21H5Z"></path><path d="M8 10.5V7.6a4 4 0 0 1 8 0v2.9"></path></svg> </span>
373Access control
374</a> <a class="np-res-row" href="/zopnight/audit-log"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="square" stroke-linejoin="miter"><path d="M5 3h9l5 5v13H5Z"></path><path d="M14 3v5h5"></path><path d="M8.5 13h7M8.5 16.5h5"></path></svg> </span>
375Audit log
376</a> <a class="np-res-row" href="/zopnight/iac-governance"> <span class="np-res-row-icon">
376 <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="square" stroke-linejoin="miter"><path d="M12 3 4 6v6c0 4.4 3.3 7.6 8 9 4.7-1.4 8-4.6 8-9V6Z"></path><path d="m8.6 12 2.4 2.4 4.4-4.8"></path></svg> </span>
377IaC governance
378</a> <span class="np-sol-head">AI</span> <a class="np-res-row" href="/zopnight/ai-gateway"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 20 20" fill="none"><path d="M7 4h6v12H7z" stroke="currentColor" stroke-width="1.5"></path><path d="M4 7h3M4 13h3M13 7h3M13 13h3" stroke="currentColor" stroke-width="1.5" stroke-linecap="square"></path></svg> </span>
379AI Gateway
380</a> <a class="np-res-row" href="/zopnight/mcp-server"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="square" stroke-linejoin="miter"><circle cx="5" cy="6" r="2.2"></circle><circle cx="19" cy="6" r="2.2"></circle><circle cx="12" cy="18" r="2.2"></circle><path d="M6.6 7.6 10.6 16M17.4 7.6 13.4 16M7.2 6h9.6"></path></svg> </span>
381MCP server
382</a> <span class="np-sol-head">Recommendations</span> <a class="np-res-row" href="/zopnight/recommendations"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 20 20" fill="none"><path d="M10 3a5 5 0 0 0-3 9v2h6v-2a5 5 0 0 0-3-9z" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"></path><path d="M8 17h4" stroke="currentColor" stroke-width="1.5" stroke-linecap="square"></path></svg> </span>
383Recommendations
384</a> <a class="np-res-row" href="/zopnight/rules"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="square" stroke-linejoin="miter"><circle cx="12" cy="12" r="9"></circle><path d="m8 12 2.8 2.8L16 9.4"></path></svg> </span>
385Rule catalogue
386</a> </div> </div> <a class="np-sol-foot" href="/zopnight/resources"> <span class="np-sol-foot-title">Free reports and handbooks</span> <span class="np-sol-foot-arrow" aria-hidden="true">→</span> </a> </div> </div> <!-- ═══════ RESOURCES · Latest hero + compact icon list ═══════ --> <div class="nav-pane" data-pane="resources"> <div class="np-bento np-bento--resources-v2"> <!-- Featured · "Latest from the blog" hero card. Text sits
387                 on the top-left (eyebrow + title + meta + CTA); the
388                 cover image is anchored at the bottom and is only
389                 partly visible at rest (translateY 55%). On card hover
390                 the image slides up so the cover reads clearly. Same
391                 peek pattern as the product dropdown ZopNight card. --> <a class="np-res-hero" href="/resources/blogs/a-hardcoded-payment-callback-was-404ing-on-prod-all-along"> <span class="np-res-hero-body"> <span class="np-res-hero-eyebrow"> <span class="np-res-hero-dot" aria-hidden="true"></span>
392Latest from the blog
393</span> <div class="np-res-hero-title">ZopNight&#39;s Billing Rewrite: Clearer Invoices, Safer Payments</div> <span class="np-res-hero-meta">3 min read · cloud-governance</span> <span class="np-res-hero-cta">Read Post <span class="np-res-hero-arrow" aria-hidden="true">→</span></span> </span> <span class="np-res-hero-peek" aria-hidden="true"> <img src="https://storage.googleapis.com/zopdev-blog-resources/1/files/originals/20261002/974341b6-28b1-466e-b852-91034a81b1f8-banner.webp" alt="" width="240" height="160" loading="lazy" decoding="async"> </span> </a> <!-- Compact list · 8 links, icon + title only, no descriptions --> <div class="np-res-list"> <a class="np-res-row" href="/resources/blogs"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 20 20" fill="none"><path d="M4 4h12v12H4z" stroke="currentColor" stroke-width="1.5"></path><path d="M7 8h6M7 11h4" stroke="currentColor" stroke-width="1.5" stroke-linecap="square"></path></svg> </span>
394Blog
395</a> <a class="np-res-row" href="/resources/ebooks"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 20 20" fill="none"><path d="M3 4h7v13H3zM10 4h7v13h-7z" stroke="currentColor" stroke-width="1.5"></path><path d="M10 4v13" stroke="currentColor" stroke-width="1.5"></path></svg> </span>
396Ebooks
397</a> <a class="np-res-row" href="/resources/university"> <span class="np-res-row-icon">
397 <svg width="16" height="16" viewBox="0 0 20 20" fill="none"><path d="M2 7l8-4 8 4-8 4-8-4z" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"></path><path d="M5 9v4c0 1.1 2.24 2 5 2s5-.9 5-2V9" stroke="currentColor" stroke-width="1.5"></path></svg> </span>
398University
399</a> <a class="np-res-row" href="/changelog"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="7" stroke="currentColor" stroke-width="1.5"></circle><path d="M10 6v4l2.5 2.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="square"></path></svg> </span>
400Changelog
401</a> <a class="np-res-row" href="/developer-docs"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 20 20" fill="none"><path d="M7 6l-4 4 4 4M13 6l4 4-4 4" stroke="currentColor" stroke-width="1.5" stroke-linecap="square" stroke-linejoin="miter"></path></svg> </span>
402Developer docs
403</a> <a class="np-res-row" href="/docs"> <span class="np-res-row-icon"> <svg width="16" height="16" viewBox="0 0 20 20" fill="none"><rect x="3" y="4" width="14" height="12" stroke="currentColor" stroke-width="1.5"></rect>
403<path d="M9 8l3 2-3 2z" fill="currentColor"></path></svg> </span>
404Product docs
405</a> </div> </div> </div> <!-- ═══════ COMPANY · About hero + Careers / Contact stack ═══════ --> <div class="nav-pane" data-pane="company"> <div class="np-bento np-bento--company-v2"> <!-- About · larger hero card with a stylized company peek
406                 (wordmark + founder avatars + location strip) that
407                 slides up on hover, monochrome at rest. --> <a class="np-comp-card" href="/about"> <span class="np-comp-eyebrow"> <svg class="np-comp-eyebrow-mark" viewBox="0 0 715 276" aria-hidden="true" focusable="false"><use href="#logo-zopdev"></use></svg> <span>About <span class="brand-lc">zopdev</span></span> </span> <div class="np-comp-title">Founded 2024.</div> <p class="np-comp-desc">Technology Value OS for AI, Cloud and Human.</p> <span class="np-comp-cta">Meet the Team <span class="np-comp-arrow" aria-hidden="true">→</span></span> <!-- Photo stack · 3 company photos overlapping with a
408                   subtle offset + rotation. On card hover they fan out
409                   horizontally so all three are visible at once. --> <span class="np-comp-stack" aria-hidden="true"> <img class="np-comp-stack-img np-comp-stack-img--3" src="https://storage.googleapis.com/zopdev-ui-assets/websitev2-images/about/offices/office-2-600w.jpg" alt="" width="600" height="400" loading="lazy" decoding="async"> <img class="np-comp-stack-img np-comp-stack-img--2" src="https://storage.googleapis.com/zopdev-ui-assets/websitev2-images/about/founders/founders-2-800w.jpg" alt="" width="800" height="600" loading="lazy" decoding="async"> <img class="np-comp-stack-img np-comp-stack-img--1" src="https://storage.googleapis.com/zopdev-ui-assets/websitev2-images/about/founders/founders-1-800w.jpg" alt="" width="800" height="600" loading="lazy" decoding="async"> </span> </a> <!-- Media Kit · compact cell, logos + brand files --> <a class="np-comp-cell" href="/media-kit"> <div class="np-cell-icon"> <svg width="18" height="18" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="square" stroke-linejoin="miter"><path d="M3 4h11v12H3z"></path><path d="M14 7h3v9h-3"></path><path d="M6 8h5M6 11h5M6 14h3" stroke-width="1.3" stroke-linecap="square"></path></svg> </div> <div class="np-cell-title">Media Kit</div> <p class="np-cell-desc">Logos, marks &amp; brand files &middot; all formats</p> </a> <!-- Contact · compact cell --> <a class="np-comp-cell" href="/contact"> <div class="np-cell-icon"> <svg width="18" height="18" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="square" stroke-linejoin="miter"><path d="M3 5h14v10H3z"></path><path d="M3 5l7 5 7-5"></path></svg> </div> <div class="np-cell-title">Contact</div> <p class="np-cell-desc">Talk to sales &middot; founders reply within 24h</p> </a> </div> </div> <!-- ═══════ OPEN SOURCE · the two deploy-button pages ═══════
410             Same two-card shape as the Playground pane (np-play-*), one card
411             per product, so it reads as part of the same menu family. --> <div class="nav-pane" data-pane="opensource"> <div class="np-bento np-bento--playground-v2"> <a class="np-play-card np-play-card--cloud" href="/zopcloud/oss"> <div class="np-play-head"> <svg class="np-play-mark" viewBox="0 0 32 32" aria-hidden="true" focusable="false"><use href="#mark-zopcloud"></use></svg> <div class="np-play-body"> <div class="np-play-title">zopcloud</div> <p class="np-play-desc">A Deploy to ZopCloud button for your README</p> </div> <span class="np-play-arrow" aria-hidden="true">&rarr;</span> </div> <div class="np-play-foot"> <span class="np-play-foot-mark np-play-foot-mark--cloud" aria-hidden="true"></span> <span class="np-play-foot-text">Hosted, free to start</span> </div> </a> <a class="np-play-card np-play-card--day" href="/zopday/oss"> <div class="np-play-head"> <svg class="np-play-mark" viewBox="0 0 32 32" aria-hidden="true" focusable="false"><use href="#mark-zopday"></use></svg> <div class="np-play-body"> <div class="np-play-title">zopday</div> <p class="np-play-desc">Deploy buttons for zopcloud or their own cloud</p> </div> <span class="np-play-arrow" aria-hidden="true">&rarr;</span> </div> <div class="np-play-foot"> <span class="np-play-foot-mark np-play-foot-mark--day" aria-hidden="true"></span> <span class="np-play-foot-text">Your own AWS, GCP or Azure</span> </div> </a> </div> </div> <!-- ═══════ PLAYGROUND · 2 hands-on consoles ═══════ --> <div class="nav-pane" data-pane="playground"> <div class="np-bento np-bento--playground-v2"> <a class="np-play-card np-play-card--night" href="/zopnight/playground"> <div class="np-play-head"> <svg class="np-play-mark" viewBox="0 0 32 32" aria-hidden="true" focusable="false"><use href="#mark-zopnight"></use></svg> <div class="np-play-body"> <div class="np-play-title">zopnight playground</div> <p class="np-play-desc">Cost loop &middot; idle, schedules, anomalies</p> </div> <span class="np-play-arrow" aria-hidden="true">&rarr;</span> </div> <div class="np-play-foot"> <span class="np-play-foot-mark np-play-foot-mark--night" aria-hidden="true"></span> <span class="np-play-foot-text">Cost console</span> </div> </a> <a class="np-play-card np-play-card--day" href="/zopday/playground"> <div class="np-play-head"> <svg class="np-play-mark" viewBox="0 0 32 32" aria-hidden="true" focusable="false"><use href="#mark-zopday"></use></svg> <div class="np-play-body"> <div class="np-play-title">zopday playground</div> <p class="np-play-desc">Deploy loop &middot;
411 clusters, datastores, push</p> </div> <span class="np-play-arrow" aria-hidden="true">&rarr;</span> </div> <div class="np-play-foot"> <span class="np-play-foot-mark np-play-foot-mark--day" aria-hidden="true"></span> <span class="np-play-foot-text">Deploy console</span> </div> </a> </div> </div> </div> </div> <div class="nav-cta gap-2 sm:gap-3 md:gap-3 lg:gap-4 shrink min-w-0 max-w-full"> <div class="nav-item nav-item--playground" data-menu="playground"> <a class="chip-playground" href="#" aria-haspopup="true" aria-expanded="false"> <span>Playground</span> <span class="nav-caret chip-playground-caret" aria-hidden="true"></span> </a> </div> <a class="sign" href="/zopnight/app/signin">Sign In</a> <a class="btn btn-accent text-xs sm:text-sm md:text-sm lg:text-base whitespace-nowrap" href="https://bookings.zop.dev/#/discover-zopdev" target="_blank" rel="noopener noreferrer"><span>Book a Demo</span> <span class="arrow">→</span></a> </div> <button class="mob-nav-toggle" id="mob-nav-toggle" aria-label="Open menu" aria-expanded="false" aria-controls="mob-nav-drawer" type="button"> <span class="bars" aria-hidden="true"><span></span><span></span><span></span></span> </button> </div> </nav> <style>astro-island,astro-slot,astro-static-slot{display:contents}</style>
411<script>(()=>{var l=(n,t)=>{let i=async()=>{await(await n())()},e=typeof t.value=="object"?t.value:void 0,s={timeout:e==null?void 0:e.timeout};"requestIdleCallback"in window?window.requestIdleCallback(i,s):setTimeout(i,s.timeout||200)};(self.Astro||(self.Astro={})).idle=l;window.dispatchEvent(new Event("astro:idle"));})();</script>
411<script>(()=>{var A=Object.defineProperty;var g=(i,o,a)=>o in i?A(i,o,{enumerable:!0,configurable:!0,writable:!0,value:a}):i[o]=a;var d=(i,o,a)=>g(i,typeof o!="symbol"?o+"":o,a);{let i={0:t=>m(t),1:t=>a(t),2:t=>new RegExp(t),3:t=>new Date(t),4:t=>new Map(a(t)),5:t=>new Set(a(t)),6:t=>BigInt(t),7:t=>new URL(t),8:t=>new Uint8Array(t),9:t=>new Uint16Array(t),10:t=>new Uint32Array(t),11:t=>Number.POSITIVE_INFINITY*t},o=t=>{let[l,e]=t;return l in i?i[l](e):void 0},a=t=>t.map(o),m=t=>typeof t!="object"||t===null?t:Object.fromEntries(Object.entries(t).map(([l,e])=>[l,o(e)]));class y extends HTMLElement{constructor(){super(...arguments);d(this,"Component");d(this,"hydrator");d(this,"hydrate",async()=>{var b;if(!this.hydrator||!this.isConnected)return;let e=(b=this.parentElement)==null?void 0:b.closest("astro-island[ssr]");if(e){e.addEventListener("astro:hydrate",this.hydrate,{once:!0});return}let c=this.querySelectorAll("astro-slot"),n={},h=this.querySelectorAll("template[data-astro-template]");for(let r of h){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute("data-astro-template")||"default"]=r.innerHTML,r.remove())}for(let r of c){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute("name")||"default"]=r.innerHTML)}let p;try{p=this.hasAttribute("props")?m(JSON.parse(this.getAttribute("props"))):{}}catch(r){let s=this.getAttribute("component-url")||"<unknown>",v=this.getAttribute("component-export");throw v&&(s+=` (export ${v})`),console.error(`[hydrate] Error parsing props for component ${s}`,this.getAttribute("props"),r),r}let u;await this.hydrator(this)(this.Component,p,n,{client:this.getAttribute("client")}),this.removeAttribute("ssr"),this.dispatchEvent(new CustomEvent("astro:hydrate"))});d(this,"unmount",()=>{this.isConnected||this.dispatchEvent(new CustomEvent("astro:unmount"))})}disconnectedCallback(){document.removeEventListener("astro:after-swap",this.unmount),document.addEventListener("astro:after-swap",this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute("await-children")||document.readyState==="interactive"||document.readyState==="complete")this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener("DOMContentLoaded",e),c.disconnect(),this.childrenConnectedCallback()},c=new MutationObserver(()=>{var n;((n=this.lastChild)==null?void 0:n.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue==="astro:end"&&(this.lastChild.remove(),e())});c.observe(this,{childList:!0}),document.addEventListener("DOMContentLoaded",e)}}async childrenConnectedCallback(){let e=this.getAttribute("before-hydration-url");e&&await import(e),this.start()}async start(){let e=JSON.parse(this.getAttribute("opts")),c=this.getAttribute("client");if(Astro[c]===void 0){window.addEventListener(`astro:${c}`,()=>this.start(),{once:!0});return}try{await Astro[c](async()=>{let n=this.getAttribute("renderer-url"),[h,{default:p}]=await Promise.all([import(this.getAttribute("component-url")),n?import(n):()=>()=>{}]),u=this.getAttribute("component-export")||"default";if(!u.includes("."))this.Component=h[u];else{this.Component=h;for(let f of u.split("."))this.Component=this.Component[f]}return this.hydrator=p,this.hydrate},e,this)}catch(n){console.error(`[astro-island] Error hydrating ${this.getAttribute("component-url")}`,n)}}attributeChangedCallback(){this.hydrate()}}d(y,"observedAttributes",["props"]),customElements.get("astro-island")||customElements.define("astro-island",y)}})();</script>
411<astro-island uid="2dcPsU" prefix="r4" component-url="/_astro/MegaMenu.BJWbIGbg.js" component-export="default" renderer-url="/_astro/client.bnjHR3qd.js" props="{}" ssr client="idle" opts="{&quot;name&quot;:&quot;MegaMenu&quot;,&quot;value&quot;:true}"></astro-island> 
411<script type="module">const a="/zopnight/app/signin",i=new Set(["zopnight","zopday","zopcloud"]);function l(r){const n=r.toLowerCase().split("/").filter(Boolean)[0];return i.has(n)?n:null}function c(r,n){let t,e;try{e=new URL(n),t=new URL(r,e)}catch{return null}if(t.origin!==e.origin||t.pathname.replace(/\/+$/,"")!==a)return null;const o=l(e.pathname);return o?t.searchParams.set("app",o):t.searchParams.delete("app"),`${t.pathname}${t.search}${t.hash}`}function s(r,n){for(const t of r.querySelectorAll(`a[href*="${a}"]`)){const e=c(t.getAttribute("href"),n);e&&e!==t.getAttribute("href")&&t.setAttribute("href",e)}}document.addEventListener("astro:page-load",()=>s(document,window.location.href));</script>
411 <!-- NOTE: the `#mob-nav-toggle` button is rendered ONCE by NavBar.astro
412     (inside .nav-inner, matching the original /website/*.html markup
413     where the toggle lives in the nav header). Do NOT duplicate it
414     here — having two `.mob-nav-toggle` elements showed up as two
415     hamburger icons on tablet viewports (the static markup AND the
416     IIFE-built drawer's bail-check `if(document.querySelector('.mob-nav-toggle')) return;`
417     would still pass because the markup itself was the duplicate).
418     This component now only owns the scrim + drawer aside. --><div class="mob-nav-scrim" id="mob-nav-scrim" aria-hidden="true" data-astro-transition-persist="mob-nav-scrim"></div> <aside class="mob-nav" id="mob-nav-drawer" inert aria-hidden="true" aria-label="Mobile navigation" data-astro-transition-persist="mob-nav"> <header class="mob-nav-head"> <a href="/" class="mob-nav-logo" aria-label="zopdev"> <svg viewBox="0 0 715 276" aria-hidden="true"><use href="#logo-zopdev"></use></svg> </a> <button class="mob-nav-close min-w-11 min-h-11 inline-flex items-center justify-center" id="mob-nav-close" aria-label="Close menu" type="button"> <svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="square"> <path d="M3 3 L13 13 M13 3 L3 13"></path> </svg> </button> </header> <nav class="mob-nav-body flex flex-col gap-2 px-4 py-3 md:px-6 md:py-4 md:gap-3" aria-label="Mobile menu items"> <!-- PRODUCT · expandable --> <details class="mob-nav-group"> <summary class="flex items-center justify-between min-h-11 py-3 md:py-4"> <span>Product</span> <svg class="mob-nav-chev" width="14" height="14" viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.6" aria-hidden="true"><path d="M3 5 L6 8 L9 5"></path></svg> </summary> <ul class="flex flex-col gap-1 md:gap-2 py-1"> <li><a class="flex items-center min-h-11 py-3 md:py-4" href="/zopnight"> <svg class="mob-nav-mark" viewBox="-1125 530 4943.43 952" role="img" aria-label="zopnight" focusable="false"> <rect x="-1125" y="530" width="952" height="952" fill="var(--logo-blue, #2A4494)"></rect> <circle cx="-649" cy="1006" r="238" fill="#FFFFFF"></circle> <path d="M27.0005 1250V1145.7157L279.1443 861.7128H30.2863V754H427.4279V858.2843L171.8557 1142.2872H432.4279V1250Z M732.8571 1262Q658.2858 1262 598.2859 1229.1429Q538.2859 1196.2858 503.2146 1137.3572Q468.1432 1078.4286 468.1432 1001.9838Q468.1432 924.5714 503.286 866.1428Q538.4288 807.7142 598.9287 774.8571Q659.4286 742 733.1311 742Q807.8571 742 867.7856 774.8571Q927.7141 807.7142 962.7854 866.1428Q997.8568 924.5714 997.8568 1001.9838Q997.8568 1078.4286 962.714 1137.3572Q927.5712 1196.2858 867.5713 1229.1429Q807.5714 1262 732.8571 1262ZM732.7416 1149.7159Q769.0004 1149.7159 798.8578 1133.2157Q828.7153 1116.7155 846.4298 1083.8986Q864.1443 1051.0816 864.1443 1002.4093Q864.1443 952.9995 846.0727 920.142Q828.0011 887.2845 798.5722 870.7843Q769.1432 854.2841 733.5714 854.2841Q697.9996 854.2841 667.9998 870.9116Q638 887.539 619.9278 920.055Q601.8557 952.5709 601.8557 1002.0838Q601.8557 1050.8577 619.5702 1083.7866Q637.2847 1116.7155 667.2537 1133.2157Q697.2227 1149.7159 732.7416 1149.7159Z M1042.5721 1470V754H1172.5703V824.5719Q1196.5703 791.7146 1236.2133 766.8573Q1275.8564 742 1338.1423 742Q1407.9996 742 1462.9996 776Q1517.9996 810 1549.7853 869Q1581.571 928 1581.571 1003Q1581.571 1077.1429 1549.7853 1136.0714Q1517.9996 1195 1462.9996 1228.5Q1407.9996 1262 1337.9995 1262Q1281.8564 1262 1240.2133 1241.0713Q1198.5703 1220.1425 1172.5703 1182.5708V1470ZM1309.2859 1148.7159Q1350.2863 1148.7159 1382.1437 1129.7157Q1414.0011 1110.7155 1431.8584 1077.7866Q1449.7157 1044.8577 1449.7157 1002.8571Q1449.7157 959.9995 1431.8584 926.5705Q1414.0011 893.1416 1382.1437 874.2129Q1350.2863 855.2841 1309.2859 855.2841Q1268.4285 855.2841 1236.9282 874.2129Q1205.4279 893.1416 1187.5706 926.142Q1169.7133 959.1423 1169.7133 1002Q1169.7133 1044.8577 1187.5706 1077.7866Q1205.4279 1110.7155 1236.9282 1129.7157Q1268.4285 1148.7159 1309.2859 1148.7159Z M1623.7151 1250V754H1753.7133V828.8575Q1777.8562 788.8573 1819.8563 765.4286Q1861.8564 742 1917.7135 742Q2010.5704 742 2060.9991 800.4284Q2111.4277 858.8568 2111.4277 970.7139V1250H1981.4296V982.9995Q1981.4296 918.9989 1955.5007 885.4273Q1929.5719 851.8557 1874.8573 851.8557Q1822.2854 851.8557 1787.9994 889.2846Q1753.7133 926.7135 1753.7133 993.8571V1250Z M2173.1438 1250V754H2303.142V1250ZM2176.0004 671.8566V545.7144H2301.7139V671.8566Z M2636.8568 1482Q2573.4281 1482 2515.7854 1461.1428Q2458.1427 1440.2856 2418.0714 1395.7857Q2378.0002 1351.2858 2369.5715 1281.429H2498.5697Q2507.8557 1321.858 2545.2846 1345.7155Q2582.7135 1369.573 2634.2854 1369.573Q2671.7144 1369.573 2703.35
41876 1353.9299Q2735.0007 1338.2869 2753.858 1306.5722Q2772.7153 1274.8575 2772.7153 1226.1427V1163.9995Q2757.5724 1187.8568 2733.9295 1207.9284Q2710.2865 1228 2677.7149 1240.2859Q2645.1432 1252.5717 2602.7144 1252.5717Q2532.0002 1252.5717 2475.4287 1219.0003Q2418.8573 1185.4288 2386.2144 1127.2859Q2353.5715 1069.1431 2353.5715 996.7144Q2353.5715 924.2858 2386.2144 866.6429Q2418.8573 809 2475.4287 775.5Q2532.0002 742 2602.8573 742Q2659.8577 742 2703.7151 765.3574Q2747.5724 788.7148 2772.7153 823.2865V754H2902.7135V1219.2858Q2902.7135 1305.2856 2866.4279 1363.7856Q2830.1423 1422.2856 2769.7139 1452.1428Q2709.2854 1482 2636.8568 1482ZM2628.8568 1140.1447Q2671.5714 1140.1447 2703.3574 1121.1445Q2735.1434 1102.1443 2753.2151 1069.9297Q2771.2867 1037.715 2771.2867 997.5715Q2771.2867 956.4281 2753.2151 924.3563Q2735.1434 892.2845 2703.3574 873.7843Q2671.5714 855.2841 2628.8568 855.2841Q2586.9993 855.2841 2554.7847 873.7843Q2522.5701 892.2845 2504.4984 923.9277Q2486.4268 955.571 2486.4268 996.7144Q2486.4268 1036.8578 2504.4984 1069.5011Q2522.5701 1102.1443 2554.7847 1121.1445Q2586.9993 1140.1447 2628.8568 1140.1447Z M2964.1436 1250V530H3094.1418V829.1432Q3118.4276 789.0002 3161.4991 765.5001Q3204.5706 742 3259.4277 742Q3351.1418 742 3401.499 800.4284Q3451.8562 858.8568 3451.8562 970.7139V1250H3322.858V982.9995Q3322.858 918.9989 3297.5721 885.4273Q3272.2861 851.8557 3217.5715 851.8557Q3164.1425 851.8557 3129.1422 889.2846Q3094.1418 926.7135 3094.1418 993.8571V1250Z M3715.8564 1250Q3665.8568 1250 3631.6427 1238.2858Q3597.4286 1226.5715 3580.0716 1193.2146Q3562.7146 1159.8577 3562.7146 1097.1438V862.8557H3477.5717V754H3562.7146V621.0005H3692.7128V754H3818.4277V862.8557H3692.7128V1080.7153Q3692.7128 1105.5728 3697.7842 1118.1443Q3702.8557 1130.7159 3716.7843 1135.073Q3730.713 1139.4301 3755.2847 1139.4301H3814.5704V1250Z" fill="currentColor"></path> </svg> <small>Cloud governance + FinOps</small> </a></li> <li><a class="flex items-center min-h-11 py-3 md:py-4" href="/zopday"> <svg class="mob-nav-mark" viewBox="-1125 530 4407.43 952" role="img" aria-label="zopday" focusable="false"> <rect x="-1125" y="530" width="952" height="952" fill="var(--zop-orange, #F58549)"></rect> <circle cx="-649" cy="1006" r="238" fill="#FFFFFF"></circle> <path d="M27.0005 1250V1145.7157L279.1443 861.7128H30.2863V754H427.4279V858.2843L171.8557 1142.2872H432.4279V1250Z M732.8571 1262Q658.2858 1262 598.2859 1229.1429Q538.2859 1196.2858 503.2146 1137.3572Q468.1432 1078.4286 468.1432 1001.9838Q468.1432 924.5714 503.286 866.1428Q538.4288 807.7142 598.9287 774.8571Q659.4286 742 733.1311 742Q807.8571 742 867.7856 774.8571Q927.7141 807.7142 962.7854 866.1428Q997.8568 924.5714 997.8568 1001.9838Q997.8568 1078.4286 962.714 1137.3572Q927.5712 1196.2858 867.5713 1229.1429Q807.5714 1262 732.8571 1262ZM732.7416 1149.7159Q769.0004 1149.7159 798.8578 1133.2157Q828.7153 1116.7155 846.4298 1083.8986Q864.1443 1051.0816 864.1443 1002.4093Q864.1443 952.9995 846.0727 920.142Q828.0011 887.2845 798.5722 870.7843Q769.1432 854.2841 733.5714 854.2841Q697.9996 854.2841 667.9998 870.9116Q638 887.539 619.9278 920.055Q601.8557 952.5709 601.8557 1002.0838Q601.8557 1050.8577 619.5702 1083.7866Q637.2847 1116.7155 667.2537 1133.2157Q697.2227 1149.7159 732.7416 1149.7159Z M1042.5721 1470V754H1172.5703V824.5719Q1196.5703 791.7146 1236.2133 766.8573Q1275.8564 742 1338.1423 742Q1407.9996 742 1462.9996 776Q1517.9996 810 1549.7853 869Q1581.571 928 1581.571 1003Q1581.571 1077.1429 1549.7853 1136.0714Q1517.9996 1195 1462.9996 1228.5Q1407.9996 1262 1337.9995 1262Q1281.8564 1262 1240.2133 1241.0713Q1198.5703 1220.1425 1172.5703 1182.5708V1470ZM1309.2859 1148.7159Q1350.2863 1148.7159 1382.1437 1129.7157Q1414.0011 1110.7155 1431.8584 1077.7866Q1449.7157 1044.8577 1449.7157 1002.8571Q1449.7157 959.9995 1431.8584 926.5705Q1414.0011 893.1416 1382.1437 874.2129Q1350.2863 855.2841 1309.2859 855.2841Q1268.4285 855.2841 1236.9282 874.2129Q1205.4279 893.1416 1187.5706 926.142Q1169.7133 959.1423 1169.7133 1002Q1169.7133 1044.8577 1187.5706 1077.7866Q1205.4279 1110.7155 1236.9282 1129.7157Q1268.4285 1148.7159 1309.2859 1148.7159Z M1848.7148 1262Q1778.8575 1262 1723.4289 1228Q1668.0004 1194 1636.2147 1134.5714Q1604.429 1075.1429 1604.429 1001Q1604.429 926 1636.2147 867.5Q1668.0004 809 1723.5004 775.5Q1779.0004 742 1848.8577 742Q1905.0007 742 1946.7152 762.9287Q1988.4297 783.8575 2013.4297 821.4292V530H2143.4279V1250H2013.4297V1179.4281Q1990.2869 1212.1425 1950.7152 1237.0713Q1911.1436 1262 1848.7148 1262ZM1876.7141 1148.7159Q1917.7144 1148.7159 1949.1432 
4181129.7157Q1980.5721 1110.7155 1998.4294 1077.358Q2016.2867 1044.0005 2016.2867 1002Q2016.2867 959.1423 1998.4294 926.142Q1980.5721 893.1416 1949.1432 874.2129Q1917.7144 855.2841 1876.7141 855.2841Q1836.7137 855.2841 1804.7849 874.2129Q1772.856 893.1416 1754.9987 925.7134Q1737.1414 958.2852 1737.1414 1001.1429Q1737.1414 1044.0005 1754.9987 1077.358Q1772.856 1110.7155 1804.7849 1129.7157Q1836.7137 1148.7159 1876.7141 1148.7159Z M2375.7146 1262Q2319.7144 1262 2279.5715 1241.8571Q2239.4286 1221.7142 2218.143 1187.6428Q2196.8573 1153.5714 2196.8573 1113Q2196.8573 1035.2856 2252.9288 992.7141Q2309.0004 950.1427 2400.0005 950.1427Q2442.7148 950.1427 2474.0006 956.2141Q2505.2865 962.2856 2524.858 968.5714V945Q2524.858 892.9995 2495.3578 868.9276Q2465.8577 844.8558 2419.4286 844.8558Q2386.2852 844.8558 2360.3563 858.2132Q2334.4274 871.5706 2327.1416 906.2854H2204.4288Q2210.4288 853.1425 2240.1432 816.5712Q2269.8575 779.9998 2316.6432 760.9999Q2363.4288 742 2419.4286 742Q2530.1427 742 2592.4995 795.0715Q2654.8562 848.1431 2654.8562 945V1057.1445Q2654.8562 1094.8588 2659.3562 1113.0016Q2663.8562 1131.1443 2674.0705 1135.93Q2684.2849 1140.7157 2700.8564 1140.7157H2705.4279V1250H2676.7141Q2623.8571 1250 2588.7859 1235.9999Q2553.7146 1221.9998 2538.0005 1181.1423Q2512.5721 1216.1425 2471.6435 1239.0713Q2430.715 1262 2375.7146 1262ZM2404.9996 1162.5726Q2437.0002 1162.5726 2459.7149 1148.1437Q2482.4296 1133.7148 2497.2154 1108.5714Q2512.0013 1083.4281 2518.0011 1052.9991Q2497.4296 1046.8562 2469.6436 1041.2848Q2441.8577 1035.7133 2413.5717 1035.7133Q2375.2847 1035.7133 2351.5701 1053.428Q2327.8555 1071.1427 2327.8555 1102.4288Q2327.8555 1128.5721 2348.5701 1145.5724Q2369.2847 1162.5726 2404.9996 1162.5726Z M2731.5721 1470V1367.1442H2838.1432Q2853.0004 1367.1442 2862.8575 1363.4298Q2872.7146 1359.7155 2881.786 1348.0011Q2890.8575 1336.2867 2901.429 1311.0007L2943.8582 1217.5708L2937.4296 1274.9989L2721.1438 754H2862.2847L3000 1100.573L3143.5726 754H3282.4277L3018.1418 1355.7141Q3001.7131 1392.5714 2989.5703 1415.3571Q2977.4274 1438.1429 2965.1417 1449.7143Q2952.856 1461.2858 2936.2847 1465.6429Q2919.7133 1470 2894.4277 1470Z" fill="currentColor"></path> </svg> <small>Internal Developer Platform</small> </a></li> <li><a class="flex items-center min-h-11 py-3 md:py-4" href="/zopcloud"> <svg class="mob-nav-mark" viewBox="-1125 530 5062.43 952" role="img" aria-label="zopcloud" focusable="false"> <rect x="-1125" y="530" width="952" height="952" fill="var(--logo-green, #7
418FB236)"></rect>  <rect x="-768" y="768" width="238" height="178.5" fill="#FFFFFF"></rect> <rect x="-946.5" y="946.5" width="595" height="297.5" fill="#FFFFFF"></rect>  <path d="M27.0005 1250V1145.7157L279.1443 861.7128H30.2863V754H427.4279V858.2843L171.8557 1142.2872H432.4279V1250Z M732.8571 1262Q658.2858 1262 598.2859 1229.1429Q538.2859 1196.2858 503.2146 1137.3572Q468.1432 1078.4286 468.1432 1001.9838Q468.1432 924.5714 503.286 866.1428Q538.4288 807.7142 598.9287 774.8571Q659.4286 742 733.1311 742Q807.8571 742 867.7856 774.8571Q927.7141 807.7142 962.7854 866.1428Q997.8568 924.5714 997.8568 1001.9838Q997.8568 1078.4286 962.714 1137.3572Q927.5712 1196.2858 867.5713 1229.1429Q807.5714 1262 732.8571 1262ZM732.7416 1149.7159Q769.0004 1149.7159 798.8578 1133.2157Q828.7153 1116.7155 846.4298 1083.8986Q864.1443 1051.0816 864.1443 1002.4093Q864.1443 952.9995 846.0727 920.142Q828.0011 887.2845 798.5722 870.7843Q769.1432 854.2841 733.5714 854.2841Q697.9996 854.2841 667.9998 870.9116Q638 887.539 619.9278 920.055Q601.8557 952.5709 601.8557 1002.0838Q601.8557 1050.8577 619.5702 1083.7866Q637.2847 1116.7155 667.2537 1133.2157Q697.2227 1149.7159 732.7416 1149.7159Z M1042.5721 1470V754H1172.5703V824.5719Q1196.5703 791.7146 1236.2133 766.8573Q1275.8564 742 1338.1423 742Q1407.9996 742 1462.9996 776Q1517.9996 810 1549.7853 869Q1581.571 928 1581.571 1003Q1581.571 1077.1429 1549.7853 1136.0714Q1517.9996 1195 1462.9996 1228.5Q1407.9996 1262 1337.9995 1262Q1281.8564 1262 1240.2133 1241.0713Q1198.5703 1220.1425 1172.5703 1182.5708V1470ZM1309.2859 1148.7159Q1350.2863 1148.7159 1382.1437 1129.7157Q1414.0011 1110.7155 1431.8584 1077.7866Q1449.7157 1044.8577 1449.7157 1002.8571Q1449.7157 959.9995 1431.8584 926.5705Q1414.0011 893.1416 1382.1437 874.2129Q1350.2863 855.2841 1309.2859 855.2841Q1268.4285 855.2841 1236.9282 874.2129Q1205.4279 893.1416 1187.5706 926.142Q1169.7133 959.1423 1169.7133 1002Q1169.7133 1044.8577 1187.5706 1077.7866Q1205.4279 1110.7155 1236.9282 1129.7157Q1268.4285 1148.7159 1309.2859 1148.7159Z M1864 1262Q1788.1431 1262 1729.6432 
4181228.6429Q1671.1432 1195.2858 1637.7861 1136.7858Q1604.429 1078.2858 1604.429 1002Q1604.429 925.5714 1637.7861 867.1428Q1671.1432 808.7142 1729.6432 775.3571Q1788.1431 742 1864 742Q1958.7141 742 2023.6424 791.7141Q2088.5708 841.4283 2107.1422 928.285H1970.287Q1961.0013 893.7131 1931.9295 873.5701Q1902.8577 853.427 1863.1429 853.427Q1828.5712 853.427 1799.7137 871.2129Q1770.8562 888.9987 1754.0703 921.8562Q1737.2843 954.7137 1737.2843 1002Q1737.2843 1048.2863 1754.0703 1082.0724Q1770.8562 1115.8584 1799.7137 1133.6443Q1828.5712 1151.4301 1863.1429 1151.4301Q1902.8577 1151.4301 1931.9295 1131.7156Q1961.0013 1112.0011 1970.287 1075.715H2107.1422Q2089.5708 1159.7146 2024.1424 1210.8573Q1958.7141 1262 1864 1262Z M2152.0009 1250V530H2281.9991V1250Z M2590.8571 1262Q2516.2858 1262 2456.2859 1229.1429Q2396.2859 1196.2858 2361.2146 1137.3572Q2326.1432 1078.4286 2326.1432 1001.9838Q2326.1432 924.5714 2361.286 866.1428Q2396.4288 807.7142 2456.9287 774.8571Q2517.4286 742 2591.1311 742Q2665.8571 742 2725.7856 774.8571Q2785.7141 807.7142 2820.7854 866.1428Q2855.8568 924.5714 2855.8568 1001.9838Q2855.8568 1078.4286 2820.714 1137.3572Q2785.5712 1196.2858 2725.5713 1229.1429Q2665.5714 1262 2590.8571 1262ZM2590.7416 1149.7159Q2627.0004 1149.7159 2656.8578 1133.2157Q2686.7153 1116.7155 2704.4298 1083.8986Q2722.1443 1051.0816 2722.1443 1002.4093Q2722.1443 952.9995 2704.0727 920.142Q2686.0011 887.2845 2656.5722 870.7843Q2627.1432 854.2841 2591.5714 854.2841Q2555.9996 854.2841 2525.9998 870.9116Q2496 887.539 2477.9278 920.055Q2459.8557 952.5709 2459.8557 1002.0838Q2459.8557 1050.8577 2477.5702 1083.7866Q2495.2847 1116.7155 2525.2537 1133.2157Q2555.2227 1149.7159 2590.7416 1149.7159Z M3074.1438 1262Q2989.144 1262 2939.7868 1203.5716Q2890.4296 1145.1432 2890.4296 1033.2861V754H3019.5706V1021.0005Q3019.5706 1085.0011 3044.0709 1118.5727Q3068.5712 1152.1443 3116.1429 1152.1443Q3168.7148 1152.1443 3198.0008 1114.7154Q3227.2869 1077.2865 3227.2869 1010.1429V754H3357.285V1250H3227.2869V1177.1425Q3205.2869 1216.2856 3167.1439 1239.1428Q3129.0009 1262 3074.1438 1262Z M3642.7148 1262Q3572.8575 1262 3517.4289 1228Q3462.0004 1194 3430.2147 1134.5714Q3398.429 1075.1429 3398.429 1001Q3398.429 926 3430.2147 867.5Q3462.0004 809 3517.5004 775.5Q3573.0004 742 3642.8577 742Q3699.0007 742 3740.7152 762.9287Q3782.4297 783.8575 3807.4297 821.4292V530H3937.4279V1250H3807.4297V1179.4281Q3784.2869 1212.1425 3744.7152 1237.0713Q3705.1436 1262 3642.7148 1262ZM3670.7141 1148.7159Q3711.7144 1148.7159 3743.1432 1129.7157Q3774.5721 1110.7155 3792.4294 1077.358Q3810.2867 1044.0005 3810.2867 1002Q3810.2867 959.1423 3792.4294 926.142Q3774.5721 893.1416 3743.1432 874.2129Q3711.7144 855.2841 3670.7141 855.2841Q3630.7137 855.2841 3598.7849 874.2129Q3566.856 893.1416 3548.9987 925.7134Q3531.1414 958.2852 3531.1414 1001.1429Q3531.1414 1044.0005 3548.9987 1077.358Q3566.856 1110.7155 3598.7849 1129.7157Q3630.7137 1148.7159 3670.7141 1148.7159Z" fill="currentColor"></path> </svg> <small>Push repo, get a URL</small> </a></li> </ul> </details> <!-- SOLUTIONS · expandable. Grouped as the ZopNight app groups them. --> <details class="mob-nav-group"> <summary class="flex items-center justify-between min-h-11 py-3 md:py-4"> <span>Solutions</span> <svg class="mob-nav-chev" width="14" height="14" viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.6" aria-hidden="true"><path d="M3 5 L6 8 L9 5"></path></svg> </summary> <ul class="flex flex-col gap-1 md:gap-2 py-1"> <li class="mob-nav-subhead" aria-hidden="true"><span>Estate</span></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/architecture">Architecture<small>See what breaks before you touch it</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/globe-view">Globe view<small>Your whole estate, on one globe</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/auto-tagging">Auto tagging<small>Untagged resources, attributed anyway</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/resource-discovery">Resource discovery<small>Every resource, every cloud</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/ownership-detection">Ownership detection<small>
418Who built it, and are they here</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/cloud-accounts">Cloud accounts<small>Connect six platforms securely</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/openshift">OpenShift<small>ROSA clusters, connected properly</small></a></li> <li class="mob-nav-subhead" aria-hidden="true"><span>Automate</span></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/schedules">Schedules<small>Nothing runs at 3am unless you said so</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/overrides">Overrides<small>Keep it running. Just not forever.</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/resource-groups">Resource groups<small>Start a stack in the right order</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/auto-scaling">Auto Scaling<small>Autoscaling you can hand over gradually</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/event-readiness">Event Readiness<small>Scale up for the sale, before the sale</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/auto-remediation">Auto-remediation<small>Findings fixed from the product</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/notifications">Notifications<small>Slack, Teams, Google Chat, webhooks</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/integrations">Integrations<small>Clouds, data platforms, Kubernetes, repos</small></a></li> <li class="mob-nav-subhead" aria-hidden="true"><span>Cost</span></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/cost-report">Cost Report<small>Every dollar, traced to what spent it</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/showback">Showback<small>Spend by team and by tag</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/team-budgets">Team budgets<small>Budgets tracked against live spend</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/unit-economics">Unit economics<small>Cost per customer, order or call</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/anomaly-detection">Anomaly detection<small>Spend spikes, with the likely cause</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/dashboards">Dashboards<small>Presets, or build your own</small></a></li> <li class="mob-nav-subhead" aria-hidden="true"><span>Govern</span></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/access-control">Access control<small>Roles scoped to single resources</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/audit-log">Audit log<small>Every change, request and response</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/iac-governance">IaC governance<small>Policy on every Terraform plan</small></a></li> <li class="mob-nav-subhead" aria-hidden="true"><span>AI</span></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/ai-gateway">AI Gateway<small>A hard budget on every LLM key</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/mcp-server">MCP server<small>Claude, Cursor and Codex, fenced in</small></a></li> <li class="mob-nav-subhead" aria-hidden="true"><span>Recommendations</span></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/recommendations">Recommendations<small>Savings you can audit</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/rules">Rule catalogue<small>447 checks, each with the fix</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/zopnight/resources">Reports &amp; handbooks<small>Free, two fields to unlock</small></a></li> </ul> </details> <!-- OPEN SOURCE · expandable --> <details class="mob-nav-group"> <summary class="flex items-center justify-between min-h-11 py-3 md:py-4"> <span>Open Source</span> <svg class="mob-nav-chev" width="14" height="14" viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.6" aria-hidden="true"><path d="M3 5 L6 8 L9 5"></path></svg> </summary> <ul class="flex flex-col gap-1 md:gap-2 py-1"> <li><a class="flex items-center min-h-11 py-3 md:py-4" href="/zopcloud/oss"> <svg class="mob-nav-mark" viewBox="0 0 32 32" aria-hidden="true"><use href="#mark-zopcloud"></use></svg>
419zopcloud<small>A Deploy to ZopCloud button for your README</small> </a></li> <li><a class="flex items-center min-h-11 py-3 md:py-4" href="/zopday/oss"> <svg class="mob-nav-mark" viewBox="0 0 32 32" aria-hidden="true"><use href="#mark-zopday"></use></svg>
420zopday<small>Deploy buttons for zopcloud or their own cloud</small> </a></li> </ul> </details> <!-- RESOURCES · expandable --> <details class="mob-nav-group"> <summary class="flex items-center justify-between min-h-11 py-3 md:py-4"> <span>Resources</span> <svg class="mob-nav-chev" width="14" height="14" viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.6" aria-hidden="true"><path d="M3 5 L6 8 L9 5"></path></svg> </summary> <ul class="flex flex-col gap-1 md:gap-2 py-1"> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/resources/blogs">Blog<small>Engineering + cost notes</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/resources/ebooks">Ebooks<small>Free playbooks</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/resources/university">University<small>Certifications</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/changelog">Changelog<small>What shipped this week</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/developer-docs">Developer docs<small>APIs, SDKs &amp; integrations</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/docs">Product docs<small>Guides &amp; how-tos</small></a></li> </ul> </details> <!-- PRICING · single link --> <a class="mob-nav-link" href="/pricing">Pricing</a> <!-- COMPANY · expandable --> <details class="mob-nav-group"> <summary class="flex items-center justify-between min-h-11 py-3 md:py-4"> <span>Company</span> <svg class="mob-nav-chev" width="14" height="14" viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.6" aria-hidden="true"><path d="M3 5 L6 8 L9 5"></path></svg> </summary> <ul class="flex flex-col gap-1 md:gap-2 py-1"> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/about">About<small>Founded 2024</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/media-kit">Media Kit<small>Logos, brand files</small></a></li> <li><a class="flex flex-col justify-center min-h-11 py-3 md:py-4" href="/contact">Contact<small>Talk to sales</small></a></li> </ul> </details> <!-- COMMUNITY · single link -->   <!-- PLAYGROUND · expandable --> <details class="mob-nav-group"> <summary class="flex items-center justify-between min-h-11 py-3 md:py-4"> <span>Playground</span> <svg class="mob-nav-chev" width="14" height="14" viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.6" aria-hidden="true"><path d="M3 5 L6 8 L9 5"></path></svg> </summary> <ul class="flex flex-col gap-1 md:gap-2 py-1"> <li><a class="flex items-center min-h-11 py-3 md:py-4" href="/zopnight/playground"> <svg class="mob-nav-mark" viewBox="0 0 32 32" aria-hidden="true"> <rect x="0" y="0" width="32" height="32" fill="#2A4494"></rect> <circle cx="16" cy="16" r="8" fill="#FFFFFF"></circle> </svg>
421zopnight playground<small>Cost loop &middot; idle, schedules, anomalies</small> </a></li> <li><a class="flex items-center min-h-11 py-3 md:py-4" href="/zopday/playground"> <svg class="mob-nav-mark" viewBox="0 0 32 32" aria-hidden="true"> <rect x="0" y="0" width="32" height="32" fill="#F58549"></rect> <circle cx="16" cy="16" r="8" fill="#FFFFFF"></circle> </svg>
422zopday playground<small>Deploy loop &middot;
422 clusters, datastores, push</small> </a></li> </ul> </details> </nav> <div class="mob-nav-foot"> <a href="/zopnight/app/signin" class="inline-flex items-center justify-center gap-sp-2 font-mono font-bold tracking-[-0.02em] cursor-pointer transition-[background-color,border-color,color] duration-150 disabled:opacity-60 disabled:cursor-not-allowed whitespace-nowrap py-[13px] px-[22px] text-t-14 leading-[22px] bg-transparent text-ink border border-line hover:bg-[var(--btn-outline-tint)] hover:border-ink mob-nav-foot-cta">Sign In</a> <a href="https://bookings.zop.dev/#/discover-zopdev" class="inline-flex items-center justify-center gap-sp-2 font-mono font-bold tracking-[-0.02em] cursor-pointer transition-[background-color,border-color,color] duration-150 disabled:opacity-60 disabled:cursor-not-allowed whitespace-nowrap py-[13px] px-[22px] text-t-14 leading-[22px] bg-zop-orange !text-zop-black font-bold border border-zop-orange hover:bg-[var(--btn-fill-orange-hover)] hover:border-[var(--btn-fill-orange-hover)] mob-nav-foot-cta" target="_blank" rel="noopener noreferrer"><span>Book a Demo</span> <span aria-hidden="true">&rarr;</span></a> </div> </aside> 
422<script type="module">(function(){var n=document.getElementById("mob-nav-toggle"),t=document.getElementById("mob-nav-drawer"),a=document.getElementById("mob-nav-scrim"),o=document.getElementById("mob-nav-close");if(!n||!t||t.dataset.drawerWired==="1")return;t.dataset.drawerWired="1";var e=null;function l(){e=document.activeElement,t.classList.add("open"),t.removeAttribute("aria-hidden"),t.removeAttribute("inert"),a&&(a.classList.add("open"),a.removeAttribute("aria-hidden")),n.setAttribute("aria-expanded","true"),n.setAttribute("aria-label","Close menu"),document.body.style.overflow="hidden"}function d(){t.classList.remove("open"),t.setAttribute("inert",""),t.setAttribute("aria-hidden","true"),a&&(a.classList.remove("open"),a.setAttribute("aria-hidden","true")),n.setAttribute("aria-expanded","false"),n.setAttribute("aria-label","Open menu"),document.body.style.overflow="",e&&typeof e.focus=="function"&&e.focus()}function i(){t.classList.contains("open")?d():l()}n.addEventListener("click",i),a&&a.addEventListener("click",d),o&&o.addEventListener("click",d),document.addEventListener("keydown",function(s){s.key==="Escape"&&t.classList.contains("open")&&d()}),t.querySelectorAll("a[href]").forEach(function(s){s.addEventListener("click",function(){setTimeout(d,40)})});var r=window.matchMedia("(max-width: 899.98px)");function c(){!r.matches&&t.classList.contains("open")&&d()}r.addEventListener?r.addEventListener("change",c):r.addListener&&r.addListener(c)})();(function(){var n=document.querySelector(".nav");if(!n||n.dataset.scrollHideWired==="1")return;n.dataset.scrollHideWired="1";function t(){return document.body&&document.body.classList.contains("docs-page")}if(t()&&n.classList.remove("nav--hidden"),!document.getElementById("zd-navscroll-css")){var a=document.createElement("style");a.id="zd-navscroll-css",a.textContent=".nav{transition:transform .24s cubic-bezier(.65,0,.35,1), background-color var(--dur-md,.4s) var(--ease-in-out,cubic-bezier(.65,0,.35,1)), border-color var(--dur-md,.4s) var(--ease-in-out,cubic-bezier(.65,0,.35,1))}.nav.nav--hidden{transform:translateY(-110%)}",document.head.appendChild(a)}var o=0,e=0,l=72,d=10,i=!1,r=!1;function c(){r=!1;var s=window.pageYOffset,u=s-o;if(o=s,t()){i&&(n.classList.remove("nav--hidden"),i=!1),e=0;return}if(s<=0){i&&(n.classList.remove("nav--hidden"),i=!1),e=0;return}if(u>0){if(e=(e>0?e:0)+u,!i&&e>l){var v=document.getElementById("nav-overlay");v&&v.classList.remove("open"),n.classList.add("nav--hidden"),i=!0,e=0}}else e=(e<0?e:0)+u,i&&Math.abs(e)>d&&(n.classList.remove("nav--hidden"),i=!1,e=0)}window.addEventListener("scroll",function(){r||(requestAnimationFrame(c),r=!0)},{passive:!0})})();</script>
422    <main class="page" id="main-content" tabindex="-1"> <header class="page-head"> <div class="meta">pricing · transparent</div> <h1>Pricing that scales with your <em>savings,</em> not your headcount.</h1> <p class="lede text-base sm:text-lg md:text-xl">A percentage of your cloud spend. <strong>Free under $2,000/mo. 5% above.</strong> Not per user. Not per seat. Not per account. If your cloud grows, we grow with you — never faster.</p> </header> <!-- ================================================================
423       01 · PRICING TIERS
424       ================================================================ --> <section> <div class="inner"> <header class="bd-unprose flex flex-col gap-sp-4 pb-sp-6 mb-sp-12 border-b border-line items-start"> <div class="sec-meta"><span>01 · plans</span></div> <div class="w-full flex flex-col md:flex-row md:items-end md:justify-between gap-sp-4 md:gap-sp-12"> <h2 class="m-0 font-bold text-[clamp(28px,3.2vw,44px)] leading-[1.1] tracking-[-0.03em] text-ink max-w-[720px]">Three tiers. One principle.</h2> <p class="m-0 text-t-15 text-ink-3 leading-[1.55] max-w-[360px] md:text-right md:mb-sp-2 shrink-0">Start free under $2,000/mo cloud spend. Scale when your cloud scales. Bring every account, every team, every user — the only pricing variable is what your cloud actually costs.</p> </div>  </header> <!-- Product switcher · same component as the homepage. ZopNight is
425           live; ZopDay + ZopCloud panes show a waitlist CTA until launch. --> <div class="prod-switch" role="tablist" aria-label="Pricing by product"> <button class="ps-tab is-active" type="button" role="tab" data-product="zopnight" aria-selected="true" aria-controls="pricing-zopnight"> <svg class="ps-logo h-4 w-auto block flex-shrink-0" viewBox="-1125 530 4943.43 952" role="img" aria-label="zopnight" focusable="false"> <rect x="-1125" y="530" width="952" height="952" fill="var(--logo-blue, #2A4494)"></rect> <circle cx="-649" cy="1006" r="238" fill="#FFFFFF"></circle> <path d="M27.0005 1250V1145.7157L279.1443 861.7128H30.2863V754H427.4279V858.2843L171.8557 1142.2872H432.4279V1250Z M732.8571 1262Q658.2858 1262 598.2859 1229.1429Q538.2859 1196.2858 503.2146 1137.3572Q468.1432 1078.4286 468.1432 1001.9838Q468.1432 924.5714 503.286 866.1428Q538.4288 807.7142 598.9287 774.8571Q659.4286 742 733.1311 742Q807.8571 742 867.7856 774.8571Q927.7141 807.7142 962.7854 866.1428Q997.8568 924.5714 997.8568 1001.9838Q997.8568 1078.4286 962.714 1137.3572Q927.5712 1196.2858 867.5713 1229.1429Q807.5714 1262 732.8571 1262ZM732.7416 1149.7159Q769.0004 1149.7159 798.8578 1133.2157Q828.7153 1116.7155 846.4298 1083.8986Q864.1443 1051.0816 864.1443 1002.4093Q864.1443 952.9995 846.0727 920.142Q828.0011 887.2845 798.5722 870.7843Q769.1432 854.2841 733.5714 854.2841Q697.9996 854.2841 667.9998 870.9116Q638 887.539 619.9278 920.055Q601.8557 952.5709 601.8557 1002.0838Q601.8557 1050.8577 619.5702 1083.7866Q637.2847 1116.7155 667.2537 1133.2157Q697.2227 1149.7159 732.7416 1149.7159Z M1042.5721 1470V754H1172.5703V824.5719Q1196.5703 791.7146 1236.2133 766.8573Q1275.8564 742 1338.1423 742Q1407.9996 742 1462.9996 776Q1517.9996 810 1549.7853 869Q1581.571 928 1581.571 1003Q1581.571 1077.1429 1549.7853 1136.0714Q1517.9996 1195 1462.9996 1228.5Q1407.9996 1262 1337.9995 1262Q1281.8564 1262 1240.2133 1241.0713Q1198.5703 1220.1425 1172.5703 1182.5708V1470ZM1309.2859 1148.7159Q1350.2863 1148.7159 1382.1437 1129.7157Q1414.0011 1110.7155 1431.8584 1077.7866Q1449.7157 1044.8577 1449.7157 1002.8571Q1449.7157 959.9995 1431.8584 926.5705Q1414.0011 893.1416 1382.1437 874.2129Q1350.2863 855.2841 1309.2859 855.2841Q1268.4285 855.2841 1236.9282 874.2129Q1205.4279 893.1416 1187.5706 926.142Q1169.7133 959.1423 1169.7133 1002Q1169.7133 1044.8577 1187.5706 1077.7866Q1205.4279 1110.7155 1236.9282 1129.7157Q1268.4285 1148.7159 1309.2859 1148.7159Z M1623.7151 1250V754H1753.7133V828.8575Q1777.8562 788.8573 1819.8563 765.4286Q1861.8564 742 1917.7135 742Q2010.5704 742 2060.9991 800.4284Q2111.4277 858.8568 2111.4277 970.7139V1250H1981.4296V982.9995Q1981.4296 918.9989 1955.5007 885.4273Q1929.5719 851.8557 1874.8573 851.8557Q1822.2854 851.8557 1787.9994 889.2846Q1753.7133 926.7135 1753.7133 993.8571V1250Z M2173.1438 1250V754H2303.142V1250ZM2176.0004 671.8566V545.7144H2301.7139V671.8566Z M2636.8568 1482Q2573.4281 1482 2515.7854 1461.1428Q2458.1427 1440.2856 2418.0714 1395.7857Q2378.0002 1351.2858 2369.5715 1281.429H2498.5697Q2507.8557 1321.858 2545.2846 1345.7155Q2582.7135 1369.573 2634.2854 1369.573Q2671.7144 1369.573 2703.35
42576 1353.9299Q2735.0007 1338.2869 2753.858 1306.5722Q2772.7153 1274.8575 2772.7153 1226.1427V1163.9995Q2757.5724 1187.8568 2733.9295 1207.9284Q2710.2865 1228 2677.7149 1240.2859Q2645.1432 1252.5717 2602.7144 1252.5717Q2532.0002 1252.5717 2475.4287 1219.0003Q2418.8573 1185.4288 2386.2144 1127.2859Q2353.5715 1069.1431 2353.5715 996.7144Q2353.5715 924.2858 2386.2144 866.6429Q2418.8573 809 2475.4287 775.5Q2532.0002 742 2602.8573 742Q2659.8577 742 2703.7151 765.3574Q2747.5724 788.7148 2772.7153 823.2865V754H2902.7135V1219.2858Q2902.7135 1305.2856 2866.4279 1363.7856Q2830.1423 1422.2856 2769.7139 1452.1428Q2709.2854 1482 2636.8568 1482ZM2628.8568 1140.1447Q2671.5714 1140.1447 2703.3574 1121.1445Q2735.1434 1102.1443 2753.2151 1069.9297Q2771.2867 1037.715 2771.2867 997.5715Q2771.2867 956.4281 2753.2151 924.3563Q2735.1434 892.2845 2703.3574 873.7843Q2671.5714 855.2841 2628.8568 855.2841Q2586.9993 855.2841 2554.7847 873.7843Q2522.5701 892.2845 2504.4984 923.9277Q2486.4268 955.571 2486.4268 996.7144Q2486.4268 1036.8578 2504.4984 1069.5011Q2522.5701 1102.1443 2554.7847 1121.1445Q2586.9993 1140.1447 2628.8568 1140.1447Z M2964.1436 1250V530H3094.1418V829.1432Q3118.4276 789.0002 3161.4991 765.5001Q3204.5706 742 3259.4277 742Q3351.1418 742 3401.499 800.4284Q3451.8562 858.8568 3451.8562 970.7139V1250H3322.858V982.9995Q3322.858 918.9989 3297.5721 885.4273Q3272.2861 851.8557 3217.5715 851.8557Q3164.1425 851.8557 3129.1422 889.2846Q3094.1418 926.7135 3094.1418 993.8571V1250Z M3715.8564 1250Q3665.8568 1250 3631.6427 1238.2858Q3597.4286 1226.5715 3580.0716 1193.2146Q3562.7146 1159.8577 3562.7146 1097.1438V862.8557H3477.5717V754H3562.7146V621.0005H3692.7128V754H3818.4277V862.8557H3692.7128V1080.7153Q3692.7128 1105.5728 3697.7842 1118.1443Q3702.8557 1130.7159 3716.7843 1135.073Q3730.713 1139.4301 3755.2847 1139.4301H3814.5704V1250Z" fill="currentColor"></path> </svg> <span class="ps-status live">live</span> </button> <button class="ps-tab" type="button" role="tab" data-product="zopday" aria-selected="false" aria-controls="pricing-zopday" tabindex="-1"> <svg class="ps-logo h-4 w-auto block flex-shrink-0" viewBox="-1125 530 4407.43 952" role="img" aria-label="zopday" focusable="false"> <rect x="-1125" y="530" width="952" height="952" fill="var(--zop-orange, #F58549)"></rect> <circle cx="-649" cy="1006" r="238" fill="#FFFFFF"></circle> <path d="M27.0005 1250V1145.7157L279.1443 861.7128H30.2863V754H427.4279V858.2843L171.8557 1142.2872H432.4279V1250Z M732.8571 1262Q658.2858 1262 598.2859 1229.1429Q538.2859 1196.2858 503.2146 1137.3572Q468.1432 1078.4286 468.1432 1001.9838Q468.1432 924.5714 503.286 866.1428Q538.4288 807.7142 598.9287 774.8571Q659.4286 742 733.1311 742Q807.8571 742 867.7856 774.8571Q927.7141 807.7142 962.7854 866.1428Q997.8568 924.5714 997.8568 1001.9838Q997.8568 1078.4286 962.714 1137.3572Q927.5712 1196.2858 867.5713 1229.1429Q807.5714 1262 732.8571 1262ZM732.7416 1149.7159Q769.0004 1149.7159 798.8578 1133.2157Q828.7153 1116.7155 846.4298 1083.8986Q864.1443 1051.0816 864.1443 1002.4093Q864.1443 952.9995 846.0727 920.142Q828.0011 887.2845 798.5722 870.7843Q769.1432 854.2841 733.5714 854.2841Q697.9996 854.2841 667.9998 870.9116Q638 887.539 619.9278 920.055Q601.8557 952.5709 601.8557 1002.0838Q601.8557 1050.8577 619.5702 1083.7866Q637.2847 1116.7155 667.2537 1133.2157Q697.2227 1149.7159 732.7416 1149.7159Z M1042.5721 1470V754H1172.5703V824.5719Q1196.5703 791.7146 1236.2133 766.8573Q1275.8564 742 1338.1423 742Q1407.9996 742 1462.9996 776Q1517.9996 810 1549.7853 869Q1581.571 928 1581.571 1003Q1581.571 1077.1429 1549.7853 1136.0714Q1517.9996 1195 1462.9996 1228.5Q1407.9996 1262 1337.9995 1262Q1281.8564 1262 1240.2133 1241.0713Q1198.5703 1220.1425 1172.5703 1182.5708V1470ZM1309.2859 1148.7159Q1350.2863 1148.7159 1382.1437 1129.7157Q1414.0011 1110.7155 1431.8584 1077.7866Q1449.7157 1044.8577 1449.7157 1002.8571Q1449.7157 959.9995 1431.8584 926.5705Q1414.0011 893.1416 1382.1437 874.2129Q1350.2863 855.2841 1309.2859 855.2841Q1268.4285 855.2841 1236.9282 874.2129Q1205.4279 893.1416 1187.5706 926.142Q1169.7133 959.1423 1169.7133 1002Q1169.7133 1044.8577 1187.5706 1077.7866Q1205.4279 1110.7155 1236.9282 1129.7157Q1268.4285 1148.7159 1309.2859 1148.7159Z M1848.7148 1262Q1778.8575 1262 1723.4289 1228Q1668.0004 1194 1636.2147 1134.5714Q1604.429 1075.1429 1604.429 1001Q1604.429 926 1636.2147 867.5Q1668.0004 809 1723.5004 775.5Q1779.0004 742 1848.8577 742Q1905.0007 742 1946.7152 762.9287Q1988.4297 783.8575 2013.4297 821.4292V530H2143.4279V1250H2013.4297V1179.4281Q1990.2869 1212.1425 1950.7152 1237.0713Q1911.1436 1262 1848.7148 1262ZM1876.7141 1148.7159Q1917.7144 1148.7159 1949.1432 
4251129.7157Q1980.5721 1110.7155 1998.4294 1077.358Q2016.2867 1044.0005 2016.2867 1002Q2016.2867 959.1423 1998.4294 926.142Q1980.5721 893.1416 1949.1432 874.2129Q1917.7144 855.2841 1876.7141 855.2841Q1836.7137 855.2841 1804.7849 874.2129Q1772.856 893.1416 1754.9987 925.7134Q1737.1414 958.2852 1737.1414 1001.1429Q1737.1414 1044.0005 1754.9987 1077.358Q1772.856 1110.7155 1804.7849 1129.7157Q1836.7137 1148.7159 1876.7141 1148.7159Z M2375.7146 1262Q2319.7144 1262 2279.5715 1241.8571Q2239.4286 1221.7142 2218.143 1187.6428Q2196.8573 1153.5714 2196.8573 1113Q2196.8573 1035.2856 2252.9288 992.7141Q2309.0004 950.1427 2400.0005 950.1427Q2442.7148 950.1427 2474.0006 956.2141Q2505.2865 962.2856 2524.858 968.5714V945Q2524.858 892.9995 2495.3578 868.9276Q2465.8577 844.8558 2419.4286 844.8558Q2386.2852 844.8558 2360.3563 858.2132Q2334.4274 871.5706 2327.1416 906.2854H2204.4288Q2210.4288 853.1425 2240.1432 816.5712Q2269.8575 779.9998 2316.6432 760.9999Q2363.4288 742 2419.4286 742Q2530.1427 742 2592.4995 795.0715Q2654.8562 848.1431 2654.8562 945V1057.1445Q2654.8562 1094.8588 2659.3562 1113.0016Q2663.8562 1131.1443 2674.0705 1135.93Q2684.2849 1140.7157 2700.8564 1140.7157H2705.4279V1250H2676.7141Q2623.8571 1250 2588.7859 1235.9999Q2553.7146 1221.9998 2538.0005 1181.1423Q2512.5721 1216.1425 2471.6435 1239.0713Q2430.715 1262 2375.7146 1262ZM2404.9996 1162.5726Q2437.0002 1162.5726 2459.7149 1148.1437Q2482.4296 1133.7148 2497.2154 1108.5714Q2512.0013 1083.4281 2518.0011 1052.9991Q2497.4296 1046.8562 2469.6436 1041.2848Q2441.8577 1035.7133 2413.5717 1035.7133Q2375.2847 1035.7133 2351.5701 1053.428Q2327.8555 1071.1427 2327.8555 1102.4288Q2327.8555 1128.5721 2348.5701 1145.5724Q2369.2847 1162.5726 2404.9996 1162.5726Z M2731.5721 1470V1367.1442H2838.1432Q2853.0004 1367.1442 2862.8575 1363.4298Q2872.7146 1359.7155 2881.786 1348.0011Q2890.8575 1336.2867 2901.429 1311.0007L2943.8582 1217.5708L2937.4296 1274.9989L2721.1438 754H2862.2847L3000 1100.573L3143.5726 754H3282.4277L3018.1418 1355.7141Q3001.7131 1392.5714 2989.5703 1415.3571Q2977.4274 1438.1429 2965.1417 1449.7143Q2952.856 1461.2858 2936.2847 1465.6429Q2919.7133 1470 2894.4277 1470Z" fill="currentColor"></path> </svg> <span class="ps-status">soon</span> </button> <button class="ps-tab" type="button" role="tab" data-product="zopcloud" aria-selected="false" aria-controls="pricing-zopcloud" tabindex="-1"> <svg class="ps-logo h-4 w-auto block flex-shrink-0" viewBox="-1125 530 5062.43 952" role="img" aria-label="zopcloud" focusable="false"> <rect x="-1125" y="530" width="952" height="952" fill="var(--logo-green, #7
425FB236)"></rect>  <rect x="-768" y="768" width="238" height="178.5" fill="#FFFFFF"></rect> <rect x="-946.5" y="946.5" width="595" height="297.5" fill="#FFFFFF"></rect>  <path d="M27.0005 1250V1145.7157L279.1443 861.7128H30.2863V754H427.4279V858.2843L171.8557 1142.2872H432.4279V1250Z M732.8571 1262Q658.2858 1262 598.2859 1229.1429Q538.2859 1196.2858 503.2146 1137.3572Q468.1432 1078.4286 468.1432 1001.9838Q468.1432 924.5714 503.286 866.1428Q538.4288 807.7142 598.9287 774.8571Q659.4286 742 733.1311 742Q807.8571 742 867.7856 774.8571Q927.7141 807.7142 962.7854 866.1428Q997.8568 924.5714 997.8568 1001.9838Q997.8568 1078.4286 962.714 1137.3572Q927.5712 1196.2858 867.5713 1229.1429Q807.5714 1262 732.8571 1262ZM732.7416 1149.7159Q769.0004 1149.7159 798.8578 1133.2157Q828.7153 1116.7155 846.4298 1083.8986Q864.1443 1051.0816 864.1443 1002.4093Q864.1443 952.9995 846.0727 920.142Q828.0011 887.2845 798.5722 870.7843Q769.1432 854.2841 733.5714 854.2841Q697.9996 854.2841 667.9998 870.9116Q638 887.539 619.9278 920.055Q601.8557 952.5709 601.8557 1002.0838Q601.8557 1050.8577 619.5702 1083.7866Q637.2847 1116.7155 667.2537 1133.2157Q697.2227 1149.7159 732.7416 1149.7159Z M1042.5721 1470V754H1172.5703V824.5719Q1196.5703 791.7146 1236.2133 766.8573Q1275.8564 742 1338.1423 742Q1407.9996 742 1462.9996 776Q1517.9996 810 1549.7853 869Q1581.571 928 1581.571 1003Q1581.571 1077.1429 1549.7853 1136.0714Q1517.9996 1195 1462.9996 1228.5Q1407.9996 1262 1337.9995 1262Q1281.8564 1262 1240.2133 1241.0713Q1198.5703 1220.1425 1172.5703 1182.5708V1470ZM1309.2859 1148.7159Q1350.2863 1148.7159 1382.1437 1129.7157Q1414.0011 1110.7155 1431.8584 1077.7866Q1449.7157 1044.8577 1449.7157 1002.8571Q1449.7157 959.9995 1431.8584 926.5705Q1414.0011 893.1416 1382.1437 874.2129Q1350.2863 855.2841 1309.2859 855.2841Q1268.4285 855.2841 1236.9282 874.2129Q1205.4279 893.1416 1187.5706 926.142Q1169.7133 959.1423 1169.7133 1002Q1169.7133 1044.8577 1187.5706 1077.7866Q1205.4279 1110.7155 1236.9282 1129.7157Q1268.4285 1148.7159 1309.2859 1148.7159Z M1864 1262Q1788.1431 1262 1729.6432 
4251228.6429Q1671.1432 1195.2858 1637.7861 1136.7858Q1604.429 1078.2858 1604.429 1002Q1604.429 925.5714 1637.7861 867.1428Q1671.1432 808.7142 1729.6432 775.3571Q1788.1431 742 1864 742Q1958.7141 742 2023.6424 791.7141Q2088.5708 841.4283 2107.1422 928.285H1970.287Q1961.0013 893.7131 1931.9295 873.5701Q1902.8577 853.427 1863.1429 853.427Q1828.5712 853.427 1799.7137 871.2129Q1770.8562 888.9987 1754.0703 921.8562Q1737.2843 954.7137 1737.2843 1002Q1737.2843 1048.2863 1754.0703 1082.0724Q1770.8562 1115.8584 1799.7137 1133.6443Q1828.5712 1151.4301 1863.1429 1151.4301Q1902.8577 1151.4301 1931.9295 1131.7156Q1961.0013 1112.0011 1970.287 1075.715H2107.1422Q2089.5708 1159.7146 2024.1424 1210.8573Q1958.7141 1262 1864 1262Z M2152.0009 1250V530H2281.9991V1250Z M2590.8571 1262Q2516.2858 1262 2456.2859 1229.1429Q2396.2859 1196.2858 2361.2146 1137.3572Q2326.1432 1078.4286 2326.1432 1001.9838Q2326.1432 924.5714 2361.286 866.1428Q2396.4288 807.7142 2456.9287 774.8571Q2517.4286 742 2591.1311 742Q2665.8571 742 2725.7856 774.8571Q2785.7141 807.7142 2820.7854 866.1428Q2855.8568 924.5714 2855.8568 1001.9838Q2855.8568 1078.4286 2820.714 1137.3572Q2785.5712 1196.2858 2725.5713 1229.1429Q2665.5714 1262 2590.8571 1262ZM2590.7416 1149.7159Q2627.0004 1149.7159 2656.8578 1133.2157Q2686.7153 1116.7155 2704.4298 1083.8986Q2722.1443 1051.0816 2722.1443 1002.4093Q2722.1443 952.9995 2704.0727 920.142Q2686.0011 887.2845 2656.5722 870.7843Q2627.1432 854.2841 2591.5714 854.2841Q2555.9996 854.2841 2525.9998 870.9116Q2496 887.539 2477.9278 920.055Q2459.8557 952.5709 2459.8557 1002.0838Q2459.8557 1050.8577 2477.5702 1083.7866Q2495.2847 1116.7155 2525.2537 1133.2157Q2555.2227 1149.7159 2590.7416 1149.7159Z M3074.1438 1262Q2989.144 1262 2939.7868 1203.5716Q2890.4296 1145.1432 2890.4296 1033.2861V754H3019.5706V1021.0005Q3019.5706 1085.0011 3044.0709 1118.5727Q3068.5712 1152.1443 3116.1429 1152.1443Q3168.7148 1152.1443 3198.0008 1114.7154Q3227.2869 1077.2865 3227.2869 1010.1429V754H3357.285V1250H3227.2869V1177.1425Q3205.2869 1216.2856 3167.1439 1239.1428Q3129.0009 1262 3074.1438 1262Z M3642.7148 1262Q3572.8575 1262 3517.4289 1228Q3462.0004 1194 3430.2147 1134.5714Q3398.429 1075.1429 3398.429 1001Q3398.429 926 3430.2147 867.5Q3462.0004 809 3517.5004 775.5Q3573.0004 742 3642.8577 742Q3699.0007 742 3740.7152 762.9287Q3782.4297 783.8575 3807.4297 821.4292V530H3937.4279V1250H3807.4297V1179.4281Q3784.2869 1212.1425 3744.7152 1237.0713Q3705.1436 1262 3642.7148 1262ZM3670.7141 1148.7159Q3711.7144 1148.7159 3743.1432 1129.7157Q3774.5721 1110.7155 3792.4294 1077.358Q3810.2867 1044.0005 3810.2867 1002Q3810.2867 959.1423 3792.4294 926.142Q3774.5721 893.1416 3743.1432 874.2129Q3711.7144 855.2841 3670.7141 855.2841Q3630.7137 855.2841 3598.7849 874.2129Q3566.856 893.1416 3548.9987 925.7134Q3531.1414 958.2852 3531.1414 1001.1429Q3531.1414 1044.0005 3548.9987 1077.358Q3566.856 1110.7155 3598.7849 1129.7157Q3630.7137 1148.7159 3670.7141 1148.7159Z" fill="currentColor"></path> </svg> <span class="ps-status">soon</span> </button> </div> <div class="pricing-panes"> <div class="tiers-grid" id="pricing-zopnight" role="tabpanel" data-product="zopnight"> <div class="relative flex flex-col gap-sp-5 p-sp-10 bg-bg-1 border border-line" data-astro-cid-dd5txfcy><div class="flex flex-col gap-sp-3" data-astro-cid-dd5txfcy><h3 class="font-mono text-t-11 tracking-meta uppercase text-ink-4 m-0" data-astro-cid-dd5txfcy>Starter</h3><div class="flex items-baseline gap-sp-2" data-astro-cid-dd5txfcy><span class="text-[clamp(32px,3.6vw,52px)] font-bold tracking-heading leading-none text-ink tabular-nums" data-astro-cid-dd5txfcy>Free</span></div><p class="text-t-14 text-ink-3 leading-body m-0 min-h-[5.5rem] sm:min-h-[5rem]" data-astro-cid-dd5txfcy>Free while your cloud stays under $2,000/mo cloud spend. The full platform, no card required, no per-seat billing, no features gated.</p></div><div class="h-px w-full bg-line" aria-hidden="true" data-astro-cid-dd5txfcy></div><div class="font-mono text-t-11 uppercase tracking-meta-tight text-ink-5" data-astro-cid-dd5txfcy>What&#39;s included</div><ul class="pricing-tier__features flex flex-col gap-sp-3 list-none p-0 m-0" data-featured="false" data-astro-cid-dd5txfcy><li class="flex items-start gap-sp-3 text-t-14 text-ink-3 leading-body" data-astro-cid-dd5txfcy><span aria-hidden="true" class="pricing-tier__check w-[14px] h-[14px] mt-[4px] shrink-0 bg-no-repeat bg-center bg-contain" data-astro-cid-dd5txfcy></span><span data-astro-cid-dd5txfcy>Every capability zopnight ships — no feature gates</span></li><li class="flex items-start gap-sp-3 text-t-14 text-ink-3 leading-body" data-astro-cid-dd5txfcy><span aria-hidden="true" class="pricing-tier__check w-[14px] h-[14px] mt-[4px] shrink-0 bg-no-repeat bg-center bg-contain" data-astro-cid-dd5txfcy></span><span data-astro-cid-dd5txfcy>Unlimited cloud accounts across AWS, Azure, GCP</span></li><li class="flex items-start gap-sp-3 text-t-14 text-ink-3 leading-body" data-astro-cid-dd5txfcy><span aria-hidden="true" class="pricing-tier__check w-[14px] h-[14px] mt-[4px] shrink-0 bg-no-repeat bg-center bg-contain" data-astro-cid-dd5txfcy></span><span data-astro-cid-dd5txfcy>Unlimited automated remediations</span></li><li class="flex items-start gap-sp-3 text-t-14 text-ink-3 leading-body" data-astro-cid-dd5txfcy><span aria-hidden="true" class="pricing-tier__check w-[14px] h-[14px] mt-[4px] shrink-0 bg-no-repeat bg-center bg-contain" data-astro-cid-dd5txfcy></span><span data-astro-cid-dd5txfcy>30-day activity history</span></li><li class="flex items-start gap-sp-3 text-t-14 text-ink-3 leading-body" data-astro-cid-dd5txfcy><span aria-hidden="true" class="pricing-tier__check w-[14px] h-[14px] mt-[4px] shrink-0 bg-no-repeat bg-center bg-contain" data-astro-cid-dd5txfcy></span><span data-astro-cid-dd5txfcy>Atlas inventory, Recommendations, Schedule, Showback</span></li><li class="flex items-start gap-sp-3 text-t-14 text-ink-3 leading-body" data-astro-cid-dd5txfcy><span aria-hidden="true" class="pricing-tier__check w-[14px] h-[14px] mt-[4px] shrink-0 bg-no-repeat bg-center bg-contain" data-astro-cid-dd5txfcy></span><span data-astro-cid-dd5txfcy>MCP Server, Slack &amp; PagerDuty, API + webhooks</span></li><li class="flex items-start gap-sp-3 text-t-14 text-ink-3 leading-body" data-astro-cid-dd5txfcy><span aria-hidden="true" class="pricing-tier__check w-[14px] h-[14px] mt-[4px] shrink-0 bg-no-repeat bg-center bg-contain" data-astro-cid-dd5txfcy></span><span data-astro-cid-dd5txfcy>SSO / SAML 2.0 + OIDC, RBAC, unlimited users</span></li></ul><div class="mt-auto pt-sp-2" data-astro-cid-dd5txfcy><a href="/zopnight/app/signin" class="inline-flex items-center justify-center gap-sp-2 font-mono font-bold tracking-[-0.02em] cursor-pointer transition-[background-color,border-color,color] duration-150 disabled:opacity-60 disabled:cursor-not-allowed whitespace-nowrap py-[13px] px-[22px] text-t-14 leading-[22px] bg-transparent text-ink border border-line hover:bg-[var(--btn-outline-tint)] hover:border-ink w-full" data-astro-cid-dd5txfcy="true">Start Now →</a></div></div> <div class="relative flex flex-col gap-sp-5 p-sp-10 bg-bg-1 border-2 border-zop-orange shadow-[6px_6px_0_0_var(--color-zop-orange)] z-10 -m-px" data-astro-cid-dd5txfcy><span class="absolute -top-[14px] left-sp-8 bg-zop-orange text-[var(--ink)] font-mono font-bold text-t-10 tracking-meta uppercase px-3 py-[3px]" data-astro-cid-dd5txfcy>Most popular</span><div class="flex flex-col gap-sp-3" data-astro-cid-dd5txfcy><h3 class="font-mono text-t-11 tracking-meta uppercase text-ink-4 m-0" data-astro-cid-dd5txfcy>Pro</h3><div class="flex items-baseline gap-sp-2" data-astro-cid-dd5txfcy><span class="text-[clamp(32px,3.6vw,52px)] font-bold tracking-heading leading-none text-ink tabular-nums" data-astro-cid-dd5txfcy>5%</span><span class="font-mono text-t-12 text-ink-4 tracking-meta-tight" data-astro-cid-dd5txfcy>
425of cloud spend</span></div><p class="text-t-14 text-ink-3 leading-body m-0 min-h-[5.5rem] sm:min-h-[5rem]" data-astro-cid-dd5txfcy>Kicks in the month your cloud crosses $2,000. Pricing indexed to what your cloud actually costs — never per user, never per seat, never per account.</p></div><div class="h-px w-full bg-line" aria-hidden="true" data-astro-cid-dd5txfcy></div><div class="font-mono text-t-11 uppercase tracking-meta-tight text-ink-5" data-astro-cid-dd5txfcy>Everything in Starter, plus</div><ul class="pricing-tier__features flex flex-col gap-sp-3 list-none p-0 m-0" data-featured="true" data-astro-cid-dd5txfcy><li class="flex items-start gap-sp-3 text-t-14 text-ink-3 leading-body" data-astro-cid-dd5txfcy><span aria-hidden="true" class="pricing-tier__check w-[14px] h-[14px] mt-[4px] shrink-0 bg-no-repeat bg-center bg-contain" data-astro-cid-dd5txfcy></span><span data-astro-cid-dd5txfcy>5% of your monthly cloud spend, measured across every connected account</span></li><li class="flex items-start gap-sp-3 text-t-14 text-ink-3 leading-body" data-astro-cid-dd5txfcy><span aria-hidden="true" class="pricing-tier__check w-[14px] h-[14px] mt-[4px] shrink-0 bg-no-repeat bg-center bg-contain" data-astro-cid-dd5txfcy></span><span data-astro-cid-dd5txfcy>6-month activity history for audit trails and cost back-fills</span></li><li class="flex items-start gap-sp-3 text-t-14 text-ink-3 leading-body" data-astro-cid-dd5txfcy><span aria-hidden="true" class="pricing-tier__check w-[14px] h-[14px] mt-[4px] shrink-0 bg-no-repeat bg-center bg-contain" data-astro-cid-dd5txfcy></span><span data-astro-cid-dd5txfcy>Monthly invoiced billing</span></li><li class="flex items-start gap-sp-3 text-t-14 text-ink-3 leading-body" data-astro-cid-dd5txfcy><span aria-hidden="true" class="pricing-tier__check w-[14px] h-[14px] mt-[4px] shrink-0 bg-no-repeat bg-center bg-contain" data-astro-cid-dd5txfcy></span><span data-astro-cid-dd5txfcy>Cancel any time — no annual commitment, no lock-in</span></li><li class="flex items-start gap-sp-3 text-t-14 text-ink-3 leading-body" data-astro-cid-dd5txfcy><span aria-hidden="true" class="pricing-tier__check w-[14px] h-[14px] mt-[4px] shrink-0 bg-no-repeat bg-center bg-contain" data-astro-cid-dd5txfcy></span><span data-astro-cid-dd5txfcy>Priority email support</span></li></ul><div class="mt-auto pt-sp-2" data-astro-cid-dd5txfcy><a href="/zopnight/app/signin" class="inline-flex items-center justify-center gap-sp-2 font-mono font-bold tracking-[-0.02em] cursor-pointer transition-[background-color,border-color,color] duration-150 disabled:opacity-60 disabled:cursor-not-allowed whitespace-nowrap py-[13px] px-[22px] text-t-14 leading-[22px] bg-zop-orange !text-zop-black font-bold border border-zop-orange hover:bg-[var(--btn-fill-orange-hover)] hover:border-[var(--btn-fill-orange-hover)] w-full" data-astro-cid-dd5txfcy="true">Start Now →</a></div></div> <div class="relative flex flex-col gap-sp-5 p-sp-10 bg-bg-1 border border-line" data-astro-cid-dd5txfcy><div class="flex flex-col gap-sp-3" data-astro-cid-dd5txfcy><h3 class="font-mono text-t-11 tracking-meta uppercase text-ink-4 m-0" data-astro-cid-dd5txfcy>Enterprise</h3><div class="flex items-baseline gap-sp-2" data-astro-cid-dd5txfcy><span class="text-[clamp(32px,3.6vw,52px)] font-bold tracking-heading leading-none text-ink tabular-nums" data-astro-cid-dd5txfcy>Custom</span></div><p class="text-t-14 text-ink-3 leading-body m-0 min-h-[5.5rem] sm:min-h-[5rem]" data-astro-cid-dd5txfcy>For teams above $50,000/mo cloud spend and regulated estates that need self-hosted, volume pricing, and named support.</p></div><div class="h-px w-full bg-line" aria-hidden="true" data-astro-cid-dd5txfcy></div><div class="font-mono text-t-11 uppercase tracking-meta-tight text-ink-5" data-astro-cid-dd5txfcy>Everything in Pro, plus</div><ul class="pricing-tier__features flex flex-col gap-sp-3 list-none p-0 m-0" data-featured="false" data-astro-cid-dd5txfcy><li class="flex items-start gap-sp-3 text-t-14 text-ink-3 leading-body" data-astro-cid-dd5txfcy><span aria-hidden="true" class="pricing-tier__check w-[14px] h-[14px] mt-[4px] shrink-0 bg-no-repeat bg-center bg-contain" data-astro-cid-dd5txfcy></span><span data-astro-cid-dd5txfcy>Volume pricing — blended rate below 5% at scale</span></li><li class="flex items-start gap-sp-3 text-t-14 text-ink-3 leading-body" data-astro-cid-dd5txfcy><span aria-hidden="true" class="pricing-tier__check w-[14px] h-[14px] mt-[4px] shrink-0 bg-no-repeat bg-center bg-contain" data-astro-cid-dd5txfcy></span><span data-astro-cid-dd5txfcy>Self-hosted deployment for regulated or air-gapped estates</span></li><li class="flex items-start gap-sp-3 text-t-14 text-ink-3 leading-body" data-astro-cid-dd5txfcy><span aria-hidden="true" class="pricing-tier__check w-[14px] h-[14px] mt-[4px] shrink-0 bg-no-repeat bg-center bg-contain" data-astro-cid-dd5txfcy></span><span data-astro-cid-dd5txfcy>Custom activity retention (up to 2 years)</span></li><li class="flex items-start gap-sp-3 text-t-14 text-ink-3 leading-body" data-astro-cid-dd5txfcy><span aria-hidden="true" class="pricing-tier__check w-[14px] h-[14px] mt-[4px] shrink-0 bg-no-repeat bg-center bg-contain" data-astro-cid-dd5txfcy></span><span data-astro-cid-dd5txfcy>Dedicated Customer Success Manager</span></li><li class="flex items-start gap-sp-3 text-t-14 text-ink-3 leading-body" data-astro-cid-dd5txfcy><span aria-hidden="true" class="pricing-tier__check w-[14px] h-[14px] mt-[4px] shrink-0 bg-no-repeat bg-center bg-contain" data-astro-cid-dd5txfcy></span><span data-astro-cid-dd5txfcy>AWS, Azure &amp; GCP Marketplace billing</span></li><li class="flex items-start gap-sp-3 text-t-14 text-ink-3 leading-body" data-astro-cid-dd5txfcy><span aria-hidden="true" class="pricing-tier__check w-[14px] h-[14px] mt-[4px] shrink-0 bg-no-repeat bg-center bg-contain" data-astro-cid-dd5txfcy></span><span data-astro-cid-dd5txfcy>Shared Slack channel with our engineering team</span></li></ul><div class="mt-auto pt-sp-2" data-astro-cid-dd5txfcy><a href="https://bookings.zop.dev/#/discover-zopdev" class="inline-flex items-center justify-center gap-sp-2 font-mono font-bold tracking-[-0.02em] cursor-pointer transition-[background-color,border-color,color] duration-150 disabled:opacity-60 disabled:cursor-not-allowed whitespace-nowrap py-[13px] px-[22px] text-t-14 leading-[22px] border-0 bg-ink !text-bg-0 hover:bg-[var(--btn-fill-ink-hover)] w-full" target="_blank" rel="noopener noreferrer" data-astro-cid-dd5txfcy="true">Talk to Sales →</a></div></div> </div> <div class="pricing-soon" id="pricing-zopday" role="tabpanel" data-product="zopday" hidden> <svg class="ps-soon-mark" viewBox="0 0 32 32" aria-hidden="true"><rect width="32" height="32" fill="#F58549"></rect><circle cx="16" cy="16" r="8" fill="#FFFFFF"></circle></svg> <h3>zopday pricing · coming soon.</h3> <p class="lede">Internal Developer Platform across AWS, GCP, Azure. We're tuning pricing alongside the private preview so the first published tiers reflect what teams actually use, not what we'd guess at.</p> <span class="ps-eta">private preview · h2 2026</span> <div class="ps-waitlist"> <div class="esc esc-strip w-full" data-email-subscribe data-form-id="waitlist-zopday-form" data-e
425sc-endpoint="pricing-waitlist" data-esc-campaign="zopday-waitlist" data-esc-success="You're on the zopday waitlist — we will notify you." data-esc-consent="0" data-esc-already-label="✓ on the waitlist" data-esc-already-msg="You're already on the zopday waitlist." data-esc-default-label="Join the Waitlist →" data-astro-cid-qzbwtgpp> <form id="waitlist-zopday-form" class="flex gap-sp-2 items-stretch max-[560px]:flex-col w-full" novalidate data-esc-form data-astro-cid-qzbwtgpp> <div class="field flex-1"> <label for="waitlist-zopday-email" class="sr-only">Email address</label>   <input type="email" id="waitlist-zopday-email" name="email" placeholder="[email protected]" required aria-required="true" aria-describedby="waitlist-zopday-msg" autocomplete="email" class="text-base sm:text-sm px-[14px] py-[12px] w-full font-sans transition-[border-color,box-shadow,background-color] duration-150 bg-white/5 border-[1.5px] border-white/35 text-[color:var(--ink)] focus:border-zop-orange focus:ring-2 focus:ring-zop-orange/20 focus:outline-none aria-invalid:border-red-400 aria-invalid:focus:shadow-[0_0_0_3px_rgba(248,113,113,0.25)]">   </div> <button type="submit" class="inline-flex items-center justify-center gap-sp-2 font-mono font-bold tracking-[-0.02em] cursor-pointer transition-[background-color,border-color,color] duration-150 disabled:opacity-60 disabled:cursor-not-allowed whitespace-nowrap py-sp-3 px-sp-5 text-t-13 bg-zop-orange !text-zop-black font-bold border border-zop-orange hover:bg-[var(--btn-fill-orange-hover)] hover:border-[var(--btn-fill-orange-hover)] max-[560px]:w-full" id="waitlist-zopday-btn" data-esc-btn="true" data-astro-cid-qzbwtgpp="true">Join the Waitlist →</button> </form>     <p class="ps-learn-row"><a class="ps-learn" href="/zopday">Learn More About <span class="brand-lc">zopday</span> →</a></p>  <p id="waitlist-zopday-msg" class="esc-msg text-t-12 font-mono tracking-[var(--ls-meta-tight)] min-h-[1.2em]" role="status" aria-live="polite" data-esc-msg data-astro-cid-qzbwtgpp></p> </div> 
425<script type="module" src="/_astro/EmailSubscribe.astro_astro_type_script_index_0_lang.DkfBUBwb.js"></script>
425 </div> </div> <div class="pricing-soon" id="pricing-zopcloud" role="tabpanel" data-product="zopcloud" hidden> <svg class="ps-soon-mark" viewBox="0 0 32 32" aria-hidden="true"><use href="#mark-zopcloud"></use></svg> <h3>zopcloud pricing · coming soon.</h3> <p class="lede">A live multi-cloud resource graph across AWS, GCP, and Azure. Pricing will track resources mapped, not seats. Same model as zopnight, separate plan lines.</p> <span class="ps-eta">private preview · h2 2026</span> <div class="ps-waitlist"> <div class="esc esc-strip w-full" data-email-subscribe data-form-id="waitlist-zopcloud-form" data-esc-endpoint="pricing-waitlist" data-esc-campaign="zopcloud-waitlist" data-esc-success="You're on the zopcloud waitlist — we will notify you." data-esc-consent="0" data-esc-already-label="✓ on the waitlist" data-esc-already-msg="You're already on the zopcloud waitlist." data-esc-default-label="Join the Waitlist →" data-astro-cid-qzbwtgpp> <form id="waitlist-zopcloud-form" class="flex gap-sp-2 items-stretch max-[560px]:flex-col w-full" novalidate data-esc-form data-astro-cid-qzbwtgpp> <div class="field flex-1"> <label for="waitlist-zopcloud-email" class="sr-only">Email address</label>   <input type="email" id="waitlist-zopcloud-email" name="email" placeholder="[email protected]" required aria-required="true" aria-describedby="waitlist-zopcloud-msg" autocomplete="email" class="text-base sm:text-sm px-[14px] py-[12px] w-full font-sans transition-[border-color,box-shadow,background-color] duration-150 bg-white/5 border-[1.5px] border-white/35 text-[color:var(--ink)] focus:border-zop-orange focus:ring-2 focus:ring-zop-orange/20 focus:outline-none aria-invalid:border-red-400 aria-invalid:focus:shadow-[0_0_0_3px_rgba(248,113,113,0.25)]">   </div> <button type="submit" class="inline-flex items-center justify-center gap-sp-2 font-mono font-bold tracking-[-0.02em] cursor-pointer transition-[background-color,border-color,color] duration-150 disabled:opacity-60 disabled:cursor-not-allowed whitespace-nowrap py-sp-3 px-sp-5 text-t-13 bg-zop-orange !text-zop-black font-bold border border-zop-orange hover:bg-[var(--btn-fill-orange-hover)] hover:border-[var(--btn-fill-orange-hover)] max-[560px]:w-full" id="waitlist-zopcloud-btn" data-esc-btn="true" data-astro-cid-qzbwtgpp="true">Join the Waitlist →</button> </form>     <p class="ps-learn-row"><a class="ps-learn" href="/zopcloud">Learn More About <span class="brand-lc">zopcloud</span> →</a></p>  <p id="waitlist-zopcloud-msg" class="esc-msg text-t-12 font-mono tracking-[var(--ls-meta-tight)] min-h-[1.2em]" role="status" aria-live="polite" data-esc-msg data-astro-cid-qzbwtgpp></p> </div>  </div> </div> </div> <p class="pricing-foot-note"> <strong class="text-ink">You don't pick a plan.</strong> Your tier is placed automatically each month based on the previous month's cloud spend across all connected accounts — under $2,000 stays on Starter, $2,000 to $50,000 moves to Pro at 5%, above $50,000 rolls into Enterprise. The month you cross a threshold, the new price applies on that month's invoice — nothing to click, nothing to upgrade.
426</p> <p class="pricing-foot-note">
427Percentage measured on total monthly cloud spend across all connected accounts. All amounts in USD. Cloud Marketplace billing available and counts toward your cloud commitment.
428</p> </div> </section> <!-- ================================================================
429       02 · FEATURE MATRIX
430       ================================================================ --> <section> <div class="inner"> <header class="bd-unprose flex flex-col gap-sp-4 pb-sp-6 mb-sp-12 border-b border-line items-start"> <div class="sec-meta"><span>02 · feature matrix</span></div> <div class="w-full flex flex-col md:flex-row md:items-end md:justify-between gap-sp-4 md:gap-sp-12"> <h2 class="m-0 font-bold text-[clamp(28px,3.2vw,44px)] leading-[1.1] tracking-[-0.03em] text-ink max-w-[720px]">Full feature comparison.</h2> <p class="m-0 text-t-15 text-ink-3 leading-[1.55] max-w-[360px] md:text-right md:mb-sp-2 shrink-0">Every capability across every tier, no asterisks, no footnotes, no surprises at renewal.</p> </div>  </header> <div class="matrix-wrap"> <div class="matrix-scroll overflow-x-auto"> <table class="matrix"> <thead> <tr> <th>Feature</th> <th class="col-plan">Starter</th> <th class="col-plan col-featured">Pro</th> <th class="col-plan">Enterprise</th> </tr> </thead> <tbody> <tr class="matrix-group"><td colspan="4"><span>Pricing</span></td></tr> <tr> <td class="feat-name">
430Cloud spend</td> <td class="col-plan"><span class="mc-mono">Up to $2,000/mo</span></td> <td class="col-plan"><span class="mc-mono is-featured">Above $2,000/mo</span></td> <td class="col-plan"><span class="mc-mono">Above $50,000/mo</span></td> </tr> <tr> <td class="feat-name">Price</td> <td class="col-plan"><span class="mc-mono">Free</span></td> <td class="col-plan"><span class="mc-mono is-featured">5% of cloud spend</span></td> <td class="col-plan"><span class="mc-mono">Custom</span></td> </tr> <tr> <td class="feat-name">Activity history retained</td> <td class="col-plan"><span class="mc-mono">30 days</span></td> <td class="col-plan"><span class="mc-mono is-featured">6 months</span></td> <td class="col-plan"><span class="mc-mono">Custom (up to 2y)</span></td> </tr> <tr class="matrix-group"><td colspan="4"><span>Platform · included on every tier</span></td></tr> <tr> <td class="feat-name">Unlimited cloud accounts (AWS, Azure, GCP)</td> <td class="col-plan"><span class="check text-zop-green text-t-15 font-bold">✓</span></td> <td class="col-plan"><span class="check-o text-zop-orange text-t-15 font-bold">✓</span></td> <td class="col-plan"><span class="check text-zop-green text-t-15 font-bold">✓</span></td> </tr> <tr> <td class="feat-name">Atlas inventory, full multi-cloud map</td> <td class="col-plan"><span class="check text-zop-green text-t-15 font-bold">✓</span></td> <td class="col-plan"><span class="check-o text-zop-orange text-t-15 font-bold">✓</span></td> <td class="col-plan"><span class="check text-zop-green text-t-15 font-bold">✓</span></td> </tr> <tr> <td class="feat-name">Recommendations feed</td> <td class="col-plan"><span class="check text-zop-green text-t-15 font-bold">✓</span></td> <td class="col-plan"><span class="check-o text-zop-orange text-t-15 font-bold">✓</span></td> <td class="col-plan"><span class="check text-zop-green text-t-15 font-bold">✓</span></td> </tr> <tr> <td class="feat-name">Unlimited automated remediations</td> <td class="col-plan"><span class="check text-zop-green text-t-15 font-bold">✓</span></td> <td class="col-plan"><span class="check-o text-zop-orange text-t-15 font-bold">✓</span></td> <td class="col-plan"><span class="check text-zop-green text-t-15 font-bold">✓</span></td> </tr> <tr> <td class="feat-name">Schedule (maintenance windows)</td> <td class="col-plan"><span class="check text-zop-green text-t-15 font-bold">✓</span></td> <td class="col-plan"><span class="check-o text-zop-orange text-t-15 font-bold">✓</span></td> <td class="col-plan"><span class="check text-zop-green text-t-15 font-bold">✓</span></td> </tr> <tr> <td class="feat-name">Showback (team cost reports)</td> <td class="col-plan"><span class="check text-zop-green text-t-15 font-bold">✓</span></td> <td class="col-plan"><span class="check-o text-zop-orange text-t-15 font-bold">✓</span></td> <td class="col-plan"><span class="check text-zop-green text-t-15 font-bold">✓</span></td> </tr> <tr> <td class="feat-name">MCP Server (Cursor, Claude, VS Code + 16 more)</td> <td class="col-plan"><span class="check text-zop-green text-t-15 font-bold">✓</span></td> <td class="col-plan"><span class="check-o text-zop-orange text-t-15 font-bold">✓</span></td> <td class="col-plan"><span class="check text-zop-green text-t-15 font-bold">✓</span></td> </tr> <tr> <td class="feat-name">Slack &amp; PagerDuty integration</td> <td class="col-plan"><span class="check text-zop-green text-t-15 font-bold">✓</span></td> <td class="col-plan"><span class="check-o text-zop-orange text-t-15 font-bold">✓</span></td> <td class="col-plan"><span class="check text-zop-green text-t-15 font-bold">✓</span></td> </tr> <tr> <td class="feat-name">RBAC (viewer / editor / admin)</td> <td class="col-plan"><span class="check text-zop-green text-t-15 font-bold">✓</span></td> <td class="col-plan"><span class="check-o text-zop-orange text-t-15 font-bold">✓</span></td> <td class="col-plan"><span class="check text-zop-green text-t-15 font-bold">✓</span></td> </tr> <tr> <td class="feat-name">SSO / SAML 2.0 + OIDC</td> <td class="col-plan"><span class="check text-zop-green text-t-15 font-bold">✓</span></td> <td class="col-plan"><span class="check-o text-zop-orange text-t-15 font-bold">✓</span></td> <td class="col-plan"><span class="check text-zop-green text-t-15 font-bold">✓</span></td> </tr> <tr> <td class="feat-name">REST API + webhooks</td> <td class="col-plan"><span class="check text-zop-green text-t-15 font-bold">✓</span></td> <td class="col-plan"><span class="check-o text-zop-orange text-t-15 font-bold">✓</span></td> <td class="col-plan"><span class="check text-zop-green text-t-15 font-bold">✓</span></td> </tr> <tr class="matrix-group"><td colspan="4"><span>Enterprise-tier only</span></td></tr> <tr> <td class="feat-name">Self-hosted deployment</td> <td class="col-plan"><span class="dash text-ink-5 text-t-15">·</span></td> <td class="col-plan"><span class="dash text-ink-5 text-t-15">·</span></td> <td class="col-plan"><span class="check text-zop-green text-t-15 font-bold">✓</span></td> </tr> <tr> <td class="feat-name">Dedicated Customer Success Manager</td> <td class="col-plan"><span class="dash text-ink-5 text-t-15">·</span></td> <td class="col-plan"><span class="dash text-ink-5 text-t-15">·</span></td> <td class="col-plan"><span class="check text-zop-green text-t-15 font-bold">✓</span></td> </tr> <tr> <td class="feat-name">Volume pricing across accounts</td> <td class="col-plan"><span class="dash text-ink-5 text-t-15">·</span></td> <td class="col-plan"><span class="dash text-ink-5 text-t-15">·</span></td> <td class="col-plan"><span class="check text-zop-green text-t-15 font-bold">✓</span></td> </tr> <tr> <td class="feat-name">AWS / Azure / GCP Marketplace billing</td> <td class="col-plan"><span class="dash text-ink-5 text-t-15">·</span></td> <td class="col-plan"><span class="dash text-ink-5 text-t-15">·</span></td> <td class="col-plan"><span class="check text-zop-green text-t-15 font-bold">✓</span></td> </tr> <tr> <td class="feat-name">Shared Slack channel with engineering</td> <td class="col-plan"><span class="dash text-ink-5 text-t-15">·</span></td> <td class="col-plan"><span class="dash text-ink-5 text-t-15">·</span></td> <td class="col-plan"><span class="check text-zop-green text-t-15 font-bold">✓</span></td> </tr> </tbody> </table> </div> </div> </div> </section> <!-- ════════════════════════════════════════════════════════════
431       TRUSTED BY · ported from homepage
432       ════════════════════════════════════════════════════════════ --> <section class="trust-marquee" aria-label="Customers"> <div class="tm-track"> <span class="tm-lg">Zopping</span> <span class="tm-lg">Linarc</span> <span class="tm-lg">
432Flexflow</span> <span class="tm-lg">ZopSmart</span> <span class="tm-lg">Pragmatic Leaders</span> <span class="tm-lg">Zopping</span> <span class="tm-lg">Linarc</span> <span class="tm-lg">Flexflow</span> <span class="tm-lg">ZopSmart</span> <span class="tm-lg">Pragmatic Leaders</span> <!-- Duplicate for seamless loop --> <span class="tm-lg" aria-hidden="true">Zopping</span> <span class="tm-lg" aria-hidden="true">Linarc</span> <span class="tm-lg" aria-hidden="true">Flexflow</span> <span class="tm-lg" aria-hidden="true">ZopSmart</span> <span class="tm-lg" aria-hidden="true">Pragmatic Leaders</span> <span class="tm-lg" aria-hidden="true">Zopping</span> <span class="tm-lg" aria-hidden="true">Linarc</span> <span class="tm-lg" aria-hidden="true">Flexflow</span> <span class="tm-lg" aria-hidden="true">ZopSmart</span> <span class="tm-lg" aria-hidden="true">Pragmatic Leaders</span> </div> </section> <!-- ════════════════════════════════════════════════════════════
433       FAQ · ported from homepage
434       ════════════════════════════════════════════════════════════ --> <section class="section" id="faq"> <div class="container"> <header class="bd-unprose flex flex-col gap-sp-4 pb-sp-6 mb-sp-12 border-b border-line items-start">  <div class="w-full flex flex-col md:flex-row md:items-end md:justify-between gap-sp-4 md:gap-sp-12"> <h2 class="m-0 font-bold text-[clamp(28px,3.2vw,44px)] leading-[1.1] tracking-[-0.03em] text-ink max-w-[720px]">Questions we get a lot.</h2> <p class="m-0 text-t-15 text-ink-3 leading-[1.55] max-w-[360px] md:text-right md:mb-sp-2 shrink-0">If yours isn&#39;t here, ask us directly.</p> </div>  </header> <div class="faq-list"> <details class="faq-item"> <summary> <span class="faq-q" role="heading" aria-level="3">Does zopnight require agent installation or code changes?</span> <span class="faq-chevron" aria-hidden="true">+</span> </summary> <div class="faq-body"> <p>No agents, no sidecars, no Terraform changes. zopnight connects through read-only cloud APIs. AWS, GCP, and Azure access is granted via IAM roles you provision once. Discovery starts in minutes, not days.</p> </div> </details><details class="faq-item"> <summary> <span class="faq-q" role="heading" aria-level="3">How quickly will I see findings?</span> <span class="faq-chevron" aria-hidden="true">+</span> </summary> <div class="faq-body"> <p>Most accounts see their first findings within 2–3 minutes of connecting. The initial scan covers all resources across regions. After that, zopnight runs continuously. New waste is surfaced as it appears, not on a daily batch.</p> </div> </details><details class="faq-item"> <summary> <span class="faq-q" role="heading" aria-level="3">What does &quot;one-click remediation&quot; actually do?</span> <span class="faq-chevron" aria-hidden="true">+</span> </summary> <div class="faq-body"> <p>When you click Fix →, zopnight calls the cloud provider API directly. Stopping an idle instance, deleting an orphaned volume, rightsizing a reservation. Every action is logged, reversible where the cloud allows it, and you can set approval workflows so nothing runs without a human sign-off.</p> </div> </details><details class="faq-item"> <summary> <span class="faq-q" role="heading" aria-level="3">Which clouds and services are supported?</span> <span class="faq-chevron" aria-hidden="true">+</span> </summary> <div class="faq-body"> <p>AWS, GCP, and Azure. Covering compute, storage, databases, networking, and Kubernetes across all regions. We add new service coverage every sprint. If you use something niche, <a href="https://bookings.zop.dev/#/discover-zopdev" target="_blank" rel="noopener noreferrer">tell us</a> and it's usually on the roadmap within a quarter.</p> </div> </details><details class="faq-item"> <summary> <span class="faq-q" role="heading" aria-level="3">Is my cloud data safe? What does zopnight read?</span> <span class="faq-chevron" aria-hidden="true">+</span> </summary> <div class="faq-body"> <p>zopnight operates with least-privilege read access plus the specific write permissions for remediation actions you explicitly enable. We never read application data, secrets, or user content. Only resource metadata and billing data. All data is encrypted in transit and at rest. SOC 2 Type II report available on request.</p> </div> </details>
434<details class="faq-item"> <summary> <span class="faq-q" role="heading" aria-level="3">Does it work alongside Terraform or other IaC tools?</span> <span class="faq-chevron" aria-hidden="true">+</span> </summary> <div class="faq-body"> <p>Yes. zopnight detects IaC-managed resources and marks them separately so you know which fixes should go through your Terraform pipeline versus which can be actioned directly. For IaC resources, we can generate a diff-ready Terraform snippet rather than acting directly.</p> </div> </details><details class="faq-item"> <summary> <span class="faq-q" role="heading" aria-level="3">How is zopnight priced?</span> <span class="faq-chevron" aria-hidden="true">+</span> </summary> <div class="faq-body"> <p>Free under $2,000/month cloud spend. 5% of your total cloud spend above that, measured across every connected account. Custom pricing kicks in above $50,000/month. Not per user, not per seat, not per account — the only variable is what your cloud actually costs. See full plans on the <a href="/pricing">pricing page</a>, or start free with the playground. No card required.</p> </div> </details> </div> </div> </section> <!-- ════════════════════════════════════════════════════════════
435       FINAL CTA · ported from homepage
436       ════════════════════════════════════════════════════════════ --> <section class="final">   <!--
437  CtaBlock — page-body component. Never place inside a layout slot —
438  Footer is owned by MarketingLayout (cf. footer-duplicate fix commit 60f5b91).
439--><section class="bg-[#0F0F12] text-[color:var(--color-paper)] pb-sp-24"><div class="container">   <div class="grid grid-cols-1 md:grid-cols-[2fr_1fr] gap-[60px] items-center"> <div class="flex flex-col items-start text-left min-w-0"> <h2 class="font-display font-bold tracking-[-0.04em] leading-[1] mb-sp-5 text-[clamp(36px,4vw,56px)] text-[color:var(--color-paper)]">Stop watching the waste.<br/>Start cutting it.</h2> <p class="text-[16px] leading-[1.55] max-w-[460px] mb-sp-7 text-[color:var(--color-paper)]">See. Find. Fix. Automatic.</p> <p class="text-[16px] leading-[1.55] max-w-[460px] mb-sp-7 text-[#B8B0A0]"> Connect your first cloud account in under 5 minutes. See your first remediation in under 7. No credit card required. </p> <div class="flex flex-wrap gap-sp-3"> <a class="btn btn-primary" href="/zopnight/app/signin">Start Free →</a><a class="btn btn-secondary" href="https://bookings.zop.dev/#/discover-zopdev" target="_blank" rel="noopener noreferrer">Book a Demo</a> </div> <div class="mt-sp-8 w-full grid grid-cols-1 md:grid-cols-3 gap-sp-5"> <div class="flex flex-col gap-1 pt-sp-4 border-t border-[rgba(240,235,219,.18)]"> <strong class="block font-mono font-semibold text-[18px] tracking-[-0.01em] text-[#F0EBDB]">free</strong> <span class="text-[13px] leading-[1.45] tracking-[0.05em] text-[rgba(240,235,219,.78)]">under $2,000/mo cloud spend</span> </div><div class="flex flex-col gap-1 pt-sp-4 border-t border-[rgba(240,235,219,.18)]"> <strong class="block font-mono font-semibold text-[18px] tracking-[-0.01em] text-[#F0EBDB]">5%</strong> <span class="text-[13px] leading-[1.45] tracking-[0.05em] text-[rgba(240,235,219,.78)]">of cloud spend, above</span> </div><div class="flex flex-col gap-1 pt-sp-4 border-t border-[rgba(240,235,219,.18)]"> <strong class="block font-mono font-semibold text-[18px] tracking-[-0.01em] text-[#F0EBDB]">cancel</strong> <span class="text-[13px] leading-[1.45] tracking-[0.05em] text-[rgba(240,235,219,.78)]">any time</span> </div> </div> </div> <div aria-hidden="true"></div> </div>  </div></section> <div aria-hidden="true" style="display:contents"> <astro-island uid="Z2mnD3s" prefix="r7" component-url="/_astro/TetrisCanvasIsland.BZjuOMl1.js" component-export="default" renderer-url="/_astro/client.bnjHR3qd.js" props="{}" ssr client="idle" opts="{&quot;name&quot;:&quot;TetrisCanvasIsland&quot;,&quot;value&quot;:true}" await-children>
439<canvas id="tet-canvas" aria-hidden="true"></canvas><!--astro:end--></astro-island> </div>  </section> </main> 
439<script>
440  (function(){
441    function fmt(n){
442      return '$' + Math.round(n).toLocaleString('en-US');
443    }
444
445    function calcUpdate(){
446      var acctEl = document.getElementById('acct-slider');
447      var spendEl = document.getElementById('spend-input');
448      var wasteEl = document.getElementById('waste-slider');
449      // Calculator widget markup is optional on this page · bail when absent
450      if (!acctEl || !spendEl || !wasteEl) return;
451
452      var accounts = parseInt(acctEl.value) || 5;
453      var spend = parseFloat(spendEl.value) || 80000;
454      var wastePct = parseInt(wasteEl.value) || 30;
455
456      var acctDisp = document.getElementById('acct-display');
457      var wastePctDisp = document.getElementById('waste-pct-display');
458      if (acctDisp) acctDisp.textContent = accounts;
459      if (wastePctDisp) wastePctDisp.textContent = wastePct + '%';
460
461      // Pricing bands (see /pricing tier cards):
462      //   spend < $2,000        → Free tier, $0 cost
463      //   $2,000 ≤ spend ≤ $50k → Pro tier, 5% of cloud spend
464      //   spend > $50,000       → Custom tier, contact sales
465      var waste = spend * (wastePct / 100);
466      var freeCap = 2000;
467      var customCap = 50000;
468      var isFree = spend < freeCap;
469      var isCustom = spend > customCap;
470      var zopCost = isFree ? 0 : (isCustom ? null : spend * 0.05);
471      var net = zopCost === null ? null : waste - zopCost;
472      var roi = zopCost && zopCost > 0 ? (net / zopCost).toFixed(1) : '∞';
473
474      var wasteDisp = document.getElementById('waste-display');
475      var wasteSub = document.getElementById('waste-sub');
476      if (wasteDisp) wasteDisp.textContent = fmt(waste);
477      if (wasteSub) wasteSub.textContent =
478        wastePct + '% of your ' + fmt(spend) + ' cloud spend';
479
480      var zopCostDisp = document.getElementById('zop-cost-display');
481      var zopCostSub = document.getElementById('zop-cost-sub');
482      if (zopCostDisp) {
483        if (isFree) zopCostDisp.textContent = 'Free';
484        else if (isCustom) zopCostDisp.textContent = 'Custom';
485        else zopCostDisp.textContent = fmt(zopCost);
486      }
487      if (zopCostSub) {
488        if (isFree) zopCostSub.textContent = 'Starter tier, cloud spend under $2,000/mo';
489        else if (isCustom) zopCostSub.textContent = 'Enterprise pricing, cloud spend above $50,000/mo';
490        else zopCostSub.textContent = fmt(spend) + ' cloud spend × 5%';
491      }
492
493      var netDisp = document.getElementById('net-savings-display');
494      var roiDisp = document.getElementById('roi-display');
495      if (netDisp) {
496        if (net === null) netDisp.textContent = 'Contact sales';
497        else netDisp.textContent = fmt(Math.max(0, net));
498      }
499      if (roiDisp) {
500        if (isFree) roiDisp.textContent = 'All waste recovered at zero cost';
501        else if (isCustom) roiDisp.textContent = 'Volume pricing quoted per estate';
502        else roiDisp.textContent = roi + '× return on zopnight investment';
503      }
504    }
505
506    function init(){
507      document.querySelectorAll('[data-year]').forEach(function(el){ el.textContent = new Date().getFullYear(); });
508      var ann = document.getElementById('ann-bar');
509      var btn = document.getElementById('ann-close');
510      if(ann && btn){
511        var key = 'zop-ann-2026-mcp';
512        try{ if(localStorage.getItem(key) === '1') ann.style.display = 'none'; }catch(e){}
513        btn.addEventListener('click', function(){
514          ann.style.display = 'none';
515          try{ localStorage.setItem(key, '1'); }catch(e){}
516        });
517      }
518      calcUpdate();
519    }
520    init();
521    document.addEventListener('astro:page-load', init);
522  })();
523</script>
523  
523<script>
524(function(){
525  function initTheme(){
526    /* Theme toggle */
527    var html = document.documentElement;
528    if(!html.getAttribute('data-theme')) html.setAttribute('data-theme','light');
529    var btn = document.getElementById('theme-toggle');
530    if(btn){
531        /* click handler moved to chrome-mobilenav.js (global) */
532    }
533  }
534  initTheme();
535  document.addEventListener('astro:page-load', initTheme);
536})();
537
538
539
540(function(){
541  var scrollHandler = null;
542  function initNavScroll(){
543    /* Nav scroll hide/show */
544    var nav = document.querySelector('.nav');
545    if(!nav) return;
546    var lastY = 0, delta = 0, hidden = false, ticking = false;
547    var HIDE_AT = 72, SHOW_AT = 10;
548    function update(){
549      ticking = false;
550      var y = window.pageYOffset;
551      var diff = y - lastY;
552      lastY = y;
553      if(y <= 0){
554        if(hidden){ nav.classList.remove('nav--hidden'); hidden = false; }
555        delta = 0; return;
556      }
557      if(diff > 0){
558        delta = (delta > 0 ? delta : 0) + diff;
559        if(!hidden && delta > HIDE_AT){
560          var ov = document.getElementById('nav-overlay');
561          if(ov) ov.classList.remove('open');
562          nav.classList.add('nav--hidden'); hidden = true; delta = 0;
563        }
564      } else {
565        delta = (delta < 0 ? delta : 0) + diff;
566        if(hidden && Math.abs(delta) > SHOW_AT){
567          nav.classList.remove('nav--hidden'); hidden = false; delta = 0;
568        }
569      }
570    }
571    if(scrollHandler){
572      window.removeEventListener('scroll', scrollHandler);
573    }
574    scrollHandler = function(){
575      if(!ticking){ requestAnimationFrame(update); ticking = true; }
576    };
577    window.addEventListener('scroll', scrollHandler, {passive:true});
578  }
579  initNavScroll();
580  document.addEventListener('astro:page-load', initNavScroll);
581  document.addEventListener('astro:before-swap', function(){
582    if(scrollHandler){
583      window.removeEventListener('scroll', scrollHandler);
584      scrollHandler = null;
585    }
586  });
587})();
588
589(function(){
590  var currentIO = null;
591  function initSectionReveal(){
592    /* Section reveal on scroll */
593    var sections = document.querySelectorAll('.section');
594    if(!sections.length || !('IntersectionObserver' in window)){
595      sections.forEach(function(s){ s.classList.add('in'); });
596      return;
597    }
598    if(currentIO){ currentIO.disconnect(); currentIO = null; }
599    var io = new IntersectionObserver(function(entries){
600      entries.forEach(function(e){
601        if(e.isIntersecting){ e.target.classList.add('in'); io.unobserve(e.target); }
602      });
603    }, {rootMargin:'-10% 0px -10% 0px', threshold:0.05});
604    sections.forEach(function(s){ io.observe(s); });
605    currentIO = io;
606  }
607  initSectionReveal();
608  document.addEventListener('astro:page-load', initSectionReveal);
609  document.addEventListener('astro:before-swap', function(){
610    if(currentIO){ currentIO.disconnect(); currentIO = null; }
611  });
612})();
613</script>
613 
613<script>
614
615/* Theme management for pricing · the simpler toggle handler lives
616   higher up in this file (line ~1641). The homepage's scroll-driven
617   three-band logic doesn't fit a subpage (no .features-bento anchor),
618   and bringing it in alongside the existing handler caused both to
619   fire on the same click, the two flips cancelled out and the toggle
620   appeared dead. Removed; the existing handler does the job. */
621
622(function(){
623  /* Module-scope state for cleanup across SPA navigations */
624  var pillarsScroll = null, pillarsResize = null;
625  var timelineScroll = null, timelineResize = null;
626  var statIORef = null;
627  var cliIORef = null;
628
629  /* =================================================================
630     PILLARS: scroll-pinned full-viewport chapters
631     ================================================================= */
632  function initPillars(){
633    var pin = document.getElementById('pillars-pin');
634    if(!pin) return;
635    var panels = pin.querySelectorAll('.pillar-panel');
636    var reduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
637    if(reduced){
638      panels.forEach(function(p){ p.classList.add('is-active'); });
639      return;
640    }
641    function setActive(idx){
642      panels.forEach(function(panel, i){
643        var active = i === idx;
644        panel.classList.toggle('is-active', active);
645        panel.querySelectorAll('.pp-tick').forEach(function(t, ti){
646          t.classList.toggle('is-on', ti === idx);
647        });
648      });
649    }
650    var ticking = false;
651    function update(){
652      ticking = false;
653      var r = pin.getBoundingClientRect();
654      var total = pin.offsetHeight - window.innerHeight;
655      var scrolled = Math.min(Math.max(-r.top, 0), total);
656      var p = total > 0 ? scrolled / total : 0;
657      var idx = p < 0.34 ? 0 : (p < 0.67 ? 1 : 2);
658      setActive(idx);
659    }
660    function onScroll(){ if(!ticking){ requestAnimationFrame(update); ticking=true; } }
661    if(pillarsScroll){ window.removeEventListener('scroll', pillarsScroll); }
662    if(pillarsResize){ window.removeEventListener('resize', pillarsResize); }
663    pillarsScroll = onScroll;
664    pillarsResize = onScroll;
665    window.addEventListener('scroll', pillarsScroll, {passive:true});
666    window.addEventListener('resize', pillarsResize);
667    update();
668  }
669
670  /* =================================================================
671     TIMELINE: scroll-pinned progression (Day 0 → 7 → 30)
672     ================================================================= */
673  function initTimeline(){
674    var pin = document.querySelector('.tl-pin');
675    if(!pin) return;
676    var fill  = pin.querySelector('.tl-rail-fill');
677    var cards = pin.querySelectorAll('.tl-card');
678    var steps = pin.querySelectorAll('.tl-step');
679    var colors = ['#2A4494', '#F58549', '#6da137']; // blue, orange, green
680    var reduced = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
681    if(reduced){
682      cards.forEach(function(c){ c.classList.add('is-active'); });
683      return;
684    }
685    var ticking = false;
686    function update(){
687      ticking = false;
688      var r = pin.getBoundingClientRect();
689      var vh = window.innerHeight;
690      var total = r.height - vh;
691      var scrolled = Math.min(Math.max(-r.top, 0), total);
692      var p = total > 0 ? scrolled / total : 0;
693      // rail fill 0..100%
694      fill.style.width = (p * 100).toFixed(2) + '%';
695      // active index: thirds
696      var idx = p < 0.34 ? 0 : (p < 0.67 ? 1 : 2);
697      fill.style.background = colors[idx];
698      cards.forEach(function(c, i){ c.classList.toggle('is-active', i <= idx); });
699      steps.forEach(function(s, i){ s.classList.toggle('is-on', i <= idx); });
700    }
701    function onScroll(){
702      if(!ticking){ requestAnimationFrame(update); ticking = true; }
703    }
704    if(timelineScroll){ window.removeEventListener('scroll', timelineScroll); }
705    if(timelineResize){ window.removeEventListener('resize', timelineResize); }
706    timelineScroll = onScroll;
707    timelineResize = onScroll;
708    window.addEventListener('scroll', timelineScroll, {passive:true});
709    window.addEventListener('resize', timelineResize);
710    update();
711  }
712
713
714  /* =================================================================
715     CLOUD-CONCEPT: live status strip
716     ================================================================= */
717  // Live ticking clock (UTC)
718  function tickClock(){
719    const d = new Date();
720    const hh = String(d.getUTCHours()).padStart(2,'0');
721    const mm = String(d.getUTCMinutes()).padStart(2,'0');
722    const ss = String(d.getUTCSeconds()).padStart(2,'0');
723    const el = document.getElementById('live-clock');
724    if(el) el.textContent = `${hh}:${mm}:${ss}`;
725  }
726
727  function initLiveStrip(){
728    /* Clear any existing ticker from previous page load */
729    if(window.__zopPricingTickerId){
730      clearInterval(window.__zopPricingTickerId);
731      window.__zopPricingTickerId = null;
732    }
733    // Skip recurring tick during automated audit runs (loader-skip is set
734    // by the pre-paint script in MarketingLayout.astro for Lighthouse /
735    // Unlighthouse / Puppeteer). Initial tickClock() still runs once.
736    if (!document.documentElement.classList.contains('loader-skip')) {
737      window.__zopPricingTickerId = setInterval(tickClock, 1000);
738    }
739    tickClock();
740
741    // Counters drift upward a little every few seconds, feels live
742    const state = { resources: 3247, remediations: 12, saved: 48210 };
743    function fmt(n){ return n.toLocaleString(); }
744    function render(){
745      const r = document.getElementById('live-resources');
746      const rm = document.getElementById('live-remediations');
747      const sv = document.getElementById('live-saved');
748      if(r)  r.textContent  = fmt(state.resources);
749      if(rm) rm.textContent = fmt(state.remediations);
750      if(sv) sv.textContent = '$' + fmt(state.saved);
751    }
752    if(window.__zopPricingDrifterId){
753      clearInterval(window.__zopPricingDrifterId);
754      window.__zopPricingDrifterId = null;
755    }
756    if (!document.documentElement.classList.contains('loader-skip')) {
757      window.__zopPricingDrifterId = setInterval(() => {
758        if(Math.random() > 0.4) state.resources += Math.floor(Math.random()*3);
759        if(Math.random() > 0.7) state.remediations += 1;
760        if(Math.random() > 0.3) state.saved += Math.floor(10 + Math.random()*90);
761        render();
762      }, 2400);
763    }
764    render();
765  }
766
767  /* =================================================================
768     CLOUD-CONCEPT: streaming CLI hero
769     ================================================================= */
770  function initCli(){
771  const body = document.getElementById('cli-body');
772  if(!body) return;
773
774  // Each item: {type: 'prompt'|'line'|'spin'|'gap', text, cls, delay}
775  const script = [
776    {t:'prompt', text:'$ ', cmd:'zop connect --cloud aws --region us-east-1', delay:300},
777    {t:'spin',   text:'  assuming read-only role · arn:aws:iam::acct/ZopRead', delay:700},
778    {t:'line',   cls:'ok',   text:'  ✓ authenticated · account 874-2103', delay:350},
779    {t:'line',   cls:'ok',   text:'  ✓ read-only role assumed · no write permissions', delay:350},
780    {t:'line',   cls:'dim',  text:'  → scanning 4 regions · ec2, rds, s3, ebs, eks', delay:450},
781    {t:'spin',   text:'  discovering resources', delay:1100},
782    {t:'line',   cls:'ok',   text:'  ✓ 847 resources indexed · 4 regions', delay:300},
783    {t:'gap', delay:400},
784    {t:'prompt', text:'$ ', cmd:'zop scan --find=waste', delay:700},
785    {t:'spin',   text:'  running CDCR.discover()', delay:900},
786    {t:'line',   cls:'warn', text:'  ! 47 optimizations found', delay:350},
787    {t:'line',   cls:'dim',  text:'    · 14 idle ec2 instances · us-east-1', delay:220},
788    {t:'line',   cls:'dim',  text:'    · 9 over-provisioned rds · eu-west-2', delay:220},
789    {t:'line',   cls:'dim',  text:'    · 24 orphaned ebs volumes · multi', delay:220},
790    {t:'line',   cls:'ok',   text:'  ✓ reclaimable: $23,450/mo', delay:400},
791    {t:'gap', delay:500},
792    {t:'prompt', text:'$ ', cmd:'zop remediate --apply --dry-run=false', delay:700},
793    {t:'spin',   text:'  applying 47 remediations · reversible · logged', delay:1200},
794    {t:'line',   cls:'ok',   text:'  ✓ 47/47 applied · 0 errors', delay:400},
795    {t:'line',   cls:'ok',   text:'  ✓ saved $23,450/mo · verified', delay:350},
796    {t:'line',   cls:'blue', text:'  → loop restarts · run #12,848 scheduled', delay:400},
797    {t:'gap', delay:400},
798    {t:'prompt', text:'$ ', cmd:'', cursor:true, delay:400}
799  ];
800
801  const spinnerFrames = ['⠋','⠙','⠹','⠸','⠼','⠴','⠦','⠧','⠇','⠏'];
802
803  function append(html){
804    const d = document.createElement('div');
805    d.className = 'cli-line cli-hidden';
806    d.innerHTML = html;
807    body.appendChild(d);
808    // auto-scroll within the cli body
809    body.scrollTop = body.scrollHeight;
810    return d;
811  }
812
813  async function typeCmd(line, cmd){
814    // type chars at ~18ms each
815    for(let i=0; i<cmd.length; i++){
816      line.innerHTML += cmd[i] === ' ' ? ' ' : escapeHtml(cmd[i]);
817      await sleep(18 + Math.random()*24);
818    }
819  }
820  function escapeHtml(s){ return s.replace(/[&<>]/g, c => ({'&':'&amp;','<':'&lt;','>':'&gt;'}[c])); }
821  function sleep(ms){ return new Promise(r => setTimeout(r, ms)); }
822
823  async function runSpin(text, ms){
824    const d = append('<span class="cli-spin">⠋</span>' + escapeHtml(text));
825    const spinEl = d.querySelector('.cli-spin');
826    let i = 0;
827    const id = setInterval(() => { if(spinEl) spinEl.textContent = spinnerFrames[i++ % spinnerFrames.length]; }, 80);
828    await sleep(ms);
829    clearInterval(id);
830    // replace spinner with check
831    if(spinEl){ spinEl.textContent = '✓'; spinEl.style.color = '#34d399'; }
832  }
833
834  async function run(){
835    for(const step of script){
836      if(step.t === 'gap'){ await sleep(step.delay || 300); continue; }
837      if(step.t === 'prompt'){
838        const d = append('<span class="p">$ </span>');
839        await sleep(80);
840        await typeCmd(d, step.cmd || '');
841        if(step.cursor){ d.innerHTML += '<span class="cli-cursor"></span>'; }
842        await sleep(step.delay || 350);
843        continue;
844      }
845      if(step.t === 'spin'){
846        await runSpin(step.text, step.delay || 800);
847        continue;
848      }
849      if(step.t === 'line'){
850        append('<span class="' + (step.cls||'') + '">' + escapeHtml(step.text) + '</span>');
851        await sleep(step.delay || 220);
852      }
853    }
854    // Restart loop for continuous "live" feel after a pause
855    await sleep(4000);
856    body.innerHTML = '';
857    run();
858  }
859
860  // Start once the hero CLI scrolls into view (or immediately if already visible)
861  if(cliIORef){ cliIORef.disconnect(); cliIORef = null; }
862  const obs = new IntersectionObserver((entries) => {
863    entries.forEach(e => {
864      if(e.isIntersecting){ obs.disconnect(); run(); }
865    });
866  }, { threshold: 0.2 });
867  obs.observe(body);
868  cliIORef = obs;
869  }
870
871  // Count-up on scroll
872  function initStatIO(){
873    if(statIORef){ statIORef.disconnect(); statIORef = null; }
874    const statIO = new IntersectionObserver((entries)=>{
875      entries.forEach(e=>{
876        if(!e.isIntersecting) return;
877        const el = e.target; const target = +el.dataset.target;
878        const prefix = el.dataset.prefix || ''; const suffix = el.dataset.suffix || '';
879        const dur = 1200; const start = performance.now();
880        function tick(now){
881          const p = Math.min(1, (now-start)/dur);
882          const ease = 1 - Math.pow(1-p,3);
883          el.textContent = prefix + Math.round(target*ease).toLocaleString() + suffix;
884          if(p<1) requestAnimationFrame(tick);
885        }
886        requestAnimationFrame(tick);
887        statIO.unobserve(el);
888      });
889    },{threshold:0.4});
890    document.querySelectorAll('[data-target]').forEach(el=>statIO.observe(el));
891    statIORef = statIO;
892  }
893
894  function init(){
895    initPillars();
896    initTimeline();
897    initLiveStrip();
898    initCli();
899    initStatIO();
900  }
901  init();
902  document.addEventListener('astro:page-load', init);
903  document.addEventListener('astro:before-swap', function(){
904    if(pillarsScroll){ window.removeEventListener('scroll', pillarsScroll); pillarsScroll = null; }
905    if(pillarsResize){ window.removeEventListener('resize', pillarsResize); pillarsResize = null; }
906    if(timelineScroll){ window.removeEventListener('scroll', timelineScroll); timelineScroll = null; }
907    if(timelineResize){ window.removeEventListener('resize', timelineResize); timelineResize = null; }
908    if(statIORef){ statIORef.disconnect(); statIORef = null; }
909    if(cliIORef){ cliIORef.disconnect(); cliIORef = null; }
910    if(window.__zopPricingTickerId){ clearInterval(window.__zopPricingTickerId); window.__zopPricingTickerId = null; }
911    if(window.__zopPricingDrifterId){ clearInterval(window.__zopPricingDrifterId); window.__zopPricingDrifterId = null; }
912  });
913})();
914
915</script>
915 
915<script>
916(function(){
917  function init(){
918    var tabs = document.querySelectorAll('.prod-switch .ps-tab');
919    if(!tabs.length) return;
920    var panes = document.querySelectorAll('.pricing-panes [data-product]');
921
922    function activate(target){
923      var product = target.dataset.product;
924      tabs.forEach(function(t){
925        var on = t === target;
926        t.classList.toggle('is-active', on);
927        t.setAttribute('aria-selected', on ? 'true' : 'false');
928        t.setAttribute('tabindex', on ? '0' : '-1');
929      });
930      panes.forEach(function(p){
931        if(p.dataset.product === product) p.removeAttribute('hidden');
932        else p.setAttribute('hidden', '');
933      });
934    }
935
936    tabs.forEach(function(tab, i){
937      tab.addEventListener('click', function(){ activate(tab); });
938      tab.addEventListener('keydown', function(e){
939        if(e.key !== 'ArrowRight' && e.key !== 'ArrowLeft') return;
940        e.preventDefault();
941        var next = tabs[(i + (e.key === 'ArrowRight' ? 1 : -1) + tabs.length) % tabs.length];
942        next.focus();
943        activate(next);
944      });
945    });
946  }
947  init();
948  document.addEventListener('astro:page-load', init);
949})();
950</script>
950  <section class="bridge-marquee" aria-label="zopdev brand statement"> <div class="bridge-track">  <span>Multi-cloud automation</span><span class="acc">·</span>  <span>Production-ready in 30 min</span><span class="acc">·</span>  <span>SOC 2 · ISO 27001</span><span class="acc">·</span>  <span>20–60% off the bill, first month</span><span class="acc">·</span>  <span>4 platforms · 1 console</span><span class="acc">·</span>   <span>Multi-cloud automation</span><span class="acc">·</span>  <span>Production-ready in 30 min</span><span class="acc">·</span>  <span>SOC 2 · ISO 27001</span><span class="acc">·</span>  <span>20–60% off the bill, first month</span><span class="acc">·</span>  <span>4 platforms · 1 console</span><span class="acc">·</span>  </div> </section> <footer data-astro-transition-persist="footer"><div class="container"><div class="foot-grid foot-grid--equal"><div class="foot-col"><h2>product</h2><ul><li><a href="/zopnight">Zopnight</a></li><li><a href="/zopday">Zopday</a></li><li><a href="/zopcloud">Zopcloud</a></li><li><a href="/k8s-view">Kubernetes View</a></li><li><a href="/integrations">Integrations</a></li><li><a href="/pricing">Pricing</a></li><li><a href="/walkthrough">Walkthrough</a></li><li><a href="/learn/mcp-server">MCP server</a></li></ul></div><div class="foot-col"><h2>solutions</h2><ul><li><a href="/solutions">Use cases by industry</a></li><li><a href="/devops-hub">DevOps hub</a></li><li><a href="/platform-engineering-hub">Platform engineering</a></li><li><a href="/services">Services</a></li><li><a href="/zopnight/anomaly-detection">Anomaly detection</a></li><li><a href="/zopnight/team-budgets">Team budgets</a></li></ul></div><div class="foot-col"><h2>resources</h2><ul><li><a href="/resources/blogs">Blog</a></li><li><a href="/resources/ebooks">Ebooks</a></li><li><a href="/resources/university">University</a></li><li><a href="/what-is-devops">What is DevOps</a></li><li><a href="/ci-cd-best-practices">CI/CD best practices</a></li><li><a href="/cdcr-whitepaper">CDCR whitepaper</a></li><li><a href="/developers">Developers</a></li><li><a href="/changelog">Changelog</a></li></ul></div><div class="foot-col"><h2>company</h2><ul><li><a href="/about">About</a></li><li><a href="/media-kit">Media Kit</a></li><li><a href="/contact">Contact</a></li><li><a href="https://bookings.zop.dev/#/discover-zopdev" target="_blank" rel="noopener noreferrer" aria-label="Demo (opens in a new tab)">Demo</a></li><li><a href="/status">Status</a></li><li><a href="/trust">Trust</a></li></ul></div><div class="foot-col"><h2>optimize</h2><ul><li><a href="/solutions/scheduling">Scheduling</a></li><li><a href="/solutions/right-sizing">Rightsizing</a></li><li><a href="/solutions/idle-detection">Idle detection</a></li><li><a href="/solutions/auto-remediation">Auto-remediation</a></li><li><a href="/solutions/orphan-cleanup">Orphan cleanup</a></li><li><a href="/solutions/auto-tagging">Smart tags</a></li><li><a href="/solutions/showback">Showback</a></li><li><a href="/solutions/finops">FinOps</a></li><li><a href="/solutions/multi-cloud">Multi-cloud</a></li><li><a href="/solutions-catalog">All solutions →</a></li></ul></div><div class="foot-col"><h2>comparisons</h2><ul><li><a href="/compare/cloudhealth-vs-zopnight">vs CloudHealth</a></li><li><a href="/compare/spot-io-vs-zopnight">vs Spot.io</a></li><li><a href="/compare/cloudzero-vs-zopnight">vs CloudZero</a></li><li><a href="/compare/kubecost-vs-zopnight">vs Kubecost</a></li><li><a href="/compare/densify-vs-zopnight">vs Densify</a></li><li><a href="/compare/apptio-vs-zopnight">vs Apptio</a></li><li><a href="/compare/vantage-vs-zopnight">vs Vantage</a></li><li><a href="/compare">All comparisons →</a></li></ul></div><div class="foot-col"><h2>by service</h2><ul><li><a href="/solutions/aws-rds">RDS</a></li><li><a href="/solutions/gcp-cloud-sql">Cloud SQL</a></li><li><a href="/solutions/aws-eks">EKS</a></li><li><a href="/solutions/gcp-gke">GKE</a></li><li><a href="/solutions/azure-aks">AKS</a></li><li><a href="/solutions/aws-s3">S3</a></li><li><a href="/solutions/aws-lambda">Lambda</a></li><li><a href="/solutions/aws-ec2">EC2</a></li><li><a href="/solutions/gcp-compute-engine">Compute Engine</a></li></ul></div><div class="foot-col"><h2>by industry &amp; role</h2><ul><li><a href="/industries">All industries →</a></li><li><a href="/industries/saas">SaaS</a></li><li><a href="/industries/fintech">Fintech</a></li><li><a href="/industries/healthcare">Healthcare</a></li><li><a href="/industries/ecommerce">Ecommerce</a></li><li><a href="/for">All roles →</a></li><li><a href="/for/devops-engineers">DevOps</a></li><li><a href="/for/finops-teams">FinOps teams</a></li><li><a href="/for/platform-engineers">Platform engineers</a></li><li><a href="/for/sre-teams">SRE teams</a></li></ul></div><div class="foot-col"><h2>learn &amp; recs</h2><ul><li><a href="/learn">Learn &amp; guides</a></li><li><a href="/learn/finops">
950FinOps guide</a></li><li><a href="/learn/cloud-cost-optimization">Cost optimization</a></li><li><a href="/learn/kubernetes-cost-optimization">Kubernetes cost</a></li><li><a href="/recommendations">Recommendations</a></li><li><a href="/recommendations/idle">Idle resources</a></li><li><a href="/recommendations/orphan">Orphaned resources</a></li><li><a href="/zopnight/rules">Rule catalogue</a></li></ul></div><div class="foot-col"><h2>by provider</h2><ul><li><a href="/aws-cost-optimization">AWS</a></li><li><a href="/zopnight/rules/aws">AWS Recommendation</a></li><li><a href="/gcp-cost-optimization">GCP</a></li><li><a href="/zopnight/rules/gcp">GCP Recommendation</a></li><li><a href="/azure-cost-optimization">Azure</a></li><li><a href="/zopnight/rules/azure">Azure Recommendation</a></li><li><a href="/cloud-cost-optimization">By location</a></li></ul></div></div><!-- ════════════════════════════════════════════════════════════
951           FOOTER BOTTOM PANEL · ZopDev wordmark left · world map right
952           ════════════════════════════════════════════════════════════ --><!-- COMPLIANCE BADGES · SOC 2 + ISO white badges before logo + globe --><div class="foot-globe"><div class="foot-globe-left"><a href="/" class="foot-globe-mark" aria-label="zopdev"><svg class="foot-globe-logo" viewBox="0 0 715 276" aria-hidden="true"><use href="#logo-zopdev"></use></svg></a><div class="foot-globe-badges" aria-label="Compliance certifications"><span class="foot-globe-badge" aria-label="SOC 2 Type II"><svg viewBox="0 0 64 64" aria-hidden="true" xmlns="http://www.w3.org/2000/svg"><circle cx="32" cy="32" r="29" fill="none" stroke="currentColor" stroke-width="1.5"></circle><path d="M32 8 a24 24 0 0 1 24 24 v6 a24 24 0 0 1 -24 24 a24 24 0 0 1 -24 -24 v-6 a24 24 0 0 1 24 -24 z" fill="none" stroke="currentColor" stroke-width="1" opacity=".5"></path><path d="M22 32 l8 8 l14 -16" stroke="currentColor" stroke-width="2.4" fill="none" stroke-linecap="square" stroke-linejoin="miter"></path></svg><span class="foot-globe-badge-label"><strong>SOC 2</strong> Type II</span></span><span class="foot-globe-badge" aria-label="ISO 27001:2022"><svg viewBox="0 0 64 64" aria-hidden="true" xmlns="http://www.w3.org/2000/svg"><rect x="6" y="6" width="52" height="52" fill="none" stroke="currentColor" stroke-width="1.5"></rect><rect x="11" y="11" width="42" height="42" fill="none" stroke="currentColor" stroke-width="1" opacity=".5"></rect><text x="32" y="29" font-family="Space Grotesk, monospace" font-size="9" fill="currentColor" text-anchor="middle" letter-spacing="2">ISO</text><text x="32" y="42" font-family="Space Grotesk, sans-serif" font-size="11" font-weight="700" fill="currentColor" text-anchor="middle">27001</text><line x1="14" y1="50" x2="50" y2="50" stroke="currentColor" stroke-width="1"></line></svg><span class="foot-globe-badge-label"><strong>ISO 27001</strong> 2022</span></span></div><div class="foot-globe-aws-group"><span class="foot-globe-aws-label" aria-hidden="true">Available on</span><a class="foot-globe-aws" href="https://aws.amazon.com/marketplace/pp/prodview-f7anqsweiahwm" target="_blank" rel="noopener noreferrer" aria-label="View zopdev on AWS Marketplace (opens in a new tab)"><img src="/logo-aws-marketplace.svg" alt="AWS Marketplace" width="194" height="34" loading="lazy" decoding="async"></a></div></div><div class="foot-globe-right min-w-0"><div class="foot-regions-v2" id="foot-regions-v2"><canvas id="foot-regions-map"></canvas></div><astro-island uid="Zzv01Y" prefix="r5" component-url="/_astro/FooterGlobe.B3WCmj3M.js" component-export="default" renderer-url="/_astro/client.bnjHR3qd.js" props="{}" ssr client="idle" opts="{&quot;name&quot;:&quot;FooterGlobe&quot;,&quot;value&quot;:true}"></astro-island></div></div><div class="foot-bottom foot-bottom-3"><div class="foot-copy">© <span data-year>2026</span> zopdev · <a href="/legal/privacy-policy">privacy</a> · <a href="/legal/website-terms-of-service">terms</a> · <a href="/legal/refund-policy">refunds</a></div><div class="foot-mid">made with <svg viewBox="0 0 7 6" aria-hidden="true"><rect x="1" y="0" width="1" height="1"></rect><rect x="2" y="0" width="1" height="1"></rect><rect x="4" y="0" width="1" height="1"></rect><rect x="5" y="0" width="1" height="1"></rect><rect x="0" y="1" width="7" height="1"></rect><rect x="0" y="2" width="7" height="1"></rect><rect x="1" y="3" width="5" height="1"></rect><rect x="2" y="4" width="3" height="1"></rect><rect x="3" y="5" width="1" height="1"></rect></svg> by zopdev</div><div class="foot-social"><a href="https://linkedin.com/company/zopdev" class="foot-social-icon" aria-label="zopdev on LinkedIn" target="_blank" rel="noopener noreferrer"><svg viewBox="0 0 24 24" fill="currentColor" 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.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 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"></path></svg></a><a href="https://twitter.com/zopdev" class="foot-social-icon" aria-label="zopdev on X (Twitter)" target="_blank" rel="noopener noreferrer"><svg 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"></path></svg></a><a href="https://github.com/zopdev" class="foot-social-icon" aria-label="zopdev on GitHub" target="_blank" rel="noopener noreferrer"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.91 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222 0 1.606-.014 2.898-.014 3.293 0 .322.216.694.825.576C20.565 22.092 24 17.598 24 12.297c0-6.627-5.373-12-12-12"></path></svg></a></div></div></div></footer>
952<script>
953/* ============================================================================
954   Footer interactive globe (canvas + drop-a-pin) lives in
955   src/components/islands/FooterGlobe.jsx and mounts via <FooterGlobe
956   client:visible /> in the marketing variant above. Only the graduation
957   band IIFE remains inline below.
958   ============================================================================ */
959
960/* ============================================================================
961   Graduation band · "Pick where you are", three product cards above the
962   globe footer. Reads <body data-product> to highlight the active product
963   ("you're here"). Self-initializing IIFE; safe on every page. Renders into
964   the .foot-globe block so the band sits visually above the world map.
965
966   DISABLED per CEO request, the entire band (3 product cards + "No
967   re-platform" line + "Looking at the platform?" link) is hidden site-wide.
968   To restore: delete the early-return below.
969   ============================================================================ */
970(function(){
971  return; /* CEO: graduation band disabled site-wide */
972  var globe = document.querySelector('.foot-globe');
973  if(!globe || document.querySelector('.foot-grad')) return;
974
975  var here = (document.body.getAttribute('data-product') || '').toLowerCase();
976  var hereKey = here === 'zopcloud' ? 'cloud'
977              : here === 'zopday'   ? 'day'
978              : here === 'zopnight' ? 'night'
979              : '';
980
981  var products = [
982    { key:'cloud', href:'/zopcloud', name:'zopcloud',
983      eyebrow:'Indie devs · MVP teams',
984      tag:'We host. You push.' },
985    { key:'day',   href:'/zopday',   name:'zopday',
986      eyebrow:'Platform engineers · scale-ups',
987      tag:'Your cloud. Our platform layer.' },
988    { key:'night', href:'/zopnight', name:'zopnight',
989      eyebrow:'FinOps leads · CFOs · enterprises',
990      tag:'Continuous governance + cost optimization.' }
991  ];
992
993  var section = document.createElement('section');
994  section.className = 'foot-grad';
995  section.setAttribute('aria-label', 'Pick where you are');
996
997  var head = document.createElement('div');
998  head.className = 'foot-grad-head';
999  head.innerHTML =
1000    '<div class="foot-grad-eyebrow">pick where you are</div>' +
1001    '<h2 class="foot-grad-title">Three products. One platform.</h2>';
1002  section.appendChild(head);
1003
1004  var row = document.createElement('div');
1005  row.className = 'foot-grad-row';
1006  for(var i=0; i<products.length; i++){
1007    var p = products[i];
1008    var card = document.createElement('a');
1009    card.className = 'foot-grad-card foot-grad-' + p.key + (p.key === hereKey ? ' is-here' : '');
1010    card.href = p.href;
1011    card.setAttribute('data-product', p.key);
1012    card.innerHTML =
1013      '<div class="grad-eyebrow">' +
1014        (p.key === hereKey ? '<span class="grad-here-dot" aria-hidden="true"></span>you are here · ' : '') +
1015        p.eyebrow +
1016      '</div>' +
1017      '<div class="grad-title">' + p.name + '</div>' +
1018      '<div class="grad-tag">' + p.tag + '</div>' +
1019      '<span class="grad-arrow" aria-hidden="true">&rarr;</span>';
1020    row.appendChild(card);
1021  }
1022  section.appendChild(row);
1023
1024  var sub = document.createElement('p');
1025  sub.className = 'foot-grad-sub';
1026  sub.innerHTML = 'No re-platform when you grow. No surprise bill when you scale. No drift when it’s running.';
1027  section.appendChild(sub);
1028
1029  var meta = document.createElement('p');
1030  meta.className = 'foot-grad-meta';
1031  meta.innerHTML = 'Looking at the platform? &rarr; <a href="/">zopdev</a>';
1032  section.appendChild(meta);
1033
1034  globe.parentNode.insertBefore(section, globe);
1035})();
1036</script>
1036 <div data-astro-transition-persist="drawer-features"><astro-island uid="15ccXc" prefix="r6" component-url="/_astro/DrawerFeatures.aoNEDZT_.js" component-export="default" renderer-url="/_astro/client.bnjHR3qd.js" props="{}" ssr client="idle" opts="{&quot;name&quot;:&quot;DrawerFeatures&quot;,&quot;value&quot;:true}"></astro-island></div> 
1036<script>
1037    /* ============================================================
1038       SECTION REVEAL + LAZY VIDEO
1039       Wrapped in `astro:page-load` so each SPA swap (when ClientRouter
1040       is active on a docs page) re-runs the observers against the new
1041       DOM. Idempotent: `.in` classList.add and `if(v.src) return` guard
1042       repeat invocations.
1043       ============================================================ */
1044    function __zopMarketingPageLoad(){
1045      /* Section reveal */
1046      if('IntersectionObserver' in window){
1047        var reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
1048        var nodes = document.querySelectorAll('.section, .stat');
1049        if(reduce){
1050          nodes.forEach(function(n){ n.classList.add('in'); });
1051        } else {
1052          var io = new IntersectionObserver(function(entries){
1053            entries.forEach(function(e){
1054              if(e.isIntersecting){ e.target.classList.add('in'); io.unobserve(e.target); }
1055            });
1056          }, { rootMargin:'0px 0px -60px 0px', threshold:0.08 });
1057          nodes.forEach(function(n){ io.observe(n); });
1058        }
1059      }
1060
1061      /* Lazy-load videos with data-lazysrc: only fetch + autoplay when in view. */
1062      var vids = document.querySelectorAll('video[data-lazysrc]');
1063      if(vids.length){
1064        function activate(v){
1065          if(v.src) return;
1066          v.src = v.getAttribute('data-lazysrc');
1067          if(v.hasAttribute('autoplay')){
1068            var reduce2 = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
1069            if(reduce2) return;
1070            try{ var p = v.play(); if(p && p.catch) p.catch(function(){}); }catch(e){}
1071          }
1072        }
1073        if(!('IntersectionObserver' in window)){
1074          vids.forEach(activate);
1075        } else {
1076          var io2 = new IntersectionObserver(function(entries){
1077            entries.forEach(function(e){
1078              if(e.isIntersecting){ activate(e.target); io2.unobserve(e.target); }
1079            });
1080          }, { rootMargin: '200px 0px' });
1081          vids.forEach(function(v){ io2.observe(v); });
1082        }
1083      }
1084
1085      /* NavBar active-link refresh — NavBar is transition:persist'd, so the
1086         build-time .active class baked into HTML stays on the OLD page's link
1087         forever unless we recompute on every SPA swap against location.pathname. */
1088      var __path = window.location.pathname;
1089      document.querySelectorAll('.nav-links a, .mob-nav a').forEach(function(a){
1090        var href = a.getAttribute('href');
1091        if(!href || href.charAt(0) === '#' || /^(?:mailto:|tel:|https?:)/.test(href)) return;
1092        var match = __path === href || (href !== '/' && __path.indexOf(href + '/') === 0);
1093        a.classList.toggle('active', match);
1094        if(match) a.setAttribute('aria-current', 'page'); else a.removeAttribute('aria-current');
1095      });
1096
1097      /* Hero/globe re-fire belt-and-suspenders. LoaderGate's own astro:page-load
1098         handler covers this when the loader element is present and .done; this
1099         is the fallback for pages that load before LoaderGate's IIFE runs. */
1100      var __l = document.getElementById('zop-loader');
1101      if(__l && __l.classList.contains('done')){
1102        var __h = document.querySelector('.hero-reveal'); if(__h && !__h.classList.contains('go')){ __h.classList.add('go'); var __hv=__h.closest('.hero-v2'); if(__hv) __hv.classList.add('is-revealed'); }
1103        var __hs = document.querySelector('.hero');        if(__hs && !__hs.classList.contains('go')) __hs.classList.add('go');
1104        var __gp = document.querySelector('.globe-panel'); if(__gp && !__gp.classList.contains('vis')) __gp.classList.add('vis');
1105      }
1106    }
1107    __zopMarketingPageLoad();
1108    document.addEventListener('astro:page-load', __zopMarketingPageLoad);
1109    /* First-load gate for the body entrance animation (`zop-page-enter`).
1110       On the very first hard load, give the keyframe time to play; after
1111       600ms add `html.spa-bootstrapped` so the rule
1112         html.spa-bootstrapped body { animation: none !important; }
1113       suppresses replays on any future swap. Astro's ClientRouter REPLACES
1114       <html> attributes on each swap (per the new page's HTML), wiping
1115       this class — so the after-swap listener below re-applies it. */
1116    setTimeout(function(){ document.documentElement.classList.add('spa-bootstrapped'); window.__zopBootstrapped = true; }, 600);
1117    </script>
1117 
1117<script>
1118    /* ============================================================
1119       SPA STATE-LEAK FIXES · root scope (fires for every nav, not
1120       just marketing — so docs/dev-docs benefit too).
1121
1122       1) MobileNav + Drawer force-close on before-swap — both are
1123          transition:persist'd; without this their open-state survives
1124          the swap and the next page loads with them covering content.
1125       2) LiveOpsStrip ticker preservation — capture currentTime at
1126          before-swap, restore at after-swap so the marquee doesn't snap
1127          back to translateX(0) on every nav.
1128       3) loader-skip reapply — head cookie pre-paint script doesn't
1129          re-run on swap; persisted LoaderGate stays .done, but the class
1130          on <html> must stick so the CSS display:none rule wins.
1131       4) Hash-anchor scroll — for cross-page /foo#bar nav, scroll the
1132          target into view after the new body settles.
1133       ============================================================ */
1134    document.addEventListener('astro:before-swap', function(){
1135      /* MobileNav close — real IDs from NavBar.astro / MobileNav.astro
1136         (#mob-nav-drawer / #mob-nav-toggle). The drawer is
1137         transition:persist'd so without this its .open state survives the
1138         swap and the next page loads with the drawer covering content. */
1139      var mob = document.getElementById('mob-nav-drawer');
1140      if(mob){ mob.classList.remove('open'); try{ mob.setAttribute('inert', ''); }catch(e){} }
1141      document.body.style.overflow = '';
1142      document.documentElement.classList.remove('mob-nav-open');
1143      var btn = document.getElementById('mob-nav-toggle');
1144      if(btn) btn.setAttribute('aria-expanded', 'false');
1145      /* Drawer close — DrawerFeatures' own astro:before-swap also strips
1146         body.drawer-open, but force-close the visible element state too. */
1147      document.body.classList.remove('drawer-open');
1148      var dr = document.querySelector('.drawer');
1149      if(dr) dr.classList.remove('open');
1150      /* Desktop mega-menu reset — the <nav> is `transition:persist`'d
1151         (NavBar.astro:20) so the overlay DOM, its `.open` class, and
1152         its stale `style.left` from the previous page survive the
1153         swap. Without this the next page would render with the
1154         dropdown visible until the user moves the cursor or presses
1155         Esc. Defense-in-depth: also re-syncs nav-item.open + .nav-pane.active
1156         + aria-expanded on triggers so MegaMenu's next mount starts
1157         from a clean neutral state. */
1158      var ov = document.getElementById('nav-overlay');
1159      if(ov){
1160        ov.classList.remove('open');
1161        ov.setAttribute('aria-hidden', 'true');
1162        ov.style.left = '';
1163      }
1164      document.querySelectorAll('.nav-item.open').forEach(function(ni){
1165        ni.classList.remove('open');
1166        var a = ni.querySelector('a[aria-haspopup]');
1167        if(a) a.setAttribute('aria-expanded', 'false');
1168      });
1169      document.querySelectorAll('.nav-pane.active').forEach(function(p){
1170        p.classList.remove('active');
1171      });
1172      /* Footer/nav scroll-jump fix — when a link inside a transition:persist'd
1173         island (footer/nav) is the active element at swap time, Astro core's
1174         restoreFocus() re-focuses it AFTER the swap without {preventScroll},
1175         scrolling it back into view. For a footer link that's at page bottom,
1176         and with html{scroll-behavior:smooth} (render-blocking in build, so
1177         active at swap) the focus-scroll animates and outlives Astro's instant
1178         scrollTo(0,0) → the new page lands on the footer. Blurring the
1179         navigational control here (before saveFocus runs) makes Astro save a
1180         null active element and skip that focus. Restricted to A/BUTTON so a
1181         persisted nav search <input> keeps its focus + caret restoration. */
1182      var ae = document.activeElement;
1183      if(ae && (ae.tagName === 'A' || ae.tagName === 'BUTTON') &&
1184         ae.closest && ae.closest('[data-astro-transition-persist]')){
1185        try{ ae.blur(); }catch(e){}
1186      }
1187    });
1188
1189    var __zopRootTickerTimes = [];
1190    document.addEventListener('astro:before-swap', function(){
1191      __zopRootTickerTimes = [];
1192      document.querySelectorAll('.topbar-news-track, .ls-track .ls-rail').forEach(function(el){
1193        var anims = el.getAnimations && el.getAnimations();
1194        if(anims && anims.length) __zopRootTickerTimes.push({ time: anims[0].currentTime });
1195      });
1196    });
1197    document.addEventListener('astro:after-swap', function(){
1198      /* Re-apply loader-skip — the persisted LoaderGate stays .done across
1199         swaps, but the <html> class is what the CSS display:none rule
1200         targets. The head pre-paint cookie script doesn't re-run on swap. */
1201      if(document.cookie.indexOf('zd-loader-shown-v2=1') !== -1){
1202        document.documentElement.classList.add('loader-skip');
1203      }
1204      /* Re-apply spa-bootstrapped — once we're past the first hard load,
1205         body entrance animation should be permanently suppressed on every
1206         swap. Astro wipes html class on swap, so re-add it here. */
1207      if(window.__zopBootstrapped){
1208        document.documentElement.classList.add('spa-bootstrapped');
1209      }
1210      /* Restore ticker animation currentTime so marquee continues smoothly. */
1211      document.querySelectorAll('.topbar-news-track, .ls-track .ls-rail').forEach(function(el, i){
1212        var saved = __zopRootTickerTimes[i];
1213        if(!saved) return;
1214        var anims = el.getAnimations && el.getAnimations();
1215        if(anims && anims.length){ try{ anims[0].currentTime = saved.time; }catch(e){} }
1216      });
1217      /* Hash-anchor scroll — for /foo#bar cross-page nav, scroll into view
1218         after the new body settles. Astro's default scrolls to top for
1219         forward nav; this restores the expected hash behavior. */
1220      var hash = window.location.hash;
1221      if(hash && hash !== '#'){
1222        requestAnimationFrame(function(){
1223          var t; try{ t = document.querySelector(hash); }catch(e){ return; }
1224          if(t && typeof t.scrollIntoView === 'function') t.scrollIntoView();
1225        });
1226      }
1227    });
1228    </script>
1228 </body> </html> 

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.