{"id":4839,"date":"2026-01-06T20:51:03","date_gmt":"2026-01-06T19:51:03","guid":{"rendered":"https:\/\/gokhan-gokalp.com\/?p=4839"},"modified":"2026-01-06T20:56:40","modified_gmt":"2026-01-06T19:56:40","slug":"devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro","status":"publish","type":"post","link":"https:\/\/gokhan-gokalp.com\/tr\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\/","title":{"rendered":"DevEx Series 03: Laying the Azure Focused Platform Foundation for an IDP with ASO and KRO"},"content":{"rendered":"<p>In the first two parts of this <em>DevEx<\/em> series, I tried to show how golden paths in <em>Backstage<\/em> can enable developer self\u2011service without chaos and how extending the catalog into <strong>copilots<\/strong> with <em>MCP<\/em> servers transforms discoverability into a <strong>conversational<\/strong> experience. Both of these steps were about reducing friction and giving developers paved roads to move faster while still staying compliant.<\/p>\n<p>Back in the first article, I also touched on the broader idea of <em>IDPs,<\/em> how organizations often build them with tools like <em>Crossplane<\/em>, <em>Tofu<\/em> <em>Controller<\/em>, <em>Argo CD<\/em>\u00a0and <em>OPA<\/em> on top of <em>Kubernetes, <\/em>that was also the stack I worked with in practice, powerful but not always the most approachable starting point for teams because of the complexity involved as I also stated in the first article.<\/p>\n<p>In this article, I want to focus on <strong><em>Azure Service Operator<\/em><\/strong> (<em>ASO<\/em>) which provides a <em>Kubernetes <\/em>native way to reconcile <em>Azure<\/em> resources directly from manifests and when combined with <em><strong>Kubernetes Resource Orchestrator <\/strong><\/em>(<em>KRO<\/em>), it becomes more streamlined to expose developer friendly abstractions without the heavy complexity of other stacks. While many organizations build <em>IDPs<\/em> with different controllers and toolchains like <em>Crossplane<\/em> or <em>Tofu Controller<\/em>, using <em>KRO<\/em> and <em>ASO<\/em> in the <em>Azure<\/em> ecosystem gives us a more <strong>minimal<\/strong> and <strong>practical<\/strong> path to build the <em>IDP<\/em> platform foundation that is easy to approach and ready to grow.<\/p>\n<p>Lately, I have been experimenting with <em>ASO <\/em>and <em>KRO<\/em> and I really liked how much they simplify the experience. That is why I wanted to include this stack in the series as well. With <em>Backstage<\/em> as the portal, <em>KRO<\/em> and <em>ASO<\/em> as the abstraction layer and the reconciliation engine, we can deliver a clean path where developers request what they need and the platform control plane provisions it automatically in <em>Azure <\/em>in a simple, compliant way that scales.<\/p>\n<h1>Let\u2019s Get Started with KRO and ASO<\/h1>\n<p>Now we have the motivation, so let&#8217;s get started looking at <em>KRO<\/em> and <em>ASO<\/em> and see how they work together in practice.<\/p>\n<p><em>KRO<\/em> provides us a <em>Kubernetes<\/em> native way to define our own simple abstractions as custom resources (<em>CRDs<\/em>) that encapsulate the logic we want to expose to developers along with any organizational standards and best practices. In essence, <em>KRO<\/em> gives us the abstraction and orchestration layer. It lets us deploy multiple resources as a single unit but on its own it doesn&#8217;t provision anything.<\/p>\n<p>This is where <em>ASO <\/em>comes into play. It acts as a reconciliation engine that actually provisions and manages the <em>Azure<\/em> resources behind those abstractions. It lets us define <em>Azure<\/em> resources as <em>Kubernetes<\/em> custom resources. Together, these two tools give us an abstraction layer and a reconciliation engine that together form the backbone of a <strong>simple automation platform<\/strong> on <em>Kubernetes<\/em>.<\/p>\n<h2>Installing KRO and ASO on AKS<\/h2>\n<p>I will assume that we already have a running <em>AKS<\/em> cluster, so we can jump straight into getting these two tools installed.<\/p>\n<p>First, we will start installing <em>ASO v2<\/em> on the cluster. To keep things simple, we will follow the steps from the official <em>ASO<\/em> documentation (<em><a href=\"https:\/\/azure.github.io\/azure-service-operator\/\" target=\"_blank\" rel=\"noopener\">Azure Service Operator<\/a><\/em>). First install <em>cert-manager<\/em>, since <em>ASO<\/em> uses it to issue and rotate certificates, then deploy <em>ASO v2<\/em> itself with a specific <em>CRD<\/em> configuration and finally configure a service principal or a managed identity that <em>ASO<\/em> will use to authenticate against <em>Azure<\/em>.<\/p>\n<p><!--StartFragment --><\/p>\n<p>That being said, let&#8217;s use the following <em>helm<\/em> command to install <em>ASO v2<\/em> along with the &#8220;<em>resources.azure.com\/*;*app.azure.com\/*<\/em>&#8221; <em>CRDs<\/em>\u00a0which are the only ones we need for this article series. By default, <em>ASO<\/em> doesn&#8217;t install any <em>CRDs<\/em> instead it allows us to choose which ones to enable via the &#8220;<em>crdPattern<\/em>&#8221; parameter. For now, we will install the<em> Azure Container Apps CRDs<\/em> since we will use them in our demo.<\/p>\n<pre>helm upgrade --install aso2 aso2\/azure-service-operator \\\r\n    --create-namespace \\\r\n    --namespace=azureserviceoperator-system \\\r\n    --set crdPattern='resources.azure.com\/*;*app.azure.com\/*'<\/pre>\n<p><!--EndFragment --><\/p>\n<p>Once <em>ASO<\/em> is installed, we should see its pods running in&#8221;<em>azureserviceoperator-system<\/em>&#8221; namespace.<\/p>\n<p><a href=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2025\/12\/asov2-setup-gokhan-gokalp-com.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-4850 lazyload\" data-src=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2025\/12\/asov2-setup-gokhan-gokalp-com.jpg\" alt=\"\" width=\"1350\" height=\"190\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2025\/12\/asov2-setup-gokhan-gokalp-com.jpg 1350w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2025\/12\/asov2-setup-gokhan-gokalp-com-300x42.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2025\/12\/asov2-setup-gokhan-gokalp-com-1024x144.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2025\/12\/asov2-setup-gokhan-gokalp-com-768x108.jpg 768w\" data-sizes=\"(max-width: 1350px) 100vw, 1350px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1350px; --smush-placeholder-aspect-ratio: 1350\/190;\" \/><\/a><\/p>\n<p>At this point, <em>ASO<\/em> alone lets us define and provision <em>Azure<\/em> resources as <em>Kubernetes<\/em> <em>CRDs<\/em>. But when we add <em>KRO<\/em> on top, its orchestration capabilities allow us to define opinionated, developer\u2011friendly abstractions that orchestrate everything behind the scenes. Without <em>KRO<\/em>, we wouldn\u2019t be able to orchestrate multiple resources behind a single, simplified abstraction.<\/p>\n<p>So, let\u2019s follow the same approach and install <em>KRO<\/em> on the cluster as well by using the steps from the official <em>KRO<\/em> documentation (<em><a href=\"https:\/\/kro.run\/docs\/getting-started\/Installation\/#installation\" target=\"_blank\" rel=\"noopener\">Installing kro<\/a><\/em>).<\/p>\n<p>With installation of <em>KRO<\/em> alongside <em>ASO<\/em>, we now have the minimal backbone of an <em>Azure<\/em> focused <em>IDP<\/em>. From this point, our <em>AKS<\/em> cluster becomes a lightweight, centralized platform orchestrator.<\/p>\n<h2>Let&#8217;s Create a Simple, Orchestrated Azure Resource Template with KRO and ASO<\/h2>\n<p>Now that both <em>ASO<\/em> and <em>KRO<\/em> are installed, we can create a small abstraction that provisions a few <em>Azure<\/em> resources as a single unit. This follows the same idea behind &#8220;<em>golden templates<\/em>&#8221; we explored earlier in this series. Instead of asking developers to stitch together multiple files or understand every <em>Azure<\/em> resource, we expose a single, opiniated interface that hides all of that complexity.<\/p>\n<p>To keep things simple, we will create a simple abstraction that sets up a &#8220;<em>Resource Group<\/em>&#8220;, an &#8220;<em>Container Apps Environment<\/em>&#8221; and a &#8220;<em>Container App<\/em>&#8221; in an <em>Azure<\/em> environment. We can think of this as a lightweight, serverless <strong>starter kit<\/strong> with built\u2011in best practices for the platform.<\/p>\n<p>So, to build this starter kit, we will use &#8220;<em>ResourceGraphDefinition<\/em>&#8221; in <em>KRO, <\/em>this is where we describe the high level abstraction, the template itself. It\u00a0is the core <em>API<\/em> in <em>KRO<\/em> for defining <em>CRDs<\/em> that orchestrates multiple resources. It links the <em>ASO<\/em> resources and ensures everything is provisioned in the right order.<\/p>\n<pre>apiVersion: kro.run\/v1alpha1\r\nkind: ResourceGraphDefinition\r\nmetadata:\r\n  name: aca-starterkit\r\n\r\nspec:\r\n  schema:\r\n    apiVersion: v1alpha1\r\n    kind: ACAStarterkit\r\n    spec:\r\n      location: string\r\n      image: string\r\n      cpu: string | default=\"0.25\"\r\n      memory: string | default=\"0.5Gi\"\r\n      targetPort: integer | default=80\r\n    status:\r\n      resourceGroupName: ${resourceGroup.status.name}\r\n      appFqdn: ${containerApp.status.configuration.ingress.fqdn}\r\n\r\n  resources:\r\n    - id: resourceGroup\r\n      template:\r\n        apiVersion: resources.azure.com\/v1api20200601\r\n        kind: ResourceGroup\r\n        metadata:\r\n          name: \"${schema.metadata.name}-rg\"\r\n        spec:\r\n          location: \"${schema.spec.location}\"\r\n\r\n    - id: containerAppsEnv\r\n      template:\r\n        apiVersion: app.azure.com\/v1api20240301\r\n        kind: ManagedEnvironment\r\n        metadata:\r\n          name: \"${schema.metadata.name}-env\"\r\n        spec:\r\n          owner:\r\n            name: \"${resourceGroup.metadata.name}\"\r\n          location: \"${schema.spec.location}\"\r\n          workloadProfiles:\r\n            - name: Consumption\r\n              workloadProfileType: Consumption\r\n\r\n    - id: containerApp\r\n      template:\r\n        apiVersion: app.azure.com\/v1api20240301\r\n        kind: ContainerApp\r\n        metadata:\r\n          name: \"${schema.metadata.name}\"\r\n        spec:\r\n          owner:\r\n            name: \"${resourceGroup.metadata.name}\"\r\n          location: \"${schema.spec.location}\"\r\n          environmentReference:\r\n            armId: \"${containerAppsEnv.status.id}\"\r\n          configuration:\r\n            ingress:\r\n              external: true\r\n              targetPort: ${schema.spec.targetPort}\r\n          template:\r\n            containers:\r\n              - name: app\r\n                image: \"${schema.spec.image}\"\r\n                resources:\r\n                  cpu: ${double(schema.spec.cpu)}\r\n                  memory: \"${schema.spec.memory}\"<\/pre>\n<p>As we can see, the &#8220;<strong><em>schema<\/em><\/strong>&#8221; section defines the structure (<em>kind, fields and etc.<\/em>) of the custom resource we expose to developers. It is a kind of a contract between platform and the developers. It defines what developers can can configure. The &#8220;<strong><em>status<\/em><\/strong>&#8221; part in this section is simply outputs of this abstraction. It defines what information goes back to developers after deployment.<\/p>\n<p>The &#8220;<strong><em>resources<\/em><\/strong>&#8221; section is where we list the underlying <em>ASO<\/em> resources that make up the abstraction. Each resource has an &#8220;<em>id<\/em>&#8221; and a &#8220;<em>template<\/em>&#8221; and <em>KRO<\/em> analyzes the expressions inside these templates to understand how the resources relate to each other. So we don&#8217;t need to wire everything together ourself.<\/p>\n<p>For example, in the the &#8220;<em>containerApp<\/em>&#8221; resource, we referenced the <em>Managed Environment <\/em>using this &#8220;<strong><em>${containerAppsEnv.status.id}<\/em><\/strong>&#8221; expression. Similarly in the &#8220;<em>containerAppsEnv<\/em>&#8221; resource, we referenced the <em>Resource Group<\/em> using &#8220;<strong><em>${resourceGroup.metadata.name}<\/em><\/strong>&#8221; expression.<\/p>\n<p>From these references, <em>KRO<\/em> builds a <em>Directed Acyclic Graph<\/em> (<em>DAG<\/em>) and compute the topological order. We will see this in action once we apply the definition. You can find all details about <em>KRO&#8217;<\/em> graph inference <em><a href=\"https:\/\/kro.run\/docs\/concepts\/rgd\/dependencies-ordering\/\" target=\"_blank\" rel=\"noopener\">here<\/a>\u00a0<\/em>and you can see all supported <em>ASO<\/em> resources listed <em><a href=\"https:\/\/azure.github.io\/azure-service-operator\/reference\/\" target=\"_blank\" rel=\"noopener\">here<\/a><\/em>.<\/p>\n<p>Let&#8217;s apply this definition and get the &#8220;<em>ACAStarterkit<\/em>&#8221; <em>CRD <\/em>created.<\/p>\n<pre>kubectl apply -f aca-starterkit.yaml\r\nkubectl get resourcegraphdefinition<\/pre>\n<p><a href=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/aca-crd.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-4861 lazyload\" data-src=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/aca-crd.jpg\" alt=\"\" width=\"1137\" height=\"152\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/aca-crd.jpg 1137w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/aca-crd-300x40.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/aca-crd-1024x137.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/aca-crd-768x103.jpg 768w\" data-sizes=\"(max-width: 1137px) 100vw, 1137px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1137px; --smush-placeholder-aspect-ratio: 1137\/152;\" \/><\/a><\/p>\n<p>Now let&#8217;s describe it to see the topological order that we mentioned.<\/p>\n<pre>kubectl describe resourcegraphdefinition aca-starterkit<\/pre>\n<p><a href=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/kro-topological-order-gokhan-gokalp.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-4864 lazyload\" data-src=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/kro-topological-order-gokhan-gokalp.jpg\" alt=\"\" width=\"1348\" height=\"358\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/kro-topological-order-gokhan-gokalp.jpg 1348w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/kro-topological-order-gokhan-gokalp-300x80.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/kro-topological-order-gokhan-gokalp-1024x272.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/kro-topological-order-gokhan-gokalp-768x204.jpg 768w\" data-sizes=\"(max-width: 1348px) 100vw, 1348px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1348px; --smush-placeholder-aspect-ratio: 1348\/358;\" \/><\/a><\/p>\n<p>As we can see, <em>KRO<\/em> built the dependency graph for our abstraction and figured out that the resource group must be created first, then the managed environment and then the container app.<\/p>\n<h2>Let&#8217;s Deploy an Application Using the ACAStarterkit CRD<\/h2>\n<p>Since everything is in place, we can now start using this <em>CRD<\/em> just like any other <em>Kubernetes<\/em> resource. This is where the <strong><em>DevEx <\/em><\/strong>really begins, all the underlying complexity is hidden behind a single, simple interface.<\/p>\n<p>There are many ways to integrate this abstraction into the platform. For example, the platform team could expose this <em>CRD<\/em> through <em>Backstage<\/em> by adding it to the template catalog as a starter kit, or bundle it into any software boilerplates, golden templates so developers can have an end to end opinionated experience with just a few clicks and start experimenting. The key idea here remains the same, this <em>CRD<\/em> becomes a <strong>reusable building block<\/strong> inside the <em>IDP.<\/em><\/p>\n<p>Let\u2019s create our first &#8220;<em>ACAStarterkit<\/em>&#8221; instance and watch <em>KRO<\/em> orchestrate the underlying <em>Azure<\/em> resources for us.<\/p>\n<p>For the sake of simplicity, I will skip <em>Backstage<\/em>, <em>scaffolding <\/em>and <em>templating<\/em> workflows. We already covered those in detail in the earlier parts of this series. Instead, we will apply a minimal &#8220;<em>ACAStarterkit<\/em>&#8221; resource directly to the cluster to provision the <em>Azure<\/em> resources and deploy a simple \u201c<em>quickstart<\/em>\u201d container image.<\/p>\n<pre>apiVersion: kro.run\/v1alpha1\r\nkind: ACAStarterkit\r\nmetadata:\r\n  name: my-hello-world-app\r\n  namespace: default\r\nspec:\r\n  location: westeurope\r\n  image: mcr.microsoft.com\/k8se\/quickstart:latest\r\n  # cpu: \"0.5\" - optional\r\n  # memory: \"1Gi\" - optional\r\n  # targetPort: 80 - optional<\/pre>\n<pre>kubectl apply -f hello-world.yaml<\/pre>\n<p>After applying this &#8220;<em>ACAStarterkit<\/em>&#8221; resource, let&#8217;s monitor the deployment by describing it.<\/p>\n<pre>kubectl describe acastarterkit my-hello-world-app<\/pre>\n<p><a href=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/describe-starterkit-deployment.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-4871 lazyload\" data-src=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/describe-starterkit-deployment.jpg\" alt=\"\" width=\"1447\" height=\"667\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/describe-starterkit-deployment.jpg 1447w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/describe-starterkit-deployment-300x138.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/describe-starterkit-deployment-1024x472.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/describe-starterkit-deployment-768x354.jpg 768w\" data-sizes=\"(max-width: 1447px) 100vw, 1447px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1447px; --smush-placeholder-aspect-ratio: 1447\/667;\" \/><\/a><\/p>\n<p>If we look at the &#8220;<em>Status<\/em>&#8221; section, we can see the overall deployment state, the progress and once provisioning is completed, the output values that we exposed such as &#8220;<em>App Fqdn<\/em>&#8221; and &#8220;<em>Resource Group Name<\/em>&#8220;.<\/p>\n<p>If we want more detailed reconciliation progress of the underlying <em>Azure<\/em> resources, for example if things are taking a bit longer, we can also inspect each resource type individually.<\/p>\n<blockquote><p><strong><em>NOTE<\/em><\/strong>: <em>Depending on the Azure resource type, provisioning might take some time.<\/em><\/p><\/blockquote>\n<pre>kubectl get resourcegroups,managedenvironments,containerapps<\/pre>\n<p><a href=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/resource-level-view-kro.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-4872 lazyload\" data-src=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/resource-level-view-kro.jpg\" alt=\"\" width=\"1427\" height=\"281\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/resource-level-view-kro.jpg 1427w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/resource-level-view-kro-300x59.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/resource-level-view-kro-1024x202.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/resource-level-view-kro-768x151.jpg 768w\" data-sizes=\"(max-width: 1427px) 100vw, 1427px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1427px; --smush-placeholder-aspect-ratio: 1427\/281;\" \/><\/a><\/p>\n<p>This also shows the status and error messages from <em>ASO<\/em> as it provisions resources in <em>Azure<\/em>. We can also see that the resources are created sequentially based on the dependency graph that <em>KRO<\/em> inferred.<\/p>\n<p>Since all the resources got provisioned by our minimal platform cluster, we can now access the application through the exposed &#8220;<em>App Fqdn<\/em>&#8221; output and verify that its running.<\/p>\n<p><a href=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/aca-hello-world-kro-aso-gokhan-gokalp.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-4873 lazyload\" data-src=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/aca-hello-world-kro-aso-gokhan-gokalp.jpg\" alt=\"\" width=\"1673\" height=\"843\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/aca-hello-world-kro-aso-gokhan-gokalp.jpg 1673w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/aca-hello-world-kro-aso-gokhan-gokalp-300x151.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/aca-hello-world-kro-aso-gokhan-gokalp-1024x516.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/aca-hello-world-kro-aso-gokhan-gokalp-768x387.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/aca-hello-world-kro-aso-gokhan-gokalp-1536x774.jpg 1536w\" data-sizes=\"(max-width: 1673px) 100vw, 1673px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1673px; --smush-placeholder-aspect-ratio: 1673\/843;\" \/><\/a><\/p>\n<p>As we can see, our quickstart container app running on <em>ACA<\/em> and fully provisioned through the &#8220;<em>ACAStarterkit<\/em>&#8221; abstraction in a simple and declarative way.<\/p>\n<h1>Wrapping Up<\/h1>\n<p>In this article, I tried to show how <em>KRO<\/em> and <em>ASO<\/em> work together and lay the foundation for an <em>Azure<\/em> focused platform setup. What we built here is the starting point of a lightweight, <em>Azure<\/em> focused <em>IDP<\/em>. Its minimal but solid and it gives us a clear and approachable path that can grow into a full IDP experience over time.<\/p>\n<p>From here, we can extend the abstraction and integrate <em>GitOps<\/em>, <em>OPA<\/em> and <em>Backstage<\/em> to turn this platform foundation into a more complete developer portal and <em>IDP<\/em> experience.<\/p>\n<h1>References<\/h1>\n<blockquote><p><em>https:\/\/azure.github.io\/azure-service-operator\/<br \/>\nhttps:\/\/kro.run\/docs\/getting-started\/Installation\/#installation<br \/>\nhttps:\/\/github.com\/Azure\/azure-service-operator\/blob\/main\/docs\/troubleshooting.md<br \/>\n<\/em><\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>In the first two parts of this DevEx series, I tried to show how golden paths in Backstage can enable developer self\u2011service without chaos and how extending the catalog into copilots with MCP servers transforms discoverability into a conversational experience. Both of these steps were&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/gokhan-gokalp.com\/tr\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\/\">Devam\u0131n\u0131 okuyun<span class=\"screen-reader-text\">DevEx Series 03: Laying the Azure Focused Platform Foundation for an IDP with ASO and KRO<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":4876,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[418,680,434],"tags":[729,728,731,717,716,719,721,720,727,440,730,718],"class_list":["post-4839","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-azure","category-cloud","category-containerizing","tag-aks","tag-aso","tag-azure-service-operator","tag-developer-experience","tag-devex","tag-idp","tag-internal-developer-platform","tag-internal-developer-portal","tag-kro","tag-kubernetes","tag-kubernetes-resource-orchestrator","tag-platform-engineering","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"tr","enabled_languages":["en","tr"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"tr":{"title":false,"content":false,"excerpt":false}}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>DevEx Series 03: Laying the Azure Focused Platform Foundation for an IDP with ASO and KRO - G\u00f6khan G\u00f6kalp<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/gokhan-gokalp.com\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"DevEx Series 03: Laying the Azure Focused Platform Foundation for an IDP with ASO and KRO - G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gokhan-gokalp.com\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\/\" \/>\n<meta property=\"og:site_name\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-06T19:51:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-06T19:56:40+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/gokhan-gokalp-idp-aso-kro.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"675\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\\\/\"},\"author\":{\"name\":\"G\u00f6khan G\u00f6kalp\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"headline\":\"DevEx Series 03: Laying the Azure Focused Platform Foundation for an IDP with ASO and KRO\",\"datePublished\":\"2026-01-06T19:51:03+00:00\",\"dateModified\":\"2026-01-06T19:56:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\\\/\"},\"wordCount\":1664,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2026\\\/01\\\/gokhan-gokalp-idp-aso-kro.jpg\",\"keywords\":[\"aks\",\"aso\",\"azure service operator\",\"developer experience\",\"devex\",\"idp\",\"internal developer platform\",\"internal developer portal\",\"kro\",\"kubernetes\",\"kubernetes resource orchestrator\",\"platform engineering\"],\"articleSection\":[\"Azure\",\"Cloud\",\"Containerizing\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\\\/\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\\\/\",\"name\":\"DevEx Series 03: Laying the Azure Focused Platform Foundation for an IDP with ASO and KRO - G\u00f6khan G\u00f6kalp\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2026\\\/01\\\/gokhan-gokalp-idp-aso-kro.jpg\",\"datePublished\":\"2026-01-06T19:51:03+00:00\",\"dateModified\":\"2026-01-06T19:56:40+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\\\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\\\/#primaryimage\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2026\\\/01\\\/gokhan-gokalp-idp-aso-kro.jpg\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2026\\\/01\\\/gokhan-gokalp-idp-aso-kro.jpg\",\"width\":1200,\"height\":675},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"DevEx Series 03: Laying the Azure Focused Platform Foundation for an IDP with ASO and KRO\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"description\":\"C# &amp; Python lover\",\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gokhan-gokalp.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"pronouns\":\"he\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"caption\":\"G\u00f6khan G\u00f6kalp\"},\"logo\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\"},\"sameAs\":[\"https:\\\/\\\/gokhan-gokalp.com\"],\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/tr\\\/author\\\/gok-gokalp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"DevEx Series 03: Laying the Azure Focused Platform Foundation for an IDP with ASO and KRO - G\u00f6khan G\u00f6kalp","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/gokhan-gokalp.com\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\/","og_locale":"tr_TR","og_type":"article","og_title":"DevEx Series 03: Laying the Azure Focused Platform Foundation for an IDP with ASO and KRO - G\u00f6khan G\u00f6kalp","og_url":"https:\/\/gokhan-gokalp.com\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\/","og_site_name":"G\u00f6khan G\u00f6kalp","article_published_time":"2026-01-06T19:51:03+00:00","article_modified_time":"2026-01-06T19:56:40+00:00","og_image":[{"width":1200,"height":675,"url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/gokhan-gokalp-idp-aso-kro.jpg","type":"image\/jpeg"}],"author":"G\u00f6khan G\u00f6kalp","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"G\u00f6khan G\u00f6kalp","Tahmini okuma s\u00fcresi":"9 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gokhan-gokalp.com\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\/#article","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\/"},"author":{"name":"G\u00f6khan G\u00f6kalp","@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"headline":"DevEx Series 03: Laying the Azure Focused Platform Foundation for an IDP with ASO and KRO","datePublished":"2026-01-06T19:51:03+00:00","dateModified":"2026-01-06T19:56:40+00:00","mainEntityOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\/"},"wordCount":1664,"commentCount":0,"publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/gokhan-gokalp-idp-aso-kro.jpg","keywords":["aks","aso","azure service operator","developer experience","devex","idp","internal developer platform","internal developer portal","kro","kubernetes","kubernetes resource orchestrator","platform engineering"],"articleSection":["Azure","Cloud","Containerizing"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gokhan-gokalp.com\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gokhan-gokalp.com\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\/","url":"https:\/\/gokhan-gokalp.com\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\/","name":"DevEx Series 03: Laying the Azure Focused Platform Foundation for an IDP with ASO and KRO - G\u00f6khan G\u00f6kalp","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\/#primaryimage"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/gokhan-gokalp-idp-aso-kro.jpg","datePublished":"2026-01-06T19:51:03+00:00","dateModified":"2026-01-06T19:56:40+00:00","breadcrumb":{"@id":"https:\/\/gokhan-gokalp.com\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gokhan-gokalp.com\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\/"]}]},{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\/#primaryimage","url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/gokhan-gokalp-idp-aso-kro.jpg","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2026\/01\/gokhan-gokalp-idp-aso-kro.jpg","width":1200,"height":675},{"@type":"BreadcrumbList","@id":"https:\/\/gokhan-gokalp.com\/devex-series-03-laying-the-azure-focused-platform-foundation-for-an-idp-with-aso-and-kro\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gokhan-gokalp.com\/"},{"@type":"ListItem","position":2,"name":"DevEx Series 03: Laying the Azure Focused Platform Foundation for an IDP with ASO and KRO"}]},{"@type":"WebSite","@id":"https:\/\/gokhan-gokalp.com\/#website","url":"https:\/\/gokhan-gokalp.com\/","name":"G\u00f6khan G\u00f6kalp","description":"C# &amp; Python lover","publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gokhan-gokalp.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe","name":"G\u00f6khan G\u00f6kalp","pronouns":"he","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","url":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","caption":"G\u00f6khan G\u00f6kalp"},"logo":{"@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659"},"sameAs":["https:\/\/gokhan-gokalp.com"],"url":"https:\/\/gokhan-gokalp.com\/tr\/author\/gok-gokalp\/"}]}},"_links":{"self":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/4839","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/comments?post=4839"}],"version-history":[{"count":29,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/4839\/revisions"}],"predecessor-version":[{"id":4875,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/4839\/revisions\/4875"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media\/4876"}],"wp:attachment":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media?parent=4839"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/categories?post=4839"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/tags?post=4839"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}