<?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[Theodor’s Blog]]></title><description><![CDATA[Writing on startups, technology, and topics I find interesting!]]></description><link>https://blog.theodormarcu.com</link><image><url>https://substackcdn.com/image/fetch/$s_!b4dy!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F345755ed-809b-4c56-bf02-d1825c7a3f10_829x829.png</url><title>Theodor’s Blog</title><link>https://blog.theodormarcu.com</link></image><generator>Substack</generator><lastBuildDate>Thu, 23 Apr 2026 12:20:06 GMT</lastBuildDate><atom:link href="https://blog.theodormarcu.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Theodor Marcu]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[theodormarcu@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[theodormarcu@substack.com]]></itunes:email><itunes:name><![CDATA[Theodor Marcu]]></itunes:name></itunes:owner><itunes:author><![CDATA[Theodor Marcu]]></itunes:author><googleplay:owner><![CDATA[theodormarcu@substack.com]]></googleplay:owner><googleplay:email><![CDATA[theodormarcu@substack.com]]></googleplay:email><googleplay:author><![CDATA[Theodor Marcu]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[How ChatGPT streams responses back to the user]]></title><description><![CDATA[And learn how you can build it too using server-sent events (SSE).]]></description><link>https://blog.theodormarcu.com/p/how-chatgpt-streams-responses-back</link><guid isPermaLink="false">https://blog.theodormarcu.com/p/how-chatgpt-streams-responses-back</guid><dc:creator><![CDATA[Theodor Marcu]]></dc:creator><pubDate>Thu, 23 Feb 2023 23:15:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!8gd1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23134c47-a648-4d04-bb3d-6cdaa5c63de5_600x368.gif" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Note October 2024: This is an old post published shortly after ChatGPT launched and many ideas found here are no longer applicable. If you&#8217;re curious about implementing a similar mechanism, you can check out better guides out there, such as Vercel&#8217;s AI hooks system.</em></p><p></p><p>I was curious to learn how ChatGPT achieves its &#8220;streaming&#8221; effect when it sends responses from the model back to the user. I&#8217;m referring to the cursor-driven effect that neatly &#8220;types&#8221; the model&#8217;s response in the chat interface:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8gd1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23134c47-a648-4d04-bb3d-6cdaa5c63de5_600x368.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8gd1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23134c47-a648-4d04-bb3d-6cdaa5c63de5_600x368.gif 424w, https://substackcdn.com/image/fetch/$s_!8gd1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23134c47-a648-4d04-bb3d-6cdaa5c63de5_600x368.gif 848w, https://substackcdn.com/image/fetch/$s_!8gd1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23134c47-a648-4d04-bb3d-6cdaa5c63de5_600x368.gif 1272w, https://substackcdn.com/image/fetch/$s_!8gd1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23134c47-a648-4d04-bb3d-6cdaa5c63de5_600x368.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8gd1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23134c47-a648-4d04-bb3d-6cdaa5c63de5_600x368.gif" width="600" height="368" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/23134c47-a648-4d04-bb3d-6cdaa5c63de5_600x368.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:368,&quot;width&quot;:600,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:79150,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8gd1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23134c47-a648-4d04-bb3d-6cdaa5c63de5_600x368.gif 424w, https://substackcdn.com/image/fetch/$s_!8gd1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23134c47-a648-4d04-bb3d-6cdaa5c63de5_600x368.gif 848w, https://substackcdn.com/image/fetch/$s_!8gd1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23134c47-a648-4d04-bb3d-6cdaa5c63de5_600x368.gif 1272w, https://substackcdn.com/image/fetch/$s_!8gd1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23134c47-a648-4d04-bb3d-6cdaa5c63de5_600x368.gif 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><figcaption class="image-caption">Example of ChatGPT &#8220;streaming&#8221; a response back to the user.</figcaption></figure></div><p>Like any other practical hacker, I started by investigating the network requests tab in Chrome in order to better understand what&#8217;s happening when a user sends a message to the OpenAI server and ChatGPT responds. I expected to see some sort of simple HTTP requests or even a web-socket, but I was surprised to see neither.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.theodormarcu.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Theodor&#8217;s Blog! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!a_pq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0452d5f-571c-4d27-a765-86afed68d13f_1858x1286.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!a_pq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0452d5f-571c-4d27-a765-86afed68d13f_1858x1286.png 424w, https://substackcdn.com/image/fetch/$s_!a_pq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0452d5f-571c-4d27-a765-86afed68d13f_1858x1286.png 848w, https://substackcdn.com/image/fetch/$s_!a_pq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0452d5f-571c-4d27-a765-86afed68d13f_1858x1286.png 1272w, https://substackcdn.com/image/fetch/$s_!a_pq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0452d5f-571c-4d27-a765-86afed68d13f_1858x1286.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!a_pq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0452d5f-571c-4d27-a765-86afed68d13f_1858x1286.png" width="1456" height="1008" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a0452d5f-571c-4d27-a765-86afed68d13f_1858x1286.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1008,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:210061,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!a_pq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0452d5f-571c-4d27-a765-86afed68d13f_1858x1286.png 424w, https://substackcdn.com/image/fetch/$s_!a_pq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0452d5f-571c-4d27-a765-86afed68d13f_1858x1286.png 848w, https://substackcdn.com/image/fetch/$s_!a_pq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0452d5f-571c-4d27-a765-86afed68d13f_1858x1286.png 1272w, https://substackcdn.com/image/fetch/$s_!a_pq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0452d5f-571c-4d27-a765-86afed68d13f_1858x1286.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Example of typical ChatGPT network requests.</figcaption></figure></div><p>As you can see in the image above, ChatGPT&#8217;s frontend communicates with the following APIs:</p><ul><li><p><code>/auth/session:</code> Manages basic authentication.</p></li><li><p><code>conversation/&lt;unique conversation ID&gt;</code>: An endpoint that accepts HTTP GET requests and returns an existing conversation history.</p></li><li><p><code>/conversations?offset=0&amp;limit=20</code>: A paginated HTTP GET endpoint to retrieve a set of past conversations and their metadata.</p></li><li><p><code>/models</code>: Returns the name and id of the models used with the current.</p></li><li><p><code>/conversation</code>: An endpoint that accepts HTTP Post requests from the user with the latest message, a conversation_id, the model being used, and a parent_message_id.</p></li></ul><p>These APIs look pretty standard, but where is the response from the model? Given these network requests, I expected the request to <code>/conversation</code> to return an answer, but that was not the case. Notice how there is no &#8220;response&#8221; section in the selected request in the &#8220;screenshot above&#8221;.</p><p>This surprised me, so I assumed that ChatGPT is using web-sockets instead. However, when I looked for the web-socket-related network requests in Chrome, I found nothing. This started getting really confusing.</p><p>I started examining the response from each endpoint hoping to find something useful. I even considered that the server was returning responses in a base64 encoding, but I could find nothing that actually contained the response!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BTM2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56ce6d67-5c24-4681-936b-ca483b65edf7_3022x1548.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BTM2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56ce6d67-5c24-4681-936b-ca483b65edf7_3022x1548.png 424w, https://substackcdn.com/image/fetch/$s_!BTM2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56ce6d67-5c24-4681-936b-ca483b65edf7_3022x1548.png 848w, https://substackcdn.com/image/fetch/$s_!BTM2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56ce6d67-5c24-4681-936b-ca483b65edf7_3022x1548.png 1272w, https://substackcdn.com/image/fetch/$s_!BTM2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56ce6d67-5c24-4681-936b-ca483b65edf7_3022x1548.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BTM2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56ce6d67-5c24-4681-936b-ca483b65edf7_3022x1548.png" width="1456" height="746" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/56ce6d67-5c24-4681-936b-ca483b65edf7_3022x1548.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:746,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:542939,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!BTM2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56ce6d67-5c24-4681-936b-ca483b65edf7_3022x1548.png 424w, https://substackcdn.com/image/fetch/$s_!BTM2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56ce6d67-5c24-4681-936b-ca483b65edf7_3022x1548.png 848w, https://substackcdn.com/image/fetch/$s_!BTM2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56ce6d67-5c24-4681-936b-ca483b65edf7_3022x1548.png 1272w, https://substackcdn.com/image/fetch/$s_!BTM2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56ce6d67-5c24-4681-936b-ca483b65edf7_3022x1548.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Confused&#8230; No web-sockets and no responses from the server&#8230;</figcaption></figure></div><h3>Server-sent events (SSE)</h3><p>After about 15 more minutes of Googling and poking around, I realized that the ChatGPT server uses something called <strong><a href="https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events">&#8220;server-sent events&#8221; (SSE)</a></strong> to send data back to the client. What tipped me off was the &#8220;EventStream&#8221; section in the <code>/conversation</code> endpoint. While the EventStream section was empty, it made me consider that something else was at play, and after a couple of searches, I learned that there was another way to send data to the client that did not include regular HTTP responses or web-sockets.<br><br>SSE is a very simple concept. It&#8217;s a one-way real-time connection from the server to the client that allows the server to push data to the client. This is similar to web sockets, but without being bidirectional (i.e. clients can&#8217;t respond). I had never heard of SSE before, but it looked like a very handy piece of web technology, so I decided to learn how to use it.</p><p>Setting up server-sent events is fairly easy. Since SSE is part of the HTTP standard, you don&#8217;t need a lot of tooling. You just need to add a listener on the front-end and a backend endpoint to send events from.</p><p>Here&#8217;s what the front-end code looks like for a basic implementation:</p><pre><code>// JavaScript

// Create an EventSource linked to your page / endpoint.
var source = new EventSource("/sse");

// Add event listeners for "publish" and "error"
source.onmessage = (event) =&gt; {
    console.log(`event: ${event.data}`);
};</code></pre><p>Setting up the backend code is equally simple. Here&#8217;s an example using Python and Flask:</p><pre><code># Python and Flask Pseudocode

@route("/sse")
def stream():
    def eventStream():
        while True:
            # Poll data from the database
            # and see if there's a new message
            if len(messages) &gt; len(previous_messages):
                yield "data: 
                    {}\n\n".format(messages[len(messages)-1)])"
    
    return Response(eventStream(), mimetype="text/event-stream")</code></pre><p>That&#8217;s it! Now you can use SSE too, like ChatGPT.</p><p></p><p></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.theodormarcu.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Theodor&#8217;s Blog! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[3 reasons to continue being optimistic about crypto]]></title><description><![CDATA[Plus some advice we're following during the next few quarters]]></description><link>https://blog.theodormarcu.com/p/3-reasons-to-continue-being-optimistic</link><guid isPermaLink="false">https://blog.theodormarcu.com/p/3-reasons-to-continue-being-optimistic</guid><dc:creator><![CDATA[Theodor Marcu]]></dc:creator><pubDate>Mon, 14 Nov 2022 21:14:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/h_600,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fff95db64-1775-4b12-801a-dd6e83e1b793_1172x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There have been a spate of negative headlines recently (the most major one being FTX collapsing). I won&#8217;t recapitulate or go into detail about them. For many in crypto, this marks the end of a bull run that started in 2020, accelerated in 2021, and crashed (alongside everything else in tech and around the world) in 2022.</p><p>Many builders, investors, and users are now reconsidering their choices. When crypto came back with a vengeance and everyone was leaving mid-dinner to mint NFTs, the decentralized future felt certain. After a year plagued with scandals, hacks, and a worsening macro picture, things do not feel so certain anymore. Many builders, users, and investors in crypto feel demoralized and wonder if everything was just a fever dream.<br><br>While many people are reconsidering their excitement about crypto, I wanted to write about the reasons why I still feel optimistic about crypto as a founder. I will also share some advice we&#8217;re following during the next few quarters as we&#8217;re navigating the product-market fit maze with <a href="http://marblewallet.com">Marble</a>, our own startup.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.theodormarcu.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Theodor&#8217;s Blog! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><strong>Reason #1: Dapps (on-chain &#8220;decentralized&#8221; apps) have gone viral for the first time</strong></p><p>During the 2017 ICO boom and bust, many in crypto justified the insane valuations of different tokens and chains by comparing them to cloud providers that could run applications in a decentralized way. This quickly fell apart when people discovered that there were almost no apps out there yet. Furthermore, most use cases were still hypothetical (decentralized finance, NFTs, games, social, etc. were still all mostly in the idea realm).</p><p>To me, the most interesting takeaway from the 2020-2022 bubble is that we&#8217;ve seen dapps become viral for the very first time. By the end of 2021, wallets like MetaMask had over 30 million monthly active users and the number of daily active wallets connecting to dapps reached an all-time high of 2.7 million.</p><p>This started with DeFi summer, when apps like<a href="https://uniswap.info/"> Uniswap</a>, <a href="https://compound.finance/">Compound</a>, and<a href="https://yearn.finance/vaults"> Yearn</a> proved that you could create successful on-chain applications that had real users and use cases. Dapp usage was turbo-charged in 2021, when NFTs became viral. Everyone was minting one, brands were getting involved, and marketplaces were printing cash hand over fist. NFTs showed that users were not afraid to use crypto applications. This sparked interest in a whole set of new use cases: consumer social applications, games, and even new concepts like DAOs were everywhere.</p><p>While usage numbers have fallen significantly since late 2021, the fact that millions of people have tried and successfully used on-chain and decentralized applications means that there is tangible value in running things on chain. This leads me to another reason to be optimistic:</p><p><strong>Reason #2: Building is here to stay (and grow)</strong></p><p>The second reason why I&#8217;m excited about crypto moving forward is that building does not seem to slow down. Here&#8217;s an example:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gV5u!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4a4fe5c9-f374-4f95-9925-32b8122c36f0_1396x563.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gV5u!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4a4fe5c9-f374-4f95-9925-32b8122c36f0_1396x563.jpeg 424w, https://substackcdn.com/image/fetch/$s_!gV5u!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4a4fe5c9-f374-4f95-9925-32b8122c36f0_1396x563.jpeg 848w, https://substackcdn.com/image/fetch/$s_!gV5u!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4a4fe5c9-f374-4f95-9925-32b8122c36f0_1396x563.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!gV5u!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4a4fe5c9-f374-4f95-9925-32b8122c36f0_1396x563.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gV5u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4a4fe5c9-f374-4f95-9925-32b8122c36f0_1396x563.jpeg" width="1396" height="563" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/4a4fe5c9-f374-4f95-9925-32b8122c36f0_1396x563.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:563,&quot;width&quot;:1396,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:104377,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gV5u!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4a4fe5c9-f374-4f95-9925-32b8122c36f0_1396x563.jpeg 424w, https://substackcdn.com/image/fetch/$s_!gV5u!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4a4fe5c9-f374-4f95-9925-32b8122c36f0_1396x563.jpeg 848w, https://substackcdn.com/image/fetch/$s_!gV5u!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4a4fe5c9-f374-4f95-9925-32b8122c36f0_1396x563.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!gV5u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4a4fe5c9-f374-4f95-9925-32b8122c36f0_1396x563.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Source: npm-stat</figcaption></figure></div><p>This graph shows that the number of downloads for <a href="https://npm-stat.com/charts.html?package=ethers&amp;from=2020-11-08&amp;to=2022-11-08">ethers</a>, a widely-used library for Ethereum dapp development, is continuing to grow despite the significant slowdown in market activity during the past months. This increase in developer activity is mirrored by all other major libraries and ecosystems (<a href="https://npm-stat.com/charts.html?package=%40solana%2Fweb3.js&amp;from=2020-11-08&amp;to=2022-11-08">@solana/web3js</a>, <a href="https://npm-stat.com/charts.html?package=%40walletconnect%2Fclient&amp;from=2020-11-08&amp;to=2022-11-08">@walletconnect/client</a>, etc.).</p><p>Here are some things I&#8217;m excited about:</p><ul><li><p>Social protocols like<a href="https://deso.org/"> DeSo</a>, <a href="https://www.farcaster.xyz/">Farcaster</a>, and<a href="https://www.lens.xyz/"> Lens</a>, which are building increasingly vibrant decentralized social media.</p></li><li><p>Apps like<a href="https://madrealities.xyz/"> Mad Realities</a>, <a href="https://mintkudos.xyz/">MintKudos</a>, <a href="https://station.express/">Station</a>, <a href="https://cyberconnect.me/">CyberConnect</a>, and<a href="https://www.utopialabs.com/"> Utopia Labs</a> continue to build applications for new and innovative use cases derived from crypto&#8217;s<a href="https://blog.eladgil.com/2018/05/core-cryptocurrency-use-cases.html"> core use cases</a>.</p></li><li><p>Crypto games are seeing serious builder activity too. During the past year, some of the sharpest people I&#8217;ve met are working on on-chain games, including teams from<a href="https://0xparc.org/"> 0xPARC</a>, <a href="https://curio.gg/">Curio</a>, <a href="https://www.critterz.xyz/">Critterz</a> (famous for adding NFTs successfully to Minecraft, who are now working on <a href="http://www.cryptotowns.xyz">Crypto Towns</a>).</p></li><li><p>Infrastructure providers that help developers build better and more user friendly applications easier, like<a href="https://sardine.ai/"> Sardine</a>,<a href="http://spindl.xyz/"> Spindl</a>, <a href="http://coherent.sh">Coherent</a>, and of course ourselves (<a href="http://marblewallet.com">Marble Wallet</a>).</p></li></ul><p>Empirically, it seems like the amount of effort that is going into building high quality crypto applications is still increasing, even though prices have tanked. This is a very good sign that the industry is still in an early stage of growth and that there is still a lot of value to be created.</p><p><strong>Reason #3: Less noise means more opportunity to build products with real use cases</strong></p><p>Many crypto founders who care about building real businesses that serve and make real users happy often felt alienated during the past two years. Too often it felt like the fundraising environment rewarded those who could show the biggest token price increase in the shortest amount of time, often through shady or borderline illegal methods.</p><p>This market crash and pause in retail demand presents an opportunity for those who want to focus on building products that create value. While this may also create headwinds, since crypto adoption has been traditionally correlated with increasing prices (and it would be foolish to think otherwise), I believe this is also an opportunity to build apps that make use of crypto in ways that is not directly tied to immediate growth in token prices.</p><p>There are some use cases already that show how crypto rails can provide value in the real world. For example, Reddit launched an NFT collectibles program that paid somewhere around $110,000-$270,000 (depending on how you estimate it) to 30 or so creators in the first few months of existence. This is a pretty impressive take rate for creators compared to platforms like YouTube/TikTok/Instagram, where the platforms capture 100% of the profits that result from creators&#8217; work [1]. Furthermore, most users on Reddit don&#8217;t even know they&#8217;re using blockchain infrastructure when trading those collectibles, which is a further win for crypto.</p><p>Another example is the world of decentralized social networks. While still small and niche, protocols like DeSo, Farcaster, and Lens are seeing budding communities starting to grow on them. For example, Farcaster sees about 1.5k weekly active casters (2.9k MAUs), according to their <a href="https://farcaster.network/">open source stats dashboard</a>. DeSo sees even more than that: they have between 6 and 10k DAUs <a href="https://www.openprosper.com/stats/trends/overall?timeline=120days">according to their dashboard</a>. This is a really positive development for those who are excited about building social networks on decentralized stacks with competing clients.</p><p>Last but not least, Dark Forest has shown that a crypto game can be immensely popular without relying on speculation and play-to-earn schemes. Dark Forest&#8217;s success has inspired some of the smartest people I know to spend time on building the next generation of gaming (which takes advantage of the interoperability and openness that comes along with being on-chain). Since big things often start out looking like toys (think about the <a href="https://en.wikipedia.org/wiki/Homebrew_Computer_Club">Homebrew Computer Club</a>), I&#8217;m very optimistic about these projects.</p><p>The question that many builders are facing right now is whether what they&#8217;re working on makes sense in an environment where retail demand for pure speculation is dead for a few years. I expect many will say no. However, out of the ones that say yes, I expect to see a higher quality of applications than what we&#8217;ve seen so far, since they&#8217;re subject to the ultimate capitalistic force: making something people want.</p><p>While token prices can help retail get onboarded into crypto (mostly for the promise of speculative gain), they can also mask the lack of inherent PMF. Low prices are bound to create a higher bar for success than what we&#8217;ve seen during the past few years. I expect that the builders who figure out interesting things to build and do before the next bull run will do very well.</p><p><strong>How we&#8217;re navigating the next few quarters</strong></p><p>While there are some strong reasons to be optimistic, things look pretty bleak overall moving forward (both for crypto and the tech world as a whole). A few things are clear:</p><ul><li><p>Fundraising is going to get a lot tougher compared to the past two years.</p></li><li><p>Retail demand is paused.</p></li><li><p>Increased regulatory oversight is coming.</p></li><li><p>High rates and fears of recession are a unique new challenge for crypto (none of the past bull runs happened in an environment without quantitative easing).</p></li><li><p>A lot of trust will have to be earned back by the crypto community.</p></li></ul><p>Because of this, the checklist of exercises (<a href="https://blog.eladgil.com/p/changing-times-or-why-is-every-layoff">a slightly modified version of Elad Gil&#8217;s</a>) we&#8217;re reviewing and paying attention to moving forward is:</p><ul><li><p><strong>Scenario Modeling</strong>: Do our plans for the next few quarters make sense if asset prices continue to fall and we&#8217;re on the brink of a recession? How does this affect headcount growth, cash needs, etc.</p></li><li><p><strong>Headcount Review: </strong>Given the scenarios above, what would postponing hiring for longer look like (given that we don&#8217;t really have that many employees to begin with)? Can we really justify adding more people? If so, what are the milestones we&#8217;d want to see before we grow our team?</p></li><li><p><strong>Review projects and assumptions: </strong>Are there any GTM or EPD projects that don&#8217;t really make sense anymore? What can we do to try getting to PMF instead? Are there new opportunities that are now more viable due to less noise?</p></li><li><p><strong>Free Round: </strong>Let&#8217;s assume that part of the last round of funding was &#8220;free&#8221; as a result of market conditions. If we subtract that money, what would we do differently, if anything? Are there any expenses we wouldn&#8217;t spend money on or defer until we hit certain milestones?</p></li><li><p><strong>Culture and expectations:</strong> What is the right company culture and mission given the past few months? Are we well positioned for what&#8217;s coming next? What are the expectations we set for ourselves during the &#8220;crypto winter&#8221;? What are the signals we want to rely on to stay optimistic? Are we still bullish on being in-person?</p></li><li><p><strong>M&amp;A:</strong> Should we sell the company and/or the limited IP we have? If so, to whom? (I don&#8217;t think this really makes sense for us, but we&#8217;re trying to cover all possible scenarios!)</p></li></ul><p>Building in a bear market looks scary, especially to people who are ambitious and are impatient. However, given the optimistic reasons I mentioned above, I think there&#8217;s still a lot of opportunity in crypto left for those who stay. As you can see, none of the reasons are tied to why FTX collapsed (or any of the big scandals this year). As long as we stay lean and focus on core product-market fit, I think we&#8217;re maximizing our chances of winning. That being said, it&#8217;s also likely that things can take a lot longer to recover, which will also slow us (and everyone else) down indirectly. However, winning in face of that adversity is a bet we&#8217;re wiling to take.</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HhiY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fff95db64-1775-4b12-801a-dd6e83e1b793_1172x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HhiY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fff95db64-1775-4b12-801a-dd6e83e1b793_1172x720.png 424w, https://substackcdn.com/image/fetch/$s_!HhiY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fff95db64-1775-4b12-801a-dd6e83e1b793_1172x720.png 848w, https://substackcdn.com/image/fetch/$s_!HhiY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fff95db64-1775-4b12-801a-dd6e83e1b793_1172x720.png 1272w, https://substackcdn.com/image/fetch/$s_!HhiY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fff95db64-1775-4b12-801a-dd6e83e1b793_1172x720.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HhiY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fff95db64-1775-4b12-801a-dd6e83e1b793_1172x720.png" width="1172" height="720" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/ff95db64-1775-4b12-801a-dd6e83e1b793_1172x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1172,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1599053,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!HhiY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fff95db64-1775-4b12-801a-dd6e83e1b793_1172x720.png 424w, https://substackcdn.com/image/fetch/$s_!HhiY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fff95db64-1775-4b12-801a-dd6e83e1b793_1172x720.png 848w, https://substackcdn.com/image/fetch/$s_!HhiY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fff95db64-1775-4b12-801a-dd6e83e1b793_1172x720.png 1272w, https://substackcdn.com/image/fetch/$s_!HhiY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fff95db64-1775-4b12-801a-dd6e83e1b793_1172x720.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Thomas Cole - Architect&#8217;s Dream</figcaption></figure></div><p><em>Thanks to John Suh, Nader Al-Naji, Balaji Srinivasan, Diogo M&#243;nica, Antonio Garcia-Martinez, Ron Miasnik, and Dan Romero for reading and commenting on various drafts of this post.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.theodormarcu.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Theodor&#8217;s Blog! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Coming soon]]></title><description><![CDATA[This is Theodor&#8217;s Blog, a newsletter about Theodor's writing.]]></description><link>https://blog.theodormarcu.com/p/coming-soon</link><guid isPermaLink="false">https://blog.theodormarcu.com/p/coming-soon</guid><dc:creator><![CDATA[Theodor Marcu]]></dc:creator><pubDate>Sat, 12 Nov 2022 01:29:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!b4dy!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F345755ed-809b-4c56-bf02-d1825c7a3f10_829x829.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>This is Theodor&#8217;s Blog</strong>, a newsletter about Theodor's writing.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.theodormarcu.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.theodormarcu.com/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item></channel></rss>