Files
nexus/sreweekly/articles/289/04-dark-side-of-self-service.html
2026-09-12 17:23:01 +08:00

587 lines
90 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html><!-- This site was created in Webflow. https://webflow.com --><!-- Last Published: Thu Jul 02 2026 12:40:06 GMT+0000 (Coordinated Universal Time) --><html data-wf-domain="humanitec.com" data-wf-page="64462c9aa96777d84de53b55" data-wf-site="64462c9aa967776f20e53b43" lang="en" data-wf-collection="64462c9aa967772c92e53bd1" data-wf-item-slug="what-developer-self-service-shouldnt-look-like"><head><meta charset="utf-8"/><link href="https://cdn.prod.website-files.com" rel="preconnect" crossorigin="anonymous"/><title>Dark Side of Self-Service | Humanitec</title><meta content="Developer self-service is a fundamental step every engineering team needs to take to reach true DevOps, true “you build it, you run it”. Often however, teams get self-service spectacularly wrong. This article will walk through some real-life examples and discuss how you should think about striking the right balance between golden cages and golden paths." name="description"/><meta content="Dark Side of Self-Service | Humanitec" property="og:title"/><meta content="Developer self-service is a fundamental step every engineering team needs to take to reach true DevOps, true “you build it, you run it”. Often however, teams get self-service spectacularly wrong. This article will walk through some real-life examples and discuss how you should think about striking the right balance between golden cages and golden paths." property="og:description"/><meta content="" property="og:image"/><meta content="Dark Side of Self-Service | Humanitec" name="twitter:title"/><meta content="Developer self-service is a fundamental step every engineering team needs to take to reach true DevOps, true “you build it, you run it”. Often however, teams get self-service spectacularly wrong. This article will walk through some real-life examples and discuss how you should think about striking the right balance between golden cages and golden paths." name="twitter:description"/><meta content="" name="twitter:image"/><meta property="og:type" content="website"/><meta content="summary_large_image" name="twitter:card"/><meta content="width=device-width, initial-scale=1" name="viewport"/><meta content="PLWCrGGWUXiLLZsQsryB32HVNyN9PTrn5R28kUhLNv0" name="google-site-verification"/><meta content="Webflow" name="generator"/><link href="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/css/relaunch-wipwipwipwip.webflow.shared.50413f302.min.css" rel="stylesheet" type="text/css" integrity="sha384-UEE/MCSLeRikfuijbOzaIzEIu5WOTyQmvWMSAe7cp/rbxUUFFZOQLaosBmubai7e" crossorigin="anonymous"/><link href="https://fonts.googleapis.com" rel="preconnect"/><link href="https://fonts.gstatic.com" rel="preconnect" crossorigin="anonymous"/><script src="https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js" type="text/javascript"></script><script type="text/javascript">WebFont.load({ google: { families: ["Varela Round:400"] }});</script><script type="text/javascript">!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);</script><link href="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/65fb02751f4c59559c7d5f94_Humanitec%20Favicon.png" rel="shortcut icon" type="image/x-icon"/><link href="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/65fb029ce13a0fdb1476de5f_Himanitec%20Webclip.png" rel="apple-touch-icon"/><link href="https://humanitec.com/blog/what-developer-self-service-shouldnt-look-like" rel="canonical"/><link href="rss.xml" rel="alternate" title="RSS Feed" type="application/rss+xml"/><!-- Usercentric Cookies Consent Notice start for humanitec.com -->
<script id="usercentrics-cmp" src="https://app.usercentrics.eu/browser-ui/latest/loader.js" data-settings-id="X5Mj3e1o0" async></script>
<!-- Usercentric Cookies Consent Notice end for humanitec.com -->
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-WBR8VPJ');</script>
<!-- End Google Tag Manager -->
<!-- [Attributes by Finsweet] Disable scrolling on menu/modal click -->
<script defer src="https://cdn.jsdelivr.net/npm/@finsweet/attributes-scrolldisable@1/scrolldisable.js"></script>
<style>
@media screen and (max-width: 991px) {
.dropdown-parent-link {
pointer-events: none;
cursor: default;
}
}
</style>
<!-- [Attributes by Finsweet] Table of Contents -->
<script defer src="https://cdn.jsdelivr.net/npm/@finsweet/attributes-toc@1/toc.js"></script>
<!-- [Attributes by Finsweet] Powerful Rich Text -->
<script defer src="https://cdn.jsdelivr.net/npm/@finsweet/attributes-richtext@1/richtext.js"></script>
<!-- [Attributes by Finsweet] Copy to clipboard -->
<script defer src="https://cdn.jsdelivr.net/npm/@finsweet/attributes-copyclip@1/copyclip.js"></script>
<!-- F’in sweet Webflow Hacks -->
<style>
.hack20-sub-bullet {
margin-left: 1rem;
}
.hack20-sub-bullet-2 {
margin-left: 2rem;
}
@media (max-width: 767px) {
.hack20-sub-bullet {
margin-left: 0.625rem;
}
.hack20-sub-bullet-2 {
margin-left: 1.5rem;
}
}
</style></head><body><div class="page-wrapper"><header class="header-component"><div class="topbar_component"><div class="topbar-container"><a href="/mvp-pricing" class="topbar-link-wrapper w-inline-block"><div>🚀 Get to platform value in 2 weeks with our MVP Program. Start now </div><div class="lottie-animation" data-w-id="e5d7b35d-97e3-b1cd-bdf9-a99310cd87bb" data-animation-type="lottie" data-src="https://cdn.prod.website-files.com/603404ef5024775bea8de703/6470596e0d72f61b1a5230c7_lottie-arrow-right-white.json" data-loop="1" data-direction="1" data-autoplay="1" data-is-ix2-target="0" data-renderer="svg" data-default-duration="1.5" data-duration="2" data-loading="eager"></div></a><div class="topbar-close-trigger"><img src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/6516b06a12dffa8b3c4f5e26_close-black.svg" loading="lazy" alt="close icon" class="tobbar-close"/></div></div></div><div class="global-styles w-embed"><style>
/* Gradient border */
.card, .card-stagger-wrapper, .pricing-card-wrapper, .score-how-it-works-terminal-wrapper, .border-light {
border-top-left-radius: 1em;
border-top-right-radius: 1em;
border-bottom-left-radius: 1em;
border-bottom-right-radius: 1em;
background-image: linear-gradient(312deg, hsla(161.8811881188119, 0.00%, 100.00%, 0.04) 5%, hsla(0, 0.00%, 100.00%, 0.40) 49%, hsla(0, 0.00%, 100.00%, 0.04));
}
/* Hide scrollbar for Chrome, Safari and Opera */
.scrollbar-hidden::-webkit-scrollbar {
display: none;
}
/* Hide scrollbar for IE, Edge add Firefox */
.scrollbar-hidden {
-ms-overflow-style: none;
scrollbar-width: none; /* Firefox */
}
.horizontal-scroll {
-ms-overflow-style: none; // IE 10+
overflow: -moz-scrollbars-none; // Firefox
}
.horizontal-scroll::-webkit-scrollbar {
display: none; // Safari and Chrome
}
/* Make text look crisper and more legible in all browsers */
body {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-smoothing: antialiased;
text-rendering: optimizeLegibility;
}
/* Focus state style for keyboard navigation for the focusable elements */
*[tabindex]:focus-visible,
input[type="file"]:focus-visible {
outline: 0.125rem solid #4d65ff;
outline-offset: 0.125rem;
}
/* Get rid of top margin on first element in any rich text element */
.w-richtext > :not(div):first-child, .w-richtext > div:first-child > :first-child {
margin-top: 0 !important;
}
/* Get rid of bottom margin on last element in any rich text element */
.w-richtext>:last-child, .w-richtext ol li:last-child, .w-richtext ul li:last-child {
margin-bottom: 0 !important;
}
/* Prevent all click and hover interaction with an element */
.pointer-events-off {
pointer-events: none;
}
/* Enables all click and hover interaction with an element */
.pointer-events-on {
pointer-events: auto;
}
/* Create a class of .div-square which maintains a 1:1 dimension of a div */
.div-square::after {
content: "";
display: block;
padding-bottom: 100%;
}
/* Make sure containers never lose their center alignment */
.container-medium,.container-small, .container-large {
margin-right: auto !important;
margin-left: auto !important;
}
/*
Make the following elements inherit typography styles from the parent and not have hardcoded values.
Important: You will not be able to style for example "All Links" in Designer with this CSS applied.
Uncomment this CSS to use it in the project. Leave this message for future hand-off.
*/
a,
.w-input,
.w-select,
.w-tab-link,
.w-nav-link,
.w-dropdown-btn,
.w-dropdown-toggle,
.w-dropdown-link {
color: inherit;
text-decoration: inherit;
font-size: inherit;
}
/* Apply "..." after 4 lines of text */
.text-style-4lines {
display: -webkit-box;
overflow: hidden;
-webkit-line-clamp: 4;
-webkit-box-orient: vertical;
}
/* Apply "..." after 3 lines of text */
.text-style-3lines {
display: -webkit-box;
overflow: hidden;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
}
/* Apply "..." after 2 lines of text */
.text-style-2lines {
display: -webkit-box;
overflow: hidden;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
/* Adds inline flex display */
.display-inlineflex {
display: inline-flex;
}
/* These classes are never overwritten */
.hide {
display: none !important;
}
@media screen and (max-width: 991px) {
.hide, .hide-tablet {
display: none !important;
}
}
@media screen and (max-width: 767px) {
.hide-mobile-landscape{
display: none !important;
}
}
@media screen and (max-width: 479px) {
.hide-mobile{
display: none !important;
}
}
.margin-0 {
margin: 0rem !important;
}
.padding-0 {
padding: 0rem !important;
}
.spacing-clean {
padding: 0rem !important;
margin: 0rem !important;
}
.margin-top {
margin-right: 0rem !important;
margin-bottom: 0rem !important;
margin-left: 0rem !important;
}
.padding-top {
padding-right: 0rem !important;
padding-bottom: 0rem !important;
padding-left: 0rem !important;
}
.margin-right {
margin-top: 0rem !important;
margin-bottom: 0rem !important;
margin-left: 0rem !important;
}
.padding-right {
padding-top: 0rem !important;
padding-bottom: 0rem !important;
padding-left: 0rem !important;
}
.margin-bottom {
margin-top: 0rem !important;
margin-right: 0rem !important;
margin-left: 0rem !important;
}
.padding-bottom {
padding-top: 0rem !important;
padding-right: 0rem !important;
padding-left: 0rem !important;
}
.margin-left {
margin-top: 0rem !important;
margin-right: 0rem !important;
margin-bottom: 0rem !important;
}
.padding-left {
padding-top: 0rem !important;
padding-right: 0rem !important;
padding-bottom: 0rem !important;
}
.margin-horizontal {
margin-top: 0rem !important;
margin-bottom: 0rem !important;
}
.padding-horizontal {
padding-top: 0rem !important;
padding-bottom: 0rem !important;
}
.margin-vertical {
margin-right: 0rem !important;
margin-left: 0rem !important;
}
.padding-vertical {
padding-right: 0rem !important;
padding-left: 0rem !important;
}
</style>
<style>
html { font-size: 1rem; }
@media screen and (max-width:1920px) { html { font-size: 1rem; } }
@media screen and (max-width:1440px) { html { font-size: calc(0.6361607142857143rem + 0.33482142857142855vw); } }
@media screen and (max-width:992px) { html { font-size: calc(0.8749369323915237rem + 0.10090817356205853vw); } }
</style></div><div class="navbar-container"><div data-animation="default" class="nav-bar w-nav" data-easing2="ease" fs-scrolldisable-element="smart-nav" data-easing="ease" data-collapse="medium" role="banner" data-duration="400" data-doc-height="1"><div class="nav-row"><nav role="navigation" class="nav-menu w-nav-menu"><a href="/products/platform-orchestrator" class="nav-link w-inline-block"><div>Product</div></a><a href="/self-hosted" class="nav-link w-inline-block"><div>Self-Hosted</div></a><div data-hover="true" data-delay="100" class="nav-dd hide w-dropdown"><div class="nav-link w-dropdown-toggle"><div>Products</div><div class="dd-arrow-icon w-icon-dropdown-toggle"></div></div><nav class="dd-list w-dropdown-list"><div fs-scrolldisable-element="when-visible" class="dd-content _24"><div class="dd-grid _24 mb"><a id="w-node-a626c3e7-0910-0d3e-e65a-a9025510adc8-92cfbed3" href="/products" class="dd-card _24 is-product w-inline-block"><div class="dd-link-text-wrapper"><div class="dd-link-icon"><div class="dd-card-text">Product Overview</div><div class="dd-icon-embed w-embed"><svg aria-hidden="true" fill='currentColor' role="img" width="100%" height="100%" viewBox="0 0 20 21" xmlns="http://www.w3.org/2000/svg"><title>Arrow Right</title><polygon points="16.172 9 10.101 2.929 11.515 1.515 20 10 19.293 10.707 11.515 18.485 10.101 17.071 16.172 11 0 11 0 9"/></svg></div></div><div class="dd-link-subtext">Use them all or combine them.</div></div><div class="bg-wrapper"><img src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/666161c08913ae3836c2af15_humanitec%20navigation%20dd%20card%20bg%20icon%20platform.webp" loading="lazy" alt="" class="dd-card_bg-icon"/><div class="dd-card_bg-glow"></div></div></a><div id="w-node-a626c3e7-0910-0d3e-e65a-a9025510add3-92cfbed3" class="dd-col _24"><div class="dd-tag">Products</div><a id="w-node-a626c3e7-0910-0d3e-e65a-a9025510add6-92cfbed3" href="/products/platform-orchestrator" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img width="50" loading="eager" alt="" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/65323283bde43d64e5a73f71_nav-icon-product-platform-orchestrator.png" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div class="dd-link-flex"><div>Platform Orchestrator</div></div><div class="dd-link-subtext">A graph-based backend for your IDP. Automate and standardize at scale.</div></div></a><a href="/products/portal" class="dd-link _24 hide w-inline-block"><div class="dd-link-icon-small"><img loading="eager" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/662a1127c83d49dbf3529fea_Portal%20Logo.svg" alt="" class="dd-link-icon is-portal"/></div><div class="dd-link-text-wrapper"><div class="dd-link-flex"><div>Portal</div></div><div class="dd-link-subtext">The frontend of your IDP. Service catalog, scaffolding and self-service.</div></div></a></div><div id="w-node-a626c3e7-0910-0d3e-e65a-a9025510ade8-92cfbed3" class="dd-col _24"><div class="dd-tag">OSS BUILDING BLOCKS</div><a href="/products/score" class="dd-link _24 hide w-inline-block"><div class="dd-link-icon-small"><img loading="eager" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/653232835a83ce150ab3cc5a_nav-icon-product-score.png" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div class="dd-link-flex"><div>Score</div></div><div class="dd-link-subtext">Code-based interface of your IDP. A familiar interface for developers.</div></div></a><a href="/resource-definitions" class="dd-link _24 hide w-inline-block"><div class="dd-link-icon-small"><img width="50" loading="eager" alt="" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/6650158078ee096c094d1361_Frame%20481343.webp" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div class="dd-link-flex"><div>Resource Definitions</div></div><div class="dd-link-subtext">Pre-configured infra modules. Easily integrated with your existing IaC.</div></div></a><a href="/reference-architectures" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="eager" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/66575865b1d94fa34a45b428_Ref%20archs%20icon.svg" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div class="dd-link-flex"><div>Reference Architectures</div></div><div class="dd-link-subtext">Blueprints for enteprise-grade Internal Developer Platforms.</div></div></a></div></div><div class="dd-grid _24 is-3col hide"><div id="w-node-a626c3e7-0910-0d3e-e65a-a9025510ae07-92cfbed3" class="dd-tag">Features</div><div id="w-node-a626c3e7-0910-0d3e-e65a-a9025510ae09-92cfbed3" class="dd-col _24"><a id="w-node-a626c3e7-0910-0d3e-e65a-a9025510ae0a-92cfbed3" href="/environment-management" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="eager" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/64462c9aa96777cfbee53d47_icon-tame-kubernetes-complexity.png" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Environment Management</div></div></a><a href="/developer-self-service" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="eager" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/64462c9aa96777b673e53d40_icon-enable-developer%20self-service.png" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Developer Self-service</div></div></a><a href="/rbac-and-governance" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="eager" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/64462c9aa967778893e53d44_icon-nail-kubernetes-migration.avif" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>RBAC and Governance</div></div></a></div><div id="w-node-a626c3e7-0910-0d3e-e65a-a9025510ae1c-92cfbed3" class="dd-col _24"><a href="/deployment-management" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="eager" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/653235cf4d0afe70af92b43b_nav-icon-features-deployment-management.png" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Deployment Management</div></div></a><a href="/insights-intelligence" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="eager" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/653232838ab95a0467b107d4_nav-icon-features-insights.png" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Insights &amp; Engineering Intelligence</div></div></a><a href="/cost-control" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="eager" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/65323283f2b3eec77b4136f3_nav-icon-features-cost-control.png" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Cost control</div></div></a></div><div class="dd-col _24"><a href="/infrastructure-orchestration" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="eager" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/65323283a02877d79b1a9dc3_nav-icon-features-infrastructure-orchestration.png" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Infrastructure Orchestration</div></div></a><a href="/cluster-gpu-orchestration" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="eager" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/65323283152d62d873d0c308_nav-icon-features-cluster-gpu.png" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Cluster &amp; GPU Orchestration</div></div></a><a href="/ephemeral-environments" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="eager" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/65323283a20d785f645b9ad9_nav-icon-features-ephemeral-environments.png" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Ephemeral Environments</div></div></a></div></div></div></nav></div><div data-hover="true" data-delay="100" class="nav-dd w-dropdown"><div class="nav-link w-dropdown-toggle"><a href="/use-cases" class="link-block dropdown-parent-link w-inline-block"><div>Use Cases</div><div class="dd-arrow-icon w-icon-dropdown-toggle"></div></a></div><nav class="dd-list w-dropdown-list"><div class="dd-content _24"><div class="dd-grid _24"><div id="w-node-_6eeb1b96-f5e8-e385-2972-bd6e982c1974-92cfbed3" class="dd-col _24"><div id="w-node-_6eeb1b96-f5e8-e385-2972-bd6e982c1975-92cfbed3" class="dd-tag">Use CASES</div><a href="/use-cases/build-internal-developer-platforms" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="lazy" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/6542238745db6bc409b21882_build-an-idp-nav-icon.svg" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Build Internal Developer Platforms (IDPs)</div><div class="dd-link-subtext">Feed your developer portal with a single platform backend</div></div></a><a href="/use-cases/catch-and-fix-infra-drift" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img sizes="100vw" srcset="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/6943182e1d2b42e68ec7bd71_carbon_ibm-secure-infrastructure-on-vpc-for-regulated-industries-p-500.png 500w, https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/6943182e1d2b42e68ec7bd71_carbon_ibm-secure-infrastructure-on-vpc-for-regulated-industries.png 512w" alt="" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/6943182e1d2b42e68ec7bd71_carbon_ibm-secure-infrastructure-on-vpc-for-regulated-industries.png" loading="lazy" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Catch and fix infra drift</div><div class="dd-link-subtext">Detect drift early and realign environments with one redeploy</div></div></a><a href="/use-cases/rollback-applications-and-infrastructure" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="lazy" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/69432032964381b81e57817f_material-symbols_undo.png" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Rollback application and infrastructure</div><div class="dd-link-subtext">Restore any environment to a known-good state in seconds</div></div></a><a href="/use-cases/reduce-risk-with-progressive-infra-rollouts" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="lazy" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/6948690eb669c9c8d04aabec_fluent_arrow-growth-20-filled.png" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Reduce risk with progressive infra rollouts</div><div class="dd-link-subtext">Gradually apply updates across environments with full control and instant rollback.</div></div></a><a href="/use-cases/enable-developer-self-service" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="lazy" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/65422387627fc9baf1ed54e5_enable-developer-self-service-nav-icon.svg" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Enable developer self-service</div><div class="dd-link-subtext">Kill waiting times. Self-serve the tech you need to run your apps</div></div></a><a href="/use-cases/eliminate-ticket-ops" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="lazy" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/6542238768439d31ffe2bfb8_eliminate-ticket-ops-nav-icon.svg" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Eliminate ticket ops</div><div class="dd-link-subtext">No more ticket ops and repetitive tasks, slash lead time</div></div></a><a href="/use-cases/impact-analysis" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="lazy" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/694c1e0ebff8b8c11a443110_fluent_radar-20-filled.png" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Understand the blast radius</div><div class="dd-link-subtext">Instantly see which workloads and environments are impacted by infra issues</div></div></a></div><a id="w-node-_6eeb1b96-f5e8-e385-2972-bd6e982c1933-92cfbed3" href="/minimum-viable-platform-mvp" class="dd-card _24 is-product hide w-inline-block"><div class="dd-link-text-wrapper"><div class="dd-link-icon"><div class="dd-card-text">Build an MVP in days</div><div class="dd-icon-embed w-embed"><svg aria-hidden="true" fill='currentColor' role="img" width="100%" height="100%" viewBox="0 0 20 21" xmlns="http://www.w3.org/2000/svg"><title>Arrow Right</title><polygon points="16.172 9 10.101 2.929 11.515 1.515 20 10 19.293 10.707 11.515 18.485 10.101 17.071 16.172 11 0 11 0 9"/></svg></div></div><div class="dd-link-subtext">A structured approach to get you to your
minimum viable platform in four phases.</div></div><div class="bg-wrapper"><img src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/666161bff46a39579ca7c212_humanitec%20navigation%20dd%20card%20bg%20icon%20%20rocket.webp" loading="lazy" alt="" class="dd-card_bg-icon is-rocket"/><div class="dd-card_bg-glow"></div></div></a><div id="w-node-_6eeb1b96-f5e8-e385-2972-bd6e982c193e-92cfbed3" class="dd-col _24 hide"><div class="dd-tag">Users</div><a href="/for-developers" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="lazy" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/6650157fd899b9e853e09f51_Application%20Developers.svg" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Application Developers</div><div class="dd-link-subtext">True self-service. No waiting times</div></div></a><a href="/for-infrastructure-teams" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="lazy" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/6650158072ae748fe66ad09b_Infrastructure%20and%20Operations.svg" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Infrastructure and Operations</div><div class="dd-link-subtext">Configure once. Enforce everywhere</div></div></a><a href="/for-security-teams" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="lazy" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/665015807d66616f010af9db_Security.svg" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Security</div><div class="dd-link-subtext">Build the DevSecOps platform for you</div></div></a><a href="/why-humanitec" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="lazy" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/6650157fd181eef1e08e3b36_Executives.svg" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Executives</div><div class="dd-link-subtext">Build a leading organization. Cut time to market.</div></div></a><div class="dd-tag-divider"><div class="dd-tag">Platform Engineers</div></div><a href="/for-infrastructure-platform-engineers" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="lazy" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/665015802e99dd4e973313e5_Infrastructure%20Platform%20engineers.svg" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Infrastructure Platform engineers</div><div class="dd-link-subtext">Build a backend for everyone</div></div></a><a href="/for-devex-platform-engineers" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="lazy" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/6650158111098963664b04a6_DevEx%20Platform%20Engineers.svg" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>DevEx Platform Engineers</div><div class="dd-link-subtext">Craft amazing DevEx flows</div></div></a></div></div></div></nav></div><div class="hidden-menu-desktop"><div class="desktop-nav-links-right-col-symbol"><a href="/pricing" class="nav-link w-inline-block"><div>Pricing</div></a><div data-hover="true" data-delay="100" class="nav-dd w-dropdown"><div class="nav-link w-dropdown-toggle"><div>Learn</div><div class="dd-arrow-icon w-icon-dropdown-toggle"></div></div><nav class="dd-list w-dropdown-list"><div class="dd-content _24"><div class="dd-grid _24"><a id="w-node-_1780451f-d61b-b1e2-5f39-fd72f50e7eb3-78be20dd" href="https://developer.humanitec.com/introduction/getting-started/the-five-minute-idp/" class="dd-card _24 is-product hide w-inline-block"><div class="dd-link-text-wrapper"><div class="dd-link-icon"><div class="dd-card-text">5 minutes IDP</div><div class="dd-icon-embed is-rotating w-embed"><svg aria-hidden="true" fill='currentColor' role="img" width="100%" height="100%" viewBox="0 0 20 21" xmlns="http://www.w3.org/2000/svg"><title>Arrow Right</title><polygon points="16.172 9 10.101 2.929 11.515 1.515 20 10 19.293 10.707 11.515 18.485 10.101 17.071 16.172 11 0 11 0 9"/></svg></div></div><div class="dd-link-subtext">Build a fully functional test platform on your local machine in five minutes</div></div><div class="bg-wrapper"><img src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/673dac4d126c06793533f33b_dd-card_bg-wrapper.avif" loading="lazy" alt="" class="dd-card_bg-icon is-rocket"/><div class="dd-card_bg-glow"></div></div></a><div class="dd-col"><div class="dd-tag">Resources</div><a id="w-node-a885fdf9-ece6-db8d-41e3-e397a8f1af70-78be20dd" href="/blog" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="lazy" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/644a3d341e164961a163533d_nav-icon-blog.svg" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Blog</div><div class="dd-link-subtext">Check out our latest articles and product releases</div></div></a><a href="/videos" class="dd-link _24 hide w-inline-block"><div class="dd-link-icon-small"><img loading="lazy" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/644a3cfe541e00a427d8c7ea_nav-icon-video-library.svg" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Videos</div><div class="dd-link-subtext">Check our video library and learn how to build a platform</div></div></a><a href="/roi" class="dd-link _24 hide w-inline-block"><div class="dd-link-icon-small"><img loading="lazy" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/644a3cff9aa69d2633789549_nav-icon-roi.svg" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>ROI Calculator</div><div class="dd-link-subtext">What is the ROI of building a platform with Humanitec?</div></div></a><a href="/whitepapers" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="lazy" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/644a3cfdd9f2d0daf5076b59_nav-icon-whitepapers.svg" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Whitepapers</div><div class="dd-link-subtext">Industry reports and benchmarking studies</div></div></a><a href="/security" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="lazy" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/644a3cfecaa54a302f02ed8e_nav-icon-security.svg" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Security</div><div class="dd-link-subtext">Learn about Humanitec&#x27;s enterprise-grade security standards</div></div></a></div><div class="dd-col"><div class="dd-tag">Community</div><a href="/events" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="lazy" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/644a3d9c8ff9f70802f144e0_nav-icon-webinars.svg" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Events</div><div class="dd-link-subtext">Sign up for our weekly events or check out past recordings</div></div></a><a href="/partners" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="lazy" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/644a3d9e23d92a38f2f21e40_nav-icon-partners.svg" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Partners</div><div class="dd-link-subtext">Check out our ecosystem of implementation partners</div></div></a><div class="dd-tag-divider"><div class="dd-tag">Reference architecture</div></div><a href="/platform-engineering" class="dd-link _24 hide w-inline-block"><div class="dd-link-icon-small"><img src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/666160a36b90f4acced3dace_Infrastructure%20Platform%20engineers.svg" loading="lazy" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div class="div-block-27"><div>What is Platform Engineering?</div></div><div class="dd-link-subtext">Learn everything about Platform Engineering, the next evolution of DevOps</div></div></a><a href="/blog/what-is-an-internal-developer-platform" class="dd-link _24 hide w-inline-block"><div class="dd-link-icon-small"><img src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/666160a36b90f4acced3dace_Infrastructure%20Platform%20engineers.svg" loading="lazy" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div class="div-block-27"><div>What is an Internal Developer Platform?</div></div><div class="dd-link-subtext">All you need to know about Internal Developer Platforms</div></div></a><a href="/reference-architectures" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="eager" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/66575865b1d94fa34a45b428_Ref%20archs%20icon.svg" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div class="dd-link-flex"><div>Reference Architectures</div></div><div class="dd-link-subtext">Blueprints for enteprise-grade Internal Developer Platforms.</div></div></a></div></div></div></nav></div><a href="https://developer.humanitec.com/" target="_blank" class="nav-link w-inline-block"><div>Docs</div></a></div></div><div class="nav-menu-row-mobile"><div class="nav-buttons-wrapper"><a href="https://app.humanitec.io/auth/login" target="_blank" class="button is-secondary w-inline-block"><div>Login</div></a><a href="/schedule-demo" class="button w-inline-block"><div>Book a demo</div></a></div></div><a href="/customers" class="nav-link w-inline-block"><div>Customers</div></a></nav><div class="nav-col-center"><div class="nav-col-logo"><a href="/" class="humanitec-logo-link w-nav-brand"><div class="humanitec-logo-wrapper is-white"><div class="humanitec-logo-embed w-embed"><svg width="100%" viewBox="0 0 156 19" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1907_115397)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.3193 0.472049L16.8915 4.01242L13.3193 7.55279L9.747 4.01242L13.3193 0.472049ZM0.697266 6.49069H5.81751C5.81751 10.6211 9.27067 14.0435 13.4383 14.0435C17.606 14.0435 21.0592 10.6211 21.0592 6.49069H26.1794C26.1794 13.4534 20.4638 19 13.5574 19C6.65104 19 0.697266 13.4534 0.697266 6.49069ZM151.566 13.5715H155.258C154.781 16.4037 152.162 18.5279 149.185 18.5279C145.731 18.5279 142.992 15.8137 142.992 12.3913C142.992 8.96895 145.731 6.25466 149.185 6.25466C152.162 6.25466 154.543 8.26088 155.258 10.9752H151.447C150.971 10.267 150.137 9.67702 149.185 9.67702C147.755 9.67702 146.565 10.8572 146.565 12.2733C146.565 13.6894 147.755 14.8696 149.185 14.8696C150.257 14.9876 151.209 14.3975 151.566 13.5715ZM132.752 10.9752H138.23C137.873 9.79505 137.039 8.96895 135.491 8.96895C133.943 8.96895 133.109 9.91301 132.752 10.9752ZM139.182 13.5715H132.752C133.109 14.7515 134.062 15.5776 135.491 15.5776C136.444 15.5776 137.277 15.2236 137.753 14.6336H141.445C140.611 16.9938 138.468 18.646 135.491 18.646C131.561 18.646 129.18 15.9317 129.18 12.5093C129.18 9.08699 132.038 6.37267 135.491 6.37267C138.944 6.37267 141.802 9.08699 141.802 12.5093C141.802 12.8633 141.802 13.2174 141.683 13.6894H139.539H139.182V13.5715ZM115.01 5.6646L112.152 2.8323L115.01 0L117.868 2.8323L115.01 5.6646ZM113.104 14.2795V10.267V6.49069H117.153V10.267V14.2795V18.2919H113.104V14.2795ZM107.032 15.3416V11.5652C107.032 10.5031 106.079 9.55898 105.008 9.55898C103.936 9.55898 102.984 10.5031 102.984 11.5652V13.6894V14.2795V18.2919H98.9345V14.2795V10.267V6.49069H102.984V7.90683C103.817 6.84472 105.127 6.25466 106.556 6.25466C109.056 6.25466 111.08 8.26088 111.08 10.7391V14.5155V18.2919H107.032V15.3416ZM40.9448 15.3416V11.5652C40.9448 10.5031 39.9922 9.55898 38.9206 9.55898C37.8488 9.55898 36.8963 10.5031 36.8963 11.5652V13.6894V14.2795V18.2919H32.8477V14.2795V10.267V6.49069V2.71428H36.8963V6.49069V7.90683C37.7298 6.84472 39.0396 6.25466 40.4686 6.25466C42.9691 6.25466 44.9934 8.26088 44.9934 10.7391V14.5155V18.2919H40.9448V15.3416ZM82.7404 14.2795V18.2919H78.6918V16.1677V11.5652C78.6918 10.5031 77.7392 9.55898 76.6675 9.55898C75.5958 9.55898 74.6433 10.5031 74.6433 11.5652V15.3416V18.41H70.5946V15.3416V11.5652C70.5946 10.5031 69.6421 9.55898 68.5704 9.55898C67.4987 9.55898 66.5461 10.5031 66.5461 11.5652V13.6894V14.2795V18.2919H62.4975V14.2795V10.267V6.49069H66.5461V7.90683C67.3796 6.84472 68.6894 6.25466 70.1184 6.25466C71.6664 6.25466 72.9762 6.96273 73.8097 8.02481C74.7623 6.84472 76.1912 6.13664 77.7392 6.13664C80.4782 6.13664 82.8595 8.37892 82.8595 11.0932V14.2795H82.7404ZM125.012 6.49069H127.513V9.79505H125.012V13.3354C125.131 14.2795 125.846 15.1056 126.798 15.1056C127.036 15.1056 127.274 14.9876 127.513 14.8696V18.0559C126.917 18.41 126.203 18.5279 125.488 18.5279C122.988 18.5279 120.964 16.5218 120.964 14.0435V9.79505H118.94V6.49069H120.964V2.71428H125.012V6.49069ZM90.718 14.9876C92.1471 14.9876 93.3381 13.8075 93.3381 12.2733C93.3381 10.7391 92.1471 9.55898 90.718 9.55898C89.2898 9.55898 88.0988 10.7391 88.0988 12.2733C87.9798 13.8075 89.1708 14.9876 90.718 14.9876ZM96.9103 12.5093V18.2919H93.5761V17.2298C92.624 18.0559 91.433 18.41 90.361 18.41C86.9078 18.41 84.1695 15.8137 84.1695 12.3913C84.1695 8.96895 87.0268 6.25466 90.48 6.25466C93.9332 6.25466 96.7913 8.96895 96.7913 12.3913C96.9103 12.5093 96.9103 12.5093 96.9103 12.5093ZM55.5911 10.5031V6.49069H59.6397V10.5031V14.5155V18.2919H55.5911V16.8758C54.7576 17.9379 53.4478 18.5279 52.0189 18.5279C49.5182 18.5279 47.494 16.5218 47.494 14.0435V10.5031V6.49069H51.5426V9.44102V13.2174C51.5426 14.2795 52.4952 15.2236 53.5669 15.2236C54.6385 15.2236 55.5911 14.2795 55.5911 13.2174V11.2112V10.5031Z" fill="currentcolor"/>
</g>
<defs>
<clipPath id="clip0_1907_115397">
<rect width="155.766" height="19" fill="white"/>
</clipPath>
</defs>
</svg></div></div></a></div></div><div class="nav-col-right"><div class="hide-tablet"><div class="desktop-nav-links-right-col-symbol"><a href="/pricing" class="nav-link w-inline-block"><div>Pricing</div></a><div data-hover="true" data-delay="100" class="nav-dd w-dropdown"><div class="nav-link w-dropdown-toggle"><div>Learn</div><div class="dd-arrow-icon w-icon-dropdown-toggle"></div></div><nav class="dd-list w-dropdown-list"><div class="dd-content _24"><div class="dd-grid _24"><a id="w-node-_1780451f-d61b-b1e2-5f39-fd72f50e7eb3-78be20dd" href="https://developer.humanitec.com/introduction/getting-started/the-five-minute-idp/" class="dd-card _24 is-product hide w-inline-block"><div class="dd-link-text-wrapper"><div class="dd-link-icon"><div class="dd-card-text">5 minutes IDP</div><div class="dd-icon-embed is-rotating w-embed"><svg aria-hidden="true" fill='currentColor' role="img" width="100%" height="100%" viewBox="0 0 20 21" xmlns="http://www.w3.org/2000/svg"><title>Arrow Right</title><polygon points="16.172 9 10.101 2.929 11.515 1.515 20 10 19.293 10.707 11.515 18.485 10.101 17.071 16.172 11 0 11 0 9"/></svg></div></div><div class="dd-link-subtext">Build a fully functional test platform on your local machine in five minutes</div></div><div class="bg-wrapper"><img src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/673dac4d126c06793533f33b_dd-card_bg-wrapper.avif" loading="lazy" alt="" class="dd-card_bg-icon is-rocket"/><div class="dd-card_bg-glow"></div></div></a><div class="dd-col"><div class="dd-tag">Resources</div><a id="w-node-a885fdf9-ece6-db8d-41e3-e397a8f1af70-78be20dd" href="/blog" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="lazy" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/644a3d341e164961a163533d_nav-icon-blog.svg" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Blog</div><div class="dd-link-subtext">Check out our latest articles and product releases</div></div></a><a href="/videos" class="dd-link _24 hide w-inline-block"><div class="dd-link-icon-small"><img loading="lazy" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/644a3cfe541e00a427d8c7ea_nav-icon-video-library.svg" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Videos</div><div class="dd-link-subtext">Check our video library and learn how to build a platform</div></div></a><a href="/roi" class="dd-link _24 hide w-inline-block"><div class="dd-link-icon-small"><img loading="lazy" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/644a3cff9aa69d2633789549_nav-icon-roi.svg" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>ROI Calculator</div><div class="dd-link-subtext">What is the ROI of building a platform with Humanitec?</div></div></a><a href="/whitepapers" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="lazy" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/644a3cfdd9f2d0daf5076b59_nav-icon-whitepapers.svg" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Whitepapers</div><div class="dd-link-subtext">Industry reports and benchmarking studies</div></div></a><a href="/security" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="lazy" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/644a3cfecaa54a302f02ed8e_nav-icon-security.svg" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Security</div><div class="dd-link-subtext">Learn about Humanitec&#x27;s enterprise-grade security standards</div></div></a></div><div class="dd-col"><div class="dd-tag">Community</div><a href="/events" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="lazy" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/644a3d9c8ff9f70802f144e0_nav-icon-webinars.svg" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Events</div><div class="dd-link-subtext">Sign up for our weekly events or check out past recordings</div></div></a><a href="/partners" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="lazy" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/644a3d9e23d92a38f2f21e40_nav-icon-partners.svg" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div>Partners</div><div class="dd-link-subtext">Check out our ecosystem of implementation partners</div></div></a><div class="dd-tag-divider"><div class="dd-tag">Reference architecture</div></div><a href="/platform-engineering" class="dd-link _24 hide w-inline-block"><div class="dd-link-icon-small"><img src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/666160a36b90f4acced3dace_Infrastructure%20Platform%20engineers.svg" loading="lazy" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div class="div-block-27"><div>What is Platform Engineering?</div></div><div class="dd-link-subtext">Learn everything about Platform Engineering, the next evolution of DevOps</div></div></a><a href="/blog/what-is-an-internal-developer-platform" class="dd-link _24 hide w-inline-block"><div class="dd-link-icon-small"><img src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/666160a36b90f4acced3dace_Infrastructure%20Platform%20engineers.svg" loading="lazy" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div class="div-block-27"><div>What is an Internal Developer Platform?</div></div><div class="dd-link-subtext">All you need to know about Internal Developer Platforms</div></div></a><a href="/reference-architectures" class="dd-link _24 w-inline-block"><div class="dd-link-icon-small"><img loading="eager" src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/66575865b1d94fa34a45b428_Ref%20archs%20icon.svg" alt="" class="dd-link-icon"/></div><div class="dd-link-text-wrapper"><div class="dd-link-flex"><div>Reference Architectures</div></div><div class="dd-link-subtext">Blueprints for enteprise-grade Internal Developer Platforms.</div></div></a></div></div></div></nav></div><a href="https://developer.humanitec.com/" target="_blank" class="nav-link w-inline-block"><div>Docs</div></a></div></div><div class="nav-buttons"><div class="nav-buttons-wrapper"><div class="button-bg-radial"><a href="https://app.humanitec.io" target="_blank" class="button is-secondary is-small w-inline-block"><div>Login</div></a></div><div class="button-bg-radial"><a href="https://app.humanitec.io/auth/signup" target="_blank" class="button is-small w-inline-block"><div>Free trial</div></a></div></div></div><div class="nav-menu-button w-nav-button"><div class="menu-icon w-embed"><svg width="100%" height="100%" viewBox="0 0 26 26" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M10 13L22 13" stroke="currentColor" stroke-width="1.625" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M4.0625 6.5H21.9375" stroke="currentColor" stroke-width="1.625" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M4.0625 19.5H21.9375" stroke="currentColor" stroke-width="1.625" stroke-linecap="round" stroke-linejoin="round"/>
</svg></div></div></div></div></div></div><div class="navbar-bg"></div></header><div class="section-light is-blog-template-hero"><div class="padding-global"><div class="container"><div class="bredcrumbs-nav"><a href="/blog" class="breadcrumb-link">All blogs</a><div class="breadcrumb-chevron w-embed"><svg width=" 100%" height=" 100%" viewBox="0 0 7 10" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1 9.45898L5.45923 5L1 0.540771" stroke="currentColor" stroke-opacity="0.6" stroke-width="1.5"/>
</svg></div><a href="/blog/what-developer-self-service-shouldnt-look-like" aria-current="page" class="breadcrumb-link w--current">Dark Side of Self-Service</a></div></div><div class="container"><div class="blog-template-hero-grid"><div id="w-node-_933693cc-8b64-afab-8a00-7aaf8dc869f4-4de53b55" class="blog-template-hero-content"><div class="margin-bottom-regular-20"><h1 class="heading-style-h3">Dark Side of Self-Service</h1></div><div class="margin-bottom-regular-20"><div class="blog-template-hero-author-wrapper"><a href="/author/kaspar-von-grunberg" class="blog-author-pic-name w-inline-block"><div class="author-image-wrapper"><img loading="lazy" alt="" src="https://cdn.prod.website-files.com/64462c9aa967772377e53b6e/6450b26051a4501f1af34ebc_Kaspar%20von%20Gru%CC%88nberg.webp" sizes="(max-width: 767px) 100vw, 582px" srcset="https://cdn.prod.website-files.com/64462c9aa967772377e53b6e/6450b26051a4501f1af34ebc_Kaspar%20von%20Gru%CC%88nberg-p-500.webp 500w, https://cdn.prod.website-files.com/64462c9aa967772377e53b6e/6450b26051a4501f1af34ebc_Kaspar%20von%20Gru%CC%88nberg-p-800.webp 800w, https://cdn.prod.website-files.com/64462c9aa967772377e53b6e/6450b26051a4501f1af34ebc_Kaspar%20von%20Gru%CC%88nberg-p-1080.webp 1080w, https://cdn.prod.website-files.com/64462c9aa967772377e53b6e/6450b26051a4501f1af34ebc_Kaspar%20von%20Gru%CC%88nberg-p-1600.webp 1600w, https://cdn.prod.website-files.com/64462c9aa967772377e53b6e/6450b26051a4501f1af34ebc_Kaspar%20von%20Gru%CC%88nberg-p-2000.webp 2000w, https://cdn.prod.website-files.com/64462c9aa967772377e53b6e/6450b26051a4501f1af34ebc_Kaspar%20von%20Gru%CC%88nberg.webp 2160w" class="blog-author-image"/></div><div><div class="text-style-heading">Kaspar von Grünberg</div></div></a><div><div class="text-style-code text-style-muted">August 27, 2021</div></div></div></div><div class="margin-bottom-regular-20"><p id="w-node-_933693cc-8b64-afab-8a00-7aaf8dc86a04-4de53b55" class="blog-header-intro-max">Developer self-service is a fundamental step every engineering team needs to take to reach true DevOps, true “you build it, you run it”. Often however, teams get self-service spectacularly wrong. This article will walk through some real-life examples and discuss how you should think about striking the right balance between golden cages and golden paths.</p></div></div><div id="w-node-_933693cc-8b64-afab-8a00-7aaf8dc86a06-4de53b55" class="blog-template-hero-image-wrapper"><img loading="lazy" width="573" alt="" src="https://cdn.prod.website-files.com/64462c9aa967772377e53b6e/64462c9aa96777ca6ce54236_6128ce1409e2fc143cab75cb_Frame%2520201.webp" sizes="(max-width: 767px) 100vw, 573px" srcset="https://cdn.prod.website-files.com/64462c9aa967772377e53b6e/64462c9aa96777ca6ce54236_6128ce1409e2fc143cab75cb_Frame%2520201-p-500.webp 500w, https://cdn.prod.website-files.com/64462c9aa967772377e53b6e/64462c9aa96777ca6ce54236_6128ce1409e2fc143cab75cb_Frame%2520201-p-800.webp 800w, https://cdn.prod.website-files.com/64462c9aa967772377e53b6e/64462c9aa96777ca6ce54236_6128ce1409e2fc143cab75cb_Frame%2520201-p-1080.webp 1080w, https://cdn.prod.website-files.com/64462c9aa967772377e53b6e/64462c9aa96777ca6ce54236_6128ce1409e2fc143cab75cb_Frame%2520201.webp 1201w" class="blog-template-image"/></div></div></div></div></div><section class="section-sidebar is-white-bg"><div class="padding-global"><div class="container"><div class="padding-section-medium"><div class="section-sidebar-content-wrapper"><div id="w-node-_933693cc-8b64-afab-8a00-7aaf8dc86a0d-4de53b55" class="section-sidebar-content-sticky"><div class="section-sidebar-inner"><div class="sidebar-row-item has-no-border"><div class="margin-bottom margin-small"><div class="text-size-medium text-weight-bold">Table of contents</div></div><div class="fs-toc_link-content"><div class="fs-toc_link-wrapper is-h2"><a href="#" class="fs-toc_link w-inline-block"><div fs-toc-element="link">Example H2</div></a><div fs-toc-element="ix-trigger" id="w-node-eee72c75-703e-2d3a-3cd6-68137a963f7a-4de53b55" class="fs-toc_h-trigger"></div><div class="fs-toc_link-wrapper is-h3"><a href="#" class="fs-toc_link is-h3 w-inline-block"><div fs-toc-element="link">Example H3</div></a><div class="fs-toc_link-wrapper is-h4"><a href="#" class="fs-toc_link is-h4 w-inline-block"><div fs-toc-element="link">Example H4</div></a><div class="fs-toc_link-wrapper is-h5"><a href="#" class="fs-toc_link is-h5 w-inline-block"><div fs-toc-element="link">Example H5</div></a><div class="fs-toc_link-wrapper is-h6"><a href="#" class="fs-toc_link is-h6 w-inline-block"><div fs-toc-element="link">Example H6</div></a></div></div></div></div></div></div></div></div></div><div id="w-node-_933693cc-8b64-afab-8a00-7aaf8dc86a1a-4de53b55" class="section-main-content"><div class="blog-template-main"><div class="text-rich-text-blog-custom-styling w-embed"><style>
.text-rich-text-blog ol {
list-style-type: decimal !important;
background-image: none !important;
margin: 0 !important;
margin-bottom: 2rem!important;
}
.text-rich-text-blog ol li {
display: list-item !important;
margin-left: 1.5em !important; /* Adjust this value as needed to indent the list items */
background-image: none !important;
margin-top: 0 !important;
margin-bottom: 0 !important;
color: inherit !important;
padding: 0 !important;
}
.hack20-sub-bullet {
background-image: url('https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/646dc1b8898b1ed1acce9a3c_bullet-outlined.svg') !important;
background-position: 0px 4px;
background-size: auto;
background-repeat: no-repeat;
}
.text-rich-text {
word-wrap: break-word;
}
em {
border: 1px solid #e2e2e2;
background-color: rgba(29,28,29, 0.04);
border-radius: 3px;
color: #0EAD8E;
width: auto;
padding: 2px;
font-size: 12px;
font-weight: 400;
font-family: monaco, monospace;
color: #0EAD8E;
-webkit-font-smoothing: antialiased;
font-style: normal;
}
table {
border-color: #8892A8;
}
</style>
<style>
sub {
vertical-align: baseline; /* Resets the subscript styling */
font-size: 100%; /* Resets the font size */
line-height: 1; /* Resets the line height */
font-style: italic; /* Applies the italics */
bottom: 0;
}
</style></div><div fs-toc-offsettop="6em" fs-toc-element="contents" class="text-rich-text-blog w-richtext"><p>Developer self-service is the best thing that can happen to a team. “You build it, you run it” is what you would want for your engineering team. It’s setting the right incentives, unblocking developers, reducing <a target="_blank" href="https://platformengineering.org/blog/cognitive-load">cognitive load</a>. Developer self-service means striking the right balance between overwhelming people by letting them operate everything and restricting them by building abstractions. In fact, developer self-service is often used as an excuse for either shifting work left or for belittling developers. In this article, I want to explain how not to approach developer self-service, which might be even more important than learning how to enable it in the first place.</p><h2>Shooting yourself in the foot</h2><p>We’re all bought in on the paradigm “you build it, you run it”, right? I mean this is literally what DevOps is all about. Heroically tearing down walls between “operations” and “application development”. We’re all one now, everybody does everything! </p><p>“Developer self-service” is just a modern reincarnation of that motto. It’s more 2021, it’s confirmed as important by enough people with enough followers on Twitter and it leaves enough room to interpret it the way you want. </p><p>In my opinion, it actually leaves room to be <strong>abused</strong> the way certain people want. Because both, the “you build it, you run it&#x27;&#x27; paradigm and the newer “developer self-service”, are being abused by certain roles in the engineering team to avoid doing their job properly and instead waste time on “nice to have” stuff. While the early 2000s were dominated by application developers throwing unstructured code “over the fence” to operations and sysadmins to somehow get it to run, we’re now experiencing the opposite: operations teams (or wrongly named DevOps teams) that come up with yet another cool technology and throw it at the application development team so they can “self-serve” it, without proper training. Many also enjoy building abstractions that <a href="https://humanitec.com/blog/devops-standards-vs-freedom">restrict the freedom </a>of the individual developer. If your abstractions work in 90% of cases but the remaining 10% are a pain, you don’t win much.</p><p>This is why it is insanely important to get the balance between the two right. It’s important for the sanity of developers and equally important for managing the workload of the operations team building (or not building) abstractions. </p><p>If Ops don’t do their job properly, all they are doing is creating more work for themselves and everyone else. Because who do developers slack if they don’t know how to debug those nasty Helm charts? Correct, operations. Which in turn can go back and complain that they are missing their quarterly targets. It’s a vicious cycle. </p><figure style="max-width:1664pxpx" class="w-richtext-align-fullwidth w-richtext-figure-type-image"><div><img alt="" src="https://cdn.prod.website-files.com/64462c9aa967772377e53b6e/64462c9aa967773810e5415a_6128cc90e4a54c0f49c940c4_w-Cchwbo0EujVKE2PWRKoWglZ75FmOvWklTrC4qYM7UVZuUMoXnvau3-4YRE7aLK-Rjet4S-UCxse7sZ-JaNtZ4hvTzeI-XIhswC4vT1XQXyNBCioLWQnkfswcsXqvc2KsUrmQRF%253Ds0.png"/></div></figure><p>You can clearly see this in the data. When we analyzed the setups of 1,856 engineering teams across the world, we asked what sentence would describe their DevOps setup best. Full “you build it, you run it” is by far not the majority, coming in at 21.2%. 32.2% are running an old-school throw-over-the-fence setup. Interesting is the remaining 44.6%. Those are the teams that basically tear down the walls, while at the same time overwhelming the majority of their developers with delivery tasks they aren’t prepared for. Who fills in are senior developers that take over the “de facto” role of old-school operations. There is little evidence this situation is better than the standard split between a sysadmin and a developer. </p><h2>There’s nothing wrong with division of labour </h2><figure style="max-width:1510pxpx" class="w-richtext-align-fullwidth w-richtext-figure-type-image"><div><img alt="" src="https://cdn.prod.website-files.com/64462c9aa967772377e53b6e/64462c9aa96777f71ae54159_6128cc8f403155ee55c58269_wA_xlthAm5xi85wOXSlCB1K-0Q4bJ8d6N_jUCbcLBVtrYGTeBtjR2aaEpLJ1R72RYupy6eRLlvltSE60wK_AfTxy-btVxQgrp0qMC_AwAx045lLo3zgfSmaeS3xrV5S3JJkNocwb%253Ds0.png"/></div></figure><p>The first thing to do here is to acknowledge that there is always some sort of division of labor. At enterprise-scale, a no-ops world is a nice dream, but not much more than that. </p><p>To quote my friend Aaron Erickson, who built Salesforce’s Internal Developer Platform: </p><p><em>“Service ownership is a good idea in theory, but in practice people get confused. If developers have to run all the ops for their services, you do not have any economies of scale. To run 1,000 different services around Kubernetes, you shouldn&#x27;t need 1,000 Kubernetes experts to do that.”</em></p><p>The question in reality is not about erasing the role of operations, it’s about defining what the right hand-over point between Ops and developer is. Rather than running an operations team, the way to go is running an <a href="https://humanitec.com/blog/internal-platform-teams-what-are-they-and-do-you-need-one">internal platform team</a> that focuses on lowering cognitive load through self-service. I will explain this using the “cognitive load” theory at the end of this article. </p><h2>Some truly bad examples</h2><p>Enough of the high-level. Let me give you two examples of setups that sound beautiful at first glance, but actually got the self-service balance totally wrong. They both highlight the arrogance of this new “leave developers alone” philosophy. </p><h3>The “throw everything at them” crew </h3><p>This example stems from a conversation I’ve recently had with an SRE at a fast scaling startup. Let’s have a look at the setup this team built and what’s wrong with it. </p><p>The company was operating with customers from one continent, with no particular data-protection requirements. They were running 4 apps in production. Each application consisted of roughly 20 microservices, mostly written in Python for the backend and ReactJS for the frontend. The company offered a B2B SaaS product, loads were almost 100% predictable, scalability wasn’t a problem at all. They were able to set things up with no legacy (a luxury that no enterprise vendor usually has), from scratch. </p><p>Let’s say we strictly optimize for developer self-service (and experience), what’s the <strong>only</strong> thing this team should be using? The answer is a cheap advertisement for Heroku (not associated with them and the link doesn’t contain any kickback). Even this smart SRE couldn’t give me a single reason why not to choose this. But Heroku is boring. It doesn’t look smart, it doesn’t make you feel like a wizard or witch, it’s not open source and it’s not recommended by the CNCF. In other words: if you’re cool, you don’t use Heroku. </p><p>So the team went off and built the following beautiful setup: Kubernetes with EKS and a local provider (because somebody in the business said this would drive sales in one geography). This local provider didn’t offer managed K8s so they used a self-managed version. Four different  DB types, some of them managed. Elastic, Redis, RabbitMQ. CI with Jenkins and GitHub Actions (why would one standardize). Argo to sync the mess with the cluster. </p><p>Then Terraform, of course, let’s IaC everything, pour Snyk on top and throw it over the fence. </p><p>Those things were all somewhat connected through scripts, no abstraction, everybody does everything. If somebody asks, respond with “you build it, you run it”. Next, you might want to write a fancy article on Medium to describe your setup. Make sure you use the words “GitOps”, “Continuous Deployment” and finish with a lot of super complex flow diagrams. </p><figure class="w-richtext-align-center w-richtext-figure-type-image"><div><img alt="" src="https://cdn.prod.website-files.com/64462c9aa967772377e53b6e/64462c9aa96777e2dbe5415b_6128cc8fd19068a133216d52_YPU6jlbUUwgFdKgGITOSHcdOPmdBwb0IdmJ9IiHFDHDS4dM6hngTY04Dwq9GCl2dKMon-ZfzCml8e8kMnnUw_tbtf7gjIa6Jz8L_yTaUW5hqPoTd-cW4nqizjS8Gav6Gn2yK0LQT%253Ds0.png"/></div></figure><p>I asked the SRE straight up: “Do you think your developers feel comfortable operating your system?” To which he responded, “I cannot imagine they do”. “Have you asked them”? “No, that’s the way we want it”. </p><p>So to summarize: rather than teaching teams one tool that is easy to maintain and operate, developers now have to operate: Terraform, Helm Charts, Argo, Jenkins, Grafana, Snyk. And that’s just scratching the surface. What was actually won? Nothing. And it’s not that developers are dumb, of course. They could learn how to do all of this. Helm Charts aren’t rocket science. But what was won?</p><h3>The “take it all from the” crew </h3><p>My other example comes from a really large company that builds lots of stuff around cars and has thousands of developers. If you ask any developer about their central platform unit, they get angry (if you’re lucky). </p><p>This unit has come to the conclusion that developers actually don’t need that much choice and that they could make most decisions centrally for them. They’ve not only abstracted everything away from them, they’ve literally taken any room to respond to the specific needs of individual teams. Developers don’t understand what goes on inside the black-box platform that was built and are totally dependent on the central platform team to increase functionality. </p><p>In this case, there is literally no way to circumvent the default. Developers don’t know what’s happening under the hood, they have no idea how things turn out, they simply don’t trust the system. This only exacerbates the fact that in reality in application development it is already hard to forecast what default the team will require. To believe that a platform team can cover 100% of cases is naive. What happens is that developers first wait for new functionality, the platform team doesn’t deliver, then they simply revolt and abandon the platform altogether. You again win nothing. </p><figure class="w-richtext-align-center w-richtext-figure-type-image"><div><img alt="" src="https://cdn.prod.website-files.com/64462c9aa967772377e53b6e/64462c9aa96777339ce54155_6128cc8f9a4a2a26c0350b5f_STRZ4YJ92EcvOjFUF7p8QeCeKLKBSMkn0ptPac_ynKUu9UNVgj76m9siCGp3P3r0tWRe7xQe82Cop8yRF9jxFaVgPg8OgZiOC7nj04X-kLF579QIL2k_WgIoRRBUIQB1VYzNz0xW%253Ds0.jpeg"/></div></figure><h2>The “cognitive load” tradeoff </h2><p>The two examples above are extremely negative and present both extremes. But how do you think about this the right way? How do you determine how much to throw at your team vs how much you abstract away? I’ve developed a model to help you structure your thoughts around this and I call it the “cognitive load” trade-off. Because this is exactly what it comes down to: cognitive load. </p><p>Let me explain. It’s probably fair to assume that developers are somewhere on the right of the bell curve of IQ distribution. In plain words: they are smart and of course, they are able to figure out how to run Terraform at scale if they have to. But while they’re becoming IaC wizards, they fall back on their area of specialization. It’s not what their managers (and the market) pays them for. </p><p>The decision that we have to take is how much cognitive load we want to throw at them. More complexity, more cognitive load. The only way to determine this is through good old communication. That’s the single most important component here. How deep do they want to go? What do they feel comfortable with? How much time can we allocate for learning new stuff? </p><p>We can think about this theoretical too. Simply map cognitive load against the complexity of the setup. The more complex your setup, the higher the cognitive load. </p><p>If we would need to map our examples above, the Heroku setup would be on the left. The setup the SRE geniuses of the first example came up with is on the right side. Huge amount of cognitive load, huge amount of complexity for the developers to handle. </p><figure style="max-width:2048pxpx" class="w-richtext-align-fullwidth w-richtext-figure-type-image"><div><img alt="" src="https://cdn.prod.website-files.com/64462c9aa967772377e53b6e/64462c9aa96777733be54157_6128cc9081bd9b35923f2c22_kYKychy3aXEYgMCwXvmmd54W6tE7pPgcGVvCe7VQQGn-rgCAC7jhMCggMPDxeaneBS2ywbgcjDIUSLHXw2705UigNTfaCBhG0bT8sS8MUuyDFLfkiNZZTrSDTFdJFeZWADAT1p3x%253Ds0.png"/></div></figure><p>How much cognitive load somebody is willing to handle varies from team to team. Well-run engineering teams communicate enough to understand the team’s (or even the individual&#x27;s) preference for cognitive load. Beyond this load, they build opaque abstractions (golden paths) that help developers understand what’s going on under the hood while limiting further cognitive load. </p><figure style="max-width:2048pxpx" class="w-richtext-align-fullwidth w-richtext-figure-type-image"><div><img alt="" src="https://cdn.prod.website-files.com/64462c9aa967772377e53b6e/64462c9aa967774118e54158_6128cc900250316d28ede39c_kSLTtRbIeuf__tKADLiA8kpEEJUrocttk0G-az0xTX0ENqjvabgWBz9MDbxUhFZnMjy9kGQ3OqJ4TwsrdeyQkVExgr7wSNCpGmAQIfXjbBwC4W_Vbozp4EmAx3Yp_RNyo0C2NJ-K%253Ds0.png"/></div></figure><h2>Golden paths, not cages </h2><p>Let’s assume we’ve figured out the amount of cognitive load our developers can handle while doing everything we expect from them. That means the rest has to be abstracted or handled for them. </p><p>In our second example, we’ve seen the disastrous effects of high levels of abstraction. The key here is to go for golden paths over golden cages and to constantly (constantly!) keep communicating, I really cannot stress this enough. A golden path is about abstracting without abstracting. Developers understand what’s under the hood, they could go low-level, you don’t keep them from doing this. All you do is give a guarantee that things are easier if you stick to the paths. What we see in the data is that 97% of developers stick to a golden path once established, following the “social contract” that staying on the path makes the setup more scalable and easier to operate for everybody. </p><p>Jason Warner, CTO at GitHub, explained this well when he detailed out how they introduced their self-service setup, freed people from pager duty, and made them go fast without restricting anybody from going low-level. </p><p><a href="https://youtu.be/ZRVrNak9RoM">3 How was the Internal Developer Platform designed and built?</a></p><p>Github engineers are arguably among the best in the world. <a href="https://humanitec.com/blog/jason-warner-why-github-built-their-own-internal-developer-platform">To quote Jason further</a>: </p><p><em>“We understand these concepts better than anybody on the planet. In the end we invented 90% of all concepts we use today”.</em></p><p>That’s self-confident but true. Not even at Github developers interpret “you build it, you run it” as developers doing everything. If they don’t do it that way, you shouldn’t either. </p><p>And just to reiterate on this one: if you communicate you win. You have to treat developers as users, you have to iterate with them, you have to explain why the golden path makes sense and why they should use it for the good of everybody. </p><p>And to end with some shameful self-advertisement but one I deeply believe: <a href="https://humanitec.com/blog/what-is-an-internal-developer-platform">Internal Developer Platforms</a> can help you build self-service setups that make for wonderful golden paths. They help you “abstract” without keeping things away, they let you expose just the right amount of cognitive load for every single developer.</p></div></div><div class="blog-template-main-author"><div class="webinars-template-author"><div class="margin-bottom-regular-20"><div class="author-info-wrapper"><div class="author-image-wrapper"><img loading="lazy" alt="" src="https://cdn.prod.website-files.com/64462c9aa967772377e53b6e/6450b26051a4501f1af34ebc_Kaspar%20von%20Gru%CC%88nberg.webp" sizes="(max-width: 767px) 100vw, 582px" srcset="https://cdn.prod.website-files.com/64462c9aa967772377e53b6e/6450b26051a4501f1af34ebc_Kaspar%20von%20Gru%CC%88nberg-p-500.webp 500w, https://cdn.prod.website-files.com/64462c9aa967772377e53b6e/6450b26051a4501f1af34ebc_Kaspar%20von%20Gru%CC%88nberg-p-800.webp 800w, https://cdn.prod.website-files.com/64462c9aa967772377e53b6e/6450b26051a4501f1af34ebc_Kaspar%20von%20Gru%CC%88nberg-p-1080.webp 1080w, https://cdn.prod.website-files.com/64462c9aa967772377e53b6e/6450b26051a4501f1af34ebc_Kaspar%20von%20Gru%CC%88nberg-p-1600.webp 1600w, https://cdn.prod.website-files.com/64462c9aa967772377e53b6e/6450b26051a4501f1af34ebc_Kaspar%20von%20Gru%CC%88nberg-p-2000.webp 2000w, https://cdn.prod.website-files.com/64462c9aa967772377e53b6e/6450b26051a4501f1af34ebc_Kaspar%20von%20Gru%CC%88nberg.webp 2160w" class="author-image"/></div><div class="author-meta-info"><div class="text-style-heading">Kaspar von Grünberg</div><div class="text-style-code text-style-muted w-dyn-bind-empty"></div><a href="https://www.linkedin.com/in/kaspar-von-gr%C3%BCnberg-73872380/" class="linkedin-wrapper w-inline-block"><div class="linkedin-icon w-embed"><svg width=" 100%" height=" 100%" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_588_62232)">
<path d="M0 1.4325C0 0.64125 0.6575 0 1.46875 0H18.5312C19.3425 0 20 0.64125 20 1.4325V18.5675C20 19.3587 19.3425 20 18.5312 20H1.46875C0.6575 20 0 19.3587 0 18.5675V1.4325ZM6.17875 16.7425V7.71125H3.1775V16.7425H6.17875ZM4.67875 6.4775C5.725 6.4775 6.37625 5.785 6.37625 4.9175C6.3575 4.03125 5.72625 3.3575 4.69875 3.3575C3.67125 3.3575 3 4.0325 3 4.9175C3 5.785 3.65125 6.4775 4.65875 6.4775H4.67875ZM10.8138 16.7425V11.6988C10.8138 11.4288 10.8337 11.1587 10.9137 10.9662C11.13 10.4275 11.6238 9.86875 12.4538 9.86875C13.54 9.86875 13.9738 10.6962 13.9738 11.9113V16.7425H16.975V11.5625C16.975 8.7875 15.495 7.4975 13.52 7.4975C11.9275 7.4975 11.2137 8.3725 10.8138 8.98875V9.02H10.7938C10.8004 9.00957 10.8071 8.99915 10.8138 8.98875V7.71125H7.81375C7.85125 8.55875 7.81375 16.7425 7.81375 16.7425H10.8138Z" fill="currentColor"/>
</g>
<defs>
<clipPath id="clip0_588_62232">
<rect width="20" height="20" fill="currentColor"/>
</clipPath>
</defs>
</svg></div><div>LinkedIn</div></a></div></div></div><div class="author-bio"><div class="w-richtext"><p>Kaspar is an early pioneer in platform engineering. Over the last decade he has been building Internal Developer Platforms (IDPs) at scale, and is responsible for coining the term IDP. A regular speaker on the topic of platform engineering, Kaspar is the author of several associated defining articles. </p></div></div></div></div></div></div></div></div></div></section><div class="section background-color-white"><div class="padding-section-medium"><div class="padding-global"><div class="container-large"><div class="margin-bottom-large-50"><h2 class="heading-style-h4">Upcoming events</h2></div><div><div class="events-list-wrapper w-dyn-list"><div class="w-dyn-empty"><div>No items found.</div></div></div></div><div class="buttons-wrapper margin-top-large"><div class="button-bg-radial"><a href="/events" class="button is-secondary w-inline-block"><div>See all events</div><div class="link-icon-embed w-embed"><svg width="100%" height="100%" viewBox="0 0 20 19" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.1084 15.9788L15.8145 4.27271" stroke="currentColor" stroke-width="2.01113"/>
<path d="M7.10645 4.34155H16.0623V13.2083" stroke="currentColor" stroke-width="2.01113"/>
</svg></div></a></div></div></div></div></div></div><div class="section-light w-condition-invisible"><div class="padding-global"><div class="container"><div class="container"><div class="margin-bottom-large-50"><h2 class="heading-style-h5">Recommended articles</h2></div><div><div class="w-dyn-list"><div class="w-dyn-empty"><div>No items found.</div></div></div></div></div></div></div></div><div class="cta-holder"><div class="footer-component"><div class="padding-global"><div class="footer-container"></div><div class="footer-container"><div class="footer-main"><div class="footer-newsletter-component"><div class="footer-tag"><div>Join our Newsletter</div></div><div class="footer-newsletter-form-wrapper w-form"><form id="footer-newsletter-form" name="wf-form-Footer-Newsletter-Form" data-name="Footer Newsletter Form" method="get" class="footer-newsletter-form" data-wf-page-id="64462c9aa96777d84de53b55" data-wf-element-id="f5567018-c3c4-7827-0d30-bc006efaf7ad"><div class="footer-newsletter-form-row"><input class="newsletter-text-field w-input" maxlength="256" name="email-2" data-name="Email 2" placeholder="hello@outlook.com" type="email" id="footer-email" required=""/><input type="submit" data-wait="Please wait..." class="newsletter-form-submit-button w-button" value="-&gt;"/></div><div class="footer-newsletter-form-row"><label class="w-checkbox newsletter-checkbox-wrapper"><input id="checkbox-2" type="checkbox" name="checkbox-2" data-name="Checkbox 2" class="w-checkbox-input newsletter-form-checkbox" checked=""/><span class="w-form-label" for="checkbox-2">By submitting this form you agree to our <a href="https://humanitec.com/policies/privacy-policy" class="form-text-link">privacy policy</a>.</span></label></div></form><div class="success-message w-form-done"><div>Thank you! Your submission has been received!</div></div><div class="w-form-fail"><div>Oops! Something went wrong while submitting the form.</div></div></div></div><div class="footer-nav"><div class="footer-nav-col"><div class="footer-tag"><div>WHY</div></div><div class="footer-link-list"><a href="/platform-engineering" class="footer-link">Why Platform Engineering</a><a href="/blog/what-is-an-internal-developer-platform" class="footer-link">Why Internal Developer Platform</a><a href="/why-humanitec" class="footer-link">Why Humanitec</a></div></div><div class="footer-nav-col"><div class="footer-tag"><div>PRODUCT</div></div><div class="footer-link-list"><a href="/products" class="footer-link hide">Product overview</a><a href="/products/platform-orchestrator" class="footer-link">Platform Orchestrator</a><a href="/products/score" class="footer-link hide">Score</a><a href="/products/portal" class="footer-link hide">Portal</a><a href="/integrations" class="footer-link">Integrations</a><a href="/pricing" class="footer-link">Pricing</a></div></div><div class="footer-nav-col hide"><div class="footer-tag"><div>Features</div></div><div class="footer-link-list"><a href="/environment-management" class="footer-link">Environment management</a><a href="/deployment-management" class="footer-link">Deployment management</a><a href="/infrastructure-orchestration" class="footer-link">Infrastructure orchestration</a><a href="/developer-self-service" class="footer-link">Developer self-service</a><a href="/rbac-and-governance" class="footer-link">RBAC &amp; governance</a></div></div><div class="footer-nav-col"><div class="footer-tag"><div>Use Cases</div></div><div class="footer-link-list"><a href="/use-cases" class="footer-link">Use cases overview</a><div class="w-dyn-list"><div role="list" class="footer-link-list w-dyn-items"><div role="listitem" class="w-dyn-item"><a href="/use-cases/reduce-risk-with-progressive-infra-rollouts" class="footer-link w-dyn-bind-empty"></a></div><div role="listitem" class="w-dyn-item"><a href="/use-cases/impact-analysis" class="footer-link w-dyn-bind-empty"></a></div><div role="listitem" class="w-dyn-item"><a href="/use-cases/rollback-applications-and-infrastructure" class="footer-link w-dyn-bind-empty"></a></div><div role="listitem" class="w-dyn-item"><a href="/use-cases/catch-and-fix-infra-drift" class="footer-link w-dyn-bind-empty"></a></div><div role="listitem" class="w-dyn-item"><a href="/use-cases/eliminate-ticket-ops" class="footer-link">Eliminate ticket Ops</a></div><div role="listitem" class="w-dyn-item"><a href="/use-cases/enable-developer-self-service" class="footer-link">End-to-end self service</a></div><div role="listitem" class="w-dyn-item"><a href="/use-cases/build-internal-developer-platforms" class="footer-link">Build developer portals</a></div></div></div></div></div><div class="footer-nav-col"><div class="footer-tag"><div>Company</div></div><div class="footer-link-list"><a href="/company" class="footer-link">About Humanitec</a><div class="div-block-25"><div class="css-styles-ripple-embed w-embed"><style>
.pulsating-ripple {
position: relative;
display: inline-block;
animation: pulsate 4s infinite;
}
.pulsating-ripple::before {
content: "";
position: absolute;
top: -0.25em;
left: -0.25em;
right: -0.25em;
bottom: -0.25em;
border-radius: 50%;
opacity: 0;
animation: ripple 4s infinite;
box-shadow: 0 0 0 0 rgba(255, 255, 255, 0.5);
}
@keyframes ripple {
0% {
opacity: 1;
box-shadow: 0 0 0 0 rgba(255, 255, 255, 0.2);
}
100% {
opacity: 0;
box-shadow: 0 0 0 40px rgba(255, 255, 255, 0);
}
}
</style></div></div><a href="/customers" class="footer-link">Customers</a><a href="/professional-services" class="footer-link">Professional Services</a><a href="/partners" class="footer-link">Partners</a><a href="/contact" class="footer-link">Contact</a></div></div><div class="footer-nav-col"><div class="footer-tag"><div>Resources</div></div><div class="footer-link-list"><a href="https://developer.humanitec.com/" class="footer-link">Docs</a><a href="/blog" class="footer-link">Blog</a><a href="/whitepapers" class="footer-link">Whitepapers</a><a id="w-node-f5567018-c3c4-7827-0d30-bc006efaf817-b693970a" href="/faqs" class="footer-link">FAQ</a><a href="https://app.humanitec.io/auth/signup" target="_blank" class="footer-link">Start free trial</a></div></div><div class="footer-nav-col"><div class="footer-tag"><div>Community</div></div><div class="footer-link-list"><a href="/events" class="footer-link">Events</a></div></div><div class="footer-nav-col"><div class="footer-tag"><div>Reference ARCHITECTURES</div></div><div class="footer-link-list"><div class="w-dyn-list"><div role="list" class="footer-link-list w-dyn-items"><div role="listitem" class="w-dyn-item"><a href="/reference-architectures/aws" class="footer-link">AWS</a></div><div role="listitem" class="w-dyn-item"><a href="/reference-architectures/azure" class="footer-link">Azure</a></div><div role="listitem" class="w-dyn-item"><a href="/reference-architectures/gcp" class="footer-link">GCP</a></div><div role="listitem" class="w-dyn-item"><a href="/reference-architectures/red-hat-openshift" class="footer-link">Red Hat OpenShift</a></div></div></div></div></div></div></div><div class="footer-footnote"><div class="footer-container"><div class="footnote-wrapper"><div class="footnote-legals"><div>©2026 Humanitec. All Rights Reserved.</div><div class="footnote-links-wrapper"><a href="/imprint" class="footnote-link">Imprint</a><a href="/support" class="footnote-link">Support</a><a href="/security" class="footnote-link">Security</a><a href="https://status.humanitec.com" target="_blank" class="footnote-link">Status</a><a href="/policies" class="footnote-link">Policies</a><a href="https://docs.humanitec.com/getting-started/technical-requirements?_ga=2.222293272.1664872232.1681904277-2099757536.1593021740&amp;_gac=1.117290228.1679580817.Cj0KCQjw8e-gBhD0ARIsAJiDsaVn9xtOPsi5Sf7BNSmd1ojuCXws0k9hz6AFNPiiwF6LwMQSM-5RPNsaAlF2EALw_wcB" target="_blank" class="footnote-link">Technical Definitions</a><a href="https://humanitec.integrityline.com/" target="_blank" class="footnote-link">Whistleblowing</a></div></div><div class="footnote-socials"><a href="https://www.youtube.com/@humanitec" target="_blank" class="footnote-social-link is-yt w-inline-block"><div class="footnote-social-icon-embed is-yt w-embed"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--bx" width="100%" height="100%" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"><path d="M21.593 7.203a2.506 2.506 0 0 0-1.762-1.766C18.265 5.007 12 5 12 5s-6.264-.007-7.831.404a2.56 2.56 0 0 0-1.766 1.778c-.413 1.566-.417 4.814-.417 4.814s-.004 3.264.406 4.814c.23.857.905 1.534 1.763 1.765c1.582.43 7.83.437 7.83.437s6.265.007 7.831-.403a2.515 2.515 0 0 0 1.767-1.763c.414-1.565.417-4.812.417-4.812s.02-3.265-.407-4.831zM9.996 15.005l.005-6l5.207 3.005l-5.212 2.995z" fill="currentColor"></path></svg></div></a><a rel="noreferrer noopener" href="https://twitter.com/humanitec_com" target="_blank" class="footnote-social-link w-inline-block"><div class="footnote-social-icon-embed w-embed"><svg width=" 100%" height=" 100%" viewBox="0 0 17 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M14.3915 2.99987C14.412 3.07679 14.4222 3.20179 14.4222 3.37486C14.4222 4.39405 14.2179 5.41323 13.8092 6.43242C13.4006 7.43238 12.8183 8.35542 12.0623 9.20154C11.3268 10.0284 10.3665 10.7015 9.18142 11.2207C7.99637 11.7399 6.68873 11.9995 5.25851 11.9995C3.46051 11.9995 1.81574 11.5476 0.324219 10.6438C0.548969 10.663 0.804367 10.6726 1.09041 10.6726C2.58194 10.6726 3.92022 10.24 5.10527 9.37461C4.39015 9.37461 3.75677 9.18231 3.20511 8.79771C2.67388 8.39388 2.30611 7.8939 2.10179 7.29777C2.30611 7.317 2.50021 7.32662 2.6841 7.32662C2.97014 7.32662 3.25619 7.29777 3.54223 7.24008C3.05187 7.14393 2.61258 6.95163 2.22438 6.66318C1.83617 6.37473 1.5297 6.02859 1.30495 5.62476C1.0802 5.2017 0.967821 4.7498 0.967821 4.26905V4.21136C1.41732 4.46135 1.89747 4.59596 2.40827 4.61519C1.44797 3.99983 0.967821 3.15371 0.967821 2.07684C0.967821 1.5384 1.12106 1.0288 1.42754 0.548054C2.22438 1.49032 3.19489 2.24029 4.33907 2.79796C5.50369 3.35563 6.73981 3.66331 8.04745 3.721C8.00659 3.49024 7.98616 3.25948 7.98616 3.02872C7.98616 2.20183 8.29263 1.49032 8.90559 0.894193C9.53898 0.298064 10.295 0 11.1735 0C12.1134 0 12.9 0.317294 13.5334 0.951883C14.2689 0.817273 14.9534 0.576899 15.5868 0.23076C15.3416 0.942268 14.8717 1.49994 14.177 1.90377C14.79 1.82685 15.4029 1.66339 16.0159 1.4134C15.5664 2.02876 15.0249 2.55758 14.3915 2.99987Z" fill="currentColor"/>
</svg></div></a><a href="https://www.linkedin.com/company/humanitec" target="_blank" class="footnote-social-link w-inline-block"><div class="footnote-social-icon-embed w-embed"><svg width=" 100%" height=" 100%" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.3333 15H1.66667C0.746192 15 0 14.2538 0 13.3333V1.66667C0 0.746192 0.746192 0 1.66667 0H13.3333C14.2538 0 15 0.746192 15 1.66667V13.3333C15 14.2538 14.2538 15 13.3333 15ZM10.6904 12.9168H12.9163V8.34416C12.9163 6.40943 11.8196 5.47396 10.2877 5.47396C8.7551 5.47396 8.11011 6.66744 8.11011 6.66744V5.69461H5.96495V12.9168H8.11011V9.1256C8.11011 8.10977 8.57772 7.50527 9.47274 7.50527C10.2955 7.50527 10.6904 8.08615 10.6904 9.1256V12.9168ZM2.08301 3.41621C2.08301 4.15217 2.6751 4.74892 3.40579 4.74892C4.13647 4.74892 4.72822 4.15217 4.72822 3.41621C4.72822 2.68024 4.13647 2.0835 3.40579 2.0835C2.6751 2.0835 2.08301 2.68024 2.08301 3.41621ZM4.53497 12.9168H2.29812V5.69461H4.53497V12.9168Z" fill="currentColor"/>
</svg></div></a></div></div></div></div></div></div></div><div class="section-bg-holder background-color-light-blue"></div></div></div><script src="https://d3e54v103j8qbb.cloudfront.net/js/jquery-3.5.1.min.dc5e7f18c8.js?site=64462c9aa967776f20e53b43" type="text/javascript" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script><script src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/js/webflow.schunk.f2efb3c5440a81cf.js" type="text/javascript" integrity="sha384-VK02VJvMib7ytrF5M2joPWNtDQs366FZgEQ5B+Iwnjx0WBnwQXfootyziSYxdrmS" crossorigin="anonymous"></script><script src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/js/webflow.schunk.72d8428f3ff0ce2f.js" type="text/javascript" integrity="sha384-rZ/522ydoWkn6RCLrLAnl1Z4p5kq4ETgtn9ZTHoLUUVp2jhgGK6RXgJJLu1z7OgM" crossorigin="anonymous"></script><script src="https://cdn.prod.website-files.com/64462c9aa967776f20e53b43/js/webflow.1d199d91.dd4f7af3d8cd15dd.js" type="text/javascript" integrity="sha384-8gAYuTrvx8N4xCoHxpZaRDGxK3Nqk45P+wYZ/j26Pu6i9T8VYzuQwdhguTJ0rY42" crossorigin="anonymous"></script><!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-WBR8VPJ"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
<!-- script to interpret github gists embedded in rich text editor -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/postscribe/2.0.8/postscribe.min.js"></script>
<script>
// define the load gist function
var loadGist = function(elem) {
var gistUrl = $(elem).text().match(/\bhttps?:\/\/\S+(.js)/gi);
if (typeof gistUrl === 'undefined' || gistUrl === null || gistUrl.length == 0)
return;
//load gist
$(elem).show();
$(elem).empty();
postscribe(elem, '<script src=' + gistUrl+ '><\/script>');
};
var gists = $('p:contains("CODE:")');
gists.hide();
gists.toArray().forEach(loadGist);
</script>
<!-- F’in sweet Webflow Hacks Subbullet List -->
<script>
// when the DOM is ready
$(document).ready(function() {
// get the li items
const listItems = $('li');
// for each li item
listItems.each(function(index, item){
// check for '~' character
// it's recommended to start with the deepest level of sub bullet
// to ensure only the relevant classes are applied
// if the li item text starts with '~~'
if($(item).text().startsWith('~~')){
// run indentText() function
indentText(this, 'hack20-sub-bullet-2');
} // else if the li item starts with '~'
else if($(item).text().startsWith('~')){
// run indentText() function
indentText(this, 'hack20-sub-bullet');
}
});
// indentText function
function indentText(li, className){
// add relevant className to li item
// if the li item text starts with '~~' add the sub-bullet-2 class
// else if the li item starts with '~' add the sub-bullet class
$(li).addClass(className);
// remove the '~' from the li items
// the regex /~+/g
// matches any one or more ~ characters
const reformatedText = $(li).html().replace(/~+/g,'');
// replace the li item's html text that has ~ tags
// with the new text that removed the ~ character(s)
$(li).html(reformatedText);
}
});
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"mainEntityOfPage" : "https://humanitec.com/blog/what-developer-self-service-shouldnt-look-like",
"url" : "https://humanitec.com/blog/what-developer-self-service-shouldnt-look-like",
"name": "What developer self-service shouldn&#39;t look like",
"headline": "What developer self-service shouldn&#39;t look like",
"image" : "https://cdn.prod.website-files.com/64462c9aa967772377e53b6e/64462c9aa96777ca6ce54236_6128ce1409e2fc143cab75cb_Frame%2520201.webp",
"dateCreated": "Apr 11, 2023",
"dateModified": "Apr 11, 2023",
"description": "Developer self-service is a fundamental step every engineering team needs to take to reach true DevOps, true “you build it, you run it”. Often however, teams get self-service spectacularly wrong. This article will walk through some real-life examples and discuss how you should think about striking the right balance between golden cages and golden paths.",
"publisher": {
"@type": "Organization",
"@id": "https://humanitec.com/#humanitec"
},
"author": {
"@type": "Person",
"name": "Kaspar von Grünberg",
"url": "kaspar-von-grunberg"
}
}
</script>
<script>
(() => {
function replaceImagesWithLightboxes(element) {
const figures = element.querySelectorAll("figure.w-richtext-figure-type-image");
figures.forEach((figure) => {
const imageContainer = figure.querySelector("div");
const image = imageContainer.querySelector("img");
if (!image) return; // Skip if no image found
const imageUrl = image.getAttribute("src");
const imageAlt = image.getAttribute("alt") || '';
const imageWidth = image.naturalWidth || image.width;
// Extract the caption
const caption = figure.querySelector("figcaption");
const captionText = caption ? caption.innerText : "";
// Create lightbox HTML
const lightbox = document.createElement("a");
lightbox.setAttribute("href", imageUrl);
lightbox.classList.add("w-inline-block", "w-lightbox");
const lightboxImage = document.createElement("img");
lightboxImage.setAttribute("src", imageUrl);
lightboxImage.setAttribute("loading", "lazy");
lightboxImage.setAttribute("sizes", "100vw");
lightboxImage.setAttribute("srcset", generateSrcset(imageUrl, imageWidth));
lightboxImage.setAttribute("alt", imageAlt);
const script = document.createElement("script");
script.setAttribute("type", "application/json");
script.classList.add("w-json");
script.textContent = JSON.stringify({
items: [
{
_id: Math.random().toString(),
origFileName: imageAlt,
fileName: imageAlt,
url: imageUrl,
width: imageWidth,
type: "image",
caption: captionText, // Include the caption text
},
],
group: "",
});
lightbox.appendChild(lightboxImage);
lightbox.appendChild(script);
// Clear the existing image container and append the lightbox
imageContainer.innerHTML = "";
imageContainer.appendChild(lightbox);
// If the caption exists, move it outside the figure (as figure is being cleared)
if (caption) {
figure.parentNode.insertBefore(caption, figure.nextSibling);
}
// Clear the figure but not the caption
figure.innerHTML = "";
figure.appendChild(imageContainer);
if (caption) {
figure.appendChild(caption);
}
});
}
function generateSrcset(imageUrl, imageWidth) {
const sizes = [500, 800, 1080, 1600, 2000];
return sizes
.filter(size => size <= imageWidth)
.map(size => `${imageUrl.replace(".jpg", `-p-${size}.jpg`)} ${size}w`)
.join(", ") + `, ${imageUrl} ${imageWidth}w`;
}
const containerElement = document.querySelector('.text-rich-text-blog.w-richtext');
if (containerElement) {
replaceImagesWithLightboxes(containerElement);
}
})();
</script>
<script>
document.addEventListener('DOMContentLoaded', function() {
// Select all links within the rich text field with the specified class
const richTextLinks = document.querySelectorAll('.text-rich-text-blog a');
// Loop through each link and set the target to "_blank"
richTextLinks.forEach(function(link) {
link.setAttribute('target', '_blank');
link.setAttribute('rel', 'noopener noreferrer'); // for security and performance
});
});
</script>
</body></html>