<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: m8a.io</title>
    <description>The latest articles on DEV Community by m8a.io (@m8a-io).</description>
    <link>https://dev.to/m8a-io</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F6599%2Fe6526e56-7175-4d63-be48-04ec8f298128.png</url>
      <title>DEV Community: m8a.io</title>
      <link>https://dev.to/m8a-io</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/m8a-io"/>
    <language>en</language>
    <item>
      <title>The Ball and Chain: Why Git is an Anti-Pattern for AI-Native Engineering</title>
      <dc:creator>Scott Molinari</dc:creator>
      <pubDate>Sat, 07 Feb 2026 11:10:40 +0000</pubDate>
      <link>https://dev.to/m8a-io/the-ball-and-chain-why-git-is-an-anti-pattern-for-ai-native-engineering-1i47</link>
      <guid>https://dev.to/m8a-io/the-ball-and-chain-why-git-is-an-anti-pattern-for-ai-native-engineering-1i47</guid>
      <description>&lt;p&gt;In our previous discussions on &lt;a href="https://dev.to/m8a-io/the-human-centric-ai-native-distributed-systems-manifesto-1jlh"&gt;The Human-Centric AI-Native Distributed Systems Manifesto&lt;/a&gt; and &lt;a href="https://dev.to/smolinari/intent-driven-development-idd-is-our-current-future-5fh4"&gt;Intent Driven Development (IDD)&lt;/a&gt;, we established a clear vision: the future of software belongs to &lt;strong&gt;Architects of Intent&lt;/strong&gt;, not laborers of syntax.&lt;/p&gt;

&lt;p&gt;But there is a problem. A massive, silent friction point is dragging us backward.&lt;/p&gt;

&lt;p&gt;We are attempting to build fluid, intent-driven, AI-generated systems, but we are storing them in a rigid, line-based history tool designed in 2005 for the Linux Kernel. We are trying to fly a starship with a steering wheel made of stone.&lt;/p&gt;

&lt;p&gt;It is time to say the quiet part out loud: &lt;strong&gt;Git is becoming the bottleneck of the AI Era.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To fully realize the promise of Intent Driven Development, we cannot continue treating Git as the engine of our engineering. We must recognize it for what it truly is: a legacy file system that doesn't understand logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "Text-Blind" Problem
&lt;/h2&gt;

&lt;p&gt;Git is a marvel of engineering, but it is fundamentally "dumb." It sees the world in lines of text.&lt;/p&gt;

&lt;p&gt;If you rename a function in &lt;code&gt;auth.ts&lt;/code&gt; from &lt;code&gt;loginUser&lt;/code&gt; to &lt;code&gt;authenticateUser&lt;/code&gt;, Git sees this as:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;- loginUser(creds)&lt;/code&gt;&lt;br&gt;
&lt;code&gt;+ authenticateUser(creds)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Git does not know you refactored a symbol. It only knows you deleted a line and added a line. It sees text; it does not see &lt;strong&gt;Logic&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For human-to-human collaboration, this was acceptable. We could read the diff and infer the intent. But in an AI-native world, this "text-blindness" creates a critical disconnect.&lt;/p&gt;

&lt;p&gt;In a true AI-Native development environment, the AI shouldn't just look at a flat directory of files. It needs to operate on a &lt;strong&gt;System Graph&lt;/strong&gt;. It must understand the &lt;em&gt;relationships&lt;/em&gt; between things—not just their proximity in a file. It needs to know that the &lt;code&gt;User&lt;/code&gt; object is semantically connected to the &lt;code&gt;Billing&lt;/code&gt; service.&lt;/p&gt;

&lt;p&gt;If the AI modifies the &lt;code&gt;User&lt;/code&gt; object, it isn't just editing text; it is propagating a ripple effect of logical changes across the entire graph. When we force that rich, multi-dimensional logic into a flat, line-based diff, we are &lt;strong&gt;downsampling&lt;/strong&gt; the intelligence of our system. We are taking a 3D model and smashing it into a 2D drawing. We lose the "Why" (The Intent) and keep only the "What" (The Text).&lt;/p&gt;

&lt;p&gt;In other words, we continue to use Git, we suffer from a &lt;strong&gt;Cognitive Impedance Mismatch&lt;/strong&gt;. We take a high-fidelity concept (The Intent) and force it through a low-fidelity medium (The Text File). Then, every time a human or an AI needs to reason about the system, they must burn energy trying to reconstruct the original architectural picture from thousands of lines of syntax. This is a massive waste of computational power and human intellect. We are throwing away the map, shredding it into strips of paper, and then trying to tape it back together every single day.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Merge Conflict is a Syntax Error, Not a Logic Error
&lt;/h2&gt;

&lt;p&gt;The ultimate symptom of this mismatch is the Merge Conflict.&lt;/p&gt;

&lt;p&gt;In a distributed system where multiple agents (human or AI) are working on different Intents simultaneously— say, &lt;strong&gt;"Integrate Stripe Payments"&lt;/strong&gt; and &lt;strong&gt;"Enforce Age Verification"&lt;/strong&gt;— Git often fails to merge them simply because they touched adjacent lines of code.&lt;/p&gt;

&lt;p&gt;These conflicts are artificial. Logically, the two changes might be perfectly compatible. But because Git manages &lt;strong&gt;Files&lt;/strong&gt; instead of &lt;strong&gt;Functions&lt;/strong&gt;, it throws a conflict.&lt;/p&gt;

&lt;p&gt;We spend hours of our lives resolving these text-based collisions. In an IDD world, this is wasted life. We should be resolving &lt;strong&gt;Logical Conflicts&lt;/strong&gt;, not text conflicts.&lt;/p&gt;

&lt;p&gt;A logical conflict looks like this: &lt;em&gt;"You cannot remove the 'Email Address' field from the User object because the 'Send Receipt' intent explicitly relies on it."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That is a valuable conflict. That protects the business. Git cannot see that conflict; it can only see that two people edited line 45.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Database Must Become the Repo
&lt;/h2&gt;

&lt;p&gt;If Git is the "Assembly Language" of version control, what is the high-level language?&lt;/p&gt;

&lt;p&gt;The logical evolution is &lt;strong&gt;Database-as-Code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In an AI-Native future, the "Source Code" cannot remain a folder of text files on a hard drive. It must become structured, versioned data in a &lt;strong&gt;Temporal Database&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you aren't familiar with the term, a "Temporal Database" is simply a database that has a built-in concept of &lt;em&gt;Time&lt;/em&gt;. It doesn't just store the &lt;em&gt;current&lt;/em&gt; value of a record; it stores the &lt;em&gt;entire history&lt;/em&gt; of how that record changed. It is like a Time Machine for your data.&lt;/p&gt;

&lt;p&gt;Imagine a world where:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Granularity is Logical:&lt;/strong&gt; You don't version a "File." You version a &lt;strong&gt;Node&lt;/strong&gt;, a &lt;strong&gt;Function&lt;/strong&gt;, or a &lt;strong&gt;Policy&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;History is Queryable:&lt;/strong&gt; You don't ask "What changed in this file?" You query: &lt;em&gt;"Show me the exact state of the 'Billing Logic' as it existed last Tuesday."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Refactoring is Instant:&lt;/strong&gt; If you rename a verified business concept, the system updates the pointer in the database. There is no "Search and Replace." There is no diff. The entity simply evolves.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is the architectural reality we need to support &lt;strong&gt;Intent Driven Development&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If the AI generates the implementation, why do we need to store the implementation in a text file? We don't. We need to store the &lt;strong&gt;Intent&lt;/strong&gt; (The Horizon Node) and the &lt;strong&gt;Verification Policy&lt;/strong&gt; (The Test). The implementation code is just a compiled artifact—a transient output that serves the intent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "Ball and Chain" of Transparency
&lt;/h2&gt;

&lt;p&gt;So, do we kill Git?&lt;/p&gt;

&lt;p&gt;Not yet. And this is the paradox.&lt;/p&gt;

&lt;p&gt;We cannot abandon Git today because it is the &lt;strong&gt;Universal Protocol of Trust&lt;/strong&gt;. It is our audit log, our backup, and our "break glass in case of emergency" tool. Developers (rightfully) fear vendor lock-in. If the code lives in a proprietary database, they feel trapped.&lt;/p&gt;

&lt;p&gt;But we must change our relationship with it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Git must become the Display, not the Engine.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this new architectural vision, the Database is the Source of Truth. It holds the rich, structured, intent-based graph of your application. Git becomes a &lt;strong&gt;Projection&lt;/strong&gt;—a mirror. The system automatically syncs the state of the database to a Git repository so you have a human-readable backup.&lt;/p&gt;

&lt;p&gt;But the work—the actual engineering—happens in the Graph, in the Intent, and in the Policy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Moving from "Commits" to "Intents"
&lt;/h2&gt;

&lt;p&gt;This shift allows us to finally clean up the history of our software.&lt;/p&gt;

&lt;p&gt;We have all seen a Git log that looks like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fix typo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;update styling&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;trying to fix build again&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wip&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is noise. It is the frantic scribbling of a human trying to make a machine work.&lt;/p&gt;

&lt;p&gt;In an Intent-Based future, we stop caring about the scribbles. We care about the &lt;strong&gt;Completed Horizon&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Intent:&lt;/strong&gt; "Implement GDPR Compliance."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Status:&lt;/strong&gt; Verified &amp;amp; Sealed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The "Commit" is too small a unit of measure for a business. The &lt;strong&gt;Intent&lt;/strong&gt; is the atomic unit of value. By moving the "Source of Truth" to a database backed system that understands these high-level concepts, we can finally have a history log that reads like a story of business evolution, not a transcript of syntax errors.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Let Go of the Files
&lt;/h2&gt;

&lt;p&gt;The transition to IDD requires us to let go of our security blankets. For decades, the text file was our safety. If we had the file, we had the power.&lt;/p&gt;

&lt;p&gt;But in the age of AI, the power is no longer in the &lt;em&gt;text of the code&lt;/em&gt;. The power is in the &lt;strong&gt;Context&lt;/strong&gt;, the &lt;strong&gt;Constraint&lt;/strong&gt;, and the &lt;strong&gt;Intent&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Yes, these are still written in text — of course, language is how we define meaning — but that text represents high-level &lt;strong&gt;Abstractions&lt;/strong&gt;, not low-level machine instructions.&lt;/p&gt;

&lt;p&gt;Git served us well in the era of manual coding. It was the perfect tool for the "Human Compiler." But as we ascend to become Architects, we need tools that understand the architecture, not just the bricks.&lt;/p&gt;

&lt;p&gt;It is time to stop managing lines, and start managing logic.&lt;/p&gt;

</description>
      <category>git</category>
      <category>ai</category>
      <category>programming</category>
      <category>devops</category>
    </item>
    <item>
      <title>Intent Driven Development (IDD) is our Current Future</title>
      <dc:creator>Scott Molinari</dc:creator>
      <pubDate>Thu, 29 Jan 2026 08:36:54 +0000</pubDate>
      <link>https://dev.to/m8a-io/intent-driven-development-idd-is-our-current-future-5fh4</link>
      <guid>https://dev.to/m8a-io/intent-driven-development-idd-is-our-current-future-5fh4</guid>
      <description>&lt;p&gt;For decades, the measure of a software engineer was their command of syntax. We spent our careers acting as human compilers, translating business requirements into machine code, line by painstaking line. But as we transition into the AI-native era, that metric is shifting. We are moving away from a world where we focus on how to implement a feature, and into a world where we focus entirely on what that feature is intended to accomplish.&lt;/p&gt;

&lt;p&gt;In our &lt;a href="https://dev.to/m8a-io/the-human-centric-ai-native-distributed-systems-manifesto-1jlh"&gt;Human-centric AI-Native Distributed Systems Manifesto&lt;/a&gt; (if you haven't read it yet, please do), we outlined a future where we prioritize "Verifiable Intent over Syntactic Correctness." To ground this philosophy in reality, we need a new operating model. We need to move beyond the traditional boundaries of Domain Driven Design and Test Driven Development.&lt;/p&gt;

&lt;p&gt;We need &lt;strong&gt;Intent Driven Development (IDD)&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Inescapable Reality of Distributed Systems
&lt;/h2&gt;

&lt;p&gt;To understand why IDD is necessary, we must first accept the current state of the global economy. It is no longer possible to conduct significant business today without applications that are, in some manner, distributed. The era of the "isolated application" is dead.&lt;/p&gt;

&lt;p&gt;Whether you are a logistics giant or a local fintech startup, your digital footprint is inherently fragmented. You are consuming APIs from payment providers, syncing data to mobile devices, replicating databases across regions for latency, and relying on third-party authentication services. "No application is an island," as our manifesto states. Every piece of logic exists within a complex, fragile web of dependencies, network latency, and eventual consistency.&lt;/p&gt;

&lt;p&gt;This complexity creates a dangerous trap. As systems become more distributed, the cognitive load required to maintain them explodes. If we rely solely on manual coding, we move too slowly to compete. But if we recklessly hand the keys to an AI, we invite chaos. An AI can write a function that works perfectly in isolation on a developer’s laptop but fails catastrophically when introduced to the latency of a real-world network.&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;IDD becomes the critical bridge&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Engine of Intent
&lt;/h2&gt;

&lt;p&gt;Intent Driven Development is the natural evolution of software engineering, accelerated by the "engine" of Artificial Intelligence. In an IDD workflow, the engineer’s primary responsibility shifts from being the manual laborer laying every brick to becoming the Architect defining the destination.&lt;/p&gt;

&lt;p&gt;In the past, methodologies like Domain Driven Design (DDD) gave us the vocabulary—the maps of our system—but still required us to manually write the glue code to make those words interact. Test Driven Development (TDD) gave us verification, but required us to write "intent" buried inside unit tests that were often as complex as the code they were testing.&lt;/p&gt;

&lt;p&gt;IDD elevates these concepts. DDD becomes the strict Schema that prevents the AI from hallucinating business concepts. TDD becomes Policy Verification, where we define high-level behavioral contracts, and the AI navigates the route to satisfy them.&lt;/p&gt;

&lt;h2&gt;
  
  
  So, What is IDD?
&lt;/h2&gt;

&lt;p&gt;We have established the philosophy, but how does Intent Driven Development manifest in a daily engineering workflow?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IDD is an "Implementation-Last" methodology.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In traditional software development, we spend 80% of our time writing the implementation and 20% verifying it. IDD flips this ratio. We spend 80% of our time defining the Constraints and the Verification, and we let the AI handle the implementation in the seconds remaining. Specifically, IDD is a three-stage lifecycle:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The Definition Phase (The Human Context)&lt;/strong&gt;&lt;br&gt;
This is where the "Intent" is crystallized. Before a single line of executable code is written, the human engineer constructs the "Immutable Skeleton." This is not a vague prompt like "Make a user system." It is a rigorous set of artifacts:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Contract (Schema):&lt;/strong&gt; You define the exact input and output.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Environmental Constraints:&lt;/strong&gt; You explicitly select the technology (e.g., Vue, NestJS and MongoDB, or Angular, Spring Boot, and MySQL, etc. etc.). We call these "Foundries" in m8a. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Behavioral Policy:&lt;/strong&gt; Instead of writing code, you write the criteria for success (e.g., "Must retry 3 times with exponential backoff").&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The Generation Phase (The AI Engine)&lt;/strong&gt;&lt;br&gt;
Once the Skeleton and Policy are locked, the AI is engaged. It is tasked with filling the void between the Input Contract and the Output Contract. Because the AI is constrained by your pre-selected stack and pre-defined business rules, it generates the boilerplate and logic required to satisfy your intent without "guessing."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The Verification Phase (The Automated Judge)&lt;/strong&gt;&lt;br&gt;
This is where "Verifiable Intent" supersedes "Syntactic Correctness." As soon as the AI generates the code, the system runs the Policy Tests. If the output fails the Schema or the Behavior check, it is rejected and regenerated. The human only reviews the solution that has already proven it meets the intent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "Intent File"
&lt;/h2&gt;

&lt;p&gt;To make this concrete, IDD relies on a tangible "Intent File."&lt;/p&gt;

&lt;p&gt;We are already seeing primitive shadows of this in the developer community today. Many developers are now adding files like CLAUDE.md or GEMINI.md to their repositories to "prep" the AI with context. While this is a step in the right direction, these local files are severely limited. They are static snapshots that only understand the code sitting next to them in the folder; they lack the global awareness of the living system. They are passive suggestions, not active architectural drivers.&lt;/p&gt;

&lt;p&gt;In true IDD, the "Intent File" is not limited to a rigid format like YAML, JSON, or a static markdown file. The "Intent" can be anything made of text. It can be a structured design document, a technical spec, or—in advanced platforms like m8a—it can be context injected dynamically via Retrieval-Augmented Generation (RAG). By pulling context from your existing documentation, knowledge bases, or previous system states, the "Intent File" becomes a living entity.&lt;/p&gt;

&lt;p&gt;Regardless of the source, the concept remains the same: The Intent is the Source Code; the actual Python or TypeScript files that get generated are merely the compiled artifacts of that intent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Non-Negotiable Human Layer
&lt;/h2&gt;

&lt;p&gt;However, a critical distinction must be made to separate IDD from the chaotic "AI-generated" workflows often hyped today. In a true IDD architecture, AI drives the car, but the Human builds the road.&lt;br&gt;
We do not ask the AI to "imagine" an architecture. We do not ask it to pick a database, choose a framework, or decide on a logging strategy. These are the "Rigid Structures" of our system, and they must remain under strict human ownership.&lt;/p&gt;

&lt;p&gt;This is not a matter of preference; it is a matter of accountability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The "3 AM" Rule&lt;/strong&gt;&lt;br&gt;
The primary reason humans must define the stack is simple: Accountability cannot be automated. When a production database locks up at 3:00 AM, the AI is not the one answering the pager. The engineer is. Therefore, the engineer must possess total agency over the tools they are required to debug. If we allow an AI to whimsically choose an obscure library because it "fit the prompt," we burden the human team with technical debt they did not consent to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Guardrails Against Entropy&lt;/strong&gt;&lt;br&gt;
AI is inherently probabilistic; it craves novelty. If you ask an AI to "build a service" ten times without constraints, it might give you ten slightly different architectural variations. In a distributed system, this inconsistency is fatal. By locking the architecture into "Immutable Skeletons"—human-defined templates—we force the AI to adhere to organizational standards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Strategic Homogeneity&lt;/strong&gt;&lt;br&gt;
Finally, architecture is rarely just technical; it is strategic. An AI cannot know that we use a specific cloud provider because of a corporate discount, or that we avoid a certain language because it conflicts with our hiring strategy. AI lacks the global context of the business.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architects of "Done"
&lt;/h2&gt;

&lt;p&gt;This brings us to the ultimate role of the human in IDD: we are the Architects of "Done."&lt;/p&gt;

&lt;p&gt;The AI can iterate indefinitely, generating code that is syntactically perfect but semantically void. It is the human engineer who must review the outcome, not for style, but for meaning. We provide the "Why" and the "Where." We set the hard guardrails, the frameworks, and the templates. The AI simply provides the "How."&lt;/p&gt;

&lt;p&gt;By embracing Intent Driven Development, we stop being the manual laborers of syntax and finally become what we were always meant to be: the Architects of Intent.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>distributedsystems</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The Human-centric AI-Native Distributed Systems Manifesto</title>
      <dc:creator>Scott Molinari</dc:creator>
      <pubDate>Thu, 29 Jan 2026 06:10:11 +0000</pubDate>
      <link>https://dev.to/m8a-io/the-human-centric-ai-native-distributed-systems-manifesto-1jlh</link>
      <guid>https://dev.to/m8a-io/the-human-centric-ai-native-distributed-systems-manifesto-1jlh</guid>
      <description>&lt;h2&gt;
  
  
  Preamble
&lt;/h2&gt;

&lt;p&gt;We are uncovering better ways of building software with AI at breakneck speed, but at the same time, we must acknowledge that in the modern enterprise, &lt;strong&gt;no application is an island&lt;/strong&gt;. Every piece of logic exists within a complex web of dependencies, latency, and state. We also recognize that AI is not a replacement for engineering, but a powerful engine for realizing intent.&lt;/p&gt;

&lt;p&gt;Through this work with AI, we have come to:&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Values
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Verifiable Intent over Syntactic Correctness:&lt;/strong&gt; We value code that provably matches the system's objective via automated policy and testing, not just code that compiles without error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;System Resilience over Local Optimization:&lt;/strong&gt; We value the stability and survival of the entire network over the raw execution speed of a single node or function.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deterministic Execution over Probabilistic Agents:&lt;/strong&gt; We value AI as a builder of rigid, predictable automation scripts, rather than as a real-time, probabilistic decision-maker for critical processes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architectural Guardrails over Manual Review:&lt;/strong&gt; We value automated, platform-level constraints that physically prevent anti-patterns over relying on human vigilance to catch them during code review.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Managed Metadata over Generative Novelty:&lt;/strong&gt; We value strict, pre-defined structures and contracts (schemas/templates) over loosely coupled or "reimagined" AI-generated logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Human Augmentation over Human Replacement:&lt;/strong&gt; We value AI as a tool to increase the capacity, velocity, and insight of the engineer, not as a means to reduce the engineering workforce.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;That is, while there is value in the items on the right, we value the items on the left more.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Principles of AI-Native Engineering
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. The Logic is Ephemeral; The State is Permanent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We treat AI-generated components as stateless workers. The AI writes the logic, but the Platform manages the persistence. This ensures that when the logic fails or scales, no data is lost in the wreckage of a hallucinatory variable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The Transition to Determinism&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI is a tool for discovery and construction, not permanent execution. Once a process is fully understood and automated, the AI steps aside, leaving behind rigid, deterministic code to perform the task. We do not ask AI to "think" about a solved problem twice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Contracts are King&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The "Handshake" between services (APIs, Data Models, Event Schemas, etc.) must be defined by humans before generation begins. The AI may write the code that fulfills the contract, but it is never permitted to alter the contract alone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Context is Global&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We reject the illusion of the "local environment." AI must be prompted and constrained to generate code that assumes the network will fail, the database will be locked, and the service will be unavailable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Human Responsibility
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;We are the Context Bearers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI cannot see the world outside the prompt. We are responsible for identifying and injecting the external conditions - legal, ethical, physical, and business - that the code must survive in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We are the Governors of Semantics&lt;/strong&gt;&lt;br&gt;
Code is math, but Systems are meaning. The AI can ensure a string is 10 characters long, but only a Human can decide if that string should be a Customer ID or a Product Code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We are the Architects of "Done"&lt;/strong&gt;&lt;br&gt;
An AI can iterate indefinitely. Only a human can declare that a system satisfies the business need and is safe for deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What do you think of this manifesto?&lt;/strong&gt;&lt;br&gt;
It is the first document (of hopefully many), which I'll make public while building the m8a platform (working on alpha). I've made this manifesto public, because it is the rules and the perspective I'm working with and I'd love to hear thoughts about this from others.&lt;/p&gt;

&lt;p&gt;Next article in our m8a series: &lt;a href="https://dev.to/smolinari/intent-driven-development-idd-is-our-current-future-5fh4"&gt;https://dev.to/smolinari/intent-driven-development-idd-is-our-current-future-5fh4&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>vibecoding</category>
      <category>distributedsystems</category>
      <category>aiidd</category>
    </item>
    <item>
      <title>m8a scenario #1 - Using Coder to Develop Keycloak Templates Live (almost)...</title>
      <dc:creator>Scott Molinari</dc:creator>
      <pubDate>Thu, 09 Feb 2023 10:32:34 +0000</pubDate>
      <link>https://dev.to/m8a-io/m8a-scenario-1-using-coder-to-develop-keycloak-templates-live-almost-26e2</link>
      <guid>https://dev.to/m8a-io/m8a-scenario-1-using-coder-to-develop-keycloak-templates-live-almost-26e2</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fas9kqjmrj3wi92rfviwz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fas9kqjmrj3wi92rfviwz.png" alt="Keycloak Custom Theming" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This article will be one of many posts about the trials and tribulations, the learnings and sharings of information as we build out the m8a.io platform (in POC). &lt;/p&gt;

&lt;p&gt;The goal of these scenario articles will be to highlight one or more technologies and explain what we did with them.&lt;/p&gt;

&lt;p&gt;We want to share these learnings and experiences, because we do believe we are making some cutting edge decisions for our new platform and/ or are coming up with alternative ways to do things that haven't yet been discovered before. And the publication of this knowledge is all in the name of giving back to those technologies that are helping us with our very lofty endeavour. It's a start. &lt;/p&gt;

&lt;p&gt;In this article, two of the technologies being highlighting are: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://coder.com/" rel="noopener noreferrer"&gt;Coder&lt;/a&gt; and &lt;a href="https://www.keycloak.org/" rel="noopener noreferrer"&gt;Keycloak&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From their websites:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc1ay8iudqfbd5c59oh9k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc1ay8iudqfbd5c59oh9k.png" alt="Coder" width="168" height="50"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Coder offloads development from local workstations to your on-prem and public cloud infrastructure. Boost developer productivity with instant onboarding and powerful server resources. Keep code and data under control within your network.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnpop0s8s0ycl30lsanku.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnpop0s8s0ycl30lsanku.png" alt="spacer" width="305" height="8"&gt;&lt;/a&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhn0ca50928owbduxetif.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhn0ca50928owbduxetif.png" alt="Keycloak" width="285" height="59"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Add authentication to applications and secure services with minimum effort. No need to deal with storing users or authenticating users.&lt;br&gt;
Keycloak provides user federation, strong authentication, user management, fine-grained authorization, and more.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As you can imagine, these are two pretty powerful sounding applications, right? &lt;/p&gt;

&lt;h2&gt;
  
  
  Scenario Description
&lt;/h2&gt;

&lt;p&gt;Above and beyond these two great applications, we are also using &lt;a href="https://kubernetes.io/" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This article will assume you have some fairly good knowledge of Kubernetes and Helm and how they both work together. You should also be familiar with Terraform. &lt;/p&gt;

&lt;p&gt;As you hopefully know, Kubernetes (k8s) is a very powerful platform for orchestrating container workloads. If you are still reading this and you don't know about k8s, I highly recommend learning about. &lt;/p&gt;

&lt;p&gt;Getting back to our two main technologies....we have implemented Keycloak as our &lt;a href="https://www.techtarget.com/searchsecurity/definition/identity-access-management-IAM-system" rel="noopener noreferrer"&gt;Identification and Authorization Management system&lt;/a&gt; (IAM). However, as these things go, Keycloak has its own tech stack. One of the technologies, of course, is the language they used, which is Java. And being it is Java, they chose to use a templating engine called &lt;a href="https://freemarker.apache.org/" rel="noopener noreferrer"&gt;Freemarker&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To keep this article as short as possible and because it isn't the intention of this article, we won't go into the deeper details of Keycloak's templating system and how to use it. Instead, I'll refer you to two good articles that explain it all well:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.baeldung.com/spring-keycloak-custom-themes" rel="noopener noreferrer"&gt;Customizing Themes for Keycloak&lt;/a&gt;&lt;br&gt;
&lt;a href="https://trigodev.com/blog/how-to-customize-keycloak-themes" rel="noopener noreferrer"&gt;How to Customize Keycloak Themes&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;That being said, if you are familiar with any other templating system for the backend, you'll understand Freemarker fairly quickly too. &lt;/p&gt;

&lt;p&gt;And, because Keycloak uses this template system, setting up your Corporate Identity within Keycloak is very much possible and not entirely difficult. &lt;/p&gt;

&lt;p&gt;However, despite knowing about templating and Keycloak you'll quickly understand the first hurdle of having Keycloak in k8s. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Above and beyond designing the templates, how can we even get those new templates into the Keycloak pods for use by the application?&lt;/em&gt;&lt;/strong&gt;  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There are two suggested ways to get customized templates into the Keycloak pod or pods.  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;using an init container to "load" the new templates over a shared volume.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;using a secret to load in a tarballed archive of the files. &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Why won't this work?
&lt;/h3&gt;

&lt;p&gt;Both require a number of steps to make the template contents usable by Keycloak and as you can imagine, are miles away from any kind of live development.  &lt;/p&gt;

&lt;p&gt;With either of these two steps, you'd need to have a local version of Keycloak to design on, then create a container with the files or create a tarball and load it into a secret and then restart Keycloak. Restarting Keycloak alone takes about a minute until it is ready to go. And if you happen to see a mistake, as it always happen, it's wash, rinse and repeat (pulling out hair or getting grey from the process). &lt;/p&gt;
&lt;h2&gt;
  
  
  Coder to the Rescue!
&lt;/h2&gt;

&lt;p&gt;Coder is going to be an integral part of the m8a platform. And as it may be, we can also use it for the purpose of (almost) live development of custom templates in a running Keycloak pod. &lt;/p&gt;

&lt;p&gt;Point #1 above of getting a template set into Keycloak via a shared volume gave us the initial idea. Why not just use another pod, a Coder agent/ workspace pod in parallel and share the volume between them? That way you can develop on the files in the volume and Keycloak would use them directly. Yes!&lt;/p&gt;

&lt;p&gt;So, off we went looking to resolve this challenge.  &lt;/p&gt;
&lt;h3&gt;
  
  
  Installing and Setting up Coder
&lt;/h3&gt;

&lt;p&gt;To get going with Coder, you'll need to &lt;a href="https://coder.com/docs/v2/latest/install/kubernetes" rel="noopener noreferrer"&gt;install Coder into your k8s cluster via Helm&lt;/a&gt;. Follow the instructions carefully and you should have Coder up and  running in cluster in no time. &lt;/p&gt;

&lt;p&gt;Next, you'll need a workspace template to be able to create a workspace. Again, the &lt;a href="https://coder.com/docs/v2/latest/templates" rel="noopener noreferrer"&gt;Coder's docs explain how to do this well&lt;/a&gt; and there is an example &lt;a href="https://github.com/coder/coder/tree/main/examples/templates/kubernetes" rel="noopener noreferrer"&gt;k8s template you can start from&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;You'll also need to install the Coder CLI onto your local machine for working on the templates.&lt;/p&gt;

&lt;p&gt;Coder's templates are basically Terraform modules. So, you'll need knowledge of how Terraform works and the config language itself, to develop them. If you know k8s though, it's fairly easy to pick up. &lt;/p&gt;
&lt;h2&gt;
  
  
  Getting Everything Set Up
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Coder's service account permissions
&lt;/h3&gt;

&lt;p&gt;In order to have Coder work with k8s objects outside its own workspace, we have to give the Coder service account (which should have been installed while installing Coder's Helm chart) enough permissions to work across namespaces. We did this by creating an admin cluster role and binding it to the service account via &lt;code&gt;kubectl&lt;/code&gt;.  &lt;/p&gt;
&lt;h3&gt;
  
  
  Keycloak setup
&lt;/h3&gt;

&lt;p&gt;This was the trickier part. And of course, this will require a development environment, and not your production Keycloak. Setting up a complete development environment in k8s is way beyond the scope of this article, but if you are a good with k8s, you'll know what to do, if you haven't done it already (i.e. you really should!). &lt;/p&gt;

&lt;p&gt;Ok. So, with Keycloak in a dev environment, you'll need to have only one Keycloak pod running, to not run into caching issues. And, you'll be setting this up in the Helm chart (we are using the Bitnami chart):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;
&lt;span class="na"&gt;extraStartupArgs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;&amp;gt;-&lt;/span&gt;
  &lt;span class="s"&gt;--spi-theme-static-max-age=-1 --spi-theme-cache-themes=false --spi-theme-cache-templates=false&lt;/span&gt;

&lt;span class="s"&gt;...&lt;/span&gt;

&lt;span class="na"&gt;replicaCount&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These startup args will turn off the Keycloak caching process for templates.&lt;/p&gt;

&lt;p&gt;Or, you can also do this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;
&lt;span class="na"&gt;extraEnvVars&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;KEYCLOAK_PRODUCTION&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;false'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will start the pod in dev-mode, which should also mean template caching is turned off. &lt;/p&gt;

&lt;h3&gt;
  
  
  Set up the volume
&lt;/h3&gt;

&lt;p&gt;We are using &lt;a href="https://longhorn.io/" rel="noopener noreferrer"&gt;Longhorn&lt;/a&gt; as a more capable storage system inside our k8s clusters. To set up the volume with Longhorn, you can go into the UI and create a new Persistent Volume Claim (pvc)/ Volume. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcgm77xulzexxcoss6q4k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcgm77xulzexxcoss6q4k.png" alt="Longhorn" width="800" height="556"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also do this via &lt;code&gt;kubectl&lt;/code&gt;, and with any other storage system in k8s. &lt;/p&gt;

&lt;p&gt;Once you have the pvc created (making sure it is in the &lt;code&gt;keycloak&lt;/code&gt; namespace) you are halfway there.&lt;/p&gt;

&lt;p&gt;As a next step, you'll need to bind the pvc to the Keycloak pod via a Persistent Volume (pv). To do this, add the following to the Helm chart and upgrade it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;extraVolumeMounts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;mountPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/bitnami/keycloak/themes/m8a-theme&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;theme&lt;/span&gt;
&lt;span class="na"&gt;extraVolumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;theme&lt;/span&gt;
    &lt;span class="na"&gt;persistentVolumeClaim&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;claimName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pvc-keycloak-theme&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;mountPath&lt;/code&gt; is dependent on where Keycloak is installed in the pod. The path above it where the Bitnami chart puts it. &lt;/p&gt;

&lt;p&gt;The &lt;code&gt;claimName&lt;/code&gt; is the name of your pvc. Ours is &lt;code&gt;pvc-keycloak-theme&lt;/code&gt;. Keep that in mind.  &lt;/p&gt;

&lt;p&gt;Now you have the Keycloak instance working with a volume that can be attached to other pods. Let's do that now with a Coder workspace.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting up the Coder workspace (the pod)
&lt;/h3&gt;

&lt;p&gt;As mentioned above, you can use the example Coder template to create the workspace. The only difference is now, you'll need to have the volume also bind to the workspace pod. To make that happen, you'll need to add this to the template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"kubernetes_pod"&lt;/span&gt; &lt;span class="s2"&gt;"main"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;coder_workspace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;me&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;start_count&lt;/span&gt;

   &lt;span class="p"&gt;...&lt;/span&gt;


      &lt;span class="nx"&gt;env&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;name&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"CODER_AGENT_TOKEN"&lt;/span&gt;
        &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;coder_agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nx"&gt;volume_mount&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;mount_path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"/home/template-dev/my-theme"&lt;/span&gt;
        &lt;span class="nx"&gt;name&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"theme"&lt;/span&gt;
        &lt;span class="nx"&gt;read_only&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nx"&gt;volume&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"theme"&lt;/span&gt;
      &lt;span class="nx"&gt;persistent_volume_claim&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;claim_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"pvc-keycloak-theme"&lt;/span&gt;
        &lt;span class="nx"&gt;read_only&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;volume_mount&lt;/code&gt; and &lt;code&gt;volume&lt;/code&gt; entries are the important additions. &lt;code&gt;volume_mount&lt;/code&gt; is the location of the files you'll be working on. &lt;code&gt;volume&lt;/code&gt; is the binding of the pvc to the pod. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://coder.com/docs/v2/latest/templates#edit-templates" rel="noopener noreferrer"&gt;Push up&lt;/a&gt; or &lt;a href="https://coder.com/docs/v2/latest/templates#add-a-template" rel="noopener noreferrer"&gt;add your template&lt;/a&gt; to your Coder instance via the Coder CLI and you are almost ready for development. &lt;/p&gt;

&lt;h3&gt;
  
  
  The new development workflow
&lt;/h3&gt;

&lt;p&gt;Ok. Now that we have pretty much everything set up. Go into your Coder installation (either via port forward or if you set everything up properly, via the URL), go to the Templates tab and fire up a new workspace. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6lbrrioodvuu5splcrqs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6lbrrioodvuu5splcrqs.png" alt="Coder Template Tab" width="800" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I like to use my local VSCode, so I press on the button, which will open the workspace in VSCode. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frnwwqwt37ghs5l3rhvfl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frnwwqwt37ghs5l3rhvfl.png" alt="Coder Workspace" width="800" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Coder will also let you work directly in the browser too, if that is what you want. We removed that feature from our template and why you don't see the option above. &lt;/p&gt;

&lt;p&gt;Remember, this is a pod working inside a k8s cluster. It's true remote development in a just-like-production dev environment. &lt;/p&gt;

&lt;p&gt;Once you've clicked on the button shown above, you'll be greeted with this a few seconds later:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz17nk76yq4i6ddd44j9l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz17nk76yq4i6ddd44j9l.png" alt="VSCode editor" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the workspace running, you can add your files as necessary and start developing directly on your Keycloak templates. &lt;/p&gt;

&lt;p&gt;Note1: In the image above, the &lt;code&gt;login&lt;/code&gt; folder is the one I was working in. You'll need to add the different folders yourself for the different areas you want to customize Keycloak's templates. &lt;/p&gt;

&lt;p&gt;Note2: In the future, you'll be able to determine which folder the Workspace should open up in. The suggestion wasn't yet implemented in Coder at the time of writing. &lt;/p&gt;

&lt;p&gt;Note3: Don't make the same mistake as I did and have browser caching turned on (and have forgotten about it). If you aren't seeing changes made directly after refreshing the Keycloak page you are customizing, see if it works with Ctrl + F5. Or turn off your browser's cache. &lt;/p&gt;

&lt;p&gt;So, that is it. I searched very hard to find something like this and couldn't find anything remotely similar. I hope this will help others, at least those wanting to customize their Keycloak instance more efficiently inside k8s. &lt;/p&gt;

&lt;p&gt;Happy Coding!!!! 😁&lt;/p&gt;

</description>
      <category>keycloak</category>
      <category>kubernetes</category>
      <category>coder</category>
      <category>backend</category>
    </item>
  </channel>
</rss>
