<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[System Design Interview Roadmap: AI & AI Agents]]></title><description><![CDATA[AI & AI Agents]]></description><link>https://systemdr.systemdrd.com/s/ai-and-ai-agents</link><image><url>https://substackcdn.com/image/fetch/$s_!_3Z_!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fd573e1-44ca-4a06-be42-264560574975_500x500.png</url><title>System Design Interview Roadmap: AI &amp; AI Agents</title><link>https://systemdr.systemdrd.com/s/ai-and-ai-agents</link></image><generator>Substack</generator><lastBuildDate>Thu, 21 May 2026 21:10:34 GMT</lastBuildDate><atom:link href="https://systemdr.systemdrd.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[SystemDR Inc]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[systemdr@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[systemdr@substack.com]]></itunes:email><itunes:name><![CDATA[System Design Roadmap]]></itunes:name></itunes:owner><itunes:author><![CDATA[System Design Roadmap]]></itunes:author><googleplay:owner><![CDATA[systemdr@substack.com]]></googleplay:owner><googleplay:email><![CDATA[systemdr@substack.com]]></googleplay:email><googleplay:author><![CDATA[System Design Roadmap]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Building a Research Chat App on LangChain Managed Deep Agents (With Human Approval Before Web Search)]]></title><description><![CDATA[Master the Blueprint of Modern AI Engineering Go Beyond Prompting and Learn How Real AI Systems Are Built, Scaled, and Deployed in Production.]]></description><link>https://systemdr.systemdrd.com/p/building-a-research-chat-app-on-langchain</link><guid isPermaLink="false">https://systemdr.systemdrd.com/p/building-a-research-chat-app-on-langchain</guid><dc:creator><![CDATA[System Design Roadmap]]></dc:creator><pubDate>Thu, 21 May 2026 13:51:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!DqcK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62f80629-6682-4f21-ac83-a559ec139048_1194x1162.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="callout-block" data-callout="true"><p>Master the Blueprint of Modern AI Engineering Go Beyond Prompting and Learn How Real AI Systems Are Built, Scaled, and Deployed in Production. AI engineering is no longer about calling...</p><p><a href="https://systemdrd.com/ebooks/ai-engineers-blueprint">https://systemdrd.com/ebooks/ai-engineers-blueprint</a></p></div><p>Most &#8220;AI demos&#8221; are a text box wired to an LLM. That works until the model tries to <strong>search the web</strong>, <strong>read a URL</strong>, or <strong>spend money on tools</strong> without you noticing.</p><p>This project is different. It is a small but complete app: a React chat UI, a FastAPI backend, and an agent definition you keep in Git. The interesting part is not the chat bubbles&#8212;it is how the same UI talks to <strong>three different runtimes</strong> (cloud managed agent, local open-source agent, or your own LangGraph deployment) and how it <strong>pauses the agent</strong> until a human approves a web search.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://systemdr.systemdrd.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">System Design Interview Roadmap is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>If you have been following system design topics&#8212;timeouts, idempotency, backpressure, &#8220;who owns state?&#8221;&#8212;you will recognize the same questions here, just with agents instead of microservices</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DqcK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62f80629-6682-4f21-ac83-a559ec139048_1194x1162.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DqcK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62f80629-6682-4f21-ac83-a559ec139048_1194x1162.png 424w, https://substackcdn.com/image/fetch/$s_!DqcK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62f80629-6682-4f21-ac83-a559ec139048_1194x1162.png 848w, https://substackcdn.com/image/fetch/$s_!DqcK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62f80629-6682-4f21-ac83-a559ec139048_1194x1162.png 1272w, https://substackcdn.com/image/fetch/$s_!DqcK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62f80629-6682-4f21-ac83-a559ec139048_1194x1162.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DqcK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62f80629-6682-4f21-ac83-a559ec139048_1194x1162.png" width="1194" height="1162" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/62f80629-6682-4f21-ac83-a559ec139048_1194x1162.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1162,&quot;width&quot;:1194,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:86610,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://langchaineco.substack.com/i/198707391?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62f80629-6682-4f21-ac83-a559ec139048_1194x1162.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!DqcK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62f80629-6682-4f21-ac83-a559ec139048_1194x1162.png 424w, https://substackcdn.com/image/fetch/$s_!DqcK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62f80629-6682-4f21-ac83-a559ec139048_1194x1162.png 848w, https://substackcdn.com/image/fetch/$s_!DqcK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62f80629-6682-4f21-ac83-a559ec139048_1194x1162.png 1272w, https://substackcdn.com/image/fetch/$s_!DqcK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62f80629-6682-4f21-ac83-a559ec139048_1194x1162.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2><strong>What you are looking at</strong></h2><p>Open the app and you get a <strong>Research Assistant</strong>. You type a question. The agent can plan, take notes in a virtual filesystem, search the web, read pages, and even call a <strong>fact-checker subagent</strong> for specific claims.</p><p>Github : <a href="https://github.com/sysdr/langchain-echosystem">https://github.com/sysdr/langchain-echosystem</a></p><p>The repo is called langchain-echosystem . Layout: </p><p>langchain-echosystem/</p><p>&#9500;&#9472;&#9472; agent/          &#8592; what the agent *is* (instructions, tools, skills)</p><p>&#9500;&#9472;&#9472; backend/        &#8592; API + runtime switch</p><p>&#9500;&#9472;&#9472; frontend/       &#8592; chat UI + approval modal</p><p>&#9492;&#9472;&#9472; langgraph.json  &#8592; optional deploy to LangSmith</p><p>Three layers, one product:</p><p><strong>LayerJob</strong></p><p><code>agent/</code></p><p>Personality, tools, when to ask a human</p><p><code>backend/</code></p><p>Pick runtime, stream tokens, handle interrupts</p><p><code>frontend/</code></p><p>Show chat, block input until you Approve/Reject</p><div><hr></div><h2><strong>The agent is just files in </strong><code>agent/</code></h2><p>Managed Deep Agents let you define an agent from the repo instead of clicking around a dashboard. That matters for newsletters and teams: <strong>version control beats copy-paste</strong>.</p><h3><strong>Instructions (</strong><code>agent/AGENTS.md</code><strong>)</strong></h3><p>The agent is told to behave like a careful researcher:</p><ul><li><p>Clarify vague questions</p></li><li><p>Search when facts need the outside world</p></li><li><p><strong>Not invent citations</strong></p></li><li><p>Use bullet points and links</p></li><li><p>Delegate doubtful claims to a fact-checker</p></li></ul><p>There is also a <code>/memories/preferences.txt</code> convention&#8212;durable user prefs saved across chats. That is a simple pattern for &#8220;long-term memory&#8221; without a separate database in this demo.</p><h3><strong>Tools (</strong><code>agent/tools.json</code><strong>)</strong></h3><p>Two tools come from LangChain&#8217;s <strong>Fleet</strong> MCP server:</p><ul><li><p><code>tavily_web_search</code></p></li><li><p><code>read_url_content</code></p></li></ul><p>The important line is <code>interrupt_config</code>. Web search is set to <strong>require human approval</strong>; reading a URL does not:</p><p>&#8220;interrupt_config&#8221;: {</p><p>&#8220;https://tools.langchain.com::tavily_web_search::Fleet&#8221;: true,</p><p>&#8220;https://tools.langchain.com::read_url_content::Fleet&#8221;: false</p><p>}</p><p>From a system design angle: this is <strong>policy as data</strong>. You are not hard-coding &#8220;if tool == search then pause&#8221; in Python; you declare it once and provision pushes it to the cloud agent.</p><h3><strong>Skills and subagents</strong></h3><ul><li><p><code>agent/skills/research/SKILL.md</code> &#8212; multi-step research workflow (plan &#8594; search &#8594; notes &#8594; synthesis).</p></li><li><p><code>agent/subagents/fact-checker.md</code> &#8212; narrow job: verify claims, label Supported / Contradicted / Insufficient evidence, cite URLs.</p></li></ul><p>Subagents are the agent equivalent of <strong>calling a specialist service</strong> instead of bloating one prompt.</p><div><hr></div><h2><strong>One backend, three ways to run the brain</strong></h2><p>The backend does not assume you always have LangSmith preview access. <code>AGENT_RUNTIME</code> in <code>.env</code> can be <code>auto</code>, <code>managed</code>, <code>local</code>, or <code>deployment</code>.</p><p><code>backend/app/config.py</code> resolves <code>auto</code> like this:</p><ol><li><p>If <code>LANGGRAPH_DEPLOYMENT_URL</code> is set &#8594; <strong>deployment</strong></p></li><li><p>Else if <code>MANAGED_AGENT_ID</code> + API key &#8594; <strong>managed</strong></p></li><li><p>Else &#8594; <strong>local</strong></p></li></ol><p><code>get_runtime()</code> in <code>backend/app/runtime/__init__.py</code> returns one of three classes with the <strong>same interface</strong>: create thread, stream chat, resolve interrupt, resume stream.</p><p>That is classic <strong>strategy pattern</strong> thinking: one API contract, pluggable implementations. Your frontend never branches on &#8220;are we local today?&#8221;</p><h3><strong>Managed mode (production-shaped)</strong></h3><p><code>ManagedRuntime</code> talks to LangSmith&#8217;s <code>/v1/deepagents</code> API via <code>DeepAgentsClient</code>. It creates a thread, starts a streamed run, maps LangChain events to SSE:</p><ul><li><p><code>messages</code> &#8594; token chunks for the UI</p></li><li><p><code>values</code> &#8594; if there is an interrupt, emit an <code>interrupt</code> event</p></li></ul><p>You provision the cloud agent once:</p><p>make provision</p><p><code>backend/scripts/provision_agent.py</code> reads everything under <code>agent/</code>, builds a JSON payload (instructions, tools, subagents, skills), POSTs or PATCHes the Managed Deep Agents API, and writes <code>MANAGED_AGENT_ID</code> back into <code>.env</code>. Change <code>AGENTS.md</code>, run provision again&#8212;the cloud agent updates. <strong>Git is the source of truth.</strong></p><p><code>REQUIRE_HITL_APPROVAL</code> env toggles whether web search needs approval at provision time&#8212;useful for demos vs stricter prod.</p><h3><strong>Local mode (laptop-friendly)</strong></h3><p><code>LocalRuntime</code> uses open-source <code>deepagents</code> with an in-memory checkpointer. It still loads <code>AGENTS.md</code> as the system prompt, but web search is a <strong>stub</strong> that tells you to use managed mode for real search.</p><p>Good for UI work and backend tests without cloud keys. Bad for &#8220;did it really find that paper?&#8221;&#8212;by design.</p><h3><strong>Deployment mode (your own graph)</strong></h3><p><code>backend/agent.py</code> defines a LangGraph-compatible graph with <code>create_deep_agent</code>. <code>langgraph.json</code> points at it for <code>langgraph up</code>. Point <code>LANGGRAPH_DEPLOYMENT_URL</code> and <code>LANGGRAPH_ASSISTANT_ID</code> at that deployment and <code>AGENT_RUNTIME=deployment</code>.</p><p>Same agent instructions file; different hosting. Useful when you want <strong>your</strong> infra and observability, not only the managed API.</p><div><hr></div><h2><strong>How a message travels through the system</strong></h2><p>Here is the happy path in managed mode:</p><p>You (browser)</p><p>  &#8594; POST /api/conversations          (new thread_id)</p><p>  &#8594; POST /api/chat/stream            (SSE: tokens + maybe interrupt)</p><p>  &#8594; [optional] POST resolve-interrupt</p><p>  &#8594; [optional] POST resume-stream    (more SSE tokens)</p><p><strong>SSE (Server-Sent Events)</strong> means the server pushes many small events on one HTTP response. The frontend&#8217;s <code>api.ts</code> parses <code>event:</code> and <code>data:</code> lines&#8212;no WebSocket server required. For token streaming, that is often enough and simpler to operate behind proxies.</p><p><code>backend/app/routes/chat.py</code> wraps the runtime iterator in <code>EventSourceResponse</code>. Event types include <code>token</code>, <code>interrupt</code>, <code>error</code>, and <code>done</code>.</p><p>On the React side (<code>App.tsx</code>):</p><ol><li><p>User sends message &#8594; append user bubble + empty assistant bubble.</p></li><li><p><code>streamChat</code> feeds tokens into the assistant bubble (markdown via <code>react-markdown</code>).</p></li><li><p>If <code>onInterrupt</code> fires &#8594; show <code>InterruptPrompt</code> modal, disable composer.</p></li><li><p>Approve &#8594; <code>resolveInterrupt</code> then <code>resumeStream</code> continues the same assistant message.</p></li><li><p>Reject &#8594; run stops; status says tool rejected.</p></li></ol><p>The modal (<code>InterruptPrompt.tsx</code>) is deliberately plain: tool name, description, Approve / Reject. No mystery about what the agent wanted to do.</p><p><strong>System design takeaway:</strong> the interrupt is a <strong>synchronization point</strong>. The agent&#8217;s run is not &#8220;failed&#8221;; it is <strong>blocked</strong> until an external decision arrives&#8212;like waiting on a human task in a workflow engine, or a payment authorization hold.</p><div><hr></div><h2><strong>Human-in-the-loop in one paragraph</strong></h2><p>Without HITL, an agent can issue searches you did not intend (wrong query, leaked context, cost). With HITL:</p><ol><li><p>Agent decides it needs <code>tavily_web_search</code>.</p></li><li><p>Runtime surfaces an interrupt in the stream.</p></li><li><p>UI stops; user approves or rejects.</p></li><li><p><code>resolve_interrupt</code> tells the API the decision.</p></li><li><p><code>resume-stream</code> continues generation.</p></li></ol><p>That is <strong>fail-safe by default</strong> for the risky tool only. Reading URLs stays automatic&#8212;policy choice, not universal slowdown.</p><p>For interviews: relate this to <strong>circuit breakers</strong>, <strong>approval workflows</strong>, and <strong>least privilege</strong>. The agent does not get unfettered egress; it gets egress <strong>after</strong> a human gate for the sensitive action.</p><div><hr></div><h2><strong>Frontend: small surface, clear states</strong></h2><p>The UI is one main component plus the interrupt overlay. State that matters:</p><ul><li><p><code>health</code> &#8212; from <code>/api/health</code>: which runtime, is it <code>ready</code>?</p></li><li><p><code>threadId</code> / <code>agentId</code> &#8212; conversation scope</p></li><li><p><code>interrupt</code> &#8212; blocks send until resolved</p></li><li><p><code>loading</code> / <code>resolving</code> &#8212; button and textarea disabled appropriately</p></li></ul><p>The header shows <strong>Managed Deep Agents</strong> vs <strong>Local</strong> vs <strong>LangSmith Deployment</strong> so you are never confused about which brain is answering.</p><p>Sample prompts on the empty state nudge system-design-style questions (&#8220;tradeoffs in agent memory&#8221;, &#8220;LangGraph durable execution&#8221;, &#8220;RAG vs long context&#8221;)&#8212;aligned with what your readers care about.</p><div><hr></div><h2><strong>Docker and Makefile: how you actually run it</strong></h2><p>cp .env.example .env</p><p>make install</p><p>make provision    <em># managed mode</em></p><p>make backend      <em># :8000</em></p><p>make frontend     <em># :5173</em></p><p>Or <code>make docker-up</code> &#8594; frontend on <strong>3000</strong>, backend on <strong>8000</strong>, healthcheck on the API before the UI container starts. Compose wires CORS for local and container hostnames.</p><p>The Makefile is thin on purpose: install, provision, run, docker. No hidden magic.</p><div><hr></div><h2><strong>What I would tell a system design reader</strong></h2><ol><li><p><strong>Separate &#8220;agent definition&#8221; from &#8220;runtime.&#8221;</strong> Files in <code>agent/</code> vs Python runtimes&#8212;same product, different ops models.</p></li><li><p><strong>Stream tokens; don&#8217;t buffer the whole answer.</strong> SSE keeps latency honest and UX responsive.</p></li><li><p><strong>Treat tool calls as side effects.</strong> Search is an side effect; gate it with HITL config, not hope.</p></li><li><p><strong>Subagents bound blast radius.</strong> Fact-checking is a focused delegate, not a bigger main prompt.</p></li><li><p><strong>Provision script = deployment pipeline for agents.</strong> CI could run <code>provision_agent.py</code> on every merge to <code>agent/</code>.</p></li></ol><p>This is not a billion-user architecture. It is a <strong>correct end-to-end slice</strong>: auth to API keys in env, threaded conversations, streaming, interrupts, multi-runtime fallback, and deploy hooks. That is exactly what you want before scaling traffic&#8212;get the state machine right first.</p><div><hr></div><h2><strong>Try it yourself</strong></h2><p>Clone the repo, set keys per <code>.env.example</code>, run <code>make provision</code> if you have LangSmith managed access, then ask something that needs the web. When the approval modal appears, you are seeing the <code>interrupt_config</code> from <code>tools.json</code> alive&#8212;not a mock.</p><p>If you only have model API keys, stay on <strong>local</strong> runtime: the UI and streaming still work; search returns the stub message until you point at managed or deployment.</p><div><hr></div><h2><strong>Closing thought</strong></h2><p>Agents are moving from &#8220;chat completion&#8221; to <strong>systems</strong>: tools, memory, subgraphs, pauses, resumes. This app is a readable map of that shift&#8212;files for behavior, a router for where the graph runs, SSE for the wire, and a modal for the one tool call you refused to automate.</p><p>For <a href="https://systemdr.systemdrd.com/">System Design Interview Roadmap</a> readers, the interview question is no longer only &#8220;design Twitter.&#8221; It is increasingly &#8220;design a worker that can call external APIs&#8212;who approves, where is state, what happens on retry?&#8221; This codebase is one honest answer.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://systemdr.systemdrd.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">System Design Interview Roadmap is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>