<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[The Software Maker]]></title><description><![CDATA[Gorkem Ercan about open source, developers, enterprise AI/ML adoption]]></description><link>https://www.gorkem-ercan.com</link><image><url>https://www.gorkem-ercan.com/img/substack.png</url><title>The Software Maker</title><link>https://www.gorkem-ercan.com</link></image><generator>Substack</generator><lastBuildDate>Fri, 01 May 2026 05:41:04 GMT</lastBuildDate><atom:link href="https://www.gorkem-ercan.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Gorkem Ercan]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[gorkeme@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[gorkeme@substack.com]]></itunes:email><itunes:name><![CDATA[Gorkem Ercan]]></itunes:name></itunes:owner><itunes:author><![CDATA[Gorkem Ercan]]></itunes:author><googleplay:owner><![CDATA[gorkeme@substack.com]]></googleplay:owner><googleplay:email><![CDATA[gorkeme@substack.com]]></googleplay:email><googleplay:author><![CDATA[Gorkem Ercan]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Signing Is Not Enough: Why AI Artifact Provenance Needs to Be a Graph]]></title><description><![CDATA[You have a fine-tuned model in production.]]></description><link>https://www.gorkem-ercan.com/p/signing-is-not-enough-why-ai-artifact</link><guid isPermaLink="false">https://www.gorkem-ercan.com/p/signing-is-not-enough-why-ai-artifact</guid><dc:creator><![CDATA[Gorkem Ercan]]></dc:creator><pubDate>Thu, 16 Apr 2026 12:28:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!1_GW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45c9cf13-229b-4181-8cdd-68b4096d3e60_2417x1388.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You have a fine-tuned model in production. It has a valid signature. It passed a security scan. Your audit trail shows clean attestations. Can you prove what it was built from?</p><p>Signing tells you an artifact hasn&#8217;t been tampered with since it was signed. It tells you nothing about what went into creating it.</p><h2><strong>What signing actually gives you</strong></h2><p>OCI attestations solve a real problem. You can sign a ModelKit, attach scan results as attestations, and verify that the artifact in your registry is the same one that passed your security checks. Tools like Jozu Hub automate this: when you import a model or run a security scan, the scan result is a signed attestation attached directly to the artifact. No manual steps, no separate metadata store.</p><p>This is valuable. It&#8217;s also insufficient.</p><p>Single-artifact verification answers one question: is this artifact what it claims to be? It doesn&#8217;t answer: what went into producing it?</p><h2><strong>The fine-tuning problem</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1_GW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45c9cf13-229b-4181-8cdd-68b4096d3e60_2417x1388.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1_GW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45c9cf13-229b-4181-8cdd-68b4096d3e60_2417x1388.png 424w, https://substackcdn.com/image/fetch/$s_!1_GW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45c9cf13-229b-4181-8cdd-68b4096d3e60_2417x1388.png 848w, https://substackcdn.com/image/fetch/$s_!1_GW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45c9cf13-229b-4181-8cdd-68b4096d3e60_2417x1388.png 1272w, https://substackcdn.com/image/fetch/$s_!1_GW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45c9cf13-229b-4181-8cdd-68b4096d3e60_2417x1388.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1_GW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45c9cf13-229b-4181-8cdd-68b4096d3e60_2417x1388.png" width="2417" height="1388" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/45c9cf13-229b-4181-8cdd-68b4096d3e60_2417x1388.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1388,&quot;width&quot;:2417,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5164137,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.gorkem-ercan.com/i/194399163?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c5e68df-07de-492f-9c15-ea2292cb69b9_2752x1536.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1_GW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45c9cf13-229b-4181-8cdd-68b4096d3e60_2417x1388.png 424w, https://substackcdn.com/image/fetch/$s_!1_GW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45c9cf13-229b-4181-8cdd-68b4096d3e60_2417x1388.png 848w, https://substackcdn.com/image/fetch/$s_!1_GW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45c9cf13-229b-4181-8cdd-68b4096d3e60_2417x1388.png 1272w, https://substackcdn.com/image/fetch/$s_!1_GW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45c9cf13-229b-4181-8cdd-68b4096d3e60_2417x1388.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Consider three ModelKits in your registry:</p><ul><li><p><strong>ModelKit A</strong>: Base model (<code>registry.example.com/models/llama-base:v2</code>), imported from HuggingFace. Jozu Hub has attached an import attestation recording its origin and a security scan attestation confirming the state of threat vectors.</p></li><li><p><strong>ModelKit D: </strong>Dataset (<code>registry.example.com/datasets/customer-support:v1</code>), curated internally. Jozu Hub attaches a security scan attestation including PII scores.</p></li><li><p><strong>ModelKit F:</strong> Fine-tuned model (<code>registry.example.com/models/finetuned-support:v1</code>), produced by fine-tuning A on D.</p></li></ul><p>F has its own attestations. It was signed. It was scanned. But none of A&#8217;s provenance flows to F. None of D&#8217;s provenance flows to F. You can verify F in isolation and have no idea whether the base model was vetted or the dataset was scanned.</p><p>This is the gap.</p><h2><strong>Chains vs. graphs</strong></h2><p>Single-artifact provenance chaining is a known problem. Each attestation on an artifact can reference previous attestations, creating a linear history: built, then scanned, then approved. Tools exist for this. SLSA and in-toto define the formats. Rekor provides an append-only transparency log for ordering.</p><p>But fine-tuning isn&#8217;t a linear chain. F is produced from two inputs. Each input has its own attestation chain. The provenance structure is a graph, not a line.</p><p>F&#8217;s attestations need to explicitly capture its inputs &#8212; by digest &#8212; so that verification can walk the graph: confirm F, then confirm each input has its own valid chain. Without that link, the input attestations exist but are disconnected from the output. They&#8217;re metadata on separate artifacts that happen to be in the same registry.</p><h2><strong>Wait.. what about SBOMs?</strong></h2><p>If you&#8217;re thinking your SBOM already captures this relationship, you&#8217;re half right. An SPDX 3 SBOM on F can list A and D as inputs using relationship types like <code>TRAINED_ON</code> and <code>GENERATED_FROM</code>. It records versions and describes the dependency structure. That&#8217;s lineage &#8212; and it belongs in the SBOM. Jozu Hub can generate these. The composition is documented.</p><p>But the SBOM is a manifest, not a verification record. It describes what went into F. It doesn&#8217;t prove that the build process actually consumed those specific artifacts, and it doesn&#8217;t capture whether each input met its policy requirements at the time it was consumed. A signed SLSA provenance attestation does &#8212; it&#8217;s a cryptographic assertion from the build pipeline that says &#8220;I consumed these artifacts, at these digests, at this time.&#8221;</p><p>SBOMs own lineage. Attestations own proof. The SBOM tells a policy engine which inputs to check. The attestation on each input is what it verifies. But that verification &#8212; walking the graph and confirming each input met its requirements &#8212; is the piece that doesn&#8217;t exist yet.</p><h2><strong>Capturing input provenance at build time</strong></h2><p>This is the step most pipelines skip. When the fine-tuning job runs and F is packaged, the build process must record which artifacts were consumed, pinned by digest.</p><p>Fine-tuning is a build. The same SLSA provenance format works here. The <code>buildType</code> identifies it as fine-tuning, and <code>resolvedDependencies</code> captures every input artifact by digest.</p><p>Retrieve the digests before fine-tuning starts:</p><pre><code><code>DIGEST_A=$(crane digest registry.example.com/models/llama-base:v2)
DIGEST_D=$(crane digest registry.example.com/datasets/customer-support:v1)</code></code></pre><p>Then construct F&#8217;s provenance attestation:</p><pre><code><code>{
  "buildDefinition": {
    "buildType": "https://jozu.dev/kitops/fine-tune/v1",
    "externalParameters": {
      "config": {
        "learning_rate": 2e-5,
        "epochs": 3,
        "batch_size": 16
      }
    },
    "resolvedDependencies": [
      {
        "uri": "registry.example.com/models/llama-base:v2",
        "digest": { "sha256": "abc123..." },
        "name": "base-model"
      },
      {
        "uri": "registry.example.com/datasets/customer-support:v1",
        "digest": { "sha256": "def456..." },
        "name": "dataset"
      }
    ]
  },
  "runDetails": {
    "builder": {
      "id": "https://jozu.dev/kitops/cli",
      "version": { "kit": "0.9.2" }
    },
    "metadata": {
      "invocationId": "ft-run-a7b8c9d0",
      "startedOn": "2025-03-15T09:00:00Z",
      "finishedOn": "2025-03-15T10:00:00Z"
    }
  }
}</code></code></pre><p>Attach it to F:</p><pre><code><code>cosign attest --key cosign.key \
  --predicate build-attestation.json \
  --type https://slsa.dev/provenance/v1 \
  registry.example.com/models/finetuned-support:v1</code></code></pre><p>Now F&#8217;s attestation explicitly names its inputs using the same standard that import provenance already uses. No new predicate type. No custom schema. The graph exists. But verification is still on you.</p><h2><strong>Where cosign&#8217;s scope ends</strong></h2><p>Cosign verifies individual attestations. It confirms that a specific attestation is validly signed and attached to a specific artifact. It does not traverse the graph.</p><p>Graph verification requires additional logic:</p><ol><li><p>Retrieve F&#8217;s provenance attestation and extract the resolved dependencies</p></li><li><p>For each dependency, resolve the digest in the registry and pull its attestations</p></li><li><p>Verify each attestation&#8217;s signature</p></li><li><p>Confirm the required attestation types are present &#8212; A needs both an import provenance and a scan attestation, D needs a scan attestation</p></li><li><p>Recurse if any input was itself produced from further inputs</p></li></ol><p>No off-the-shelf tool does this today. The primitives are all there &#8212; cosign for signature verification, crane for digest resolution, OCI registries for attestation storage. The orchestration that ties them into recursive graph traversal is not.</p><h2><strong>Why almost nobody is doing this</strong></h2><p>Cosign doesn&#8217;t do it. The OCI spec doesn&#8217;t require it. Most pipelines treat each artifact in isolation &#8212; sign it, scan it, ship it.</p><p>The infrastructure to capture and verify input provenance has to be built deliberately. There&#8217;s no off-the-shelf tool that takes a fine-tuned model and walks back through its inputs to confirm each one was properly vetted. The primitives exist &#8212; digests, attestations, registries &#8212; but the orchestration layer doesn&#8217;t.</p><p>Part of the reason is that most supply chain security content stops at &#8220;sign your artifacts.&#8221; That&#8217;s Step 1. The harder problem &#8212; proving that the signed artifact was built from verified inputs &#8212; doesn&#8217;t have a standard solution yet.</p><h2><strong>What this prevents</strong></h2><p>Without input provenance capture, an attacker or a careless pipeline can substitute a different dataset or base model between approval and fine-tuning. F&#8217;s own attestations pass verification. The substitution is invisible.</p><p>With the graph in place, any substitution breaks verification. The digest recorded in F&#8217;s build attestation won&#8217;t match the artifact in the registry, or the artifact at that digest won&#8217;t have the required attestations. Either way, verification fails. That&#8217;s the point.</p><p>Signing is necessary. The graph is what makes it sufficient.</p><p><em>The provenance infrastructure described here is part of what we&#8217;re building into <a href="https://kitops.org/">KitOps</a> and <a href="https://jozu.com/">Jozu Hub</a>. ModelKits already carry the attestations. The next step is making input provenance capture and graph verification part of the pipeline, not an afterthought. If you&#8217;re working through similar problems, Yoi canfind me on <a href="https://www.linkedin.com/in/gorkemercan/">LinkedIn</a>.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.gorkem-ercan.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading. Subscribe for free to receive new post.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Complexity Without Comprehension]]></title><description><![CDATA[&#8220;Vibe coding&#8221; allows engineers to build impressive cathedrals in the wrong location with unprecedented speed.]]></description><link>https://www.gorkem-ercan.com/p/complexity-without-comprehension</link><guid isPermaLink="false">https://www.gorkem-ercan.com/p/complexity-without-comprehension</guid><dc:creator><![CDATA[Gorkem Ercan]]></dc:creator><pubDate>Mon, 05 Jan 2026 15:46:23 GMT</pubDate><content:encoded><![CDATA[<p>&#8220;Vibe coding&#8221; allows engineers to build impressive cathedrals in the wrong location with unprecedented speed.</p><p>AI helps developers build complex systems without forcing them to understand the problem domain deeply first. Traditional development&#8217;s slow pace was a forcing function for understanding. You&#8217;d hit walls, get frustrated, simplify. AI lets you bulldoze past those walls without learning why they existed.</p><p>Humans can learn plenty fast about a problem domain when forced to. The problem is AI removes the forcing function to learn entirely.</p><h3><strong>The Missing Filter</strong></h3><p>Traditional development had unavoidable chokepoints:</p><ul><li><p><strong>Hitting a complexity wall</strong> forced you to understand the problem better.</p></li><li><p><strong>Inability to implement a feature</strong> forced you to question its necessity.</p></li><li><p><strong>Unmaintainable code</strong> forced you to simplify the architecture.</p></li><li><p><strong>Degrading performance</strong> forced you to understand resource constraints.</p></li></ul><p>These weren&#8217;t just slowdowns; they were filters that killed bad ideas before they became real code. You literally couldn&#8217;t proceed without either understanding the problem deeply or abandoning the approach. AI removes the natural selection pressure that kept bad code from your codebase.</p><h3><strong>Balancing Speed and Understanding</strong></h3><p>How can we have our cake and eat it too?</p><p>Use AI for the parts you already understand deeply, not for exploration. When you are exploring, the friction is the teacher. Remove it, and you learn nothing.</p><p>The challenge lies in distinguishing between what you understand deeply and what requires exploration&#8212;a skill many lack. The Dunning-Kruger effect exists precisely because people struggle to accurately assess their own understanding.</p><h3><strong>The Concrete Test</strong></h3><p>Before using AI on any component, force yourself to:</p><ol><li><p>Explain the problem to someone non-technical.</p></li><li><p>Predict what will break.</p></li><li><p>Describe the failure modes.</p></li></ol><p>If you cannot do these things before the code exists, you are exploring, not implementing. Use different tools for exploration.</p><p><strong>Effective exploration looks like:</strong></p><ul><li><p>Paper prototypes</p></li><li><p>Throwaway spike solutions (truly throwaway, not &#8220;we&#8217;ll refactor later&#8221;)</p></li><li><p>Building the &#8220;dumbest&#8221; possible version (no vibe coding)</p></li><li><p>Talking to users before writing any code</p></li></ul><p>These create friction that generates understanding. AI is an accelerant. Accelerants applied to exploration create expensive mistakes faster.</p><h3><strong>Force Multiplier vs. Knowledge Substitute</strong></h3><p>The AI development framework that works for me is simple: use AI as a force multiplier, not a knowledge substitute.</p><ul><li><p><strong>Force Multiplier:</strong> &#8220;I understand OAuth flows and have implemented them manually before. AI helps me generate the boilerplate faster.&#8221;</p></li><li><p><strong>Knowledge Substitute:</strong> &#8220;I need authentication, so I&#8217;ll let AI figure out what pattern to use.&#8221;</p></li></ul><p>Learn first, then build. AI makes the building trivial, but it doesn&#8217;t make the learning optional. Skip the learning, and you&#8217;ll wake up maintaining an impressive cathedral that nobody needed, built on land you don&#8217;t own, solving problems that don&#8217;t exist.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.gorkem-ercan.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading. Subscribe for free to receive new posts.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Bidirectional Model-Data Provenance]]></title><description><![CDATA[Closing the Loop from Edge to Retraining]]></description><link>https://www.gorkem-ercan.com/p/bidirectional-model-data-provenance</link><guid isPermaLink="false">https://www.gorkem-ercan.com/p/bidirectional-model-data-provenance</guid><dc:creator><![CDATA[Gorkem Ercan]]></dc:creator><pubDate>Tue, 09 Dec 2025 20:56:54 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!7M5_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aee8c65-837e-4e4a-a603-8441edca0b2d_1986x1426.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A medical diagnostic model runs on 500 edge devices in hospitals. Six months later, the FDA asks which model version produced specific diagnostic results in January. The answer determines recalls, fines, or regulatory approval for the next product.</p><p>Can the question be answered in 48 hours with cryptographic proof? Or does it require three weeks cross-referencing deployment logs, S3 timestamps, and spreadsheets&#8212;with gaps?</p><p>This is the provenance problem. Not just &#8220;where did this model come from&#8221; but &#8220;which data came from which model version, and can you prove it?&#8221;</p><h2>The Real Problem: Two Disconnected Workflows</h2><p>Traditional ML infrastructure treats model distribution and data collection as separate systems:</p><p><strong>Models flow out:</strong> CI/CD pipelines, container registries, deployment scripts, version tags.</p><p><strong>Data flows in:</strong> Custom collectors, S3 buckets, data lakes, ETL pipelines, manual tracking.</p><p>The connection between them? Spreadsheets. Naming conventions. Hope.</p><p>This breaks when you need to:</p><ul><li><p>Retrain models on data from specific versions</p></li><li><p>Prove regulatory compliance with audit trails</p></li><li><p>Debug performance issues across model versions</p></li><li><p>Correlate field failures with deployment history</p></li></ul><p>The root cause: <strong>models and data live in different systems with different identities</strong>. A model is medical-diagnostic:v2.1.4. Its training data is s3://bucket/device-042/2025-01-15/batch-003.parquet. There&#8217;s no cryptographic link.</p><h2>The Solution: Bidirectional Artifact Flow</h2><p>Treat both models and training data as versioned OCI artifacts with cryptographic references between them.</p><p><strong>Outbound (Model Distribution):</strong> Models package as ModelKits&#8212;OCI artifacts containing weights, inference code, and configuration. Edge devices pull by content-addressable digest: sha256:abc123...</p><p><strong>Inbound (Data Collection):</strong> Training data packages as separate ModelKits that reference the source model by digest. These Training Data ModelKits contain inference outputs, optional ground truth labels, and metadata (device ID, timestamps, inference parameters).</p><p><strong>Single Infrastructure:</strong> The same OCI registry handles both directions. Models distribute outbound. Training data flows inbound. Query by model digest to aggregate data from specific versions across your entire device fleet.</p><p><strong>Cryptographic Chain:</strong> Sign and attest both artifact types. The provenance link is mathematically verifiable, not administratively maintained.</p><h2>How It Works</h2><h3>Model Deployment</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7M5_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aee8c65-837e-4e4a-a603-8441edca0b2d_1986x1426.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7M5_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aee8c65-837e-4e4a-a603-8441edca0b2d_1986x1426.png 424w, https://substackcdn.com/image/fetch/$s_!7M5_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aee8c65-837e-4e4a-a603-8441edca0b2d_1986x1426.png 848w, https://substackcdn.com/image/fetch/$s_!7M5_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aee8c65-837e-4e4a-a603-8441edca0b2d_1986x1426.png 1272w, https://substackcdn.com/image/fetch/$s_!7M5_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aee8c65-837e-4e4a-a603-8441edca0b2d_1986x1426.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7M5_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aee8c65-837e-4e4a-a603-8441edca0b2d_1986x1426.png" width="1456" height="1045" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9aee8c65-837e-4e4a-a603-8441edca0b2d_1986x1426.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1045,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Model Deployment&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Model Deployment" title="Model Deployment" srcset="https://substackcdn.com/image/fetch/$s_!7M5_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aee8c65-837e-4e4a-a603-8441edca0b2d_1986x1426.png 424w, https://substackcdn.com/image/fetch/$s_!7M5_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aee8c65-837e-4e4a-a603-8441edca0b2d_1986x1426.png 848w, https://substackcdn.com/image/fetch/$s_!7M5_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aee8c65-837e-4e4a-a603-8441edca0b2d_1986x1426.png 1272w, https://substackcdn.com/image/fetch/$s_!7M5_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aee8c65-837e-4e4a-a603-8441edca0b2d_1986x1426.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Inference and Data Collection</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2Fva!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8e0a65-32a7-4914-b393-7b6984917706_1736x2086.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2Fva!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8e0a65-32a7-4914-b393-7b6984917706_1736x2086.png 424w, https://substackcdn.com/image/fetch/$s_!2Fva!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8e0a65-32a7-4914-b393-7b6984917706_1736x2086.png 848w, https://substackcdn.com/image/fetch/$s_!2Fva!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8e0a65-32a7-4914-b393-7b6984917706_1736x2086.png 1272w, https://substackcdn.com/image/fetch/$s_!2Fva!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8e0a65-32a7-4914-b393-7b6984917706_1736x2086.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2Fva!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8e0a65-32a7-4914-b393-7b6984917706_1736x2086.png" width="1456" height="1750" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6a8e0a65-32a7-4914-b393-7b6984917706_1736x2086.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1750,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Inference&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Inference" title="Inference" srcset="https://substackcdn.com/image/fetch/$s_!2Fva!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8e0a65-32a7-4914-b393-7b6984917706_1736x2086.png 424w, https://substackcdn.com/image/fetch/$s_!2Fva!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8e0a65-32a7-4914-b393-7b6984917706_1736x2086.png 848w, https://substackcdn.com/image/fetch/$s_!2Fva!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8e0a65-32a7-4914-b393-7b6984917706_1736x2086.png 1272w, https://substackcdn.com/image/fetch/$s_!2Fva!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8e0a65-32a7-4914-b393-7b6984917706_1736x2086.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Retraining Query and Aggregation</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wj4A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b9719aa-8fa8-4169-9afe-2c143627e679_1470x2146.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wj4A!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b9719aa-8fa8-4169-9afe-2c143627e679_1470x2146.png 424w, https://substackcdn.com/image/fetch/$s_!wj4A!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b9719aa-8fa8-4169-9afe-2c143627e679_1470x2146.png 848w, https://substackcdn.com/image/fetch/$s_!wj4A!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b9719aa-8fa8-4169-9afe-2c143627e679_1470x2146.png 1272w, https://substackcdn.com/image/fetch/$s_!wj4A!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b9719aa-8fa8-4169-9afe-2c143627e679_1470x2146.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wj4A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b9719aa-8fa8-4169-9afe-2c143627e679_1470x2146.png" width="1456" height="2126" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4b9719aa-8fa8-4169-9afe-2c143627e679_1470x2146.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2126,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Retratining&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Retratining" title="Retratining" srcset="https://substackcdn.com/image/fetch/$s_!wj4A!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b9719aa-8fa8-4169-9afe-2c143627e679_1470x2146.png 424w, https://substackcdn.com/image/fetch/$s_!wj4A!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b9719aa-8fa8-4169-9afe-2c143627e679_1470x2146.png 848w, https://substackcdn.com/image/fetch/$s_!wj4A!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b9719aa-8fa8-4169-9afe-2c143627e679_1470x2146.png 1272w, https://substackcdn.com/image/fetch/$s_!wj4A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b9719aa-8fa8-4169-9afe-2c143627e679_1470x2146.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The beauty: <strong>models and data share the same identity system</strong>. Query by model digest returns all training data generated by that version across your entire fleet. The provenance is in the artifact structure itself.</p><h2>This Works Today</h2><p>The pattern relies on standard OCI infrastructure and existing tools. KitOps handles ModelKit creation and streaming pack-and-push. Any OCI-compliant registry works, though registries with metadata query capabilities (like Jozu Hub) simplify data aggregation. Cosign or Notary provide signing.</p><p>The architecture scales with your registry infrastructure. If you&#8217;re deploying models to edge devices in regulated environments&#8212;automotive, medical devices, industrial control systems&#8212;the provenance problem isn&#8217;t optional. Auditors will ask which model version produced which results. This architecture answers that question with cryptographic proof instead of spreadsheets.</p><p>The bidirectional flow isn&#8217;t novel infrastructure. It&#8217;s the logical extension of treating ML artifacts the same way we learned to treat application artifacts: versioned, immutable, content-addressable, and cryptographically verifiable.<br></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.gorkem-ercan.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.gorkem-ercan.com/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[The State of OCI Artifacts for AI/ML]]></title><description><![CDATA[I&#8217;ve spent the last 18 months watching OCI artifacts for AI/ML go from &#8220;interesting idea&#8221; to production-grade infrastructure in enterprises.]]></description><link>https://www.gorkem-ercan.com/p/the-state-of-oci-artifacts-for-aiml</link><guid isPermaLink="false">https://www.gorkem-ercan.com/p/the-state-of-oci-artifacts-for-aiml</guid><dc:creator><![CDATA[Gorkem Ercan]]></dc:creator><pubDate>Tue, 07 Oct 2025 12:03:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!yXGi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F567903bd-7608-4f16-bef9-d3cc3f2e7ddc_3840x1616.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;ve spent the last 18 months watching OCI artifacts for AI/ML go from &#8220;interesting idea&#8221; to production-grade infrastructure in enterprises. The shift is real, but not where most people first expected. It&#8217;s not replacing S3 buckets everywhere&#8212;it&#8217;s becoming the standard for Kubernetes-native ML deployments where governance, provenance, supply chain controls, and container-centric operations matter. Here&#8217;s what&#8217;s actually happening with OCI for ML as of October 2025.</p><h2><strong>Momentum is growing</strong></h2><p>Let me walk through what&#8217;s actually happened over the last 18 months, because the timeline tells a story about ecosystem convergence:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yXGi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F567903bd-7608-4f16-bef9-d3cc3f2e7ddc_3840x1616.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yXGi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F567903bd-7608-4f16-bef9-d3cc3f2e7ddc_3840x1616.png 424w, https://substackcdn.com/image/fetch/$s_!yXGi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F567903bd-7608-4f16-bef9-d3cc3f2e7ddc_3840x1616.png 848w, https://substackcdn.com/image/fetch/$s_!yXGi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F567903bd-7608-4f16-bef9-d3cc3f2e7ddc_3840x1616.png 1272w, https://substackcdn.com/image/fetch/$s_!yXGi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F567903bd-7608-4f16-bef9-d3cc3f2e7ddc_3840x1616.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yXGi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F567903bd-7608-4f16-bef9-d3cc3f2e7ddc_3840x1616.png" width="1456" height="613" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/567903bd-7608-4f16-bef9-d3cc3f2e7ddc_3840x1616.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:613,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:189509,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.gorkem-ercan.com/i/175397004?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F567903bd-7608-4f16-bef9-d3cc3f2e7ddc_3840x1616.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!yXGi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F567903bd-7608-4f16-bef9-d3cc3f2e7ddc_3840x1616.png 424w, https://substackcdn.com/image/fetch/$s_!yXGi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F567903bd-7608-4f16-bef9-d3cc3f2e7ddc_3840x1616.png 848w, https://substackcdn.com/image/fetch/$s_!yXGi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F567903bd-7608-4f16-bef9-d3cc3f2e7ddc_3840x1616.png 1272w, https://substackcdn.com/image/fetch/$s_!yXGi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F567903bd-7608-4f16-bef9-d3cc3f2e7ddc_3840x1616.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The momentum started quietly. When Jozu released <strong><a href="https://kitops.org/">KitOps</a></strong> in March 2024, early users responded: &#8220;<em>Why didn&#8217;t we think of this sooner?&#8221; </em>By May 2025 it entered the CNCF Sandbox and has seen over 150K downloads. KitOps offers a Docker-like CLI ( <code>kit pack, kit push, kit pull</code>) plus native Hugging Face integration, letting teams import models into OCI registries with automatic metadata generation.</p><p>In June 2025 the CNCF accepted <strong><a href="https://github.com/modelpack/model-spec">ModelPack</a></strong> into its Sandbox, marking the first vendor-neutral open standard for packaging ML artifacts as OCI objects. Contributors include <a href="https://jozu.com/">Jozu</a>, Red Hat, PayPal, ANT Group, and ByteDance&#8212;indicating commitment beyond startups. ModelPack builds directly on the OCI Image Manifest Specification v1.1, defining custom media types for models, datasets, code, and documentation as separate deduplicated layers.</p><p>Docker shipped <strong><a href="https://www.docker.com/blog/introducing-docker-model-runner/">Model Runner</a></strong> in beta (April 2025) and reached general availability in September 2025. It introduces an OCI artifact approach for <a href="https://github.com/ggml-org/llama.cpp">GGUF</a>-format LLMs, treating models as first-class artifacts with domain-specific configuration schemas.</p><p>Red Hat&#8217;s <a href="https://github.com/containers/omlmd">OMLMD</a> project (July 2024) delivers a Python SDK and CLI for working with ML models and metadata via OCI registries.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.gorkem-ercan.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.gorkem-ercan.com/subscribe?"><span>Subscribe now</span></a></p><h2><strong>Kubernetes integration establishes the foundation</strong></h2><p>Kubernetes 1.31 (August 2024) introduced <a href="https://kubernetes.io/blog/2024/08/16/kubernetes-1-31-image-volume-source/">Image Volume Source</a> (KEP-4639) in alpha&#8212;native support for mounting OCI artifacts as read-only volumes in pods, specifically designed for AI/ML use cases. This eliminates the init-container pattern previously required to fetch models, instead allowing data scientists to package model weights as OCI objects that mount directly alongside model servers. KServe added OCI artifact support and KitOps released its <a href="https://kitops.org/docs/integrations/kserve/">integration</a> with KServe with support of multiple cloud providers.</p><p>OCI specifications for AI/ML artifacts have achieved genuine production readiness as of October 2025. Technical implementation is mature with OCI v1.1 providing robust architectural foundations. Security tooling spans ML-specific scanning, signing, attestations, and policy enforcement.</p><p>Two OCI specifications have emerged serving distinct contexts:</p><ul><li><p>Docker Model Runner: targets desktop / local inference workflows; emphasizes GGUF-format models optimized for consumer hardware ergonomics.</p></li><li><p>CNCF ModelPack: targets enterprise production; supports multiple model formats (SafeTensors, ONNX, PyTorch) plus governance artifacts (attestations, SBOMs, policy bundles).</p></li></ul><h2><strong>Should you adopt this now?</strong></h2><p>OCI artifacts for ML make operational sense today if you are:</p><ul><li><p>Running Kubernetes-native infrastructure</p></li><li><p>Under regulatory or internal compliance pressure for model provenance</p></li><li><p>Distributing models across multiple teams or external partners</p></li><li><p>Already container-centric in your release and operations workflows</p></li></ul><p>If none of these apply, keep your current workflows&#8212;S3 buckets and DVC remain perfectly valid.</p><p>If you&#8217;re evaluating adoption and want to compare implementation patterns&#8212;what&#8217;s working and where things still break&#8212;send a message below (or comment). If you&#8217;re building tooling in this space, I&#8217;d love to hear what you&#8217;re seeing.</p><div class="directMessage button" data-attrs="{&quot;userId&quot;:109254376,&quot;userName&quot;:&quot;Gorkem Ercan&quot;,&quot;canDm&quot;:null,&quot;dmUpgradeOptions&quot;:null,&quot;isEditorNode&quot;:true}" data-component-name="DirectMessageToDOM"></div><p></p>]]></content:encoded></item><item><title><![CDATA[Monorepos for AI Projects: The Good, the Bad, and the Ugly]]></title><description><![CDATA[Recently, I met a team that used an AI&#8209;focused monorepo containing everything: notebooks, training pipelines, microservices, and infrastructure code.]]></description><link>https://www.gorkem-ercan.com/p/monorepos-for-ai-projects-the-good</link><guid isPermaLink="false">https://www.gorkem-ercan.com/p/monorepos-for-ai-projects-the-good</guid><dc:creator><![CDATA[Gorkem Ercan]]></dc:creator><pubDate>Fri, 18 Jul 2025 12:00:18 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/063e1a79-965e-4533-8fe9-489c1b55606b_1024x1536.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Recently, I met a team that used an AI&#8209;focused monorepo containing everything: notebooks, training pipelines, microservices, and infrastructure code. In this post I share my observations on how their data scientists, engineers, and DevOps teams collaborated, and where things broke down. I also explore how KitOps helped introduce structure at a critical point: the transition from experimentation to production.</p><h2><strong>&#9989; The Good</strong></h2><p>When a monorepo works, it works because the alignment and velocity benefits outweigh any drawbacks. Here is what I noticed:</p><ul><li><p><strong>Shared context</strong>: Everyone, from data scientists to platform engineers, had visibility into the same repository, which fostered fast collaboration and fewer misunderstandings.</p></li><li><p><strong>Fast iteration</strong>: A data scientist could tweak a model and then message an engineer to wire it up to an API within the same codebase.</p></li><li><p><strong>Unified CI/CD</strong>: Teams could run pipelines for end&#8209;to&#8209;end tests, integrate model&#8209;training jobs into GitHub Actions, and deploy inference microservices using the same scripts.</p></li></ul><h2><strong>&#10060; The Bad</strong></h2><p>This setup had major flaws, some of them critical to production readiness.</p><ul><li><p><strong>No model provenance</strong>: Models trained in notebooks were often dumped into S3 buckets with ad&#8209;hoc names. There was no versioning or traceability. The teams included their names in the model filenames, but that practice did not age well.</p></li><li><p><strong>Reproducibility gaps</strong>: Because experiments were often driven from notebooks, they lacked pinned dependencies or runtime configuration. Rerunning a past experiment was, at best, guesswork.</p></li><li><p><strong>Security blind spots</strong>: With no SBOMs or attestations, the security team had no idea what was running in production, creating a compliance risk.</p></li></ul><h2><strong>&#128556; The Ugly</strong></h2><p>Some things technically &#8220;worked,&#8221; but only through tribal knowledge, individual heroics, or duct&#8209;taped workflows.</p><ul><li><p><strong>Manual model handoffs</strong>: Data scientists pinged infrastructure engineers on Slack with pointers to model files. There was no formalized way to package a model.</p></li><li><p><strong>Inconsistent naming conventions</strong>: Some model folders were named <code>teamXXX_final_modelv2</code>, while others used names like <code>modelXX_2024_05_19</code>. Pipelines frequently broke when a model name changed or a new model appeared.</p></li><li><p><strong>Overloaded CI pipelines</strong>: A single Git push could retrigger training, redeploy the inference container, and run unrelated tests. The infrastructure was brittle because the monorepo lacked boundaries between experimentation and production.</p></li><li><p><strong>Blurred ownership</strong>: When a model in production failed, nobody knew whether to call the data scientist, ML engineer, or platform SRE. The repository did not encode accountability.</p></li></ul><h2><strong>&#129520; How KitOps Helped</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9yZA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f44a14c-7d7f-408f-9da0-e1cd6d30ebea_2632x316.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9yZA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f44a14c-7d7f-408f-9da0-e1cd6d30ebea_2632x316.png 424w, https://substackcdn.com/image/fetch/$s_!9yZA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f44a14c-7d7f-408f-9da0-e1cd6d30ebea_2632x316.png 848w, https://substackcdn.com/image/fetch/$s_!9yZA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f44a14c-7d7f-408f-9da0-e1cd6d30ebea_2632x316.png 1272w, https://substackcdn.com/image/fetch/$s_!9yZA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f44a14c-7d7f-408f-9da0-e1cd6d30ebea_2632x316.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9yZA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f44a14c-7d7f-408f-9da0-e1cd6d30ebea_2632x316.png" width="1456" height="175" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1f44a14c-7d7f-408f-9da0-e1cd6d30ebea_2632x316.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:175,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:563219,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.gorkem-ercan.com/i/168627289?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f44a14c-7d7f-408f-9da0-e1cd6d30ebea_2632x316.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9yZA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f44a14c-7d7f-408f-9da0-e1cd6d30ebea_2632x316.png 424w, https://substackcdn.com/image/fetch/$s_!9yZA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f44a14c-7d7f-408f-9da0-e1cd6d30ebea_2632x316.png 848w, https://substackcdn.com/image/fetch/$s_!9yZA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f44a14c-7d7f-408f-9da0-e1cd6d30ebea_2632x316.png 1272w, https://substackcdn.com/image/fetch/$s_!9yZA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f44a14c-7d7f-408f-9da0-e1cd6d30ebea_2632x316.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>KitOps introduced structure at the artifact level without forcing the team to refactor the entire repository.</p><ol><li><p><strong>Clear handoff via ModelKit artifacts</strong><br>Data scientists used the <code>kit</code> CLI and <code>pykitops</code> to export trained models as self&#8209;contained, versioned ModelKits that included:</p><ul><li><p>Weights</p></li><li><p>Metadata (input and output schema)</p></li><li><p>Optional model cards as README files</p></li><li><p>Runtime dependencies (for example, tokenizers, configuration files, and sometimes Python code)</p></li></ul><p>These kits became immutable units that downstream teams could trust.</p></li><li><p><strong>Decoupled training and inference</strong><br>ModelKits were pushed to an OCI&#8209;compatible registry where inference microservices could pull them at runtime. Training scripts no longer needed to be bundled into deployment images. The same model could be pulled into staging, production, or offline evaluation environments with confidence, allowing platform engineers to treat inference containers as cattle rather than pets.</p></li><li><p><strong>Auditability and compliance</strong><br>The team did not yet add SBOMs to ModelKits, but they recorded the monorepo SHA as an attestation with which each ModelKit created. This practice gave the security team visibility into what was running in production and where it came from, easing a key compliance bottleneck.</p></li><li><p><strong>Standardization without a repo rewrite</strong><br>The team adopted one simple convention: if a model is going to production, it must be exported as a ModelKit. That rule turned Git chaos into structured deployment boundaries.</p></li></ol><p>Monorepos are a double&#8209;edged sword. Their collaboration benefits are impressive, but scaling them, especially in AI and ML systems, requires discipline.</p><p>KitOps did not &#8220;fix&#8221; the monorepo; arguably, it did not need fixing. Instead, it created clean seams where they mattered most: at the handoff between teams and in the lifecycle from experimentation to production. That was enough.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.gorkem-ercan.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Enjoyed this post? Subscribe for more insights on modern AI and ML workflows, cloud native AI, and secure deployment pipeline</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Model Lifecycle ≠ Container Lifecycle — Why Jozu Splits Them]]></title><description><![CDATA[Why prebuilt inference containers like NVIDIA NIMs miss the mark on lifecycle, control, and separation of concerns.]]></description><link>https://www.gorkem-ercan.com/p/model-lifecycle-container-lifecycle</link><guid isPermaLink="false">https://www.gorkem-ercan.com/p/model-lifecycle-container-lifecycle</guid><dc:creator><![CDATA[Gorkem Ercan]]></dc:creator><pubDate>Thu, 10 Jul 2025 18:04:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!s200!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa520dc-0689-487e-95f4-672e48970004_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you&#8217;ve played with NVIDIA <a href="https://developer.nvidia.com/nim">NIMs</a>, you&#8217;ve probably had the same thought i did: <em>this is a strong step forward for getting models into production.</em> It&#8217;s fast. It's GPU-optimized. It wraps up Triton, models, and runtime into a neat container. For many teams, that's enough.</p><p>At Jozu, though, we&#8217;re solving the same production inference problem&#8212;but from the perspective of platform and DevOps teams, not just model consumers.</p><h2><strong>&#127919; The Problem We&#8217;re Solving: Infra Teams Need Control, Not Just Speed</strong></h2><p>NIMs are fantastic for what they do: help teams quickly run high-performance inference workloads on NVIDIA hardware. But many of the teams we work with&#8212;infra, platform, and SRE leads inside organizations scaling their AI infrastructure&#8212;need something more composable, secure, and lifecycle-aware. They need:</p><ul><li><p>Full control over <strong>which model goes where</strong> and <strong>how it&#8217;s updated</strong></p></li><li><p>Clear provenance and <strong>auditability</strong> across environments</p></li><li><p>The ability to <strong>decouple containers from models</strong>, just apps were decoupled from hardware</p></li></ul><p>That&#8217;s why we built <strong><a href="https://jozu.ml">Jozu</a> Rapid Inference Containers (RICs)</strong> &#8212;a packaging and runtime architecture that treats models as first-class, injectable artifacts, not frozen blobs inside prebuilt containers.</p><h2><strong>&#129521; What Are Jozu RICs?</strong></h2><p>At a high level, RICs are base inference containers (e.g., using vLLM, Triton, llama.cpp, etc.) that dynamically <strong>inject the right model at pull-time</strong> using our open packaging format called <strong>ModelKits</strong>.</p><p>A ModelKit includes:</p><ul><li><p>Model weights (e.g., GGUF, safetensors, ONNX)</p></li><li><p>Optional adapters (e.g., LoRA)</p></li><li><p>Inference config (Triton, vLLM, etc.)</p></li><li><p>Metadata, licenses, SBOMs, and attestations</p></li></ul><h2><strong>&#129504; Models &#8800; Containers</strong></h2><p>Most model serving setups today &#8212; including NVIDIA NIMs &#8212; bundle the model directly into the container image. That might feel convenient, but it tightly couples <strong>what you serve</strong> (the model) with <strong>how you serve it</strong> (the container).</p><p>This creates real problems:</p><ul><li><p>Promoting a model to production means building and shipping a new container.</p></li><li><p>Rolling back a model requires knowing which image it was embedded in.</p></li><li><p>You can&#8217;t track or attest to models independently of the containers they're wrapped in.</p></li></ul><p><strong>Jozu RICs break this coupling.</strong></p><p>We treat the container as the <strong>runtime</strong>, and the model as a <strong>pluggable artifact</strong>, delivered just in time at pull.</p><p>This gives you major advantages:</p><ul><li><p>&#9989; <strong>Run the same container</strong> across staging, production, or air-gapped environments &#8212; just inject different models.</p></li><li><p>&#9989; <strong>Promote, attest, or roll back</strong> individual models without touching containers or deployments.</p></li><li><p>&#9989; <strong>Automate model lifecycle</strong> using GitOps: model changes are observable, auditable, and versioned like application code.</p></li></ul><p>Think of it like Helm charts for models&#8212;one runtime, many artifacts, full control.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!s200!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa520dc-0689-487e-95f4-672e48970004_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!s200!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa520dc-0689-487e-95f4-672e48970004_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!s200!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa520dc-0689-487e-95f4-672e48970004_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!s200!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa520dc-0689-487e-95f4-672e48970004_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!s200!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa520dc-0689-487e-95f4-672e48970004_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!s200!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa520dc-0689-487e-95f4-672e48970004_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ffa520dc-0689-487e-95f4-672e48970004_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!s200!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa520dc-0689-487e-95f4-672e48970004_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!s200!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa520dc-0689-487e-95f4-672e48970004_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!s200!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa520dc-0689-487e-95f4-672e48970004_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!s200!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa520dc-0689-487e-95f4-672e48970004_1536x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>&#9878;&#65039; Where NIMs Fall Short&#8212;and What Jozu Solves Instead</strong></h2><p>To be fair &#8212; if you&#8217;re a product team at an enterprise shipping a known, stable model behind an API, NIMs might just work.</p><p>They&#8217;re great for:</p><ul><li><p>Use cases that <strong>only run on NVIDIA GPUs</strong></p></li><li><p>Scenarios with <strong>a few approved models</strong> reused broadly</p></li><li><p>Teams that prioritize convenience over lifecycle governance, customization, or traceability</p></li></ul><p>We&#8217;re not here to replace NIMs for those teams.</p><p>But if you're asking:</p><ul><li><p>How do I track where every model came from?</p></li><li><p>How do I promote a fine-tuned adapter without repacking a container?</p></li><li><p>How do I plug models into <strong>Kubernetes-native CI/CD?</strong></p></li></ul><p>Then you&#8217;re thinking the same way we are.</p><h2><strong>&#128274; The Bigger Picture: Secure ModelOps</strong></h2><p>Model security isn&#8217;t just about scanning containers anymore. It&#8217;s about:</p><ul><li><p><strong>Provenance</strong>: Where did this model come from? Who trained it?</p></li><li><p><strong>Reproducibility</strong>: Can I build it again, exactly?</p></li><li><p><strong>Attestation</strong>: Can I prove no one tampered with it?</p></li></ul><p>That&#8217;s what RICs and ModelKits are built for &#8212; and where we think the industry is headed.</p><h2><strong>&#9989; Want to Try It?</strong></h2><p>Jozu&#8217;s CLI (<code>kit</code>) is open source. You can:</p><ul><li><p>Package your own models as ModelKits</p></li><li><p>Use RIC-compatible base images</p></li><li><p>Deploy via Kubernetes and GitOps</p></li></ul><p>We&#8217;d love feedback &#8212; especially if you&#8217;ve used NIMs and hit their limits.</p><p>NVIDIA NIMs and Jozu RICs are both trying to solve a hard problem: <strong>how to bring models to production</strong> without chaos.</p><p>If you're looking for a simplified start with NVIDIA&#8217;s ecosystem, NIMs offer a convenient starting point &#8212; but with trade-offs in flexibility and control.</p><p>If you want <strong>lifecycle-aware, security-conscious, DevOps-aligned model delivery</strong>, Jozu RICs might be the alternative you didn&#8217;t know you needed.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.gorkem-ercan.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">&#128260; Models change. Pipelines drift. Stay updated.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Why Model Packaging Isn’t Enough]]></title><description><![CDATA[Docker&#8217;s recent release of Docker Model Runner sends a clear signal: AI developers want to package models like they package code.]]></description><link>https://www.gorkem-ercan.com/p/why-model-packaging-isnt-enough</link><guid isPermaLink="false">https://www.gorkem-ercan.com/p/why-model-packaging-isnt-enough</guid><dc:creator><![CDATA[Gorkem Ercan]]></dc:creator><pubDate>Fri, 04 Jul 2025 13:51:27 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ac5c6afd-b640-436a-a43a-b3e1c0512292_300x300.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Docker&#8217;s recent release of <a href="https://www.docker.com/blog/oci-artifacts-for-ai-model-packaging/">Docker Model Runner</a> sends a clear signal: AI developers want to package models like they package code. But Docker&#8217;s approach&#8212;like much of its tools is built for local development, not for the distributed, iterative, production-grade workflows that AI demands.</p><p>This isn&#8217;t a knock on Docker. It&#8217;s a recognition of its scope. If your goal is to run a model on your laptop or share it with a teammate, Model Runner might suffice. But if you're serious about advancing models through development, staging, and production pipelines, you need something much more robust.</p><h3><strong>Where Docker Model Runner Falls Short in AI Workflows</strong></h3><p>Docker containers are excellent for application-level reproducibility. But AI models are not applications&#8212;they&#8217;re evolving systems that require:</p><ul><li><p><strong>Datasets, training configurations, and preprocessing logic</strong></p></li><li><p><strong>Dependencies tied to specific frameworks and hardware</strong></p></li><li><p><strong>Lifecycle management: versioning, governance, model evaluation, rollback</strong></p></li><li><p><strong>Operational needs: GPU scheduling, autoscaling, routing, monitoring</strong></p></li></ul><p>Docker&#8217;s Model Runner abstracts only the model weights, enough to get started, but insufficient for production use.</p><h3><strong>ModelKits: Purpose-Built for AI</strong></h3><p><a href="https://kitops.org">KitOps</a> introduces <strong>ModelKits</strong>: immutable, composable packages that include not just model weights, but <em>everything</em> needed to reproduce and operate that model across environments.</p><p>Each ModelKit includes:</p><ul><li><p>Model binaries</p></li><li><p>Training and inference code</p></li><li><p>Configuration files</p></li><li><p>Datasets</p></li><li><p>Evaluation results</p></li></ul><p>This is more than packaging&#8212;it&#8217;s <strong>reproducibility and lifecycle control, baked into the artifact</strong>.</p><h3><strong>What ModelKits Add to the Picture</strong></h3><p>Docker&#8217;s Model Runner is a helpful starting point&#8212;a general-purpose tool now being applied to the evolving domain of AI models. It&#8217;s designed for:</p><ul><li><p>Local usage</p></li><li><p>Simplified packaging</p></li><li><p>Ad-hoc inference serving</p></li></ul><p>ModelKits are designed for:</p><ul><li><p>Full ML lifecycle reproducibility</p></li><li><p>Multi-stage workflows and pipelines</p></li><li><p>Collaboration across research, infra, and product teams</p></li><li><p>Seamless transitions across dev, staging, and production</p></li><li><p>KitOps supports local-first workflows too. With <code>kit dev</code>, you can spin up an inference server</p></li></ul><p>When paired with a registry and KitOps tooling, ModelKits integrate natively with CI/CD pipelines, distributed inference runtimes, and governance platforms.</p><h3><strong>Shipping AI Products? Choose the Right Foundation</strong></h3><p>If you're solo, prototyping, and just need a quick way to serve a model&#8212;Docker&#8217;s Model Runner will work.</p><p>But if you&#8217;re running real experiments, versioning datasets, collaborating with others, deploying across environments, or managing audit trails&#8212;you need something built for the job.</p><p>You need KitOps.</p><p>You need ModelKits.</p><p>Because packaging the model is just the beginning.</p><p>What happens after is where real AI engineering begins.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.gorkem-ercan.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Enjoyed this post? Subscribe for more insights on modern AI and ML workflows, cloud native AI, and secure deployment pipeline</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[From Dev to Deploy: Why We Package AI/ML Artifacts with OCI, Not Git]]></title><description><![CDATA[The shift from Git-based workflows to OCI artifacts isn't just a tooling change&#8212;it's a fundamental rethinking of how we manage AI/ML assets in production.]]></description><link>https://www.gorkem-ercan.com/p/from-dev-to-deploy-why-we-package</link><guid isPermaLink="false">https://www.gorkem-ercan.com/p/from-dev-to-deploy-why-we-package</guid><dc:creator><![CDATA[Gorkem Ercan]]></dc:creator><pubDate>Tue, 24 Jun 2025 14:59:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!J4j8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F098b40d4-1711-4a2a-9b10-2c361b655efa_1648x754.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In recent releases, both <strong>FluxCD</strong> and <strong>ArgoCD</strong>&#8212;two of the most widely used continuous deployment tools&#8212;have added support for deploying from <strong>OCI artifacts</strong>. At first glance, this might seem like a minor addition. But it signals something deeper: the growing recognition that <strong>development</strong> and <strong>deployment</strong> are fundamentally different phases of the lifecycle. And because of the inherent uncertainty and mutability of AI/ML artifacts, this separation is even more critical in AI systems.</p><p>Let&#8217;s unpack that.</p><h2><strong>&#128736;&#65039; Git Is Great for Development</strong></h2><p>Tools like <strong>DVC</strong>, <strong>Hugging Face Hub</strong>, and <strong>Git LFS</strong> are excellent for development workflows. They&#8217;re optimized for:</p><ul><li><p>Rapid experimentation</p></li><li><p>Versioning models alongside code</p></li><li><p>Collaborative iteration between data scientists</p></li></ul><p>These tools assume a development mindset: mutable history, active collaboration, and quick rollback. That&#8217;s perfect when you're training, tuning, and testing&#8212;but it starts to fall apart when you're preparing for production.</p><h2><strong>&#128679; Git Breaks Down at Deployment</strong></h2><p>Once you're ready to serve models in production, your requirements change:</p><ul><li><p>You need <strong>immutability</strong>, not editable branches</p></li><li><p>You need to <strong>promote</strong> the exact same artifact across dev, staging, and prod</p></li><li><p>You care about <strong>provenance</strong>, <strong>signing</strong>, and <strong>attestations</strong></p></li><li><p>Your CI/CD system must treat models and datasets as <strong>first-class deployable units</strong></p></li></ul><p>Git wasn&#8217;t built for this. Teams often end up with brittle workflows: custom scripts, out-of-band state management, and inconsistencies that are hard to debug.</p><h2><strong>&#9989; OCI Artifacts Are Built for Deployment</strong></h2><p>Enter <strong>OCI artifacts</strong>&#8212;the same standard used to ship Docker containers. But OCI is broader than that. It&#8217;s a general-purpose packaging format that supports any binary blob, including model checkpoints, datasets, and structured metadata.</p><p><strong>KitOps</strong> leverages OCI to package <strong>ModelKits</strong>: versioned, self-contained AI/ML artifacts with metadata, optional attestations, and digital signatures. This brings deployment maturity to model management:</p><ul><li><p><strong>Immutable</strong> by digest</p></li><li><p><strong>Promotable</strong> via tag and digest separation</p></li><li><p><strong>Verifiable</strong> using Cosign, Notation, or Sigstore</p></li><li><p><strong>Integrates with policy engines</strong> like Kyverno and Gatekeeper</p></li></ul><p>These aren&#8217;t theoretical advantages. OCI artifacts are hardened, production-grade units. With KitOps, those same principles apply to models and data pipelines.</p><h2><strong>&#129513; Where Git Ends and KitOps Begins</strong></h2><p>Here&#8217;s how responsibilities divide across the ML lifecycle:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!J4j8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F098b40d4-1711-4a2a-9b10-2c361b655efa_1648x754.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!J4j8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F098b40d4-1711-4a2a-9b10-2c361b655efa_1648x754.png 424w, https://substackcdn.com/image/fetch/$s_!J4j8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F098b40d4-1711-4a2a-9b10-2c361b655efa_1648x754.png 848w, https://substackcdn.com/image/fetch/$s_!J4j8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F098b40d4-1711-4a2a-9b10-2c361b655efa_1648x754.png 1272w, https://substackcdn.com/image/fetch/$s_!J4j8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F098b40d4-1711-4a2a-9b10-2c361b655efa_1648x754.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!J4j8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F098b40d4-1711-4a2a-9b10-2c361b655efa_1648x754.png" width="622" height="284.5137362637363" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/098b40d4-1711-4a2a-9b10-2c361b655efa_1648x754.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:666,&quot;width&quot;:1456,&quot;resizeWidth&quot;:622,&quot;bytes&quot;:103447,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.gorkem-ercan.com/i/166728836?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F098b40d4-1711-4a2a-9b10-2c361b655efa_1648x754.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!J4j8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F098b40d4-1711-4a2a-9b10-2c361b655efa_1648x754.png 424w, https://substackcdn.com/image/fetch/$s_!J4j8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F098b40d4-1711-4a2a-9b10-2c361b655efa_1648x754.png 848w, https://substackcdn.com/image/fetch/$s_!J4j8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F098b40d4-1711-4a2a-9b10-2c361b655efa_1648x754.png 1272w, https://substackcdn.com/image/fetch/$s_!J4j8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F098b40d4-1711-4a2a-9b10-2c361b655efa_1648x754.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Some teams attempt to stretch Git + DVC all the way to production, but that often involves fragile CI logic, lockfile gymnastics, and deep institutional knowledge. OCI-native workflows avoid these traps by building on standard, cloud-native patterns.</p><p>This isn&#8217;t just a packaging debate&#8212;it&#8217;s about <strong>ecosystem fit</strong>. OCI artifacts integrate seamlessly into Kubernetes-centric environments. They can be signed, scanned, validated, and promoted using the same pipelines and tooling already adopted by DevOps and platform teams.</p><h2><strong>&#129504; Final Thought</strong></h2><p>If you're deploying models by cloning Git repositories and running bash scripts, you're using dev tools to solve a deployment problem. That might work&#8212;until it doesn't.</p><p>Infrastructure teams already use OCI to ship software. KitOps brings that same discipline to AI/ML. With OCI-based ModelKits, you're not just deploying models&#8212;you're treating them like the production software they are.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.gorkem-ercan.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Enjoyed this post? Subscribe for more insights on modern AI and ML workflows, cloud native AI, and secure deployment pipelines</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Secure Supply Chain with ModelKits Explained]]></title><description><![CDATA[This article is a guide on establishing a secure software supply chain using ModelKits. It is aimed at technical practitioners in AI/ML deployment pipelines who require effective methods for ensuring the authenticity and integrity of software artifacts. The document outlines the roles of attestations, provenance, and immutability in building a trusted pipeline and discusses best practices, compliance considerations, and emerging trends.]]></description><link>https://www.gorkem-ercan.com/p/secure-supply-chain-with-modelkits</link><guid isPermaLink="false">https://www.gorkem-ercan.com/p/secure-supply-chain-with-modelkits</guid><dc:creator><![CDATA[Gorkem Ercan]]></dc:creator><pubDate>Thu, 03 Apr 2025 15:31:27 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/f9f4eeeb-4eb9-466e-baa8-93f937d203ce_510x510.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This article is a guide on establishing a secure software supply chain using <a href="https://kitops.org/">ModelKits</a>. It is aimed at technical practitioners in AI/ML deployment pipelines who require effective methods for ensuring the authenticity and integrity of software artifacts. The document outlines the roles of attestations, provenance, and immutability in building a trusted pipeline and discusses best practices, compliance considerations, and emerging trends.</p><h2>The Genesis: Attestations, Provenance, and Immutability</h2><h3>What Are Attestations?</h3><p>An attestation is a verifiable piece of metadata that certifies specific properties or events related to an AI/ML artifact. This can include information about how the model was built, which datasets were used, how the dataset was collected, or simply the source.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.gorkem-ercan.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Software Maker! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Attestations help establish trust by providing a record of the processes and checks that the AI/ML artifacts have undergone. They offer multiple benefits:</p><ul><li><p><strong>Enhanced Security:</strong> Attestations help ensure that artifacts haven&#8217;t been tampered with and that they originate from a trusted source.</p></li><li><p><strong>Auditability:</strong> They provide a clear, verifiable record of an artifact&#8217;s history, which is valuable for auditing and forensic investigations.</p></li><li><p><strong>Compliance:</strong> In regulated industries, attestations can serve as evidence that an artifact meets required standards and policies.</p></li><li><p><strong>Operational Confidence:</strong> By verifying attestations before deployment, organizations can have greater confidence that only approved and vetted artifacts are running in production.</p></li></ul><h3>What Is Provenance?</h3><p>Provenance refers to the comprehensive record of an artifact&#8217;s origin, history, and the processes it has undergone from its creation to its current state. In the context of AI/ML artifacts (or other software artifacts), provenance may include details such as the origin of the model (for example, a hash or URL), the training process including the datasets used, lifecycle events such as validations and security checks, and the chain of custody.</p><h3>The Relationship of Attestations and Provenance</h3><p>Attestations and provenance are closely related, yet they serve distinct purposes within a secure supply chain. Provenance acts as a detailed record of the artifact&#8217;s lifecycle, capturing every significant step, transformation, or interaction that the artifact experiences. It provides a complete historical record, while attestations serve as formal, verifiable assertions about the artifact&#8217;s state or properties at a specific point in time. An attestation might assert that the artifact meets certain criteria or has passed specific tests.</p><h4>Common Secure Supply Chains Scenarios</h4><ul><li><p><strong>Rapid Verification:</strong> In many automated environments, verifying a signed attestation is quicker than reconstructing the entire provenance.</p></li><li><p><strong>In-Depth Auditing:</strong> If a potential security issue arises, the provenance data can be reviewed in depth to understand the artifact&#8217;s full history.</p></li><li><p><strong>Regulatory Compliance:</strong> Some standards require both a summary assertion (attestation) and a detailed audit trail (provenance) to meet strict compliance requirements.</p></li></ul><h3>What Is Immutability?</h3><p>Immutability refers to the property of an artifact or data structure that prevents it from being changed after its creation. Immutability plays a crucial role in the effectiveness and trustworthiness of attestations and provenance.</p><ol><li><p><strong>Consistency Between Attestation and Artifact</strong></p><p>When an artifact is immutable, it guarantees that the conditions and properties described in the attestation (such as build parameters, security scans, or provenance details) remain accurate over time. Since the content is fixed, a verifier can confidently check that a digest or hash matches the one recorded in the attestation. Any deviation indicates tampering or an inconsistency, leading to a clear rejection of the artifact.</p></li><li><p><strong>Enhanced Security Posture</strong></p><p>In a secure supply chain, immutability combined with a signed attestation creates a robust chain-of-custody. Each artifact remains exactly as it was when it passed through each stage of the pipeline, reducing the risk of undetected modifications.</p></li><li><p><strong>Simplified Compliance and Audit Processes</strong></p><p>Immutable artifacts, paired with their corresponding attestations, provide a consistent and verifiable audit trail. Auditors can rely on the fact that the artifact's properties haven&#8217;t changed since the attestation was issued. Many regulatory frameworks require strict traceability and non-repudiation of changes.</p></li><li><p><strong>Operational Stability</strong></p><p>Immutability ensures that only approved and vetted artifacts are running in production. If an issue arises, the assurance that the artifact is immutable allows operators to roll back to a previous, known-good state without worrying about hidden modifications.</p></li></ol><h2>How It All Works for ModelKits</h2><h3>Generation</h3><p>In an AI/ML pipeline&#8212;whether during training, fine-tuning, or data extraction&#8212; the first step for secure packaging is creating a ModelKit. As the ModelKit is generated, an accompanying attestation can be produced that captures essential metadata.</p><p>The attestation metadata might include details such as the build environment, the results of scans, or the outcome of compliance tests. This attestation is often signed using cryptographic keys, ensuring that it comes from a trusted source and has not been tampered with.</p><h4>How to Create Attestations for ModelKits</h4><ol><li><p><strong>Package Artifacts as a ModelKit and Automate Its Generation.</strong></p><p>Package models, datasets, code, and documentation to create an immutable package and store it on a secure OCI registry.</p><ul><li><p>Tools: Use the <code>kit</code> CLI or <code>pykitops</code> to automate creation of ModelKits on your pipelines.</p></li><li><p>Automate: Include this step in your AI/ML pipelines so that every artifact that is a candidate for production is a ModelKit.</p></li></ul></li><li><p><strong>Define Essential Metadata</strong></p><p>Determine which details are critical for your attestation. Common metadata elements include:</p><ul><li><p>Build Environment: Information about the operating system, tools, and configuration used during the build.</p></li><li><p>Security and Compliance Checks: Results from vulnerability scans, static analysis, or other compliance tests.</p></li><li><p>Pipeline Steps: A record of the build and test stages executed.</p></li><li><p>Timestamps and Identifiers: The build date/time and unique identifiers (e.g., a hash or version tag) for the ModelKit.</p></li></ul></li><li><p><strong>Automate Attestation Generation</strong></p><p>Incorporate attestation creation into your pipeline by automating the process:</p><ul><li><p>Scripting and Tools: Use scripts or dedicated tools to automatically collect and format the metadata. (for example, output the data in JSON or YAML).</p></li><li><p>Integration: Embed this step within your existing CI/CD workflow (using systems like Jenkins, GitLab CI, or GitHub Actions) so that every build triggers an attestation generation.</p></li></ul></li><li><p><strong>Sign the Attestation</strong></p><p>To ensure that the attestation is both authentic and tamper-evident:</p><ul><li><p>Digital Signing: Use cryptographic keys to sign the attestation. This confirms that it was produced by a trusted source.</p></li><li><p>Key Management: Securely manage your private keys&#8212;tools like Cosign can help streamline signing and verification processes.</p></li></ul></li></ol><h3>Storage and Association</h3><p>The generated attestation is then associated with the ModelKit. This can be done by storing it in an OCI registry alongside the ModelKit or in an external attestation store. Tools and standards such as Cosign or Notary can be used to facilitate this association.</p><h3>Verification</h3><p>Before deploying a ModelKit, systems (like a Kubernetes admission controller or a CI/CD pipeline) can verify the attestation. Verification ensures that the ModelKit was built under the expected conditions, and that the metadata hasn&#8217;t been altered. It checks the digital signature against a trusted key. If the attestation is valid, it can be trusted to meet the security and compliance requirements. If not, the deployment can be halted or flagged for further review.</p><h4>How to Create, Sign, Store, and Verify a Simple Attestation Using Cosign</h4><p>These instructions assume that you have just created a ModelKit, tagged it with <code>jozu.ml/myorg/mymodel:latest</code>, and pushed it to the OCI registry.</p><p><strong>Generate a Key Pair with Cosign</strong><br>Cosign makes it easy to generate a key pair. This command creates two files: a private key (<code>cosign.key</code>) and a public key (<code>cosign.pub</code>).</p><pre><code><code>cosign generate-key-pair
# Consider storing keys in a secure location or HSM and set up key rotation policies.</code></code></pre><p><strong>Generate Attestation</strong><br>Create an attestation file containing metadata about your ModelKit. For example:</p><pre><code><code>ARTIFACT_ID="mymodel-123abc"
BUILD_ENV=$(uname -a)
TRAINING_PARAMS="learning_rate=0.01, epochs=50"
TIMESTAMP=$(date)

cat &lt;&lt;EOF &gt; attestation.json
{
    "artifact_id": "$ARTIFACT_ID",
    "build_environment": "$BUILD_ENV",
    "training_parameters": "$TRAINING_PARAMS",
    "timestamp": "$TIMESTAMP"
}
EOF</code></code></pre><p>This script generates an <code>attestation.json</code> file containing some example metadata. It is recommended to use a well known attestation format in real-world cases.</p><p><strong>Sign the Attestation and Attach It to Your ModelKit</strong></p><pre><code><code>cosign attest --key cosign.key --predicate attestation.json --registry-username=&lt;registry_user&gt; --registry-password=&lt;registry_pass&gt; jozu.ml/myorg/mymodel:latest</code></code></pre><p><strong>Verify the Attestation</strong><br>To confirm that your attestation has been correctly signed and stored, use the verification command</p><pre><code><code>cosign verify-attestation --key cosign.pub jozu.ml/myorg/mymodel:latest</code></code></pre><p>This command retrieves the attestation from the OCI registry, verifies its digital signature using the public key, and displays the attestation details if the verification is successful</p><h3>Standards and Formats for Attestations</h3><p>A critical element of a secure supply chain (SSC) is the standardization of how attestations are formatted, signed, and verified. By adhering to industry standards, organizations ensure that the metadata accompanying artifacts is both interoperable and verifiable across different systems and tools. Below are some of the most prominent standards and formats used in the SSC landscape:</p><ul><li><p><strong><a href="https://in-toto.io/">in&#8209;toto</a>:</strong> in&#8209;toto is a framework designed to capture the complete supply chain of an artifact. It records every significant step&#8212;from code commit to artifact generation&#8212;in a detailed, cryptographically verifiable manner. The in&#8209;toto format allows for complex workflows to be attested, ensuring that each stage of the build, test, and deployment process is recorded in an immutable log. This depth of detail is invaluable in environments where understanding the full history of an artifact is crucial for trust and compliance.</p></li><li><p><strong><a href="https://github.com/secure-systems-lab/dsse">DSSE</a> (Dead Simple Signing Envelope):</strong> DSSE provides a lightweight, standardized container for signing arbitrary JSON payloads. It is designed to encapsulate attestation data in a manner that is both simple and secure, making it easier to integrate into automated pipelines. DSSE&#8217;s simplicity and focus on digital signature management help maintain the integrity of the attestation, ensuring that any tampering can be quickly detected. Tools like Cosign use DSSE to wrap attestations, providing a consistent method for signing and verifying artifact metadata.</p></li><li><p><strong>OCI Image Attestation Specification:</strong> In environments where artifacts are stored in OCI-compliant registries (e.g., container images), the OCI image attestation specification plays a vital role. This standard allows attestations to be stored alongside artifacts in the registry, linking metadata directly to the artifact via its digest. The format is tailored for containerized environments, ensuring that the provenance, security, and compliance of container images are verifiable before deployment.</p></li></ul><p>Our <a href="#how-to-create-sign-store-and-verify-a-simple-attestation-using-cosign">example</a> has not leveraged the in-toto framework but rather used a simple JSON document to better demonstrate the process. However, by leveraging these standards, organizations can create a robust framework for ensuring that every ModelKit or AI artifact is accompanied by trustworthy attestations. These formats not only facilitate secure signing and verification processes but also enhance interoperability between different tools and platforms, thereby strengthening the overall security and auditability of the software supply chain.</p><h2>Alignment with Regulatory Standards</h2><p>Having explored the core technical mechanisms behind ModelKits&#8212;from generating secure artifacts and signing attestations to ensuring immutable storage&#8212;we now turn our focus to a critical aspect of secure supply chains: regulatory compliance. In today&#8217;s complex security landscape, aligning with frameworks like NIST, ISO, and GDPR is not only beneficial but essential. The following section delves into how ModelKits meet these standards, providing concrete examples and a comparative overview of key compliance features.</p><p>Ensuring regulatory compliance is critical for organizations leveraging ModelKits in their secure supply chain. By aligning with established frameworks such as NIST, ISO, and industry-specific standards, ModelKits not only help protect critical assets but also streamline audit processes and support forensic investigations.</p><ul><li><p><strong><a href="https://csrc.nist.gov/pubs/sp/800/161/r1/upd1/final">NIST SP 800-161</a> (Supply Chain Risk Management):</strong><br>ModelKits incorporate cryptographic signatures and immutable logs to ensure traceability and non-repudiation. These features support NIST requirements for tracking and verifying the origin and integrity of artifacts. The comprehensive provenance data maintained throughout the pipeline also aids in risk assessment and incident response.</p></li><li><p><strong><a href="https://www.iso.org/standard/27001">ISO/IEC 27001</a> (Information Security Management):</strong><br>With built-in mechanisms for secure artifact storage, digital signing, and continuous verification, ModelKits support ISO/IEC 27001 objectives by ensuring that only approved, tamper-evident artifacts are deployed. The structured metadata and audit trails facilitate regular security assessments and help demonstrate compliance during certification audits.</p></li><li><p><strong><a href="https://gdpr-info.eu/">GDPR</a> (General Data Protection Regulation):</strong><br>Although GDPR primarily focuses on data privacy, ModelKits can play a role in ensuring that data handling processes are auditable and that any data transformations or access events in the AI/ML pipelines are properly logged. This helps organizations enforce data protection policies and manage consent-related requirements.</p></li><li><p><strong>Industry-Specific Regulations:</strong><br>For sectors such as finance, healthcare, or critical infrastructure, ModelKits can be tailored to capture compliance-specific metadata (e.g., financial audit trails or patient data access logs), thus meeting stricter regulatory requirements.</p></li></ul><p>By integrating compliance considerations into every stage&#8212;from artifact generation to verification&#8212;ModelKits provide a solution for organizations looking to meet diverse regulatory requirements. The use of standardized attestations and immutable storage not only fortifies the security of the software supply chain but also offers clear, verifiable audit trails that are essential for compliance with NIST, ISO/IEC 27001, GDPR, and other regulatory frameworks.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.gorkem-ercan.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Software Maker! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Securing MCP: Applying Lessons Learned from the Language Server Protocol]]></title><description><![CDATA[Given my experience with LSP, I&#8217;m enthusiastic about the growing interest in the Model Context Protocol (MCP). However, I am concerned that the valuable lessons learned from LSP are not being effectively applied to MCP.]]></description><link>https://www.gorkem-ercan.com/p/securing-mcp-applying-lessons-learned</link><guid isPermaLink="false">https://www.gorkem-ercan.com/p/securing-mcp-applying-lessons-learned</guid><dc:creator><![CDATA[Gorkem Ercan]]></dc:creator><pubDate>Fri, 28 Mar 2025 13:31:47 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/785116db-d978-4838-899e-b6dd1203a368_320x320.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I was deeply involved with the Language Server Protocol (<a href="https://microsoft.github.io/language-server-protocol/">LSP</a>) from its earliest days at Red Hat, one of the instrumental organizations in driving LSP adoption. During that time, I contributed to several key implementations, including the second-ever language server&#8212;the <a href="https://github.com/eclipse-jdtls/eclipse.jdt.ls">Java Language Server</a>&#8212;and the widely adopted <a href="https://github.com/redhat-developer/yaml-language-server">YAML Language Server</a>. These projects became benchmarks for reliability and widespread adoption in developer communities.</p><p><strong>Why MCP Matters</strong></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.gorkem-ercan.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Software Maker! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Given my experience with LSP, I&#8217;m enthusiastic about the growing interest in the Model Context Protocol (<a href="https://modelcontextprotocol.io/">MCP</a>). However, I am concerned that the valuable lessons learned from LSP are not being effectively applied to MCP.</p><p>When LSP emerged, it transformed programming language tooling. Specifically, it allowed language experts to implement sophisticated, language-specific intelligence consistently across different IDEs and editors. LSP created an abstraction enabling the same compiler development teams to directly support any IDE or editor.</p><p>MCP provides an analogous abstraction between AI tools and agents and their computing environments. However, the type of abstraction provided by LSP&#8212;deep, specialized programming language expertise&#8212;is significantly more complex to integrate and replicate compared to the API interactions primarily targeted by MCP. This difference currently makes MCP&#8217;s value proposition lower than that of LSP, which raises ongoing questions about whether MCP provides substantial value beyond existing APIs.</p><p><strong>Critical Risks with Current MCP Implementations</strong></p><p>Unfortunately, MCP carries forward several critical shortcomings that were also issues with LSP. One significant oversight with LSP was the lack of standardized packaging. Visual Studio Code&#8212;the hero product driving LSP adoption&#8212;provided its own method for packaging extensions, but this approach was not easily transferable to other platforms. The absence of standardized, secure packaging made LSP implementations vulnerable to supply chain attacks. Even VS Code&#8217;s extension packaging was not originally designed with supply chain security in mind, proving <a href="https://www.techradar.com/pro/security/vscode-extensions-pulled-over-security-risks-but-millions-of-users-have-already-installed">vulnerable</a> at times.</p><p>The risk is even greater with MCP due to its broader potential access and integration to critical systems. Organizations face significant security risks if they adopt MCP directly from third-party sources without a robust packaging solution that includes secure attestations and digital signatures.</p><p>Additionally, LSP is defined to operate on single-user desktop environments without built-in multi-tenancy, a feature that simplifies implementation, but limits use in cloud environments. This lack of multi-tenancy poses a much larger challenge for MCP, as MCP implementations are more likely to run in multi-tenant environments requiring robust authentication and authorization.</p><p>Without addressing these critical issues related to packaging, secure supply chains, multi-tenancy, authentication, and authorization, the overall value and viability of MCP will continue to be questioned.</p><p>At <a href="https://jozu.com/">Jozu</a>, we are uniquely positioned to address these critical MCP adoption challenges. With extensive experience gained from pioneering work on LSP and our development of <a href="https://kitops.org/">KitOps</a>&#8212;a proven open-source solution trusted by enterprises for securely packaging and deploying AI/ML workloads&#8212;we are prepared to solve MCP&#8217;s most pressing security and packaging issues. Partnering with us will help your organization significantly reduce exposure to supply chain risks while accelerating secure MCP adoption.</p><p><strong>Your Opportunity: Become a Design Partner</strong></p><p>We&#8217;re currently seeking a limited number of design partners to join us in shaping the future of MCP. As a design partner, you&#8217;ll gain exclusive access to our solution, have direct influence on product direction, and receive expert guidance on securely implementing MCP in your organization.</p><p>Spots are limited&#8212;<a href="mailto:gorkeml@jozu.com?subject=Interested%20in%20Becoming%20a%20Design%20Partner%20for%20MCP">contact</a> today to secure your position.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.gorkem-ercan.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Software Maker! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The KitOps Methodology]]></title><description><![CDATA[In the ever-evolving world of AI and machine learning, the path from model conception to deployment is full of challenges.]]></description><link>https://www.gorkem-ercan.com/p/the-kitops-methodology</link><guid isPermaLink="false">https://www.gorkem-ercan.com/p/the-kitops-methodology</guid><dc:creator><![CDATA[Gorkem Ercan]]></dc:creator><pubDate>Wed, 05 Mar 2025 16:03:24 GMT</pubDate><content:encoded><![CDATA[<p>In the ever-evolving world of AI and machine learning, the path from model conception to deployment is full of challenges. The <a href="https://kitops.org/">KitOps</a> methodology is designed to guide teams through this complex journey with a focus on security, reproducibility, and transparency. The KitOps methodology streamlines the entire AI lifecycle by offering a unified, OCI-compliant framework that bridges the gap between development, packaging, and deployment. This approach not only simplifies collaboration but also empowers teams to innovate without sacrificing clarity or security. KitOps creates an environment where data scientist, a DevOps engineer, or an application developer, KitOps helps bridge the gap between model creation, versioning, and operationalization, all while maintaining transparency, security, and modularity.</p><h2><strong>Core Principles</strong></h2><h3><strong>Secure, Immutable Versioning and Provenance</strong></h3><p>At the heart of KitOps is the idea to secure and immutable versioning. Each model version is encapsulated as a single, immutable entity that includes code, data, documentation, and configurations as a single, immutable entity. This guarantees:</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.gorkem-ercan.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Software Maker! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><ul><li><p><strong>Consistency:</strong> Every component of a given model version is stored together, ensuring full reproducibility.</p></li><li><p><strong>Traceability:</strong> Comprehensive attestations and provenance details make it easy to track changes and verify the authenticity of each model version.</p></li><li><p><strong>Integrity and Accountability:</strong> Immutability prevents unauthorized modifications and supports compliance with DevSecOps best practices.</p></li></ul><h3><strong>Separation of Concerns</strong></h3><p>KitOps advocates for a clear separation between model artifacts and infrastructure dependencies. This principle helps teams maintain:</p><ul><li><p><strong>Modularity:</strong> Models remain independent units, which simplifies updates and reducing the risk of conflicts.</p></li><li><p><strong>Simplicity:</strong> Teams can focus on improving models without being entangled in infrastructure-level complexities.</p></li><li><p><strong>Enhanced Maintenance:</strong> Updating models and infrastructure independently prevents unintended breakage and simplifies long-term maintenance.</p></li></ul><h2><strong>Key Components</strong></h2><h3><strong>ModelKit</strong></h3><p><strong>ModelKit</strong> is an OCI-compliant packaging format that contains all the essential artifacts of the AI/ML model lifecycle. This includes:</p><ul><li><p><strong>Datasets:</strong> Comprehensive collections of training, validation, and test data.</p></li><li><p><strong>Code:</strong> All logic required for model training, inference, and deployment.</p></li><li><p><strong>Configurations:</strong> Environment variables, hyperparameters, and deployment settings.</p></li><li><p><strong>Documents:</strong> Detailed records and guides related to the model.</p></li><li><p><strong>Model Artifacts:</strong> Serialized model weights and associated metadata.</p></li></ul><p>This standardized packaging ensures that models can be easily shared, audited, and redeployed, fostering a collaborative and transparent workflow.</p><h3><strong>OCI Registry</strong></h3><p>An <strong>OCI Registry</strong>, compatible with <a href="https://opencontainers.org/">Open Container Initiative</a> standards, serves as a centralized repository for storing and distributing OCI artifacts like ModelKits and container images. Its benefits include:</p><ul><li><p><strong>Standardization:</strong> Consistent management and access to model artifacts.</p></li><li><p><strong>Integration:</strong> Direct compatibility with common CI/CD, MLOps, and DevOps tools.</p></li><li><p><strong>Security:</strong> Hardened storage and secure artifact transmission, enhancing overall supply chain integrity.</p></li></ul><h3><strong>Kitfile</strong></h3><p>The <strong>Kitfile</strong> is a YAML-based configuration file that precisely defines the contents of a ModelKit. With a Kitfile, teams can ensure:</p><ul><li><p><strong>Repeatability:</strong> Consistent model packages across different environments and teams.</p></li><li><p><strong>Governance:</strong> A clear and auditable record of the artifacts included in each ModelKit.</p></li><li><p><strong>Simplicity:</strong> One central place to specify datasets, code, configurations, and documentation artifacts.</p></li></ul><h3><strong>Kit CLI and PyKitOps</strong></h3><p>The <strong>Kit CLI</strong> and the <strong><a href="https://github.com/jozu-ai/pykitops">Pykitops</a></strong> library are powerful tools that enables users to create, manage, run, and deploy ModelKits. Whether you are packaging a new model for development or deploying an existing model into production, these tools simplify your workflow and accelerate your innovation cycle.</p><h2><strong>How it works?</strong></h2><ol><li><p><strong>Create or Generate a Kitfile:</strong><br>Begin by specifying which documents, code, datasets, configurations, and serialized model weights should be included. Early stages might focus on datasets and code, while production-ready models include comprehensive elements such as weights, validation data, API code, and even infrastructure-as-code recipes like Terraform scripts.</p></li><li><p><strong>Package the ModelKit:</strong><br>Use the command <code>kit pack</code> to bundle your Kitfile into a ModelKit. This package acts as a single source of truth, simplifying collaboration, auditing, and distribution among stakeholders.</p></li><li><p><strong>Push to a Registry:</strong><br>Push your ModelKit to an OCI-compatible registry (e.g., <a href="https://jozu.ml/">Jozu Hub</a>) to store, manage, and share it securely. This ensures that your team&#8212;across various regions and environments&#8212;has consistent and secure access to the model artifacts.</p></li><li><p><strong>Use Automated Processing:</strong><br>Leverage automation to handle the ModelKit for various tasks such as deployment, training, evaluation, or integration into downstream applications. Automated pipelines ensure consistency and rapid iteration, allowing teams to quickly adapt models to evolving requirements.</p></li></ol><h2><strong>Benefits of the KitOps Methodology</strong></h2><ul><li><p><strong>Efficiency:</strong> Streamlined management of artifacts and distribution processes reduces friction and accelerates innovation</p></li><li><p><strong>Security and Compliance:</strong> Strong governance, auditing, and immutability measures ensure that every change is traceable and compliant with industry standards.</p></li><li><p><strong>Scalability:</strong> As models, datasets, and related resources expand, KitOps scales gracefully, maintaining uniform standards and practices.</p></li></ul><h2><strong>Conclusion</strong></h2><p>The KitOps methodology represents a modern, secure, and reliable approach to managing AI/ML assets. By pairing well-defined artifacts with standardized tooling&#8212;supported by OCI registries and the Kit CLI&#8212;teams can confidently develop, test, share, and deploy models. In an era where rapid iteration and continuous improvement are key, KitOps not only enhances technical efficiency but also nurtures a culture of innovation and accountability.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.gorkem-ercan.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Software Maker! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The Expected Cooling of the Generative AI Hype]]></title><description><![CDATA[Environmental changes have always been catalysts for evolutionary shifts.]]></description><link>https://www.gorkem-ercan.com/p/the-expected-cooling-of-the-generative</link><guid isPermaLink="false">https://www.gorkem-ercan.com/p/the-expected-cooling-of-the-generative</guid><dc:creator><![CDATA[Gorkem Ercan]]></dc:creator><pubDate>Sun, 18 Aug 2024 15:24:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-fcM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea45dd1-b32e-4929-8070-705cb2688efb_1024x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-fcM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea45dd1-b32e-4929-8070-705cb2688efb_1024x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-fcM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea45dd1-b32e-4929-8070-705cb2688efb_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!-fcM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea45dd1-b32e-4929-8070-705cb2688efb_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!-fcM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea45dd1-b32e-4929-8070-705cb2688efb_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!-fcM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea45dd1-b32e-4929-8070-705cb2688efb_1024x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-fcM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea45dd1-b32e-4929-8070-705cb2688efb_1024x1024.webp" width="394" height="394" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3ea45dd1-b32e-4929-8070-705cb2688efb_1024x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:394,&quot;bytes&quot;:611046,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-fcM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea45dd1-b32e-4929-8070-705cb2688efb_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!-fcM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea45dd1-b32e-4929-8070-705cb2688efb_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!-fcM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea45dd1-b32e-4929-8070-705cb2688efb_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!-fcM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea45dd1-b32e-4929-8070-705cb2688efb_1024x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Environmental changes have always been catalysts for evolutionary shifts. The rise of Large Language Models (LLMs) like ChatGPT has ignited the birth of a new technological ecosystem. But, as with any seismic change, the initial response is often wildly exaggerated, driven by those who don't fully grasp the nuances&#8212;a phenomenon we now dub the *AI Hype*. For those of us who've seen such waves before, it was clear from the start: this was a hype cycle, and like all hype cycles, it had to run its course. Now, the signs are undeniable&#8212;<a href="https://pitchbook.com/news/articles/generative-ai-seed-funding-drops">the hype is cooling down</a>. But what's next for AI?</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.gorkem-ercan.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.gorkem-ercan.com/subscribe?"><span>Subscribe now</span></a></p><p>No technology, no matter how revolutionary, can thrive without delivering real value. And here's the truth: we haven&#8217;t yet cracked the code on generating consistent value for enterprises from AI. The next phase of AI's evolution won't be about shiny new algorithms or eye-catching demos; it will be about the nitty-gritty work of building standards, developing techniques, and creating frameworks that enable AI and ML to integrate into the fabric of business seamlessly and safely. We've begun to see <a href="https://www.investopedia.com/4-key-takeaways-from-walmart-earnings-call-8695732">pockets of success</a> and early experiments that hint at the financial benefits AI/ML can offer. But as the hype bubble bursts, there's always a danger that the technology itself will be blamed for the inevitable disappointments&#8212;rather than the non-specialists who inflated expectations to begin with.</p><p>The reality is clear: AI/ML works. It has proven, valuable applications and should not be discarded just because it was overhyped. Now, more than ever, it&#8217;s time to rally behind standards, support open-source initiatives, and back companies that are focused on streamlining the adoption of AI and ML. This is how we accelerate the next phase of AI's evolution, turning what was once hype into sustainable, real-world impact.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.gorkem-ercan.com/p/the-expected-cooling-of-the-generative/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.gorkem-ercan.com/p/the-expected-cooling-of-the-generative/comments"><span>Leave a comment</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[What is a Control Plane for AI/ML?]]></title><description><![CDATA[We are experiencing a new phase of enterprise AI/ML adoption where AI/ML becomes integral to business operations.]]></description><link>https://www.gorkem-ercan.com/p/what-is-a-control-plane-for-aiml</link><guid isPermaLink="false">https://www.gorkem-ercan.com/p/what-is-a-control-plane-for-aiml</guid><dc:creator><![CDATA[Gorkem Ercan]]></dc:creator><pubDate>Sun, 30 Jun 2024 22:35:20 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/704a3c36-2f8a-4a4f-8323-4c2e9b8a412c_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We are experiencing a new phase of enterprise AI/ML adoption where AI/ML becomes integral to business operations. This change brings the urgent need for robust management frameworks. This is where the concept of control planes comes in, providing the necessary infrastructure to manage, monitor, and optimize AI/ML applications effectively.</p><h2><strong>What is a Control Plane?</strong></h2><p>Before we delve into the specifics of a Control Plane for AI/ML, let's define what a control plane is. A control plane is responsible for managing and orchestrating various components within a system. It is distinguished from the data plane, which handles the actual data processing and forwarding tasks. The control plane functions as the &#8220;brain&#8221; of the system, providing instructions, managing configurations, and ensuring that the various components operate cohesively. Examples of control planes include the Kubernetes Control Plane, which manages the lifecycle of containers across a cluster, or in Software-Defined Networking (SDN) where SDN controllers like OpenDaylight, ONOS, and Cisco APIC provide a centralized view of the network.</p><h2><strong>A Control Plane for AI/ML</strong></h2><p>Machine learning workflows are complex, multi-staged, nondeterministic, and continuous, making them prime candidates for huge benefits from control planes. A control plane that orchestrates various stages of the AI/ML lifecycle, including data preprocessing, model training, deployment, monitoring, and maintenance, vastly improves day 1 and day 2 operations for AI/ML applications.</p><h3><strong>Key Components of an AI/ML Control Plane</strong></h3><ol><li><p><strong>Data Pipeline Management:</strong> Ensures smooth data flow from ingestion to processing and storage, managing dependencies and scheduling tasks.</p></li><li><p><strong>Model Training and Deployment:</strong> Coordinates the training of models, manages model repositories, and handles deployment to various environments (e.g., cloud, edge).</p></li><li><p><strong>Resource Allocation and Optimization:</strong> Dynamically assigns computational resources based on workload demands and priorities, optimizing for cost-efficiency and performance.</p></li><li><p><strong>Monitoring and Logging:</strong> Provides real-time insights into the performance and health of models and infrastructure, enabling proactive issue resolution and continuous improvement.</p></li><li><p><strong>Security and Compliance:</strong> Enforces security policies, manages user access, and ensures compliance with data privacy laws and industry standards.</p></li></ol><p>Each of these components can encompass multiple concerns. For instance, resource allocation and optimization can deal with both scaling and cost management, while security and compliance can cover access management and auditing. Furthermore, there can be multiple tools, like MLflow, feature stores, and monitoring solutions present on the data plane for each of these areas that the control plane would have to work with. Therefore, a superior quality for a control plane is its <strong>extensibility</strong> to accommodate different concerns and tools.</p><h2><strong>Why Do You Need One Now?</strong></h2><p>If you do not already have an application control plane, chances are you have been using some ad-hoc scripting with manual monitoring in addition to good DevOps practices such as Infrastructure as Code and CI/CD pipelines. Depending on the size and complexity of your operation, you may already feel the need for a control plane and even be building a custom one slowly. Unfortunately, AI/ML workloads do not bring good news. AI/ML applications come with the following new or magnified issues:</p><ul><li><p><strong>Increased Complexity:</strong> Managing AI/ML workflows is more complex and fragmented, often involving multiple stages leading to potential inconsistencies and errors.</p></li><li><p><strong>Scalability Issues:</strong> Scaling operations to handle larger datasets, more complex model workloads, and high computational demands is challenging.</p></li><li><p><strong>Resource Inefficiency:</strong> Resource underutilization is more costly due to the need for more expensive resources.</p></li><li><p><strong>Monitoring and Logging:</strong> New requirements like detecting model and data drift, interoperability, and explainability of AI models, and increased security and compliance requirements arise.</p></li><li><p><strong>Security and Compliance Risks:</strong> AI and ML applications bring new security and compliance risks such as ethical considerations, transparency and explainability, data privacy and security, and model security.</p></li></ul><p>All these issues are interrelated. Without an extensible platform to manage the complexity, trying to solve these issues will feel like plugging one leak while another pops up.</p><h2><strong>The Time to Act is Now</strong></h2><p>For most enterprises, competitive edge in leveraging AI/ML technologies effectively hinges on the ability to manage and optimize these processes seamlessly. Taking immediate steps to address these challenges will prevent your AI/ML initiatives from becoming mired in inefficiencies and compliance risks. Ensure your enterprise remains competitive by implementing a robust AI/ML control plane now. My team at <a href="https://jozu.com/">Jozu</a> is working on such an extensible platform that can help you and we would like to hear from you.</p><div class="directMessage button" data-attrs="{&quot;userId&quot;:109254376,&quot;userName&quot;:&quot;Gorkem Ercan&quot;,&quot;canDm&quot;:null,&quot;dmUpgradeOptions&quot;:null,&quot;isEditorNode&quot;:true}" data-component-name="DirectMessageToDOM"></div><p></p>]]></content:encoded></item><item><title><![CDATA[The Over-Promise of AI: A Reality Check for Enterprises]]></title><description><![CDATA[We live in a time where the promises of Artificial Intelligence (AI) seem almost boundless.]]></description><link>https://www.gorkem-ercan.com/p/the-over-promise-of-ai-a-reality</link><guid isPermaLink="false">https://www.gorkem-ercan.com/p/the-over-promise-of-ai-a-reality</guid><dc:creator><![CDATA[Gorkem Ercan]]></dc:creator><pubDate>Wed, 22 May 2024 13:53:48 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c7b07b8a-7985-49f4-b7b7-f7b0baca2979_1024x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We live in a time where the promises of Artificial Intelligence (AI) seem almost boundless. It&#8217;s easy to get swept up in the hype&#8212;autonomous cars, virtual assistants, and predictive algorithms that claim to know our desires before we do. But as we stand on this precipice, it&#8217;s critical for enterprises to tread carefully. The truth is, AI, in its current form, is not a silver bullet.</p><p>Enterprises should not be on the hunt for solutions that are solely AI-based. Instead, they should be seeking solutions that are AI-infused. There&#8217;s a subtle but significant difference. Generative AI and advanced machine learning techniques are remarkable, yes, but they are not panaceas. These technologies should be viewed as powerful tools to enhance and integrate within existing systems, rather than standalone solutions that promise instant transformation.</p><p>Infusing AI into business processes can indeed offer substantial benefits&#8212;enhanced efficiency, better decision-making, and improved customer experiences, to name a few. However, the real challenge lies in the integration. It&#8217;s not just about having the latest AI models; it&#8217;s about embedding them into the fabric of enterprise systems in a way that drives tangible business outcomes.</p><p>This is where the industry faces a bottleneck. There&#8217;s a scarcity of professionals who possess a trifecta of expertise: a strong command of AI and machine learning, adept application development skills, and an understanding of business dynamics. Designing AI-infused systems requires a multidisciplinary approach. It&#8217;s not enough to be a master of one domain; the true innovators in business will be those who can bridge the gaps between these critical areas.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.gorkem-ercan.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Software Maker! Subscribe for free to receive new posts</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><p>It might sound paradoxical coming from the CTO of an AI/ML company, but this is precisely why we established our venture <a href="https://jozu.com/">Jozu</a>. Our mission is to demystify and democratize AI/ML for enterprises and application developers. We aim to make it easier for businesses to harness these technologies, not as isolated wonders, but as integral components of their operational infrastructure.</p><p>The journey toward meaningful AI integration is nuanced and complex. But by focusing on AI infusion rather than chasing after standalone AI solutions, enterprises can position themselves to unlock the real value these technologies offer. It&#8217;s a path of incremental enhancements, strategic implementations, integration with current operations and continuous learning&#8212;an approach that promises a more sustainable and impactful transformation.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.gorkem-ercan.com/p/the-over-promise-of-ai-a-reality?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.gorkem-ercan.com/p/the-over-promise-of-ai-a-reality?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Toward Standardized Frameworks in AI: Architecting for Scalability and Sustainability]]></title><description><![CDATA[The AI development landscape is shaped by an escalating arms race centered on augmenting context sizes and amassing extensive parameter counts in large language models (LLMs).]]></description><link>https://www.gorkem-ercan.com/p/toward-standardized-frameworks-in</link><guid isPermaLink="false">https://www.gorkem-ercan.com/p/toward-standardized-frameworks-in</guid><dc:creator><![CDATA[Gorkem Ercan]]></dc:creator><pubDate>Fri, 03 May 2024 15:26:11 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/51675ccf-42cb-4b78-a7e6-268b2f2dfb0b_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The AI development landscape is shaped by an escalating arms race centered on augmenting context sizes and amassing extensive parameter counts in large language models (LLMs). While these metrics are pivotal for pushing the boundaries of AI capabilities, they skirt the equally critical aspect of technological adoption. Without robust adoption, even the most advanced AI constructs remain underutilized academic exercises.</p><h4>Technical and Economic Barriers to Adoption</h4><p>Foremost among the barriers to AI integration is the formidable cost of entry. The infrastructure required to train and deploy sophisticated AI models is not trivial; it encompasses advanced computational resources like high-throughput GPUs and extensive data sets, necessitating significant capital investment. Beyond the hardware, the ecosystem's lack of homogenized frameworks and standards magnifies the operational costs and complicates lifecycle management of AI assets.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.gorkem-ercan.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Software Maker! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h4>The Imperative for Standardization</h4><p>In the absence of universally accepted standards, fundamental decisions&#8212;ranging from model packaging to dataset structuring&#8212;become potential future liabilities. The rapid obsolescence rate within AI technology domains means today&#8217;s cutting-edge is a legacy system next month. Selecting an inference engine or committing to a specific runtime environment often locks developers into rigid architectures that resist modular updates or cross-platform interoperability.</p><p>Moreover, the proliferation of proprietary platforms by dominant market players fosters a &#8216;walled garden&#8217; environment. This not only stifles innovation by curtailing cross-vendor operability but also risks significant strategic assets being perennially tethered to a singular vendor&#8217;s ecosystem.</p><h4>Strategic Initiatives and Open Standards</h4><p>This landscape, however, is not sculpted by deliberate exclusionary practices but rather by a nascent field evolving through its teething phases. Visionary technologists and industry pioneers are acutely aware of the benefits of standardized AI practices&#8212;enhanced adoption, reduced entry barriers, and greater innovation.</p><p>Initiatives such as <a href="https://onnx.ai/">ONNX</a>, <a href="https://kitops.ml/">KitOps</a> (which I spearheaded), embody this ethos by advocating for and implementing open standards that democratize AI technology. These frameworks are designed not only to foster technical interoperability but also to ensure ethical governance and sustainable development within the AI ecosystem.</p><h4>The Future Trajectory</h4><p>As we navigate the complexities of AI standardization, it becomes imperative to architect solutions that are not only technically proficient but also scalable and sustainable over time. The establishment of open standards will be critical in ensuring that AI technologies remain adaptive and accessible across various industries.</p><h4>Conclusion</h4><p>The path to universal AI adoption is fraught with technical challenges and economic hurdles, but it is navigable through concerted efforts toward standardization and open architecture. By embracing collaborative development and standard-setting, we can unlock a future where AI technologies are as ubiquitous as they are transformative.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.gorkem-ercan.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Software Maker! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Do data scientists really like Git?]]></title><description><![CDATA[I have a theory: data scientists do not like Git.]]></description><link>https://www.gorkem-ercan.com/p/do-data-scientists-really-like-git</link><guid isPermaLink="false">https://www.gorkem-ercan.com/p/do-data-scientists-really-like-git</guid><dc:creator><![CDATA[Gorkem Ercan]]></dc:creator><pubDate>Wed, 28 Feb 2024 00:59:42 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/e73b7356-60c8-438a-9442-d91aa193b238_1024x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I have a theory: data scientists do not like Git. I think they did not adopt Git because they needed to version control their notebooks. They adopted Git because when they approached the software developers and DevOps engineers for collaboration that is what they were forced to do.</p><p>There are no bad intentions here. Software developers really do not have any other platform but Git to collaborate. It was only natural that they recommended data scientists to use Git too. Git is a great tool that is optimized to handle a large number</p><p> of small, text-based files. On the other hand, AI/ML projects are not just about coding; they involve training an AI model with data. The ML code facilitates the training. And the training requires large datasets. The datasets used for training AI models can be huge and unstructured (images, videos, audio).</p><p>There have been attempts to remedy the deficiencies of Git with varying degrees of success. However, I do not think the answer is mending a versioning system that is optimized for code-bases and I do worry about AI/ML development moving towards specialized proprietary platforms instead of using well known open platforms.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.gorkem-ercan.com/p/do-data-scientists-really-like-git/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.gorkem-ercan.com/p/do-data-scientists-really-like-git/comments"><span>Leave a comment</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Securing Backstage Plugins]]></title><description><![CDATA[Embracing the Permissions API]]></description><link>https://www.gorkem-ercan.com/p/securing-backstage-plugins</link><guid isPermaLink="false">https://www.gorkem-ercan.com/p/securing-backstage-plugins</guid><dc:creator><![CDATA[Gorkem Ercan]]></dc:creator><pubDate>Sat, 18 Nov 2023 00:19:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!LZ_z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd08daf4d-09c4-4784-8cd5-2547ae34a462_1024x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LZ_z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd08daf4d-09c4-4784-8cd5-2547ae34a462_1024x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LZ_z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd08daf4d-09c4-4784-8cd5-2547ae34a462_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!LZ_z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd08daf4d-09c4-4784-8cd5-2547ae34a462_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!LZ_z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd08daf4d-09c4-4784-8cd5-2547ae34a462_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!LZ_z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd08daf4d-09c4-4784-8cd5-2547ae34a462_1024x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LZ_z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd08daf4d-09c4-4784-8cd5-2547ae34a462_1024x1024.webp" width="342" height="342" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d08daf4d-09c4-4784-8cd5-2547ae34a462_1024x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:342,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Generated by DALL&#183;E&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Generated by DALL&#183;E" title="Generated by DALL&#183;E" srcset="https://substackcdn.com/image/fetch/$s_!LZ_z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd08daf4d-09c4-4784-8cd5-2547ae34a462_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!LZ_z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd08daf4d-09c4-4784-8cd5-2547ae34a462_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!LZ_z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd08daf4d-09c4-4784-8cd5-2547ae34a462_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!LZ_z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd08daf4d-09c4-4784-8cd5-2547ae34a462_1024x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><a href="https://backstage.io/">Backstage</a> has emerged as a pivotal platform for crafting developer portals. It&#8217;s a universe of its own, bustling with a diverse range of plugins. But here's a twist: as these plugins expand, so does the number of companies that use them. One reality of corporate adoption is the need for security measures. In this post, let's unravel how the Permissions API that is part of the Backstage Core helps secure plugins.</p><p>Backstage is a framework for building developer portals with built-in features like software catalogue, templates and plugins. As Backstage's plugin ecosystem flourishes, it brings unparalleled value. Yet, this is accompanied by a crucial responsibility for the plugin providers to ensure security and especially Authorization. The dilemma is the Permissions API, which is the basis for Authorization, is not enabled by default.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://www.gorkem-ercan.com/p/securing-backstage-plugins?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thank you for reading The Software Maker. This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.gorkem-ercan.com/p/securing-backstage-plugins?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.gorkem-ercan.com/p/securing-backstage-plugins?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><h3>Decoding Permissions</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7fPM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e3c7c6f-eb3e-442f-9cee-834ce875f572_784x392.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7fPM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e3c7c6f-eb3e-442f-9cee-834ce875f572_784x392.png 424w, https://substackcdn.com/image/fetch/$s_!7fPM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e3c7c6f-eb3e-442f-9cee-834ce875f572_784x392.png 848w, https://substackcdn.com/image/fetch/$s_!7fPM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e3c7c6f-eb3e-442f-9cee-834ce875f572_784x392.png 1272w, https://substackcdn.com/image/fetch/$s_!7fPM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e3c7c6f-eb3e-442f-9cee-834ce875f572_784x392.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7fPM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e3c7c6f-eb3e-442f-9cee-834ce875f572_784x392.png" width="784" height="392" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4e3c7c6f-eb3e-442f-9cee-834ce875f572_784x392.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:392,&quot;width&quot;:784,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:59189,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!7fPM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e3c7c6f-eb3e-442f-9cee-834ce875f572_784x392.png 424w, https://substackcdn.com/image/fetch/$s_!7fPM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e3c7c6f-eb3e-442f-9cee-834ce875f572_784x392.png 848w, https://substackcdn.com/image/fetch/$s_!7fPM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e3c7c6f-eb3e-442f-9cee-834ce875f572_784x392.png 1272w, https://substackcdn.com/image/fetch/$s_!7fPM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e3c7c6f-eb3e-442f-9cee-834ce875f572_784x392.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In Backstage, plugins reach out to the Permissions API, which in turn consults the Permission Policy. This policy, often provided by vendors or created by in-house platform teams, is where the decisions about who gets to do what are made. Typically, permission policy matches users, groups, roles, attributes, etc., to permissions depending on the implementation and returns an ALLOW, DENY or a maybe to the plugin. Well, two things are alarming in that sentence. 1. there is a maybe decision, which basically expects the plugin to run a conditional and ultimately decide. 2. It is completely left to the plugin to decide to do a permission check and even enforce the decision from the Permission Policy. Unfortunately, this is the reality as of this writing, and the best we can do is to guide the plugin developers to use the Permissions API and use it correctly. Fortunately, securing a Backstage plugin is very well explained in the <a href="https://backstage.io/docs/permissions/plugin-authors/01-setup">documentation</a> for backstage.</p><p>Incorporating the Permissions API in Backstage plugins is not just about adding layers of security; it's about crafting a seamless developer experience. The combination of well-defined permissions, thorough checks, conditional logic, and front-end integration ensures that plugins remain both functional and secure.</p><p>As a plugin developer, how can you decide if your plugin needs to take the Permissions API in use? Here are the criteria that I think you should consider.</p><ul><li><p><strong>User Roles:</strong> Consider the roles and responsibilities of the users of your plugin. If there are diverse user roles with varying levels of access and responsibilities, you may need finer-grained permissions to accommodate these roles effectively.</p></li><li><p><strong>Sensitivity of Data:</strong> The sensitivity of the data or resource is a key factor. Highly sensitive data, such as personal or financial information, typically requires finer-grained access control.</p></li><li><p><strong>Regulatory Compliance:</strong> Regulatory requirements, such as GDPR or HIPAA, may dictate the level of granularity for certain types of data access.</p></li><li><p><strong>Principle of Least Privilege:</strong> Apply the principle of least privilege. Fine-grained permissions can help ensure that users or roles have access only to the specific resources they need to perform their tasks.</p></li></ul><p>Once you decide to use the permissions API and create your own permissions, some best practices to consider are </p><p><strong>User Interface: </strong>If your plugin has a user interface, design it to present missing actions clearly to users, indicating what options are accessible to them. Do not allow users to click on an action to realize they are not authorized to do the operation.</p><p><strong>Separation of Concerns:</strong> Ensure that permissions are well-separated concerns and do not unnecessarily mix responsibilities. For example, reading and modifying data should typically be separate permissions.</p><p><strong>Testability:</strong> Ensure that permissions are testable and that you can verify that users have the correct permissions. Implement tests to verify that access control is functioning as expected.</p><p><strong>Documentation and Naming:</strong> Document each permission clearly. Use descriptive and consistent naming conventions to make it easy for administrators and developers to understand the purpose of each permission both in terms of its purpose and its impact on the system. Avoid ambiguous or overlapping permissions.</p><p><strong>Monitoring and Auditing:</strong> Implement mechanisms for monitoring and auditing permissions. It should be possible to track who performs which actions for security monitoring and compliance purposes.</p><p><strong>Security Implications:</strong> Assess the security implications of your conditions. Be mindful of potential vulnerabilities, such as injection attacks, and implement safeguards to mitigate these risks.</p><p>In summary, the expansion of Backstage's plugin ecosystem underscores the necessity of integrating robust security measures into the plugins. This is crucial for maintaining the integrity and reliability of the platform as it grows. Developers are urged to judiciously use the permission API, considering key aspects such as user roles, data sensitivity, and compliance with regulations. By adhering to best practices in design, testing, and documentation, they can ensure that their plugins are not only functional but also secure. Ultimately, applying these principles will bolster Backstage's position as a trusted and versatile platform for developer portals. Failing to do so&#8230; well.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.gorkem-ercan.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Software Maker! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Understanding the P in IDP]]></title><description><![CDATA[Whether selling dog food or diamond rings, you need some software to keep up with the competition.]]></description><link>https://www.gorkem-ercan.com/p/understanding-the-p-in-idp</link><guid isPermaLink="false">https://www.gorkem-ercan.com/p/understanding-the-p-in-idp</guid><dc:creator><![CDATA[Gorkem Ercan]]></dc:creator><pubDate>Sun, 07 May 2023 23:10:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!oMtA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7da4f682-8f1c-41fd-9cb4-2cf37be87949_929x522.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Whether selling dog food or diamond rings, you need some software to keep up with the competition. The efficiency of the developers in an organization has become a determining factor in the competitiveness of the business. One of the tools organizations have started using to improve their software development is the introduction of IDPs.</p><p><em>ID </em>on <em>IDP</em> stands for internal developer, which clearly identifies the target audience, the developers within an organization. However, the term IDP can be confusing, especially when we get to the letter P. Depending on the context, the P may refer to a platform or portal. So, what exactly is an internal developer platform? Let&#8217;s try to bring some order to the chaos by defining both. </p><h3>Internal Developer Platform</h3><p>An Internal Developer Platform is a self-service abstraction of all the tools, services, and processes that support an organization's software development. The main goal of an Internal Developer Platform is to ease the cognitive load of software developers. In other words, it is a unified platform that enables developers to focus on building quality software without worrying about infrastructure, security, or deployment.</p><h3>Internal Developer Portal</h3><p>Now that we better understand what an internal developer platform is, let's delve into  Internal Developer Portal. An internal developer portal is a single pane of glass to an organization's Internal Developer Platform. It puts all the tools, services, and processes, as well as the underlying infrastructure, under one interface.</p><p>At a minimum, an Internal Developer Portal is a user interface, hence the name portal. However, the interface can also extend to uniform API access to the developer platform. (imagine a control plane for internal software development). The portal gives developers a single entry point to access all the necessary services to build software. It can also serve as a centralized hub for documentation, tutorials, and best practices.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oMtA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7da4f682-8f1c-41fd-9cb4-2cf37be87949_929x522.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oMtA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7da4f682-8f1c-41fd-9cb4-2cf37be87949_929x522.png 424w, https://substackcdn.com/image/fetch/$s_!oMtA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7da4f682-8f1c-41fd-9cb4-2cf37be87949_929x522.png 848w, https://substackcdn.com/image/fetch/$s_!oMtA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7da4f682-8f1c-41fd-9cb4-2cf37be87949_929x522.png 1272w, https://substackcdn.com/image/fetch/$s_!oMtA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7da4f682-8f1c-41fd-9cb4-2cf37be87949_929x522.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oMtA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7da4f682-8f1c-41fd-9cb4-2cf37be87949_929x522.png" width="544" height="305.6706135629709" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7da4f682-8f1c-41fd-9cb4-2cf37be87949_929x522.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:522,&quot;width&quot;:929,&quot;resizeWidth&quot;:544,&quot;bytes&quot;:97293,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!oMtA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7da4f682-8f1c-41fd-9cb4-2cf37be87949_929x522.png 424w, https://substackcdn.com/image/fetch/$s_!oMtA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7da4f682-8f1c-41fd-9cb4-2cf37be87949_929x522.png 848w, https://substackcdn.com/image/fetch/$s_!oMtA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7da4f682-8f1c-41fd-9cb4-2cf37be87949_929x522.png 1272w, https://substackcdn.com/image/fetch/$s_!oMtA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7da4f682-8f1c-41fd-9cb4-2cf37be87949_929x522.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>An Internal Developer Platform is one of the essential tools for modern software development, and an Internal Developer Portal is its essential part. Stay tuned for more posts on IDPs. And if you want to be informed as they are published, use the bottom below to subscribe.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.gorkem-ercan.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.gorkem-ercan.com/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Reboot]]></title><description><![CDATA[It seems like the decade of reboots is upon us.]]></description><link>https://www.gorkem-ercan.com/p/reboot</link><guid isPermaLink="false">https://www.gorkem-ercan.com/p/reboot</guid><dc:creator><![CDATA[Gorkem Ercan]]></dc:creator><pubDate>Sat, 06 May 2023 16:05:07 GMT</pubDate><content:encoded><![CDATA[<p>It seems like the decade of reboots is upon us. Some of my childhood favourite TV shows like McGyver, Quantum Leap and even Jean-Luc Picard are making a comeback. And that got me thinking, why not reboot my blog too?</p><p>So, after some recommendations (thanks, the stranger on the subway!) and a little research, I have chosen Substack as my new publishing platform. I am new to this platform and slightly rusty with my writing. I suppose I can only improve from here. </p><p>Please note If you're looking for any of my posts from 2006 to 2021, I haven't brought them along for the ride. But don't worry, you can still check them out on the <a href="https://web.archive.org/web/20230306004700/http://www.gorkem-ercan.com/">internet archive </a>.</p><p>Welcome to the grand reboot of my blog, The Software Maker! Here, I'll share my thoughts on all things software and technology with a touch of humour and a sprinkle of sarcasm. So buckle up, and let's enjoy this ride together!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.gorkem-ercan.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for stopping by The Software Maker.  If you like what you see (and let's be honest, who wouldn't?), why not subscribe for free?</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>