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'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 & brand files · 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 · 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">→</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">→</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 · idle, schedules, anomalies</p> </div> <span class="np-play-arrow" aria-hidden="true">→</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 ·
411 clusters, datastores, push</p> </div> <span class="np-play-arrow" aria-hidden="true">→</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="{"name":"MegaMenu","value":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 & 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 & 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 & 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 · 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 ·
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">→</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'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 & 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 & 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 & 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'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 "one-click remediation" 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="{"name":"TetrisCanvasIsland","value":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 => ({'&':'&','<':'<','>':'>'}[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 & 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 & recs</h2><ul><li><a href="/learn">Learn & 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="{"name":"FooterGlobe","value":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">→</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? → <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="{"name":"DrawerFeatures","value":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.