<?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: Tom McNamara</title>
    <description>The latest articles on DEV Community by Tom McNamara (@tommcnamara).</description>
    <link>https://dev.to/tommcnamara</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2857285%2F205fe69a-7c57-4334-8cef-5a90aefa032f.png</url>
      <title>DEV Community: Tom McNamara</title>
      <link>https://dev.to/tommcnamara</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tommcnamara"/>
    <language>en</language>
    <item>
      <title>How to build a secure, cross-protocol Agentic AI cluster in 15 minutes (without touching Istio).</title>
      <dc:creator>Tom McNamara</dc:creator>
      <pubDate>Wed, 15 Jul 2026 15:28:11 +0000</pubDate>
      <link>https://dev.to/tommcnamara/how-to-build-a-secure-cross-protocol-agentic-ai-cluster-in-15-minutes-without-touching-istio-5ega</link>
      <guid>https://dev.to/tommcnamara/how-to-build-a-secure-cross-protocol-agentic-ai-cluster-in-15-minutes-without-touching-istio-5ega</guid>
      <description>&lt;h2&gt;
  
  
  The Challenge of the ReAct Loop (East-West Traffic)
&lt;/h2&gt;

&lt;p&gt;A ReAct loop is essentially an AI agent breaking down a complex problem by continuously "thinking" (reasoning) and "doing" (acting). It queries an LLM, parses the output, calls an internal tool or API (RAG database, calculator, external service), evaluates the result, and loops back.&lt;br&gt;
This creates a massive explosion of &lt;strong&gt;East-West API&lt;/strong&gt; traffic. &lt;br&gt;
This traffic is ...&lt;br&gt;
&lt;strong&gt;Highly Chatty&lt;/strong&gt;: Hundreds of micro-transactions per user prompt.&lt;br&gt;
&lt;strong&gt;Autonomous&lt;/strong&gt;: The agent decides which internal APIs to call on the fly, making traffic patterns highly unpredictable.&lt;br&gt;
&lt;strong&gt;Latency Sensitive&lt;/strong&gt;: Every millisecond of network overhead degrades the user's perception of the AI's speed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Heavy Service Meshes and mTLS Fall Short
&lt;/h2&gt;

&lt;p&gt;When Platform Engineers see East-West traffic, their first instinct is usually to throw a heavy service mesh (like Istio) and mutual TLS (mTLS) at the problem. However, in the context of Agentic AI, this introduces severe friction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The mTLS Overhead&lt;/strong&gt;: Traditional mTLS relies on Public Key Infrastructure (PKI) and certificate rotation. Managing these certs across dynamically scaling AI microservices creates massive DevOps overhead.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Layered Blindspot&lt;/strong&gt;: mTLS operates at Layer 4 (the transport layer). It guarantees that Machine A is talking to Machine B, but it has no idea what they are saying.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Latency Tax&lt;/strong&gt;: The handshake overhead of traditional cryptographic verification is punishing for rapid-fire ReAct loops.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Analogy&lt;/strong&gt;: Think of an AI ReAct loop as a rapid-fire brainstorming session between a group of brilliant analysts. Using traditional mTLS is like forcing them to stop, pull out their driver's licenses, and have a notary stamp a document before they are allowed to speak their next sentence. The security mechanism destroys the velocity of the system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vulnerabilities and the Danger of "Excessive Agency"
&lt;/h2&gt;

&lt;p&gt;Are there incidents showing weaknesses? Absolutely. The OWASP Top 10 for LLMs specifically highlights &lt;strong&gt;Excessive Agency&lt;/strong&gt; and &lt;strong&gt;Insecure Output Handling&lt;/strong&gt;.&lt;br&gt;
If a threat actor successfully executes a Prompt Injection attack on an external-facing AI interface, that agent becomes a malicious insider. If your internal APIs are only protected by network boundaries or static API tokens, that compromised agent can move laterally, access sensitive RAG data, or execute destructive actions via your internal tools. Traditional Layer 3-5 defenses assume that if the traffic comes from the "trusted" AI agent pod, it must be legitimate. They are completely blind to a hijacked reasoning loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Layer 7 Approach
&lt;/h2&gt;

&lt;p&gt;This is exactly why we built the &lt;strong&gt;Korvette-S Workload Security Proxy (WoSP)&lt;/strong&gt; at Hopr.co. Instead of relying on static certificates and heavy network-layer meshes, we use an Automated Moving Target Defense (AMTD).&lt;br&gt;
Here is how I break it down for our peers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Zero Trust at the Transaction Level&lt;/strong&gt;: We use &lt;strong&gt;MAID™ (Machine Alias IDentity)&lt;/strong&gt; to provide cryptographic, rotating identities for workloads. We don't just trust the IP or the static cert; we verify the identity for each transaction.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Defeating Lateral Movement&lt;/strong&gt;: Using the &lt;strong&gt;SEE™ (Synchronous Ephemeral Encryption) protocol&lt;/strong&gt;, our sidecars establish mutual authentication and rotate keys instantly. If an AI agent goes rogue, it cannot reuse intercepted credentials or static API keys to exploit downstream services.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Invisible to the Application&lt;/strong&gt;: We deploy this using an Envoy sidecar architecture with a WebAssembly (Wasm) filter. For example, our Lane7 blueprints demonstrate injecting the &lt;code&gt;xtra-wasm-filter&lt;/code&gt; directly into the Envoy configuration without requiring any changes to the underlying application code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Codes Hidden In Plain Sight (CHIPS™)&lt;/strong&gt;: We embed moving target defense directly into the payload at layer 7 or layer 4.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you look at the &lt;strong&gt;Lane7 Agentic AI Blueprint&lt;/strong&gt;, it is a masterclass in decoupling the application layer's protocol complexity from the underlying Zero Trust security model. Here is a breakdown of how this 6-pod architecture operates and how it pulls off that seamless protocol mixing:&lt;/p&gt;

&lt;h2&gt;
  
  
  The 6-Pod Pipeline Architecture
&lt;/h2&gt;

&lt;p&gt;The blueprint lays out a classic scatter-gather (fan-out/fan-in) ReAct pipeline, but hardens it with Hopr's Automated Moving Target Defense (AMTD) across every internal hop. The message flow moves cleanly through the stages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Entry/Routing Phase&lt;/strong&gt;: Traffic hits the &lt;code&gt;ai-gateway&lt;/code&gt; (the boundary entry), which validates the payload and passes it to the &lt;code&gt;ai-orchestrator&lt;/code&gt;. The orchestrator acts as an MCP-style task dispatcher, broadcasting the task out to two concurrent processing branches.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Inference/Action Phase&lt;/strong&gt;: The payload is processed simultaneously by the &lt;code&gt;llm-gateway&lt;/code&gt; (which handles the LLM inference SDK calls) and the &lt;code&gt;tool-executor&lt;/code&gt; (which dispatches agentic tools like web searches or DB lookups).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Aggregation/Exit Phase&lt;/strong&gt;: The &lt;code&gt;nlp-processor&lt;/code&gt; acts as a fan-in aggregator, waiting for both the LLM and tool branches to finish before merging the results. Finally, it ships the unified payload to the &lt;code&gt;ai-results-sink&lt;/code&gt;, which serves as the boundary exit.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Heterogeneous Protocol Design
&lt;/h2&gt;

&lt;p&gt;What makes this blueprint brilliant from a networking perspective is how it handles the reality of modern AI workloads: not everything should be stateless HTTP. The architecture intentionally uses &lt;strong&gt;heterogeneous protocols&lt;/strong&gt; across the pod boundaries.&lt;br&gt;
It splits the protocols based on the specific needs of the AI pipeline leg:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;HTTP for Boundaries and State Routing&lt;/strong&gt;: Standard HTTP is used for the &lt;code&gt;ai-gateway&lt;/code&gt;, &lt;code&gt;ai-orchestrator&lt;/code&gt;, &lt;code&gt;nlp-processor&lt;/code&gt;, and &lt;code&gt;ai-results-sink&lt;/code&gt;. This makes perfect sense for boundary entry, fan-out dispatch, fan-in aggregation, and boundary exit where standard request/response framing is optimal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;WebSocket for Streaming Inference Legs&lt;/strong&gt;: The blueprint switches to persistent WebSocket sessions for the &lt;code&gt;llm-gateway&lt;/code&gt; and &lt;code&gt;tool-executor&lt;/code&gt;. In production, LLM inference and agentic tool-calls require real-time streaming responses, making persistent WebSocket connections the right tool for the job.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How it Mixes Seamlessly (The Envoy/Wasm Magic)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;YAML&lt;/span&gt;
&lt;span class="na"&gt;schema_version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2.0"&lt;/span&gt;
&lt;span class="na"&gt;network&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;agentic-ai"&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Agentic&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;AI&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Blueprint&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;—&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;6-Pod&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Zero&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Trust"&lt;/span&gt;
  &lt;span class="na"&gt;deployment_scope&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;single-cluster"&lt;/span&gt;
  &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http&lt;/span&gt;          &lt;span class="c1"&gt;# network default&lt;/span&gt;

&lt;span class="na"&gt;pods&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ai-gateway"&lt;/span&gt;
    &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http-gateway"&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ai-orchestrator"&lt;/span&gt;
    &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ai-orchestrator"&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llm-gateway"&lt;/span&gt;
    &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llm-gateway"&lt;/span&gt;
    &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;websocket&lt;/span&gt;   &lt;span class="c1"&gt;# override for streaming LLM leg&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool-executor"&lt;/span&gt;
    &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool-executor"&lt;/span&gt;
    &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;websocket&lt;/span&gt;   &lt;span class="c1"&gt;# override for real-time tool feedback&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nlp-processor"&lt;/span&gt;
    &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nlp-processor"&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ai-results-sink"&lt;/span&gt;
    &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http-sink"&lt;/span&gt;

&lt;span class="na"&gt;connections&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ai-gateway&lt;/span&gt;
    &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ai-orchestrator&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ai-orchestrator&lt;/span&gt;
    &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;llm-gateway&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ai-orchestrator&lt;/span&gt;
    &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tool-executor&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;llm-gateway&lt;/span&gt;
    &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nlp-processor&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tool-executor&lt;/span&gt;
    &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nlp-processor&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nlp-processor&lt;/span&gt;
    &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ai-results-sink&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usually, mixing HTTP and WebSockets inside a service mesh requires complex, brittle L7 routing rules. The Lane7 blueprint handles this seamlessly by dropping the security down to Layer 4.&lt;/p&gt;

&lt;p&gt;Here is what is happening under the hood:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pure L4 Tunneling&lt;/strong&gt;: In the Envoy configuration, the Hopr &lt;code&gt;xtra4.wasm&lt;/code&gt; filter sits right before &lt;code&gt;envoy.tcp_proxy&lt;/code&gt;. This forms a pure Layer 4 persistent TCP tunnel.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Protocol Transparency&lt;/strong&gt;: Because the security (the CHIPS™ payload embedding, SEE™ encryption, and MAID™ rotation) happens at the TCP byte stream level, the protocol framing is entirely transparent. HTTP framing, WebSocket frames, and gRPC HTTP/2 frames all pass through the security layer identically.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Smart Egress Configuration&lt;/strong&gt;: The egress Envoy listener on the sending pod is automatically configured to speak whatever ingress protocol the receiving pod expects.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As DevOps engineers, we know that trying to force streaming LLM inference through a rigid HTTP request/response cycle introduces massive latency and timeout headaches. By utilizing an L4 TCP proxy with a 300-second idle timeout, this architecture keeps the WoSP tunnels alive, lets the application code talk natively to &lt;code&gt;localhost&lt;/code&gt; using whichever protocol fits best, and keeps the whole cluster secured by default.&lt;/p&gt;

&lt;p&gt;Let's talk about the elephant in the room for AI infrastructure: Prompt Injection via network interception.&lt;/p&gt;

&lt;p&gt;Most of the industry talks about Prompt Injection as an external, front-door problem—a user typing a malicious prompt into a chat UI. But as Platform Engineers, we have to operate under the assumption of breach. If a threat actor compromises a low-tier service in your cluster, they will attempt to move laterally by sniffing East-West traffic. In a traditional service mesh protected by static API tokens or long-lived mTLS certificates, an attacker can simply intercept a valid credential, replay it, and inject a malicious prompt directly into your internal &lt;code&gt;llm-gateway&lt;/code&gt; or &lt;code&gt;tool-executor&lt;/code&gt;. Suddenly, the attacker has autonomous control over your internal agents. Here is how the Lane7 Agentic AI architecture completely breaks that kill chain.&lt;/p&gt;

&lt;p&gt;Defeating Network-Level Prompt Injection with AMTD&lt;br&gt;
The 6-pod blueprint uses Hopr's Automated Moving Target Defense (AMTD) to secure all inter-pod communication. Instead of relying on static identities, the AMTD engine rotates cryptographic identities very frequently (configurable).&lt;br&gt;
Think about what this does to an attacker's window of opportunity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Interception&lt;/strong&gt;: An attacker manages to sniff the raw TCP stream between the &lt;code&gt;ai-orchestrator&lt;/code&gt; and the &lt;code&gt;llm-gateway&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Extraction&lt;/strong&gt;: They extract the session identity or credential.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Pivot&lt;/strong&gt;: They attempt to craft a malicious Prompt Injection payload and replay the hijacked credential.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Block&lt;/strong&gt;: Because the cryptographic identities rotate very often, the intercepted credential becomes completely useless almost instantly. The Hopr WoSP immediately drops the forged request.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By constantly shifting the attack surface at Layer 7, we strip the attacker of the time required to weaponize intercepted credentials.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Goal of Blueprints: Velocity and Simplicity
&lt;/h2&gt;

&lt;p&gt;While the Cloud Native AMTD security model is incredibly powerful, if I am being honest with you as a fellow DevOps engineer, the primary reason we build Lane7 blueprints isn't just security. It is about &lt;strong&gt;developer velocity and operational simplicity&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Building a Zero Trust application network from scratch usually requires a massive administrative tax. You have to stand up a Certificate Authority (CA), manage complex Public Key Infrastructure (PKI), and write thousands of lines of brittle YAML for Istio virtual services and sidecar injections.&lt;/p&gt;

&lt;p&gt;The Lane7 blueprints completely eliminate this overhead. Here is why this matters for your CI/CD pipelines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No PKI Overhead&lt;/strong&gt;: This blueprint implements a Zero Trust pipeline where no certificates, CAs, or PKI of any kind are required.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Application Code Stays Clean&lt;/strong&gt;: Developers write their code to talk natively to localhost. The WoSP sidecar handles all the secure transport and cross-cluster routing transparently, meaning no application code changes are required to achieve Zero Trust.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Instant Deployment&lt;/strong&gt;: The blueprint gives you a pre-validated "steel frame." You simply inject your custom LLM logic into the app.py stubs, build the images, and run a single bash deploy.sh script to spin up the entire 6-pod architecture.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And here are the steps to get started.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Select and download&lt;/strong&gt; a Lane7 Blueprint for free from our &lt;a href="https://www.hopr.co/lane7-blueprints#L7-catalog" rel="noopener noreferrer"&gt;Blueprint Catalog&lt;/a&gt;&lt;br&gt;
In a few minutes you will receive a Blueprint .zip bundle and a 30-day Free trial license&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Unzip the bundle&lt;/strong&gt; and follow the README&lt;br&gt;
Your license and credentials are in the 02-secrets.yaml for each pod&lt;br&gt;
Your Kubernetes manifests are pre-configured – no additional config is needed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create a cluster&lt;/strong&gt; (or use an existing one) in a local Kubernetes environment&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create Docker images&lt;/strong&gt; for each app.py (Dockerfile included in the blueprint) in each pod and insert the images in the cluster(s).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deploy&lt;/strong&gt; the app network with one command deploy.sh&lt;br&gt;
Monitor the pod deployments per the README&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Customize&lt;/strong&gt; the application in each pod. We made it easy to add your own business logic. Edit Section 1 only.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;An average DevOps can complete the deployment in about 15 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Lane 7
&lt;/h2&gt;

&lt;p&gt;We designed these blueprints because Platform Engineering teams shouldn't have to choose between shipping fast and staying secure. And by baking AMTD into a deployable template, you can accelerate the rollout of complex, multi-agent AI networks while simultaneously immunizing them against lateral movement and network-level prompt injection.&lt;/p&gt;

&lt;p&gt;By shifting to AMTD at the application/pod, we strip away the massive DevOps overhead of managing complex PKI and heavy service mesh configurations. We give the AI the low-latency communication it needs to execute ReAct loops efficiently, while ensuring that even if an agent is compromised, the blast radius is contained to a cryptographic zero.&lt;/p&gt;

&lt;p&gt;It's about enabling velocity for developers without compromising on Zero Trust. Let me know if you want to dive deeper into how we structure the Envoy filters or the SEE™ protocol!&lt;/p&gt;

&lt;h3&gt;
  
  
  Ready to build?
&lt;/h3&gt;

&lt;p&gt;You have two options: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Fast Track&lt;/strong&gt;: Download the pre-configured Agentic AI Blueprint directly from our &lt;a href="https://www.hopr.co/lane7-blueprints#L7-catalog" rel="noopener noreferrer"&gt;catalog&lt;/a&gt;. You'll get the Kubernetes manifests, a 30-day trial license, and the deploy scripts. Spin it up in 15 minutes. &lt;br&gt;
&lt;em&gt;Author's note&lt;/em&gt;: The security of our technologies has been classified as EAR and is subject to US export controls. (Just wanted to be upfront about that for this community)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Custom Track&lt;/strong&gt;: Have a unique use case? Contact us to discuss your use case, and we will construct the &lt;code&gt;topology.yaml&lt;/code&gt; and run it through our internal &lt;code&gt;lane7-compose&lt;/code&gt; engine and hand you a fully secured, bespoke Kubernetes blueprint for free. Don't waste days configuring service meshes.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What is you experience with building an Agentic AI app? How concerned are you with it's security? How much time do you spend with connection routing, policies, and access control?&lt;br&gt;
Please share your thoughts&lt;/p&gt;

</description>
      <category>devops</category>
      <category>security</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I Replaced 500 Lines of cert-manager Config With a 150-Line Blueprint</title>
      <dc:creator>Tom McNamara</dc:creator>
      <pubDate>Fri, 30 Jan 2026 16:34:49 +0000</pubDate>
      <link>https://dev.to/tommcnamara/i-replaced-500-lines-of-cert-manager-config-with-a-50-line-blueprint-2325</link>
      <guid>https://dev.to/tommcnamara/i-replaced-500-lines-of-cert-manager-config-with-a-50-line-blueprint-2325</guid>
      <description>&lt;h2&gt;
  
  
  The 3 AM Certificate Expiry Crisis
&lt;/h2&gt;

&lt;p&gt;Have you experienced this? Your phone explodes with PagerDuty alerts. A production API is down. Not because of bad code. Not because of a DDoS attack. But because an internal service certificate had expired.&lt;/p&gt;

&lt;p&gt;The irony? This happens even with "automated" certificate management via cert-manager. Even if there is 90-day rotation, monitoring and runbooks.&lt;/p&gt;

&lt;p&gt;This crisis is repeated all too often.&lt;/p&gt;

&lt;p&gt;My experience: a 6-hour restoration process:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Emergency cert renewal (45 minutes)&lt;/li&gt;
&lt;li&gt;Restarting pods to pick up new certs (30 minutes)&lt;/li&gt;
&lt;li&gt;Root cause analysis (2 hours)&lt;/li&gt;
&lt;li&gt;Writing a postmortem (1 hour)&lt;/li&gt;
&lt;li&gt;Updating runbooks so this "never happens again" (2 hours)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Three weeks later, a different service. Same issue. Different certificate.&lt;/p&gt;

&lt;p&gt;What did I learn? &lt;strong&gt;Automating certificate issuance isn't the same as eliminating certificate problems.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The real question isn't "how do we rotate certs faster?" &lt;/p&gt;

&lt;p&gt;It is: &lt;strong&gt;"Why are we using certificates at all for internal East-West traffic?"&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Here's What "Automated" Certificate Management Actually Looks Like
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;cert-manager for internal mTLS compared with Blueprint with Synchronous Ephemeral Encryption (SEE™)&lt;/strong&gt;&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%2Fcyrejd92lt0wsz3xre6h.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%2Fcyrejd92lt0wsz3xre6h.png" alt="cert-manager yaml comparison with Lane7 Blueprint" width="799" height="261"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before: cert-manager&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;See full typical &lt;a href="https://gist.github.com/TMM21042/f1ced4007f01c3fd0b382435ad34fd56" rel="noopener noreferrer"&gt;Cert Manager YAML gist&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;150+ lines of Certificate YAML&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Issuer configuration&lt;/li&gt;
&lt;li&gt;CertificateRequest management
&lt;/li&gt;
&lt;li&gt;Secret rotation scripts&lt;/li&gt;
&lt;li&gt;Monitoring alerts for expiry&lt;/li&gt;
&lt;li&gt;Runbooks for emergency renewal
&lt;strong&gt;= 200+ lines of config&lt;/strong&gt;
&lt;strong&gt;= 30% of platform team's time managing PKI&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;After: Lane7 Blueprint&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;See full typical &lt;a href="https://gist.github.com/TMM21042/8581fcc703a1b32028689e00c35f7c95" rel="noopener noreferrer"&gt;Blueprint pod YAML gist&lt;/a&gt;&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="c1"&gt;# This is the entire deployment&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
&lt;span class="na"&gt;metadata&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;web-app-pod-1&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# ... standard Kubernetes deployment&lt;/span&gt;
  &lt;span class="c1"&gt;# Workload Security Proxy (WoSP) sidecar handles all networking, identity, and encryption&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&amp;lt;150 lines total in Deployment YAML. Deploy in &amp;lt;30 minutes. &lt;br&gt;
Secret credentials rotate with each communication session (as fast as once per minute). Identity credentials rotate daily (or more frequently for active services). Both must be valid for trust verification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No certificates. No PKI. No 3 AM alerts.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The False Security Blanket of Automated PKI
&lt;/h2&gt;

&lt;p&gt;Here's what I thought "automating certificates" meant:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Auto-renewal every 90 days&lt;/li&gt;
&lt;li&gt;✅ Automated distribution to pods&lt;/li&gt;
&lt;li&gt;✅ Monitoring for expiry&lt;/li&gt;
&lt;li&gt;✅ Zero manual intervention&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sounds like Zero Trust, right?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrong. It's just "Zero Touch" issuance.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  The Problems That Automation Doesn't Solve:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. The "Secret Zero" Problem&lt;/strong&gt;&lt;br&gt;
How do you securely deliver the first secret that fetches the certificate? &lt;br&gt;
You bootstrap trust with... another secret. It's turtles all the way down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Certificate Authority = Single Point of Failure&lt;/strong&gt;&lt;br&gt;
Your entire cluster trusts one CA. If that CA is compromised (or misconfigured, or has a bug), your entire security model collapses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Every cert rotation is an entirely new pod identity&lt;/strong&gt;&lt;br&gt;
Every app loses its history of trusted interactions when a rotation occurs. It's former identity and any trust is completely abolished.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Handshake Overhead&lt;/strong&gt;&lt;br&gt;
Every connection requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Certificate validation&lt;/li&gt;
&lt;li&gt;Chain verification
&lt;/li&gt;
&lt;li&gt;Revocation checking (OCSP/CRL)&lt;/li&gt;
&lt;li&gt;Key exchange negotiation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This adds latency and CPU overhead to every single internal service call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Static Identity Window&lt;/strong&gt;&lt;br&gt;
Even with 90-day rotation, that certificate sits on disk for 90 days. If an attacker gets it on Day 1, they have 89 days to use it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Expiry Anxiety&lt;/strong&gt;&lt;br&gt;
No matter how good your automation, there's always the fear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What if the rotation script fails?&lt;/li&gt;
&lt;li&gt;What if the webhook times out?&lt;/li&gt;
&lt;li&gt;What if the monitoring alert gets missed?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  The Realization
&lt;/h3&gt;

&lt;p&gt;I realized that "automated PKI" wasn't actually Zero Trust—it was just faster legacy security. PKI works well for root domains because they are vetted by a third party. Vetting of workloads submitting a CSR doesn't happen. The interest is PKI for fast TLS connections - Not trust.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The chain of trust ended at the Certificate Authority, not at the workload itself.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Zero Trust includes frequent verification of trust - not just once. I needed a way to verify the identity of the service at runtime without relying on files sitting on disk.&lt;/p&gt;
&lt;h2&gt;
  
  
  What If Identity Changed Every Day or Sooner?
&lt;/h2&gt;

&lt;p&gt;I started researching alternatives to PKI certs for internal networking. Service meshes like Istio use SPIFFE/SPIRE, but they still use X.509 certificates (just with shorter lifespans. And they only "assert" trust not verify it - that's a big difference for true Zero Trust that requires verification).&lt;/p&gt;

&lt;p&gt;That's when I thought about &lt;strong&gt;Cloud Native AMTD (Automated Moving Target Defense)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The concept is simple but radical:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Traditional security:&lt;/strong&gt; Change the lock on the door every year.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AMTD:&lt;/strong&gt; Change the location of the door every day and change the lock on the door every time two apps connect. But only trusted entrants can know where the door is and have the keys to the lock, just at the time they need it.&lt;/p&gt;
&lt;h3&gt;
  
  
  How This Works With Cryptographic Identities:
&lt;/h3&gt;

&lt;p&gt;Instead of static certificates that sit on disk, what if the there  were two credentials - a cryptographic identity credential and a secret credential - that rotated continuously and were stored it the workload but verified externally ?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identities (with a verifiable chain of trust) rotate every 24 hours or sooner. &lt;/li&gt;
&lt;li&gt;Secrets rotating as fast as once per minute.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If an attacker captures a secret at 10:00:00, it's useless at 10:01.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But how do you rotate credentials that fast without constant handshakes, without key vaults, or key insertions?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's where CHIPS™ (Codes Hidden In Plain Sight) comes in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Secret credentials rotating every minute in a live deployment without a key exchange&lt;/strong&gt;&lt;br&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%2F3gakyoyuqeftna3rcwy0.gif" 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%2F3gakyoyuqeftna3rcwy0.gif" alt="Secret credential loge entries showing rotation every minute in a live deployment without a key exchange" width="720" height="638"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;In addition to automated secrets rotation, a Zero Trust identity credential also rotates daily (or sooner for active applications/services) without depending on a central control plane&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Both credentials must be right to access either workload in the connection&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Lane7 Blueprints: The "Easy Button" for AMTD
&lt;/h2&gt;

&lt;p&gt;After validating the AMTD approach provided by WoSP sidecars, we built &lt;strong&gt;Lane7 Blueprints&lt;/strong&gt;, pre-configured Kubernetes deployments that implement Zero Trust networking without PKI, and protect applications with a Cloud Native AMTD.&lt;/p&gt;
&lt;h3&gt;
  
  
  What You Get:
&lt;/h3&gt;

&lt;p&gt;Instead of stitching together cert-manager, Issuers, CertificateRequests, and rotation scripts, you get a working topology in one .zip bundle:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Available Blueprints:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bi-Pod&lt;/strong&gt; (A → B relay)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple two-service communication&lt;/li&gt;
&lt;li&gt;Perfect for API → Database&lt;/li&gt;
&lt;li&gt;Deploy in 5 minutes&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tri-Pod Fan-out&lt;/strong&gt; (A → B, A → C)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bifurcation pattern&lt;/li&gt;
&lt;li&gt;Deploy in 8 minutes&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tri-Pod Fan-In&lt;/strong&gt; (A → C, B → C)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aggregator pattern&lt;/li&gt;
&lt;li&gt;Deploy in 10 minutes&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each Blueprint includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ A basic Python app and Dockerfile (customizable business logic)&lt;/li&gt;
&lt;li&gt;✅ Pre-configured WoSP (Workload Security Proxy) sidecars&lt;/li&gt;
&lt;li&gt;✅ WoSP credentials and license (delivered securely)&lt;/li&gt;
&lt;li&gt;✅ All Kubernetes manifests (3 per pod in the blueprint)
&lt;/li&gt;
&lt;li&gt;✅ Topology design that defines per-pod access authorization&lt;/li&gt;
&lt;li&gt;✅ Documentation&lt;/li&gt;
&lt;li&gt;✅ Everything you need to deploy immediately&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  How It Works (High Level):
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Your Application:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Your app just talks HTTP to localhost
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;http://localhost:18001/api/data&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# simple app with replaceable business logic
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;WoSP Sidecar:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Intercepts the localhost request&lt;/li&gt;
&lt;li&gt;Encrypts with current rotating key (generated via CHIPS™)&lt;/li&gt;
&lt;li&gt;Sends to remote service's WoSP sidecar&lt;/li&gt;
&lt;li&gt;Remote WoSP decrypts (using its identical CHIPS-generated key)&lt;/li&gt;
&lt;li&gt;Delivers to remote app's localhost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;NOTE: The very first communication for a new connection between WoSPs includes an identity trust verification step&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your app never knows encryption is happening.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your app only sees traffic that is trusted.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The CHIPS™ and SEE™ Advantage:
&lt;/h3&gt;

&lt;p&gt;CHIPS (Codes Hidden In Plain Sight) solves the key distribution problem. And Synchronous Ephemeral Encryption (SEE™) builds the secure communication channel (even across cluster boundaries):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Both workloads are configured to use the same CHIPS™ algorithm (delivered once, securely).&lt;/li&gt;
&lt;li&gt;Seed material is collected on demand by Web Retriever when WoSPs run their CHIPS™ algorithm.&lt;/li&gt;
&lt;li&gt;Each WoSP runs its algorithm at the start of a new connection (communication session) and generate an identical secret using a proven PQC crypto library.&lt;/li&gt;
&lt;li&gt;The SEE™ protocol takes over from CHIPS™. Secrets are never passed or exchanged. They remain where they are generated and used as keys to encrypt or decrypt messages with their counterpart workload during the P2P session. The ephemeral keys exist for the session and vanish when the connection closes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No key exchange over wire = no handshake, no Secret Zero problem&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What This Means for You:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Deploy a Blueprint:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Bi-pod Blueprint (three manifests in each pod directory)&lt;/span&gt;
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; pod-1/ &lt;span class="nt"&gt;-f&lt;/span&gt; pod-2/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;10 minutes later:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Zero Trust application network at Layer 7 is active&lt;/li&gt;
&lt;li&gt;✅ Unique ephemeral credentials for each pair of communicating workloads&lt;/li&gt;
&lt;li&gt;✅ Workloads access protected by a Cloud Native AMTD&lt;/li&gt;
&lt;li&gt;✅ Data in transit secured without exposure of the session key&lt;/li&gt;
&lt;li&gt;✅ No certificates to manage&lt;/li&gt;
&lt;li&gt;✅ No CA to secure&lt;/li&gt;
&lt;li&gt;✅ No expiry to worry about&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;And you can sleep through the night.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  But Wait—What About My Application Code?
&lt;/h2&gt;

&lt;p&gt;Here's where Blueprints get really interesting.&lt;/p&gt;

&lt;p&gt;You're not just getting pre-configured Kubernetes YAML. &lt;strong&gt;You're getting a working "secure by defautl" network of applications that you can customize!&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The App Shell Feature
&lt;/h3&gt;

&lt;p&gt;The app in a Blueprint is a working "shell" with security built-in. Just swap in your business logic. &lt;/p&gt;

&lt;p&gt;Every Blueprint includes an HTTP Python application that handles all the WoSP integration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ HTTP server setup (aiohttp)&lt;/li&gt;
&lt;li&gt;✅ WoSP sidecar communication (localhost egress/ingress)&lt;/li&gt;
&lt;li&gt;✅ Message routing and queuing (async workers)&lt;/li&gt;
&lt;li&gt;✅ Error handling and retries&lt;/li&gt;
&lt;li&gt;✅ Background task orchestration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;You don't write this code. It's already done.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The file header says it all:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# -----------------------------------------------------------------------------
# Hopr.co Blueprint Demo Application
#
# The business logic within this file is provided free of charge for 
# demonstration purposes. Users are encouraged to modify the "Business Logic" 
# sections to test their application logic with the WoSP.
# -----------------------------------------------------------------------------
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What You DO Customize
&lt;/h3&gt;

&lt;p&gt;The app is structured with clear separation:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Section 1: Business Logic (MODIFY THIS)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ==============================================================================
# SECTION 1: BUSINESS LOGIC -- THIS SECTION CAN BE MODIFIED
# ==============================================================================
&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;my_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;is_initiator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Handles incoming POST requests.
    - Non-initiator pods: Adds the message to a queue to be forwarded.
    - Initiator pod: Receives the message, logs completion, and STOPS the chain.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# Your business logic here
&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initiator_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;my_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;A background task only for the first pod to start the relay race.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# Your business logic here
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Section 2: WoSP Integration (DO NOT MODIFY)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ==============================================================================
# SECTION 2: NETWORKING &amp;amp; COMMUNICATION (WoSP INTEGRATION) -- DO NOT MODIFY
# ==============================================================================
&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;send_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;my_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Sends a JSON payload to the local WoSP egress proxy.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# Infrastructure code - already done
&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;client_worker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;my_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;A background worker that pulls messages from the queue and sends them.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# Infrastructure code - already done
&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Main application entry point.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# Infrastructure code - already done
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Separation of Concerns
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What's handled for you (Section 2 - Don't Touch):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP server creation (&lt;code&gt;web.Application()&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Async client sessions with timeouts&lt;/li&gt;
&lt;li&gt;Message queuing (&lt;code&gt;asyncio.Queue&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;WoSP egress proxy communication (&lt;code&gt;http://localhost:18001/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Background worker orchestration&lt;/li&gt;
&lt;li&gt;Graceful shutdown handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What you customize (Section 1 - Modify Freely):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Message payload structure&lt;/li&gt;
&lt;li&gt;Message processing logic&lt;/li&gt;
&lt;li&gt;Initiation triggers and timing&lt;/li&gt;
&lt;li&gt;Completion handling&lt;/li&gt;
&lt;li&gt;Your application's data flow&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Real Example: The Serial Relay (Baton) App
&lt;/h3&gt;

&lt;p&gt;The default Bi-Pod Blueprint implements a &lt;strong&gt;relay race pattern&lt;/strong&gt;—a message (the "baton") travels from Pod A → Pod B → back to Pod A, building a trail of who touched it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Default Implementation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;my_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;is_initiator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;baton_num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;baton_number&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;is_initiator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Initiator receives the baton back - cycle complete
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🏁 CYCLE COMPLETE: Relay baton #&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;baton_num&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; retired.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Trail: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;trail&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json_response&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;accepted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Cycle complete. Baton #&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;baton_num&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; retired.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Non-initiator forwards the baton
&lt;/span&gt;        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✅ Queued baton #&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;baton_num&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; for delivery.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json_response&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;accepted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Baton accepted for forwarding.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initiator_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;my_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Initial delay
&lt;/span&gt;    &lt;span class="n"&gt;baton_counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;baton_counter&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🎬 Starting relay cycle for baton #&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;baton_counter&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;initial_payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;baton_number&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;baton_counter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;New relay from &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;my_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;trail&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;  &lt;span class="c1"&gt;# Tracks which pods touched this baton
&lt;/span&gt;        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;initial_payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Send a new baton every 20 seconds
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What this does:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Initiator pod creates a "baton" message every 20 seconds&lt;/li&gt;
&lt;li&gt;Message travels through the chain: Pod A → Pod B → Pod A&lt;/li&gt;
&lt;li&gt;Each pod appends its name to the &lt;code&gt;trail&lt;/code&gt; array&lt;/li&gt;
&lt;li&gt;When the baton returns to the initiator, the cycle completes&lt;/li&gt;
&lt;li&gt;Logs show: &lt;code&gt;Trail: ['pod-1', 'pod-2', 'pod-1']&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;This demonstrates the WoSP networking works. Now customize it for your use case.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Example 1: Turn It Into a Task Queue
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Change two functions to build a distributed task processor:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initiator_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;my_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Producer: Creates tasks for workers&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;task_counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;task_counter&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

        &lt;span class="c1"&gt;# Get next work item (e.g., from database, S3, message queue)
&lt;/span&gt;        &lt;span class="n"&gt;image_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_next_unprocessed_image&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="n"&gt;task_payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;task_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;task_counter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;task_type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_resize&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;image_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;target_size&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1024x768&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;created_at&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pending&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📋 Creating task #&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;task_counter&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;image_url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task_payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Create tasks as needed
&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;my_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;is_initiator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Worker: Processes tasks and returns results&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;task_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;task_id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;is_initiator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Initiator receives completed task
&lt;/span&gt;        &lt;span class="n"&gt;result_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;result_url&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;processing_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;processing_time&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✅ Task #&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; complete!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;   Result: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result_url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;   Processing time: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;processing_time&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;ms&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Store result (database, S3, etc.)
&lt;/span&gt;        &lt;span class="nf"&gt;save_result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json_response&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;accepted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Task #&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; result saved.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Worker processes the task
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🔧 Processing task #&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;start_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;result_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;resize_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; 
            &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;target_size&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;processing_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start_time&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;

        &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;result_url&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result_url&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;processing_time&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;processing_time&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;completed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;processed_by&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;my_name&lt;/span&gt;

        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Send result back to initiator
&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json_response&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;accepted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Task #&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; processed.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;You just built a distributed image processor with Zero Trust networking.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The WoSP infrastructure handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Encrypted communication between pods&lt;/li&gt;
&lt;li&gt;10-second credential rotation&lt;/li&gt;
&lt;li&gt;No certificates, no PKI, no handshakes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You just wrote the &lt;code&gt;resize_image()&lt;/code&gt; business logic.&lt;/p&gt;




&lt;h3&gt;
  
  
  Example 2: Turn It Into a Data Aggregator
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Change the same functions to collect sensor data:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initiator_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;my_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Coordinator: Initiates data collection rounds&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;round_counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;round_counter&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

        &lt;span class="n"&gt;collection_payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;round_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;round_counter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sensor_ids&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sensor_1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sensor_2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sensor_3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;readings&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;started_at&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📊 Starting data collection round #&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;round_counter&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;collection_payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Collect every minute
&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;my_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;is_initiator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Sensor nodes: Add readings and forward&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;round_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;round_id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;is_initiator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Coordinator receives complete dataset
&lt;/span&gt;        &lt;span class="n"&gt;readings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;readings&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;
        &lt;span class="n"&gt;duration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;started_at&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📈 Round #&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;round_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; complete!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;   Collected &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;readings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; readings in &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Analyze aggregated data
&lt;/span&gt;        &lt;span class="n"&gt;avg_temp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;temperature&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;readings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;readings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;   Average temperature: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;avg_temp&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;°C&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Store in time-series database
&lt;/span&gt;        &lt;span class="nf"&gt;store_readings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;round_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;readings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json_response&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;accepted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Round #&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;round_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; data stored.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Sensor node adds its reading
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🌡️  Adding reading for round #&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;round_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;reading&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sensor_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;my_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;temperature&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;get_temperature_reading&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;humidity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;get_humidity_reading&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;timestamp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;readings&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reading&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Forward to next sensor
&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json_response&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;accepted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Reading added from &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;my_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;You just built a distributed sensor network with secure, encrypted data collection.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Again, WoSP handles all the networking. You just wrote &lt;code&gt;get_temperature_reading()&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Example 3: Turn It Into an API Chain
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Same pattern, different business logic:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initiator_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;my_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Frontend: Accepts user requests&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# In a real app, this would be triggered by incoming HTTP requests
&lt;/span&gt;    &lt;span class="c1"&gt;# For demo, we'll simulate requests
&lt;/span&gt;    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;request_counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;request_counter&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

        &lt;span class="n"&gt;user_request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;request_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;request_counter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_123&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;action&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;get_recommendations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;context&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;location&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;San Francisco&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;preferences&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;italian&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;outdoor seating&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;enriched_data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;  &lt;span class="c1"&gt;# Services will populate this
&lt;/span&gt;        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🌐 Processing user request #&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_counter&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;my_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;is_initiator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Service chain: Each service enriches the request&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;request_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;request_id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;is_initiator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Frontend receives enriched response
&lt;/span&gt;        &lt;span class="n"&gt;enriched&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;enriched_data&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;

        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✅ Request #&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; processed!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;   User profile: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;enriched&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;user_profile&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;   Recommendations: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;enriched&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;recommendations&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Return to user
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json_response&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;success&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;enriched&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Each service adds its contribution
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;⚙️  Service &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;my_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; processing request #&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Enrich the request based on service type
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user-service&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;my_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;enriched_data&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;user_profile&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_user_profile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;user_id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;recommendation-service&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;my_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;enriched_data&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;recommendations&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_recommendations&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;enriched_data&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;user_profile&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;context&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Forward to next service
&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json_response&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;accepted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Processed by &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;my_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;You just built a microservices API chain with zero PKI overhead.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Blueprints Build Zero Trust App Networks: Same Infrastructure, Different Logic
&lt;/h3&gt;

&lt;p&gt;Notice the approach?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The WoSP infrastructure (Section 2) never changes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;send_message()&lt;/code&gt; - sends to localhost:18001&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;client_worker()&lt;/code&gt; - pulls from queue and sends&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;main()&lt;/code&gt; - sets up HTTP server and workers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Only the business logic (Section 1) changes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What data structure you send&lt;/li&gt;
&lt;li&gt;What processing you do when you receive it&lt;/li&gt;
&lt;li&gt;How you handle completion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The deployment stays the same:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; pod-1/ &lt;span class="nt"&gt;-f&lt;/span&gt; pod-2/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  The SDLC Reversal
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Traditional cert-manager/PKI flow:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Dev writes application code from scratch
2. Dev configures app to read TLS certificates from mounted volumes
3. Dev adds certificate rotation handling (watch for cert updates)
4. DevOps installs cert-manager in cluster
5. DevOps writes Certificate resources for each service
6. DevOps configures ClusterIssuer and CA infrastructure
7. DevOps writes Deployments with volume mounts for certs
8. Debug cert-manager issues:
   - "Certificate not ready"
   - TLS handshake failures
   - Apps caching old certificates
   - Rotation timing problems
9. Set up monitoring for certificate expiry
10. Write runbooks for emergency cert renewal
11. Deploy (finally)
12. Ongoing: Respond to cert expiry alerts, troubleshoot rotation failures
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Lane7 Blueprint flow:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. DevOps deploys secure Blueprint (10 minutes)
   ✅ HTTP server: done
   ✅ WoSP integration: done
   ✅ Async workers: done
   ✅ Zero Trust networking: done
   ✅ Rotating credentials: done (every 10 seconds)
   ✅ No certificates, no PKI, no CA infrastructure

2. Dev modifies two functions in Section 1 (30 minutes)
   ✅ initiator_task() - what to send
   ✅ handle_post() - what to do when received

   Dev doesn't touch:
   ❌ TLS configuration
   ❌ Certificate management
   ❌ Volume mounts for certs
   ❌ Rotation logic

3. Redeploy (5 minutes)
   ✅ kubectl apply -f deployment.yaml

4. Done
   ✅ No ongoing cert maintenance
   ✅ No expiry alerts
   ✅ No 3 AM pages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The difference:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Traditional (cert-manager)&lt;/th&gt;
&lt;th&gt;Lane7 Blueprints&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;12 steps to production&lt;/td&gt;
&lt;td&gt;3 steps to production&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2-4 days of work&lt;/td&gt;
&lt;td&gt;45 minutes of work&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ongoing maintenance (8-10 hrs/week)&lt;/td&gt;
&lt;td&gt;Zero maintenance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dev writes TLS integration code&lt;/td&gt;
&lt;td&gt;Dev writes only business logic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DevOps manages PKI infrastructure&lt;/td&gt;
&lt;td&gt;DevOps deploys and forgets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Certs expire (even with automation)&lt;/td&gt;
&lt;td&gt;Credentials rotate automatically&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The infrastructure is already there. Just add your logic.&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why This Matters
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;For Platform Teams:&lt;/strong&gt;&lt;br&gt;
You provide a &lt;strong&gt;secure, working application template&lt;/strong&gt;. Developers don't need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Understand WoSP sidecar integration&lt;/li&gt;
&lt;li&gt;❌ Learn Envoy proxy configuration&lt;/li&gt;
&lt;li&gt;❌ Debug async HTTP communication patterns&lt;/li&gt;
&lt;li&gt;❌ Manage credentials or certificates&lt;/li&gt;
&lt;li&gt;❌ Figure out localhost:18001 routing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For Developers:&lt;/strong&gt;&lt;br&gt;
You get a &lt;strong&gt;known-good starting point&lt;/strong&gt;. You don't need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Start from scratch with boilerplate&lt;/li&gt;
&lt;li&gt;❌ Learn Kubernetes networking internals&lt;/li&gt;
&lt;li&gt;❌ Worry about security (it's built-in)&lt;/li&gt;
&lt;li&gt;❌ Debug "why isn't my sidecar working?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You just write:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;code&gt;initiator_task()&lt;/code&gt; - your business logic for creating work&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;handle_post()&lt;/code&gt; - your business logic for processing work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For the Business:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Faster time-to-market (deploy in hours, not weeks)&lt;/li&gt;
&lt;li&gt;✅ Consistent patterns (all apps use same Blueprint structure)&lt;/li&gt;
&lt;li&gt;✅ Reduced complexity (one way to do internal networking)&lt;/li&gt;
&lt;li&gt;✅ Better security (Zero Trust by default, no optional PKI to misconfigure)&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  What Teams Can Build
&lt;/h3&gt;

&lt;p&gt;Using Blueprint app shells as templates, teams can build:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Processing:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ETL pipelines (extract → transform → load)&lt;/li&gt;
&lt;li&gt;Stream processing (ingest → filter → aggregate)&lt;/li&gt;
&lt;li&gt;Batch job orchestration (coordinator → workers → results)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Distributed Systems:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Task queues (producer → workers → collector)&lt;/li&gt;
&lt;li&gt;Request routers (frontend → services → aggregator)&lt;/li&gt;
&lt;li&gt;Event processing (source → handlers → sink)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Internal Services:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API relay chains (A → B → C enrichment)&lt;/li&gt;
&lt;li&gt;Microservice orchestration (secure by default)&lt;/li&gt;
&lt;li&gt;Service coordination patterns (leader → followers)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The development pattern is always:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clone the Blueprint app&lt;/li&gt;
&lt;li&gt;Modify Section 1 (business logic)&lt;/li&gt;
&lt;li&gt;Leave Section 2 (WoSP integration) untouched&lt;/li&gt;
&lt;li&gt;Deploy&lt;/li&gt;
&lt;/ol&gt;


&lt;h3&gt;
  
  
  From Baton to Production
&lt;/h3&gt;

&lt;p&gt;The serial relay "baton" app demonstrates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Messages flow through the chain correctly&lt;/li&gt;
&lt;li&gt;✅ WoSP sidecars encrypt/decrypt automatically&lt;/li&gt;
&lt;li&gt;✅ Credentials rotate every 10 seconds (check the logs)&lt;/li&gt;
&lt;li&gt;✅ No certificates needed&lt;/li&gt;
&lt;li&gt;✅ The infrastructure works&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Now make it yours:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replace &lt;code&gt;"baton_number"&lt;/code&gt; with &lt;code&gt;"task_id"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;"trail"&lt;/code&gt; with &lt;code&gt;"processing_steps"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Replace the relay logic with your business logic&lt;/li&gt;
&lt;li&gt;Keep the WoSP integration untouched&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Deploy. Test. Ship.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Next:&lt;/strong&gt; Let's look at the time savings this approach delivers in practice.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Before/After Timeline
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Before: Setting Up Internal mTLS with cert-manager&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 1: Infrastructure Setup&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Day 1-2: DevOps installs and configures cert-manager
- Install cert-manager via Helm
- Create internal CA (or configure external CA)
- Write ClusterIssuer resource
- Test certificate issuance
- Debug "Certificate not ready" errors

Day 3-4: DevOps writes per-service Certificate resources
- Certificate for Service A (DNS names, SANs, usages)
- Certificate for Service B
- Certificate for Service C...
- Configure renewal thresholds (renewBefore)
- Set up monitoring for certificate expiry

Day 5: DevOps writes Deployment YAMLs
- Volume mounts for TLS certificates
- Init containers to wait for certs (if needed)
- Environment variables pointing to cert paths
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Week 2: Application Integration&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Day 1-2: Dev modifies application code
- Read TLS cert and key from mounted volumes
- Configure HTTP client/server with TLS
- Add certificate rotation handling:
  * Watch certificate files for changes
  * Reload certs without downtime
  * Handle rotation failures gracefully

Day 3-4: Integration debugging
- "TLS handshake failure" errors
- Certificate validation issues
- Apps caching old certificates after rotation
- Timing problems (app starts before cert-manager issues cert)
- Volume mount permission issues

Day 5: Testing
- Test initial deployment
- Test certificate rotation
- Test certificate expiry scenarios
- Test CA rotation scenarios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Week 3: Production Deployment&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Day 1-2: Deploy to production
- Roll out cert-manager configuration
- Deploy services with new TLS code
- Monitor for certificate issues

Day 3-5: Operational overhead setup
- Create monitoring dashboards for cert expiry
- Set up alerts (15 days before expiry, 7 days, 1 day)
- Write runbooks:
  * Emergency certificate renewal
  * CA rotation procedures
  * Troubleshooting TLS handshake failures
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Ongoing (Forever):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monitor certificate expiry alerts&lt;/li&gt;
&lt;li&gt;Troubleshoot rotation failures&lt;/li&gt;
&lt;li&gt;Respond to 3 AM pages when certs expire&lt;/li&gt;
&lt;li&gt;Update runbooks after each incident&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;8-10 hours/week managing PKI infrastructure&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;After: Setting Up Lane7 Blueprints&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 1, Day 1 (Morning):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;9:00 AM: DevOps downloads Bi-Pod Blueprint
9:05 AM: kubectl apply -f namespace.yaml
9:06 AM: kubectl apply -f secrets.yaml (pre-configured credentials)
9:07 AM: kubectl apply -f deployment.yaml
9:10 AM: ✅ Services running with Zero Trust networking
         ✅ Credentials rotating every 10 seconds
         ✅ No certificates, no PKI, no CA

Infrastructure: DONE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Week 1, Day 1 (Afternoon):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2:00 PM: Dev opens blueprint Python app
2:05 PM: Reads Section 1 comments (business logic zone)
2:10 PM: Modifies initiator_task() for their use case
2:25 PM: Modifies handle_post() for their processing logic
2:30 PM: Tests locally (app talks to localhost:18001)
2:45 PM: kubectl apply -f deployment.yaml (redeploy)

Business logic: DONE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Week 1, Day 2:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Testing, refinement, ship to production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Ongoing (Forever):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nothing. Zero certificate maintenance.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Time saved per deployment: 4 days → 3 hours&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Time saved per week: 8-10 hours → 0 hours&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Peace of mind: Priceless&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture: App + WoSP + Web Retriever
&lt;/h2&gt;

&lt;p&gt;Lane7 Blueprints place three containers in each pod. The app uses a novel sidecar proxy, the WoSP, but with key security components. There is also a container for &lt;a href="https://gitlab.com/hoprco/web-retriever" rel="noopener noreferrer"&gt;Web Retriever&lt;/a&gt;, an open source project for Envoy deployments.&lt;/p&gt;

&lt;h3&gt;
  
  
  WoSP (Workload Security Proxy)
&lt;/h3&gt;

&lt;p&gt;An Envoy-based proxy that runs alongside your application container. The WoSP adds an Wasm filter to Envoy that that abstracts identity and secrets management from the app and eliminates the dependency on central identity managers like cert-manager.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Listens on localhost for your app's HTTP requests&lt;/li&gt;
&lt;li&gt;Encrypts traffic using current CHIPS-generated key&lt;/li&gt;
&lt;li&gt;Routes to remote service's WoSP sidecar&lt;/li&gt;
&lt;li&gt;Decrypts incoming encrypted traffic from remote WoSPs&lt;/li&gt;
&lt;li&gt;Rejects incoming traffic that fails decryption&lt;/li&gt;
&lt;li&gt;Delivers decrypted traffic to your app's localhost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What it doesn't do:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modify your application code&lt;/li&gt;
&lt;li&gt;Require changes to your app's configuration&lt;/li&gt;
&lt;li&gt;Add external dependencies to your app&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  1. CHIPS™ (Codes Hidden In Plain Sight)
&lt;/h4&gt;

&lt;p&gt;Patented cryptographic technology that generates ephemeral symmetric keys. What special about CHIPS™ is that it generates identical keys if two CHIPS™ algorithms run at nearly the same time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Technical approach:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dynamic elements are obtained by Web Retriever&lt;/li&gt;
&lt;li&gt;The CHIPS algorithm uses the dynamic elements to produce a seed&lt;/li&gt;
&lt;li&gt;Identical seed generation on both sides (no exchange needed)&lt;/li&gt;
&lt;li&gt;Seeds are used by proven symmetric post-quantum crypto library in key generation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why this works:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No key exchange = no handshake overhead&lt;/li&gt;
&lt;li&gt;No Secret Zero problem (seed delivered once, securely)&lt;/li&gt;
&lt;li&gt;Synchronized rotation = both sides always generate an identical key&lt;/li&gt;
&lt;li&gt;Fast rotation is automatic and self-contained&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. Synchronous Ephemeral Encryption (SEE™)
&lt;/h4&gt;

&lt;p&gt;A patented protocol that self-synchronizes session key generation and produces a bi-directional end-to-end encrypted communication channel (layer 7).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Synchronizes key generation at both ends&lt;/li&gt;
&lt;li&gt;Starts a secure communication session at both ends&lt;/li&gt;
&lt;li&gt;Rejects access attempts that fail decryption at either end&lt;/li&gt;
&lt;li&gt;Manages encryption/decryption&lt;/li&gt;
&lt;li&gt;Integrates with Envoy's HTTP filter chain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why SEE™:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There's no handshake to establish a session&lt;/li&gt;
&lt;li&gt;Session key is not exposed outside the pod&lt;/li&gt;
&lt;li&gt;There's no early termination to expose data&lt;/li&gt;
&lt;li&gt;Isolated from application&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. Machine Alias ID (MAID™)
&lt;/h4&gt;

&lt;p&gt;A rotating cryptographic identity credential that is derived from the history of a workload's activity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the MAID™ does:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identifies each workload participating in a communication session&lt;/li&gt;
&lt;li&gt;Meets the Zero Trust principal for frequent trust verification&lt;/li&gt;
&lt;li&gt;Builds the chain of trust in the workload and not the CA&lt;/li&gt;
&lt;li&gt;Prevents spoofing of the CHIPS/SEE processes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why MAID™:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Verified trust of workload identity before a session begins&lt;/li&gt;
&lt;li&gt;Eliminates PKI cryptographic key pairs, CSRs, or key managers&lt;/li&gt;
&lt;li&gt;Insensitive to CA identity trust boundaries&lt;/li&gt;
&lt;li&gt;Isolated from the application&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Flow:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your App → localhost:18001 → WoSP Sidecar (layer 7)
                              ↓ (encrypt with CHIPS key)
                              Network
                              ↓ (encrypted traffic)
Remote WoSP Sidecar → localhost:8000 → Remote App (layer 7)
(decrypt with same CHIPS key)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key insight:&lt;/strong&gt; Your app thinks it's talking HTTP to localhost. The app network exists at the application layer. The other layers see encrypted traffic only. The identity and secret credentials rotate frequently. A Cloud Native AMTD protects the pods and data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The magic:&lt;/strong&gt; Both WoSP sidecars generate the same key at the same time, without ever exchanging keys over the network.&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%2Fp23x0oyg7sx20en1bctq.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%2Fp23x0oyg7sx20en1bctq.png" alt="The WoSP sidecar and Its Components" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Lane7 Blueprints vs. cert-manager vs. Istio
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;cert-manager&lt;/th&gt;
&lt;th&gt;Istio (SPIFFE/SPIRE)&lt;/th&gt;
&lt;th&gt;Lane7 Blueprints&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Identity Model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;X.509 certificates&lt;/td&gt;
&lt;td&gt;X.509 certificates&lt;/td&gt;
&lt;td&gt;MAID credential&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rotation Frequency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;90 days (default)&lt;/td&gt;
&lt;td&gt;1-24 hours&lt;/td&gt;
&lt;td&gt;500 sessions (default)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PKI Required&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes (CA infrastructure)&lt;/td&gt;
&lt;td&gt;Yes (SPIRE server)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Secret Zero Problem&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes (how to get first cert)&lt;/td&gt;
&lt;td&gt;Yes (SPIRE agent bootstrap)&lt;/td&gt;
&lt;td&gt;No (self-generated seed)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Handshake Overhead&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High (TLS handshake)&lt;/td&gt;
&lt;td&gt;Medium (cached certs)&lt;/td&gt;
&lt;td&gt;None (self-generated PQC keys)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Config Complexity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High (200+ lines)&lt;/td&gt;
&lt;td&gt;Very High (1000+ lines)&lt;/td&gt;
&lt;td&gt;Low (150 lines)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scope&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cert issuance only&lt;/td&gt;
&lt;td&gt;Full service mesh&lt;/td&gt;
&lt;td&gt;East-West encryption&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deployment Time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2-4 days&lt;/td&gt;
&lt;td&gt;1-2 weeks&lt;/td&gt;
&lt;td&gt;&amp;lt;30 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ongoing Maintenance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8-10 hrs/week&lt;/td&gt;
&lt;td&gt;10-15 hrs/week&lt;/td&gt;
&lt;td&gt;0 hrs/week&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Learning Curve&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Steep&lt;/td&gt;
&lt;td&gt;Very Steep&lt;/td&gt;
&lt;td&gt;Gentle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best For&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Public-facing services&lt;/td&gt;
&lt;td&gt;Complex microservices with full mesh needs&lt;/td&gt;
&lt;td&gt;Internal Zero Trust service or app networking&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  When to Use Lane7 Blueprints:
&lt;/h3&gt;

&lt;p&gt;✅ &lt;strong&gt;Good fit:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Internal K8s service-to-service communication&lt;/li&gt;
&lt;li&gt;HTTP application networks, Agentic AI systems, You want Zero Trust without PKI complexity&lt;/li&gt;
&lt;li&gt;You want low cyber risk (high security) and Zero Trust&lt;/li&gt;
&lt;li&gt;You want micro-segmentation out-of-the-box. Only authorized routes work. This is Zero Trust by design.&lt;/li&gt;
&lt;li&gt;You don't need full service mesh features (traffic management, observability, etc.)&lt;/li&gt;
&lt;li&gt;You're US-based (EAR compliance requirement)&lt;/li&gt;
&lt;li&gt;You want to deploy and forge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❌ &lt;strong&gt;Not a good fit:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need Layer 7 traffic management (use Istio)&lt;/li&gt;
&lt;li&gt;You need built-in observability/tracing (use Linkerd)&lt;/li&gt;
&lt;li&gt;You need ingress/egress control (use a full mesh)&lt;/li&gt;
&lt;li&gt;You're outside the US (currently - international licensing coming)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  This Isn't a Silver Bullet (And That's OK)
&lt;/h2&gt;

&lt;p&gt;Before you rush to deploy, here are the limitations:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Protocols
&lt;/h3&gt;

&lt;p&gt;Blueprints are pre-configured for HTTP (Bi-Pod, Tri-Pod, Fan-Out-In). You can combine, chain, or stack multiple blueprints to build sophisticated service/application networks, but if you have other protocol needs, such at HL7, then contact us to move those up on our roadmap. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; Simplicity and security. Each topology has been tested and validated.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. East-West (Currently)
&lt;/h3&gt;

&lt;p&gt;Lane7 is for internal service-to-service traffic at the present time. You'll have to wait for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ingress (external → cluster traffic)&lt;/li&gt;
&lt;li&gt;Egress (cluster → external traffic)&lt;/li&gt;
&lt;li&gt;North-South traffic management (multi-cluster blueprints coming soon).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; We focused on solving one problem extremely well: internal mTLS without PKI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Workaround:&lt;/strong&gt; Use Lane7 for East-West + your existing ingress controller for North-South.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Need a particular Blueprint Pattern that's not yet in our &lt;a href="https://www.hopr.co/lane7-blueprints#L7-catalog" rel="noopener noreferrer"&gt;Lane7 catalog&lt;/a&gt;?&lt;/strong&gt;&lt;br&gt;
email us here: &lt;a href="mailto:lane7@hopr.co"&gt;lane7@hopr.co&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. US-Only (EAR Compliance)
&lt;/h3&gt;

&lt;p&gt;CHIPS™, SEE™, and MAID™ uses advanced cryptographic technology that is subject to US Export Administration Regulations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; WoSPs are US built technology and we're required to restrict delivery to US-based organizations. We are seeking ENC assessment to lessen the restriction and increase blueprint availability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Current status:&lt;/strong&gt; US-based organizations only.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Roadmap:&lt;/strong&gt; International licensing in progress. Email us if you're outside US and interested — we're tracking demand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; This is NOT ITAR (defense-specific). This is commercial export control (EAR). Similar to how many US crypto vendors start.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Not a Full Service Mesh
&lt;/h3&gt;

&lt;p&gt;The WoSPs in each Lane7 Blueprint are built on Envoy. So certain characteristics can be inherited from Envoy capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Traffic splitting / canary deployments&lt;/li&gt;
&lt;li&gt;Circuit breaking&lt;/li&gt;
&lt;li&gt;Throttling&lt;/li&gt;
&lt;li&gt;Built-in observability/tracing&lt;/li&gt;
&lt;li&gt;Load balancing policies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; Service meshes are complex because they do everything. We do one thing: Zero Trust machine identity and encrypted communication without PKI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Workaround:&lt;/strong&gt; If you need full mesh features, use Istio or Linkerd. If you just need encrypted East-West traffic without the overhead, use Lane7.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Early Stage Product
&lt;/h3&gt;

&lt;p&gt;You'll be in the first cohort of external users. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What this means:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ We're responsive to feedback&lt;/li&gt;
&lt;li&gt;✅ We monitor deployments via observability plane&lt;/li&gt;
&lt;li&gt;✅ We offer support (15-min calls, email, docs)&lt;/li&gt;
&lt;li&gt;⚠️ You're helping us improve the product&lt;/li&gt;
&lt;li&gt;⚠️ Best for greenfield or isolated workloads initially&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;If you need battle-tested:&lt;/strong&gt; Use Istio/Linkerd.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're OK being an early adopter:&lt;/strong&gt; Welcome aboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Questions Everyone Asks
&lt;/h2&gt;

&lt;h3&gt;
  
  
  "Why US-only? This seems arbitrary."
&lt;/h3&gt;

&lt;p&gt;Not arbitrary—it's US law. WoSPs use cryptographic technology subject to Export Administration Regulations (EAR). We're required to restrict delivery to US-based organizations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EAR ≠ ITAR.&lt;/strong&gt; This is commercial export control, not defense-specific. Most US crypto vendors either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;(a) Go through export approval (takes 6-12 months)&lt;/li&gt;
&lt;li&gt;(b) Use exemptions (limited use cases)&lt;/li&gt;
&lt;li&gt;(c) Restrict to US initially (our approach)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We chose (c) to move fast and stay compliant. &lt;/p&gt;

&lt;p&gt;If you're outside the US: Email us at &lt;a href="mailto:lane7@hopr.co"&gt;lane7@hopr.co&lt;/a&gt;. We're tracking demand.&lt;/p&gt;




&lt;h3&gt;
  
  
  "How does CHIPS™ actually work? Sounds like magic."
&lt;/h3&gt;

&lt;p&gt;Not magic—just a novel approach to key generation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simple explanation:&lt;/strong&gt; Like TOTP (Google Authenticator) but not time-based. It is event-based. A connection between two pods starts CHIPS/SEE for encryption keys.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Technical explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Both workloads have WoSPs configured to use the same CHIPS algorithm. There are many thousands of them!&lt;/li&gt;
&lt;li&gt;License confirms the validity of a WoSP&lt;/li&gt;
&lt;li&gt;Each workload runs identically configured WoSPs&lt;/li&gt;
&lt;li&gt;Credentials rotate based on the session activity of the App&lt;/li&gt;
&lt;li&gt;No key exchange over wire = no handshake needed&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;This is NOT novel cryptography.&lt;/strong&gt; We're not inventing ciphers. It's a novel application of well-understood primitives (AES).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Validated:&lt;/strong&gt; 3rd-party independent security analysis + ethical hacker review.&lt;/p&gt;




&lt;h3&gt;
  
  
  "What happens if credentials get out of sync?"
&lt;/h3&gt;

&lt;p&gt;They're designed to be independent (not synchronized) as a security measure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MAID™ (identity) verified by observability plane&lt;/li&gt;
&lt;li&gt;SEE™ (secrets) verified locally in WoSP&lt;/li&gt;
&lt;li&gt;Two different verification points = no single point of compromise&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An attacker capturing one credential cannot derive the other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fault tolerance:&lt;/strong&gt;&lt;br&gt;
The system handles temporary issues (network delays, transient failures) with automatic re-attempts. Connections fail closed (deny) rather than open.&lt;/p&gt;

&lt;p&gt;This is different from PKI where compromising the CA compromises everything.&lt;/p&gt;




&lt;h3&gt;
  
  
  "Is this production-ready?"
&lt;/h3&gt;

&lt;p&gt;Depends on your definition.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Current state:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ We run this in production for some workloads&lt;/li&gt;
&lt;li&gt;✅ Pre-configured and tested Blueprints&lt;/li&gt;
&lt;li&gt;✅ Observability plane monitoring&lt;/li&gt;
&lt;li&gt;✅ Support available&lt;/li&gt;
&lt;li&gt;✅ Free Blueprints on for local development and non-commercial use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚠️ Early stage (first external user cohort)&lt;/li&gt;
&lt;li&gt;⚠️ US-only (EAR)&lt;/li&gt;
&lt;li&gt;⚠️ Expanding to additional blueprints for non-HTTP protocols&lt;/li&gt;
&lt;li&gt;⚠️ Best for greenfield initially&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;If you need:&lt;/strong&gt; Battle-tested, enterprise SLA → We have a paid tier for commercial use in a production environment&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're OK with:&lt;/strong&gt; Early adopter status, working with us to improve → Try it now&lt;/p&gt;




&lt;h3&gt;
  
  
  "What's the catch? Why is this free?"
&lt;/h3&gt;

&lt;p&gt;Free Blueprints = Create demand and increase adoption&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FREE tier:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;45-day license for each WoSP in the Blueprint&lt;/li&gt;
&lt;li&gt;Pre-configured topologies and messaging patterns&lt;/li&gt;
&lt;li&gt;non-commercial use (proof of concept)&lt;/li&gt;
&lt;li&gt;intended for Dev environments&lt;/li&gt;
&lt;li&gt;US-only&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;PAID tier (coming soon):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;365-day licenses&lt;/li&gt;
&lt;li&gt;Commercial use&lt;/li&gt;
&lt;li&gt;Intended for production environment&lt;/li&gt;
&lt;li&gt;Priority support&lt;/li&gt;
&lt;li&gt;Enterprise scaling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The catch:&lt;/strong&gt; We need early adopters to validate the product. You're not the product. We're building a business around the WoSP/Lane7 and using free tier to accelerate adoption.&lt;/p&gt;

&lt;p&gt;When you need longer licenses or custom topologies → you become a paying customer.&lt;/p&gt;




&lt;h3&gt;
  
  
  "How is this different from Istio/Linkerd?"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scope:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Istio/Linkerd = Full service mesh (traffic management, observability, security)&lt;/li&gt;
&lt;li&gt;Lane7 = East-West Zero Trust communications (one problem solved extremely well)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Identity:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Istio/Linkerd = X.509 certs via SPIFFE/SPIRE (still PKI)&lt;/li&gt;
&lt;li&gt;Lane7 = MAID™ with Zero Trust verification (no PKI)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Complexity:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Istio = 1000+ lines of config, control plane, sidecars, learning curve&lt;/li&gt;
&lt;li&gt;Lane7 = 150 lines, all deployment manifests, deploy in &amp;lt;30 min&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use case:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you need full mesh → Istio/Linkerd&lt;/li&gt;
&lt;li&gt;If you just want internal mTLS without PKI overhead and complexity → Lane7&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not replacements. Different tools for different needs.&lt;/p&gt;




&lt;h3&gt;
  
  
  "Can I see the code?"
&lt;/h3&gt;

&lt;p&gt;WoSP uses open-source components (Envoy, etc.), but CHIPS™, SEE™, and MAID™ are patented proprietary crypto licensed by Hopr. The Cloud Native AMTD they produce is also protected by US patent.&lt;/p&gt;

&lt;p&gt;We've already open-sourced &lt;a href="https://gitlab.com/hoprco/web-retriever" rel="noopener noreferrer"&gt;Web Retriever&lt;/a&gt;, but the other technologies will remain licensed and controlled due to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EAR compliance requirements&lt;/li&gt;
&lt;li&gt;Intellectual property protection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You get full access to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Blueprint YAML configurations&lt;/li&gt;
&lt;li&gt;Deployment manifests&lt;/li&gt;
&lt;li&gt;Documentation on how everything works&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Technical deep dive on WoSP/CHIPS coming in a follow-up post.&lt;/p&gt;

&lt;h2&gt;
  
  
  You Don't Have to Live Like This
&lt;/h2&gt;

&lt;p&gt;Six months ago, our team spent 8-10 hours a week confronting complex configurations and yaml hell:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monitoring expiry dates&lt;/li&gt;
&lt;li&gt;Troubleshooting rotation failures&lt;/li&gt;
&lt;li&gt;Responding to broken configs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Today: 0 hours per week.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not because we got better at certificate management. Because we stopped using certificates for internal traffic entirely.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Shift in Thinking
&lt;/h3&gt;

&lt;p&gt;We don't have to manage PKI like it's 2015. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero Trust doesn't require certificates.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It requires verifiable identity trust. And there are better ways to establish identity than files sitting on disk for 90 days.&lt;/p&gt;

&lt;p&gt;Cloud Native AMTD (Automated Moving Target Defense) from the WoSP has been a game changer. And now, with Lane7 Blueprints, you don't need to be an advanced DevOps to quickly build an app network that is secure by default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No PKI. No certificates. No Secret Zero. No 3 AM alerts.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Try It Yourself
&lt;/h3&gt;

&lt;p&gt;The fastest way to see this in action is to deploy one of the two free Blueprints. the &lt;strong&gt;Bi-Pod Blueprint&lt;/strong&gt; or the &lt;strong&gt;Quad-Pod Blueprint&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sign up (US-based orgs only): &lt;a href="https://hopr.co/lane7-blueprints#l7-catalog" rel="noopener noreferrer"&gt;Lane7 Blueprints Catalog&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Download your Blueprint (pre-configured with credentials)&lt;/li&gt;
&lt;li&gt;Deploy: 

&lt;ul&gt;
&lt;li&gt;Bi-Pod: &lt;code&gt;kubectl apply -f pod-1/ -f pod-2/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Quad-Pod: &lt;code&gt;kubectl apply -f pod-1/ -f pod-2/ -f pod-3/ -f pod-4/&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Watch the keys rotate every 60 seconds in the logs&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Free 45-day license. Deploy in &amp;lt;30 minutes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Technical documentation: &lt;a href="https://docs.hopr.co" rel="noopener noreferrer"&gt;https://docs.hopr.co&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Questions? Email: &lt;a href="mailto:support@hopr.co"&gt;support@hopr.co&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Coming next:&lt;/strong&gt; A technical deep dive on WoSP decentralized credential management and cryptographic innovations. &lt;br&gt;
I'll explain how CHIPS™, SEE™, and MAID™ work together to secure apps, reject threat traffic, protect data in transit everywhere, and how this compares to Diffie-Hellman and SPIFFE/SPIRE.&lt;/p&gt;

&lt;p&gt;If you want to be notified when that post drops, follow me here on Dev.to.&lt;/p&gt;

&lt;p&gt;And if you deploy a Free Blueprint, I'd love to hear how it goes. Drop a comment below.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;May your certificates never expire at 3 AM again.&lt;/strong&gt; 🙂&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>security</category>
      <category>zerotrust</category>
    </item>
  </channel>
</rss>
