<?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[kaumnen's Cloud Dispatch]]></title><description><![CDATA[cloud and code chaos: bugs and lightning tips.]]></description><link>https://www.kaumnen.com</link><image><url>https://substackcdn.com/image/fetch/$s_!U-YW!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fed192f-d0d3-47fe-bf23-c3725968adf8_512x512.png</url><title>kaumnen&apos;s Cloud Dispatch</title><link>https://www.kaumnen.com</link></image><generator>Substack</generator><lastBuildDate>Tue, 05 May 2026 22:48:28 GMT</lastBuildDate><atom:link href="https://www.kaumnen.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[kaumnen]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[kaumnen@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[kaumnen@substack.com]]></itunes:email><itunes:name><![CDATA[kaumnen]]></itunes:name></itunes:owner><itunes:author><![CDATA[kaumnen]]></itunes:author><googleplay:owner><![CDATA[kaumnen@substack.com]]></googleplay:owner><googleplay:email><![CDATA[kaumnen@substack.com]]></googleplay:email><googleplay:author><![CDATA[kaumnen]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[How To Make Retro Games with Amazon Q Developer CLI]]></title><description><![CDATA[Build classic games faster than ever with AI-powered development]]></description><link>https://www.kaumnen.com/p/how-to-make-retro-games-with-amazon-q-developer-cli</link><guid isPermaLink="false">https://www.kaumnen.com/p/how-to-make-retro-games-with-amazon-q-developer-cli</guid><dc:creator><![CDATA[kaumnen]]></dc:creator><pubDate>Sat, 14 Jun 2025 23:41:27 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/dcf85769-6fa4-40d6-a60f-227225fbd7e3_1440x1440.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Back in high school, a couple of friends and I built a mobile game where you&#8217;d control a circle at the bottom of the screen and avoid the incoming objects until you get to the finish line. We shared the assets, docs, plans, even code (<em>lol, git what?</em>) over Google Drive. </p><p>Since it was my first project, I<strong>&#8217;</strong>ll never forget the feeling of getting to play the game I'd worked on. Being able to adjust the speed, point count, music, animations, colors, then hit &#8216;build&#8217; and fire it up on my phone? So cool!</p><p>We had a blast, but eventually steered towards different fields. In my case - backend &amp; cloud. </p><p>Now, after a couple of years, that game project still stands alone in my game portfolio (<em>built games</em> one, not the <em>played games </em>one, that one is a different story C:). </p><p>Do I want to build a game? I do. </p><p>Do I have the time to learn the game dev, C++, C# or something else? Eh, probably not. </p><p>But do I <em>need</em> to learn it with all AI tools that are out there? Nope.</p><div><hr></div><blockquote><p>Want to skip reading and check out the game right away? Here it is: </p><p><a href="https://breakout.kaumnen.com/">https://breakout.kaumnen.com/</a> (might take a bit to load <em>WASM things</em> at first)</p></blockquote><div><hr></div><p>So which game will it be? <a href="https://en.wikipedia.org/wiki/Breakout_(video_game)">Breakout</a></p><ul><li><p>Simple - <em>check</em></p></li><li><p>Familiar - <em>check</em></p></li><li><p>Replayable - <em>check</em></p></li><li><p>Power-ups - <em>check</em></p></li><li><p>Fun - <em>check</em></p></li></ul><p>Can I vibe code it? Spoiler alert: absolutely! But how?</p><h1>Amazon Q Developer CLI and a Plan</h1><p>I wanted to check out Amazon Q Developer for some time now, CLI part to be precise. It&#8217;s an AI-powered assistant that can generate code, commands, tests, explain something, fix problems, etc. I&#8217;ve seen a lot of people recommending it. The full feature set can be found <a href="https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/features.html">here</a>.</p><p>Now I got a project and some free time - let&#8217;s finally check it out!</p><blockquote><p>Installing instructions, setup, how does it function - all of that can be found in the <a href="https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/command-line.html">docs</a>. There is a free tier too!</p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!N7nF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d719f1d-b9cf-45bf-91e9-77b9a69597e2_1044x191.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!N7nF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d719f1d-b9cf-45bf-91e9-77b9a69597e2_1044x191.png 424w, https://substackcdn.com/image/fetch/$s_!N7nF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d719f1d-b9cf-45bf-91e9-77b9a69597e2_1044x191.png 848w, https://substackcdn.com/image/fetch/$s_!N7nF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d719f1d-b9cf-45bf-91e9-77b9a69597e2_1044x191.png 1272w, https://substackcdn.com/image/fetch/$s_!N7nF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d719f1d-b9cf-45bf-91e9-77b9a69597e2_1044x191.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!N7nF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d719f1d-b9cf-45bf-91e9-77b9a69597e2_1044x191.png" width="728" height="133.18773946360153" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1d719f1d-b9cf-45bf-91e9-77b9a69597e2_1044x191.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:191,&quot;width&quot;:1044,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:27170,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.kaumnen.com/i/165938287?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1c5545b-0bde-4cd7-9eb5-c14801bfcc59_1068x220.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!N7nF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d719f1d-b9cf-45bf-91e9-77b9a69597e2_1044x191.png 424w, https://substackcdn.com/image/fetch/$s_!N7nF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d719f1d-b9cf-45bf-91e9-77b9a69597e2_1044x191.png 848w, https://substackcdn.com/image/fetch/$s_!N7nF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d719f1d-b9cf-45bf-91e9-77b9a69597e2_1044x191.png 1272w, https://substackcdn.com/image/fetch/$s_!N7nF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d719f1d-b9cf-45bf-91e9-77b9a69597e2_1044x191.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Q Chat Command</figcaption></figure></div><p>Now that I&#8217;ve set it up, let&#8217;s create a plan. </p><ol><li><p>What are we building? <strong>A Breakout game</strong></p></li><li><p>With what programming language? <strong>Python 3.13</strong></p></li><li><p>What libraries to use? <strong>Pygame</strong></p></li></ol><p>There are a few more requirements: </p><ol><li><p>I want it to run on web, so let&#8217;s use <strong>pygbag</strong> for WebAssembly</p></li><li><p>I want to use <strong>uv</strong> package manager. If you didn&#8217;t check out <strong><a href="https://docs.astral.sh/uv/">uv</a></strong> - I can&#8217;t recommend it enough, it&#8217;s awesome. It really is.</p></li></ol><p>With that, let&#8217;s prompt Q chat to create an <strong>overview.md</strong> file which will contain all the project requirements, what to build, how to build it and so on:</p><pre><code>create a detailed overview.md file for building a web based breakout retro game using python 3.13, uv package manager, pygame with pygbag for web assembly</code></pre><p>Not the best of prompts, but lets see what will come out of it:</p><ol><li><p>Core tech</p><ol><li><p></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!S9kF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065e6fc8-8003-47fc-a36b-45cd2bdd2df7_1664x228.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!S9kF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065e6fc8-8003-47fc-a36b-45cd2bdd2df7_1664x228.png 424w, https://substackcdn.com/image/fetch/$s_!S9kF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065e6fc8-8003-47fc-a36b-45cd2bdd2df7_1664x228.png 848w, https://substackcdn.com/image/fetch/$s_!S9kF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065e6fc8-8003-47fc-a36b-45cd2bdd2df7_1664x228.png 1272w, https://substackcdn.com/image/fetch/$s_!S9kF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065e6fc8-8003-47fc-a36b-45cd2bdd2df7_1664x228.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!S9kF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065e6fc8-8003-47fc-a36b-45cd2bdd2df7_1664x228.png" width="1456" height="200" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/065e6fc8-8003-47fc-a36b-45cd2bdd2df7_1664x228.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:200,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:75036,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.kaumnen.com/i/165938287?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065e6fc8-8003-47fc-a36b-45cd2bdd2df7_1664x228.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!S9kF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065e6fc8-8003-47fc-a36b-45cd2bdd2df7_1664x228.png 424w, https://substackcdn.com/image/fetch/$s_!S9kF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065e6fc8-8003-47fc-a36b-45cd2bdd2df7_1664x228.png 848w, https://substackcdn.com/image/fetch/$s_!S9kF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065e6fc8-8003-47fc-a36b-45cd2bdd2df7_1664x228.png 1272w, https://substackcdn.com/image/fetch/$s_!S9kF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065e6fc8-8003-47fc-a36b-45cd2bdd2df7_1664x228.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Core Technologies Part of the Overview File</figcaption></figure></div></li></ol></li><li><p>Project Structure</p><ol><li><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!y0IZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea8d8a6e-07dc-4250-b89d-e60ab927e4e3_1428x950.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!y0IZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea8d8a6e-07dc-4250-b89d-e60ab927e4e3_1428x950.png 424w, https://substackcdn.com/image/fetch/$s_!y0IZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea8d8a6e-07dc-4250-b89d-e60ab927e4e3_1428x950.png 848w, https://substackcdn.com/image/fetch/$s_!y0IZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea8d8a6e-07dc-4250-b89d-e60ab927e4e3_1428x950.png 1272w, https://substackcdn.com/image/fetch/$s_!y0IZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea8d8a6e-07dc-4250-b89d-e60ab927e4e3_1428x950.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!y0IZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea8d8a6e-07dc-4250-b89d-e60ab927e4e3_1428x950.png" width="1428" height="950" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ea8d8a6e-07dc-4250-b89d-e60ab927e4e3_1428x950.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:950,&quot;width&quot;:1428,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:183408,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.kaumnen.com/i/165938287?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea8d8a6e-07dc-4250-b89d-e60ab927e4e3_1428x950.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!y0IZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea8d8a6e-07dc-4250-b89d-e60ab927e4e3_1428x950.png 424w, https://substackcdn.com/image/fetch/$s_!y0IZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea8d8a6e-07dc-4250-b89d-e60ab927e4e3_1428x950.png 848w, https://substackcdn.com/image/fetch/$s_!y0IZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea8d8a6e-07dc-4250-b89d-e60ab927e4e3_1428x950.png 1272w, https://substackcdn.com/image/fetch/$s_!y0IZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea8d8a6e-07dc-4250-b89d-e60ab927e4e3_1428x950.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">Project Structure Part of the Overview File</figcaption></figure></div></li></ol></li><li><p>Game States</p><ol><li><p></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uh3i!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59a64e14-1ecb-4941-9a31-a26255c0fe98_908x238.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uh3i!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59a64e14-1ecb-4941-9a31-a26255c0fe98_908x238.png 424w, https://substackcdn.com/image/fetch/$s_!uh3i!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59a64e14-1ecb-4941-9a31-a26255c0fe98_908x238.png 848w, https://substackcdn.com/image/fetch/$s_!uh3i!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59a64e14-1ecb-4941-9a31-a26255c0fe98_908x238.png 1272w, https://substackcdn.com/image/fetch/$s_!uh3i!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59a64e14-1ecb-4941-9a31-a26255c0fe98_908x238.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uh3i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59a64e14-1ecb-4941-9a31-a26255c0fe98_908x238.png" width="908" height="238" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/59a64e14-1ecb-4941-9a31-a26255c0fe98_908x238.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:238,&quot;width&quot;:908,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:67252,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.kaumnen.com/i/165938287?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59a64e14-1ecb-4941-9a31-a26255c0fe98_908x238.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!uh3i!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59a64e14-1ecb-4941-9a31-a26255c0fe98_908x238.png 424w, https://substackcdn.com/image/fetch/$s_!uh3i!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59a64e14-1ecb-4941-9a31-a26255c0fe98_908x238.png 848w, https://substackcdn.com/image/fetch/$s_!uh3i!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59a64e14-1ecb-4941-9a31-a26255c0fe98_908x238.png 1272w, https://substackcdn.com/image/fetch/$s_!uh3i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59a64e14-1ecb-4941-9a31-a26255c0fe98_908x238.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Game States Part of the Overview File</figcaption></figure></div></li></ol></li><li><p>Game Features, Visual Design, Performance Considerations, Dev Workflow in phases, Deployment Options and more</p></li></ol><div><hr></div><p>This document (you can find a full version <a href="https://github.com/kaumnen/breakout-retro/blob/main/overview.md">here</a>) will help with model guidance and keep it from steering off course. I didn&#8217;t expect it to create a project overview this detailed. Great stuff.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ntzh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6307bf51-34c2-418a-b44a-5734cc849b0d_1596x158.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ntzh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6307bf51-34c2-418a-b44a-5734cc849b0d_1596x158.png 424w, https://substackcdn.com/image/fetch/$s_!Ntzh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6307bf51-34c2-418a-b44a-5734cc849b0d_1596x158.png 848w, https://substackcdn.com/image/fetch/$s_!Ntzh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6307bf51-34c2-418a-b44a-5734cc849b0d_1596x158.png 1272w, https://substackcdn.com/image/fetch/$s_!Ntzh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6307bf51-34c2-418a-b44a-5734cc849b0d_1596x158.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ntzh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6307bf51-34c2-418a-b44a-5734cc849b0d_1596x158.png" width="1456" height="144" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6307bf51-34c2-418a-b44a-5734cc849b0d_1596x158.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:144,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:21299,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.kaumnen.com/i/165938287?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6307bf51-34c2-418a-b44a-5734cc849b0d_1596x158.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Ntzh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6307bf51-34c2-418a-b44a-5734cc849b0d_1596x158.png 424w, https://substackcdn.com/image/fetch/$s_!Ntzh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6307bf51-34c2-418a-b44a-5734cc849b0d_1596x158.png 848w, https://substackcdn.com/image/fetch/$s_!Ntzh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6307bf51-34c2-418a-b44a-5734cc849b0d_1596x158.png 1272w, https://substackcdn.com/image/fetch/$s_!Ntzh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6307bf51-34c2-418a-b44a-5734cc849b0d_1596x158.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Q Chat Tool Action Approval</figcaption></figure></div><p>This is an important feature as you want to stay in control. Will it <strong>rm -rf /</strong> your system on its own? Only if <strong>you</strong> allow it.</p><p>But for our overview.md file - it&#8217;s fine.</p><blockquote><p>Tip: When you are using AI assistants/agents, you should have an overview.md, tasks.md, acceptance.md and other files so you can include or reference them during the chat to keep the LLM&#8217;s focus on the point.</p></blockquote><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.kaumnen.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.kaumnen.com/subscribe?"><span>Subscribe now</span></a></p><h1>Implementation</h1><p>I can start the implementation now. The prompt:</p><pre><code>i already have uv installed, start with the project structure and  dependencies install</code></pre><p>And the result:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wD04!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f79f98e-d9f3-4e4a-98b1-736291ea2d97_2914x588.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wD04!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f79f98e-d9f3-4e4a-98b1-736291ea2d97_2914x588.png 424w, https://substackcdn.com/image/fetch/$s_!wD04!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f79f98e-d9f3-4e4a-98b1-736291ea2d97_2914x588.png 848w, https://substackcdn.com/image/fetch/$s_!wD04!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f79f98e-d9f3-4e4a-98b1-736291ea2d97_2914x588.png 1272w, https://substackcdn.com/image/fetch/$s_!wD04!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f79f98e-d9f3-4e4a-98b1-736291ea2d97_2914x588.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wD04!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f79f98e-d9f3-4e4a-98b1-736291ea2d97_2914x588.png" width="1456" height="294" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1f79f98e-d9f3-4e4a-98b1-736291ea2d97_2914x588.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:294,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:116572,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.kaumnen.com/i/165938287?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f79f98e-d9f3-4e4a-98b1-736291ea2d97_2914x588.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wD04!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f79f98e-d9f3-4e4a-98b1-736291ea2d97_2914x588.png 424w, https://substackcdn.com/image/fetch/$s_!wD04!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f79f98e-d9f3-4e4a-98b1-736291ea2d97_2914x588.png 848w, https://substackcdn.com/image/fetch/$s_!wD04!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f79f98e-d9f3-4e4a-98b1-736291ea2d97_2914x588.png 1272w, https://substackcdn.com/image/fetch/$s_!wD04!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f79f98e-d9f3-4e4a-98b1-736291ea2d97_2914x588.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Q Chat Example Tool Call Structure</figcaption></figure></div><p>What I find cool here is that I see:</p><ul><li><p>Model&#8217;s reasoning</p></li><li><p>The tool it is trying to use</p></li><li><p>The tool input</p></li><li><p>The purpose of the tool&#8217;s input</p></li></ul><p>It is very detailed. </p><p>Different tools will have a different preview. For example, this is what the <strong>fs_write</strong> tool in action looks like:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!e4lN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87345e2-97f3-4583-96ea-8efe835e5ad7_1868x566.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!e4lN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87345e2-97f3-4583-96ea-8efe835e5ad7_1868x566.png 424w, https://substackcdn.com/image/fetch/$s_!e4lN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87345e2-97f3-4583-96ea-8efe835e5ad7_1868x566.png 848w, https://substackcdn.com/image/fetch/$s_!e4lN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87345e2-97f3-4583-96ea-8efe835e5ad7_1868x566.png 1272w, https://substackcdn.com/image/fetch/$s_!e4lN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87345e2-97f3-4583-96ea-8efe835e5ad7_1868x566.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!e4lN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87345e2-97f3-4583-96ea-8efe835e5ad7_1868x566.png" width="1456" height="441" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f87345e2-97f3-4583-96ea-8efe835e5ad7_1868x566.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:441,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:95859,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.kaumnen.com/i/165938287?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87345e2-97f3-4583-96ea-8efe835e5ad7_1868x566.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!e4lN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87345e2-97f3-4583-96ea-8efe835e5ad7_1868x566.png 424w, https://substackcdn.com/image/fetch/$s_!e4lN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87345e2-97f3-4583-96ea-8efe835e5ad7_1868x566.png 848w, https://substackcdn.com/image/fetch/$s_!e4lN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87345e2-97f3-4583-96ea-8efe835e5ad7_1868x566.png 1272w, https://substackcdn.com/image/fetch/$s_!e4lN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87345e2-97f3-4583-96ea-8efe835e5ad7_1868x566.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">Q Chat fs_write Tool Call Structure</figcaption></figure></div><p>It went on to setup the structure and the dependencies. After that, again, a detailed overview:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WYbW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7614a5fe-9621-497a-881b-4619ebe93223_1876x1598.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WYbW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7614a5fe-9621-497a-881b-4619ebe93223_1876x1598.png 424w, https://substackcdn.com/image/fetch/$s_!WYbW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7614a5fe-9621-497a-881b-4619ebe93223_1876x1598.png 848w, https://substackcdn.com/image/fetch/$s_!WYbW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7614a5fe-9621-497a-881b-4619ebe93223_1876x1598.png 1272w, https://substackcdn.com/image/fetch/$s_!WYbW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7614a5fe-9621-497a-881b-4619ebe93223_1876x1598.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WYbW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7614a5fe-9621-497a-881b-4619ebe93223_1876x1598.png" width="1456" height="1240" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7614a5fe-9621-497a-881b-4619ebe93223_1876x1598.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1240,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:311537,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.kaumnen.com/i/165938287?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7614a5fe-9621-497a-881b-4619ebe93223_1876x1598.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WYbW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7614a5fe-9621-497a-881b-4619ebe93223_1876x1598.png 424w, https://substackcdn.com/image/fetch/$s_!WYbW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7614a5fe-9621-497a-881b-4619ebe93223_1876x1598.png 848w, https://substackcdn.com/image/fetch/$s_!WYbW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7614a5fe-9621-497a-881b-4619ebe93223_1876x1598.png 1272w, https://substackcdn.com/image/fetch/$s_!WYbW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7614a5fe-9621-497a-881b-4619ebe93223_1876x1598.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">Q Chat Closing Overeview</figcaption></figure></div><p>I went on to finish those next steps one by one, with little to no changes. </p><p>After it created a few files - it&#8217;s finally ready! I type in <strong>y</strong> and:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!27b1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c65cdff-bdec-49ff-92f5-523a7d9d4e77_1842x856.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!27b1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c65cdff-bdec-49ff-92f5-523a7d9d4e77_1842x856.png 424w, https://substackcdn.com/image/fetch/$s_!27b1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c65cdff-bdec-49ff-92f5-523a7d9d4e77_1842x856.png 848w, https://substackcdn.com/image/fetch/$s_!27b1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c65cdff-bdec-49ff-92f5-523a7d9d4e77_1842x856.png 1272w, https://substackcdn.com/image/fetch/$s_!27b1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c65cdff-bdec-49ff-92f5-523a7d9d4e77_1842x856.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!27b1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c65cdff-bdec-49ff-92f5-523a7d9d4e77_1842x856.png" width="1456" height="677" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1c65cdff-bdec-49ff-92f5-523a7d9d4e77_1842x856.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:677,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:161014,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.kaumnen.com/i/165938287?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c65cdff-bdec-49ff-92f5-523a7d9d4e77_1842x856.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!27b1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c65cdff-bdec-49ff-92f5-523a7d9d4e77_1842x856.png 424w, https://substackcdn.com/image/fetch/$s_!27b1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c65cdff-bdec-49ff-92f5-523a7d9d4e77_1842x856.png 848w, https://substackcdn.com/image/fetch/$s_!27b1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c65cdff-bdec-49ff-92f5-523a7d9d4e77_1842x856.png 1272w, https://substackcdn.com/image/fetch/$s_!27b1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c65cdff-bdec-49ff-92f5-523a7d9d4e77_1842x856.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">Q Chat Tool Call Output Error Handling</figcaption></figure></div><p>Not a big deal, is it? Happens all the time. The cool thing is that <strong>Q Developer CLI</strong> has awareness of command outputs, so it can act on the problems without you going back and forth with the model. </p><p>After a few changes, the game boots up!</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;8d7225f6-9809-4151-8e21-2c971c15f4d9&quot;,&quot;duration&quot;:null}"></div><p>It works, but I noticed a few problems: </p><ul><li><p>Using arrow or A/D keys doesn&#8217;t override the mouse control, so the paddle is moving left and right only <strong>within</strong> the bounds of the <strong>mouse</strong>-controlled area</p></li><li><p>Bricks in higher rows don&#8217;t have more health than those in lower ones</p></li><li><p>Collision does not change the ball&#8217;s direction of movement</p></li></ul><p>I&#8217;ve sent a few prompts to fix these issues, Q Developer CLI did its thing and fixed the issues. Take a look at the sped up video:</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;10bb86fc-cc3b-4c66-a8aa-31e39134bd05&quot;,&quot;duration&quot;:null}"></div><p>Great! Now that the core logic is in place, next up - power-ups!</p><blockquote><p>Tip: don&#8217;t prompt it to do multiple things at once. Send precise prompts. If any issues need fixing - write out a few examples to help model understand the issue better. Ideally - point to the file(s) that should be modified. Q is smart enough to find and read them on its own!</p></blockquote><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.kaumnen.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 kaumnen's Cloud Dispatch! Subscribe for free to receive new posts.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><p>I kept sending precise and focused prompts. Testing the game, noting the issues and prompting again. After a few of those - it&#8217;s ready!</p><p>The power-ups really bumped the fun up a notch! Check it out:</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;70ffa121-f85a-4e05-9af4-0453d40859d0&quot;,&quot;duration&quot;:null}"></div><p>Do note that I did <strong>not</strong> write a single line of the code or config. Not even a command. Everything you see has been generated so to speak.</p><h1>The WebAssembly</h1><p>I think we&#8217;re ready to see how it can run in the browser. Sending a new prompt:</p><pre><code>lets implement the web part</code></pre><p>I intentionally sent a vague prompt to see if it&#8217;d remember the pygbag requirement from the overview.md file, and check it out:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hxIJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb9f0895-aadf-4bc9-82b3-77c89e12b60d_1261x338.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hxIJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb9f0895-aadf-4bc9-82b3-77c89e12b60d_1261x338.png 424w, https://substackcdn.com/image/fetch/$s_!hxIJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb9f0895-aadf-4bc9-82b3-77c89e12b60d_1261x338.png 848w, https://substackcdn.com/image/fetch/$s_!hxIJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb9f0895-aadf-4bc9-82b3-77c89e12b60d_1261x338.png 1272w, https://substackcdn.com/image/fetch/$s_!hxIJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb9f0895-aadf-4bc9-82b3-77c89e12b60d_1261x338.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hxIJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb9f0895-aadf-4bc9-82b3-77c89e12b60d_1261x338.png" width="1261" height="338" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eb9f0895-aadf-4bc9-82b3-77c89e12b60d_1261x338.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:338,&quot;width&quot;:1261,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:53952,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.kaumnen.com/i/165938287?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb9f0895-aadf-4bc9-82b3-77c89e12b60d_1261x338.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!hxIJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb9f0895-aadf-4bc9-82b3-77c89e12b60d_1261x338.png 424w, https://substackcdn.com/image/fetch/$s_!hxIJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb9f0895-aadf-4bc9-82b3-77c89e12b60d_1261x338.png 848w, https://substackcdn.com/image/fetch/$s_!hxIJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb9f0895-aadf-4bc9-82b3-77c89e12b60d_1261x338.png 1272w, https://substackcdn.com/image/fetch/$s_!hxIJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb9f0895-aadf-4bc9-82b3-77c89e12b60d_1261x338.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">Q Chat Context Retrieval</figcaption></figure></div><p>It did remember! Then proceeded to:</p><ul><li><p>do a test run </p></li><li><p>setup a config file for the pygbag </p></li><li><p>check and refactor existing files to align them with the pygbag requirements </p></li></ul><p>Tried again and.. bingo!</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;f631673a-82de-4298-a738-924e92cd16b9&quot;,&quot;duration&quot;:null}"></div><blockquote><p>Tip: If you notice, during the chat, that the model is <em>lost</em>, trying some weird things, circling back after the new prompt - just start a new chat to clear the context. Why? The bad responses the model generated stay in the context and will negatively impact the output quality.</p></blockquote><h1>Conclusion</h1><p>Looking back at that old Google Drive folder and my high school game project, it's incredible to see how far technology has come. Building this Breakout game with Amazon Q Developer CLI felt like a huge leap forward. </p><p>As for the Amazon Q Developer CLI - it&#8217;s great. The interface in which it operates (the CLI) provides so many possibilities, from help with commands (e.g. those scary-looking <strong>ffmpeg </strong>commands) to full code generation. I plan to test it more, might even stop hitting the <em><strong>Up</strong></em> arrow key 50 times instead of just typing out a command. Or even better - <strong>q chat &#8220;</strong><em>help</em><strong>&#8221;</strong>.</p>]]></content:encoded></item><item><title><![CDATA[Building Simple And Powerful AI Assistant For AWS Docs]]></title><description><![CDATA[Leveraging RAG, MCPs and Amazon Nova LLMs for Efficient AWS Documentation Queries]]></description><link>https://www.kaumnen.com/p/building-simple-and-powerful-aws-ai-assistant-for-aws-docs</link><guid isPermaLink="false">https://www.kaumnen.com/p/building-simple-and-powerful-aws-ai-assistant-for-aws-docs</guid><dc:creator><![CDATA[kaumnen]]></dc:creator><pubDate>Mon, 12 May 2025 16:48:18 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/58157aa9-5e00-4896-8687-4641f3eadc55_1920x1280.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Working with AWS on a daily basis means diving into the documentation often. It is great, well written. But navigating its sheer volume to pinpoint exactly what you need, <em>when</em> you need it, can take a bit of time sometimes.</p><p>There are LLMs. RAG is well-known. MCP servers seem pretty interesting. So I got an idea - can I create an AI-powered assistant that can help me quickly query the docs and see what&#8217;s up? Yes! </p><p>Also, while I&#8217;m at that - it&#8217;s a good opportunity to test Amazon Nova LLMs (Micro, Lite and Pro). </p><p>This article walks through the creation of <a href="https://github.com/kaumnen/lumen">lumen</a>, a proof-of-concept app I built to help with AWS-related questions, by combining Retrieval Augmented Generation (RAG), AWS Model Context Protocol (MCP) servers, and the capabilities of Amazon's Nova Large Language Models (LLMs).</p><p></p><h1>Architecture Overview</h1><p>We covered the <em>why</em> part. Let&#8217;s now focus on the <em>what</em> and <em>how</em> parts.</p><p>Here is a quick diagram of <a href="https://github.com/kaumnen/lumen">lumen</a>:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!62Y3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a572636-1e2a-47e2-a85d-b7029e486a76_1207x744.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!62Y3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a572636-1e2a-47e2-a85d-b7029e486a76_1207x744.png 424w, https://substackcdn.com/image/fetch/$s_!62Y3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a572636-1e2a-47e2-a85d-b7029e486a76_1207x744.png 848w, https://substackcdn.com/image/fetch/$s_!62Y3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a572636-1e2a-47e2-a85d-b7029e486a76_1207x744.png 1272w, https://substackcdn.com/image/fetch/$s_!62Y3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a572636-1e2a-47e2-a85d-b7029e486a76_1207x744.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!62Y3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a572636-1e2a-47e2-a85d-b7029e486a76_1207x744.png" width="1207" height="744" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2a572636-1e2a-47e2-a85d-b7029e486a76_1207x744.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:744,&quot;width&quot;:1207,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:91289,&quot;alt&quot;:&quot;A diagram representing architecture of lumen.&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://www.kaumnen.com/i/162788713?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a572636-1e2a-47e2-a85d-b7029e486a76_1207x744.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A diagram representing architecture of lumen." title="A diagram representing architecture of lumen." srcset="https://substackcdn.com/image/fetch/$s_!62Y3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a572636-1e2a-47e2-a85d-b7029e486a76_1207x744.png 424w, https://substackcdn.com/image/fetch/$s_!62Y3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a572636-1e2a-47e2-a85d-b7029e486a76_1207x744.png 848w, https://substackcdn.com/image/fetch/$s_!62Y3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a572636-1e2a-47e2-a85d-b7029e486a76_1207x744.png 1272w, https://substackcdn.com/image/fetch/$s_!62Y3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a572636-1e2a-47e2-a85d-b7029e486a76_1207x744.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><figcaption class="image-caption">Architecture Diagram</figcaption></figure></div><p>It has what the vast majority of <a href="https://www.ibm.com/think/topics/retrieval-augmented-generation">RAG</a> systems have these days:</p><ol><li><p>Knowledge Base - <a href="https://qdrant.tech/documentation/overview/">Qdrant Vector DB</a></p></li><li><p>Retriever - LangChain&#8217;s tool in Python BE</p></li><li><p>Integration Layer - LangChain/LangGraph</p></li><li><p>Generator - Amazon Nova LLMs</p></li></ol><p>There is one more thing I added - <a href="https://awslabs.github.io/mcp/">AWS MCP Servers</a>:</p><ul><li><p>Core MCP Server</p></li><li><p>AWS Documentation MCP Server</p></li></ul><p></p><h2>Retrieval Augmented Generation (RAG)</h2><p>lumen ingests the <strong>PDF</strong> files. PDF is one of the few file formats that proves to be a challenge to parse and chunk time and time again. No parsing tool is perfect, but the two I found to work best with the AWS Docs PDFs are <a href="https://docling-project.github.io/docling/">Docling</a> and <a href="https://pymupdf.readthedocs.io/en/latest/pymupdf4llm/">PyMuPDF4LLM</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!neoN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d9e52fd-2bbd-41d1-b6ea-b033681994ae_3578x1984.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!neoN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d9e52fd-2bbd-41d1-b6ea-b033681994ae_3578x1984.png 424w, https://substackcdn.com/image/fetch/$s_!neoN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d9e52fd-2bbd-41d1-b6ea-b033681994ae_3578x1984.png 848w, https://substackcdn.com/image/fetch/$s_!neoN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d9e52fd-2bbd-41d1-b6ea-b033681994ae_3578x1984.png 1272w, https://substackcdn.com/image/fetch/$s_!neoN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d9e52fd-2bbd-41d1-b6ea-b033681994ae_3578x1984.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!neoN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d9e52fd-2bbd-41d1-b6ea-b033681994ae_3578x1984.png" width="1456" height="807" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4d9e52fd-2bbd-41d1-b6ea-b033681994ae_3578x1984.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:807,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:519911,&quot;alt&quot;:&quot;A screenshot showing an example of the RAG Chat interface.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.kaumnen.com/i/162788713?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d9e52fd-2bbd-41d1-b6ea-b033681994ae_3578x1984.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A screenshot showing an example of the RAG Chat interface." title="A screenshot showing an example of the RAG Chat interface." srcset="https://substackcdn.com/image/fetch/$s_!neoN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d9e52fd-2bbd-41d1-b6ea-b033681994ae_3578x1984.png 424w, https://substackcdn.com/image/fetch/$s_!neoN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d9e52fd-2bbd-41d1-b6ea-b033681994ae_3578x1984.png 848w, https://substackcdn.com/image/fetch/$s_!neoN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d9e52fd-2bbd-41d1-b6ea-b033681994ae_3578x1984.png 1272w, https://substackcdn.com/image/fetch/$s_!neoN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d9e52fd-2bbd-41d1-b6ea-b033681994ae_3578x1984.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">RAG Chat example</figcaption></figure></div><h3>How does the file ingestion work?</h3><ol><li><p><strong>Get the AWS Docs PDF file</strong></p><ol><li><p>Uploaded by the user</p></li><li><p>Downloaded by the app if a user submits online PDF location</p></li></ol></li><li><p><strong>Optimization</strong></p><ol><li><p>Remove Table of Contents, Document revision and similar sections as they do not provide much value in terms of aiding the LLM response. But they do help in the next steps!</p></li></ol></li><li><p><strong>Parsing</strong></p><ol><li><p>This is the most important part. PDF file is parsed and converted to Markdown. Takes the most time too.</p></li></ol></li><li><p><strong>Chunking</strong></p><ol><li><p>Markdown shines here. Each document is chunked based on the heading levels in small, byte-sized pieces. This process will make each embedding more relevant and on point.</p></li></ol></li><li><p><strong>Generating Vectors</strong></p><ol><li><p>The final part. This is where embeddings are created using <a href="https://docs.aws.amazon.com/bedrock/latest/userguide/titan-embedding-models.html">Amazon Titan Text Embeddings V2</a> model and then stored in Qdrant Vector DB.</p></li></ol></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!h_9K!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f46455f-6086-45bc-81e7-89f3331d2f2f_746x1012.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!h_9K!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f46455f-6086-45bc-81e7-89f3331d2f2f_746x1012.png 424w, https://substackcdn.com/image/fetch/$s_!h_9K!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f46455f-6086-45bc-81e7-89f3331d2f2f_746x1012.png 848w, https://substackcdn.com/image/fetch/$s_!h_9K!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f46455f-6086-45bc-81e7-89f3331d2f2f_746x1012.png 1272w, https://substackcdn.com/image/fetch/$s_!h_9K!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f46455f-6086-45bc-81e7-89f3331d2f2f_746x1012.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!h_9K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f46455f-6086-45bc-81e7-89f3331d2f2f_746x1012.png" width="746" height="1012" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4f46455f-6086-45bc-81e7-89f3331d2f2f_746x1012.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1012,&quot;width&quot;:746,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:71940,&quot;alt&quot;:&quot;A diagram representing RAG Ingestion Pipeline.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.kaumnen.com/i/162788713?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f46455f-6086-45bc-81e7-89f3331d2f2f_746x1012.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A diagram representing RAG Ingestion Pipeline." title="A diagram representing RAG Ingestion Pipeline." srcset="https://substackcdn.com/image/fetch/$s_!h_9K!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f46455f-6086-45bc-81e7-89f3331d2f2f_746x1012.png 424w, https://substackcdn.com/image/fetch/$s_!h_9K!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f46455f-6086-45bc-81e7-89f3331d2f2f_746x1012.png 848w, https://substackcdn.com/image/fetch/$s_!h_9K!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f46455f-6086-45bc-81e7-89f3331d2f2f_746x1012.png 1272w, https://substackcdn.com/image/fetch/$s_!h_9K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f46455f-6086-45bc-81e7-89f3331d2f2f_746x1012.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">RAG File Ingestion Pipeline</figcaption></figure></div><p></p><blockquote><p>Why <strong>Amazon Titan Text Embeddings V2</strong> model? </p><ul><li><p>With a maximum of <strong>8192</strong> <strong>input text tokens</strong> it can embed larger documents or text chunks without needing too much splitting (this can provide more contextual information)</p></li><li><p>Flexible output dimensions (1024, 512, 256) allow fine-tuning the trade-off between <strong>embedding context</strong> and <strong>performance</strong></p></li><li><p>More than <strong>100 supported languages</strong> in preview means you don&#8217;t really have to think about supporting multiple languages (but test the system always!)</p></li><li><p>It makes things easier if you are already invested in the AWS ecosystem by being available in the <a href="https://docs.aws.amazon.com/bedrock/">Bedrock</a> service as a first-party model</p></li></ul></blockquote><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.kaumnen.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.kaumnen.com/subscribe?"><span>Subscribe now</span></a></p><p></p><h3>How does the data retrieval work?</h3><ol><li><p><strong>Embed user query</strong></p><ol><li><p>Send user message to the embedding model</p></li></ol></li><li><p><strong>Search the Qdrant Vector DB</strong></p><ol><li><p>Use the calculated vector to search Qdrant Collection</p></li></ol></li><li><p><strong>Return the content with metadata</strong></p><ol><li><p>Remember that the documents are chunked based on the heading levels? Metadata contains heading levels and document title:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KBAG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e434b24-474c-4e7c-929f-d68ffeb46a32_3024x1332.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KBAG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e434b24-474c-4e7c-929f-d68ffeb46a32_3024x1332.png 424w, https://substackcdn.com/image/fetch/$s_!KBAG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e434b24-474c-4e7c-929f-d68ffeb46a32_3024x1332.png 848w, https://substackcdn.com/image/fetch/$s_!KBAG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e434b24-474c-4e7c-929f-d68ffeb46a32_3024x1332.png 1272w, https://substackcdn.com/image/fetch/$s_!KBAG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e434b24-474c-4e7c-929f-d68ffeb46a32_3024x1332.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KBAG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e434b24-474c-4e7c-929f-d68ffeb46a32_3024x1332.png" width="1456" height="641" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8e434b24-474c-4e7c-929f-d68ffeb46a32_3024x1332.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:641,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:249368,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.kaumnen.com/i/162788713?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e434b24-474c-4e7c-929f-d68ffeb46a32_3024x1332.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!KBAG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e434b24-474c-4e7c-929f-d68ffeb46a32_3024x1332.png 424w, https://substackcdn.com/image/fetch/$s_!KBAG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e434b24-474c-4e7c-929f-d68ffeb46a32_3024x1332.png 848w, https://substackcdn.com/image/fetch/$s_!KBAG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e434b24-474c-4e7c-929f-d68ffeb46a32_3024x1332.png 1272w, https://substackcdn.com/image/fetch/$s_!KBAG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e434b24-474c-4e7c-929f-d68ffeb46a32_3024x1332.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div></li></ol></li><li><p><strong>Send the results to the LLM</strong></p><ol><li><p>The final step that provides precise and factual data which helps LLM to create a better response</p></li></ol></li></ol><div><hr></div><p>You can use the <strong>search page</strong> to check the data retrieval:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iWmu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6504224d-2cd1-4f08-b243-6e38112b3ed0_3578x1618.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iWmu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6504224d-2cd1-4f08-b243-6e38112b3ed0_3578x1618.png 424w, https://substackcdn.com/image/fetch/$s_!iWmu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6504224d-2cd1-4f08-b243-6e38112b3ed0_3578x1618.png 848w, https://substackcdn.com/image/fetch/$s_!iWmu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6504224d-2cd1-4f08-b243-6e38112b3ed0_3578x1618.png 1272w, https://substackcdn.com/image/fetch/$s_!iWmu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6504224d-2cd1-4f08-b243-6e38112b3ed0_3578x1618.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iWmu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6504224d-2cd1-4f08-b243-6e38112b3ed0_3578x1618.png" width="1456" height="658" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6504224d-2cd1-4f08-b243-6e38112b3ed0_3578x1618.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:658,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:521990,&quot;alt&quot;:&quot;A screenshot showing an example of the Vector Search interface.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.kaumnen.com/i/162788713?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6504224d-2cd1-4f08-b243-6e38112b3ed0_3578x1618.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A screenshot showing an example of the Vector Search interface." title="A screenshot showing an example of the Vector Search interface." srcset="https://substackcdn.com/image/fetch/$s_!iWmu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6504224d-2cd1-4f08-b243-6e38112b3ed0_3578x1618.png 424w, https://substackcdn.com/image/fetch/$s_!iWmu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6504224d-2cd1-4f08-b243-6e38112b3ed0_3578x1618.png 848w, https://substackcdn.com/image/fetch/$s_!iWmu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6504224d-2cd1-4f08-b243-6e38112b3ed0_3578x1618.png 1272w, https://substackcdn.com/image/fetch/$s_!iWmu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6504224d-2cd1-4f08-b243-6e38112b3ed0_3578x1618.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">Search Vectors page</figcaption></figure></div><p></p><h2>Model Context Protocol (MCP) Servers</h2><p>lumen also supports <strong>AWS MCP Servers</strong>, namely the <strong>Core</strong> and <strong>AWS Documentation</strong> ones.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nrFM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8467e8d0-d1e7-443f-ba63-2f4e8eca24dd_3580x1986.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nrFM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8467e8d0-d1e7-443f-ba63-2f4e8eca24dd_3580x1986.png 424w, https://substackcdn.com/image/fetch/$s_!nrFM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8467e8d0-d1e7-443f-ba63-2f4e8eca24dd_3580x1986.png 848w, https://substackcdn.com/image/fetch/$s_!nrFM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8467e8d0-d1e7-443f-ba63-2f4e8eca24dd_3580x1986.png 1272w, https://substackcdn.com/image/fetch/$s_!nrFM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8467e8d0-d1e7-443f-ba63-2f4e8eca24dd_3580x1986.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nrFM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8467e8d0-d1e7-443f-ba63-2f4e8eca24dd_3580x1986.png" width="1456" height="808" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8467e8d0-d1e7-443f-ba63-2f4e8eca24dd_3580x1986.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:808,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:571959,&quot;alt&quot;:&quot;A screenshot showing an example of the MCP Chat interface.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.kaumnen.com/i/162788713?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8467e8d0-d1e7-443f-ba63-2f4e8eca24dd_3580x1986.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A screenshot showing an example of the MCP Chat interface." title="A screenshot showing an example of the MCP Chat interface." srcset="https://substackcdn.com/image/fetch/$s_!nrFM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8467e8d0-d1e7-443f-ba63-2f4e8eca24dd_3580x1986.png 424w, https://substackcdn.com/image/fetch/$s_!nrFM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8467e8d0-d1e7-443f-ba63-2f4e8eca24dd_3580x1986.png 848w, https://substackcdn.com/image/fetch/$s_!nrFM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8467e8d0-d1e7-443f-ba63-2f4e8eca24dd_3580x1986.png 1272w, https://substackcdn.com/image/fetch/$s_!nrFM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8467e8d0-d1e7-443f-ba63-2f4e8eca24dd_3580x1986.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">MCP Chat example</figcaption></figure></div><h3>Core MCP Server</h3><blockquote><p>MCP server that provides a starting point for using the following awslabs MCP servers - awslabs.cdk-mcp-server - awslabs.bedrock-kb-retrieval-mcp-server - awslabs.nova-canvas-mcp-server - awslabs.cost-analysis-mcp-server - awslabs.aws-documentation-mcp-server - awslabs.aws-diagram-mcp-server</p><p>- AWS MCP Servers Docs - <a href="https://awslabs.github.io/mcp/servers/core-mcp-server/">Direct Link</a> -</p></blockquote><h3>AWS Documentation MCP Server</h3><blockquote><p>Model Context Protocol (MCP) server for AWS Documentation</p><p>This MCP server provides tools to access AWS documentation, search for content, and get recommendations.</p><p>- AWS MCP Servers Docs - <a href="https://awslabs.github.io/mcp/servers/aws-documentation-mcp-server/">Direct Link</a> -</p></blockquote><p></p><p>I integrated these two AWS MCP Servers with the <a href="https://github.com/langchain-ai/langchain-mcp-adapters">langchain-mcp-adapters</a>. It converts the <strong>MCP Server tools</strong> into <strong>LangChain tools</strong>. As RAG system&#8217;s integration layer is LangChain this was a great tool for the job.</p><p><strong>AWS MCP Servers</strong> supported chat has its own window so you can use and test <strong>RAG or MCP</strong> supported chat responses separately.</p><div><hr></div><p>Both RAG-supported and MCP-supported chat windows have a Tool Activity drop-down component where you can see which tools were called and what were their responses. </p><p>You can also choose the <strong>Amazon Nova</strong> model you want to use in the chat. <strong>Session Info</strong> on the sidebar shows basic info about the chat (number of messages, tool calls and total tokens usage).</p><p></p><h1>Amazon Nova Models</h1><p>The backbone of lumen. I used:</p><ul><li><p>Amazon Nova <strong>Micro</strong></p></li><li><p>Amazon Nova <strong>Lite</strong></p></li><li><p>Amazon Nova <strong>Pro</strong></p></li></ul><h2>Amazon Nova Micro</h2><p>A <strong>text-only</strong> model optimized for very low latency and cost. Has plenty of context token space (<strong>128K</strong>). My usage of the <strong>Micro</strong> model in lumen:</p><ul><li><p><strong>summarization</strong></p></li><li><p><strong>simple tasks</strong> (listing quotas, basic info about services)</p></li></ul><p>It is suprisingly <strong>good</strong> at tool calling and following the system prompt. Needless to say - it&#8217;s quite fast!</p><h2>Amazon Nova Lite</h2><p>This model can process <strong>text, images and videos</strong>. Has a larger context token space as well (<strong>300K</strong>)! My usage of the <strong>Lite</strong> model in lumen:</p><ul><li><p><strong>cross-referencing multiple sources</strong></p></li><li><p><strong>somewhat complex queries</strong> (how can service X take advantage of service Y, scenario-based questions)</p></li></ul><p><strong>Very solid</strong> at tool calling and following the system prompt. Slightly slower than <strong>Micro</strong>, but still fast.</p><h2>Amazon Nova Pro</h2><p>This one has all the benefits of the previous models but bumps things up a notch when it comes to the intelligence. Large context token space (<strong>300K</strong>) and is really good when it comes to the complex queries. My usage of the <strong>Pro</strong> model in lumen:</p><ul><li><p><strong>when I need very detailed responses</strong></p></li><li><p><strong>architecture-based questions</strong> (how to do X while having YZ in place, ideas to simplify, lower cost, speed up AWS infrastructure, etc.)</p></li></ul><p>It is <strong>rock-solid</strong> at tool calling and following the system prompt. It is slower, but it&#8217;s worth it. In cases where I expect a very detailed response to a complex query I don&#8217;t really mind longer inference time.</p><p></p><blockquote><p>I don&#8217;t know if this is the case but Nova models seem to be aligned very, very well with AWS Documentation. </p><p>Depending on the model-query combination, I didn&#8217;t really notice any hallucinations, <strong>even when links were included in the response</strong>. </p><p>It seems Amazon/AWS engineers carefully prepared relevant datasets, which is evident in the models&#8217; performances. In any case - kudos to the team!</p></blockquote><p></p><h1>Final thoughts</h1><p>So, building lumen turned out to be a great practical exercise. It definitely helps me dig through AWS docs and it provided real hands-on experience setting up the RAG pipeline, wiring up Qdrant, MCPs and properly testing out the different Amazon Nova models for the job.</p><p>Their performance, tool-calling ability and contextual understanding were a highlight.</p><p>Of course, there's always room for improvement (PDF parsing, <em>looking at you</em>), maybe refining the chunking strategy or even implementing a custom HTML parser down the line. But for now, lumen is working well as a proof-of-concept and is already a useful tool in my own workflow.</p><p>lumen is and will stay open source and <s>MIT licensed</s>.</p><blockquote><p><strong>EDIT 02. June 2025:</strong> Quick heads-up on the license: lumen kicked off with an MIT license but to properly mesh with some of the great open-source software lumen uses I'm now switching it over to the <strong><a href="https://choosealicense.com/licenses/agpl-3.0/">GNU Affero General Public License v3.0 (AGPL 3.0)</a></strong>. It's just a necessary step to keep things solid and genuinely open for everyone.</p></blockquote><p>There are still some rough edges, so contributions to help smooth them out and build upon the concept are welcome! </p><p>You can find the source code and how-to-run instructions here: <a href="https://github.com/kaumnen/lumen">lumen</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.kaumnen.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 kaumnen's Cloud Dispatch! Subscribe for free to receive new posts.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[How To Secure Server Access Via Cloudflare Zero Trust & WARP]]></title><description><![CDATA[Secure connection to your server and services with Cloudflare Zero Trust and WARP, eliminating the need to open SSH or other ports.]]></description><link>https://www.kaumnen.com/p/how-to-secure-server-access-via-cloudflare</link><guid isPermaLink="false">https://www.kaumnen.com/p/how-to-secure-server-access-via-cloudflare</guid><dc:creator><![CDATA[kaumnen]]></dc:creator><pubDate>Fri, 12 Jul 2024 17:44:10 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/76564a6c-2610-4bc6-8530-5945207c38ae_1920x1440.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Needless to say - you shouldn&#8217;t use passwords for your SSH connections. Why? Is there a reason not to use an SSH key pair? </p><p>In case you must/want to use it or you want to remove your SSH port from the server and therefore public internet, I&#8217;ll show you how you can SSH into your instance without port 22, through a VPN. It&#8217;s all free and if you ask me - pretty cool!</p><div><hr></div><h1>What do you need?</h1><ol><li><p>A publicly accessible server (virtual or physical, doesn&#8217;t really matter) </p></li></ol><blockquote><p>If you don&#8217;t have an instance ready and would like to try this out, there are a lot of options, but notable free ones include: <a href="https://aws.amazon.com/free">AWS Free Tier</a>, <a href="https://azure.microsoft.com/en-us/pricing/free-services">Azure Free Tier</a>, <a href="https://www.oracle.com/cloud/free/">Oracle Free Tier</a></p></blockquote><ol start="2"><li><p>Cloudflare Account</p><ol><li><p>Zero Trust</p></li><li><p>WARP Client</p></li></ol></li></ol><div><hr></div><h1>How does this work? </h1><p>Let&#8217;s take a look at the following diagram:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bC0n!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc287274c-d3ce-47af-b7a1-32510e8fcb46_1128x210.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bC0n!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc287274c-d3ce-47af-b7a1-32510e8fcb46_1128x210.png 424w, https://substackcdn.com/image/fetch/$s_!bC0n!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc287274c-d3ce-47af-b7a1-32510e8fcb46_1128x210.png 848w, https://substackcdn.com/image/fetch/$s_!bC0n!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc287274c-d3ce-47af-b7a1-32510e8fcb46_1128x210.png 1272w, https://substackcdn.com/image/fetch/$s_!bC0n!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc287274c-d3ce-47af-b7a1-32510e8fcb46_1128x210.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bC0n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc287274c-d3ce-47af-b7a1-32510e8fcb46_1128x210.png" width="728" height="135.53191489361703" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c287274c-d3ce-47af-b7a1-32510e8fcb46_1128x210.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:210,&quot;width&quot;:1128,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:29981,&quot;alt&quot;:&quot;Secure access scheme&quot;,&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="Secure access scheme" title="Secure access scheme" srcset="https://substackcdn.com/image/fetch/$s_!bC0n!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc287274c-d3ce-47af-b7a1-32510e8fcb46_1128x210.png 424w, https://substackcdn.com/image/fetch/$s_!bC0n!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc287274c-d3ce-47af-b7a1-32510e8fcb46_1128x210.png 848w, https://substackcdn.com/image/fetch/$s_!bC0n!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc287274c-d3ce-47af-b7a1-32510e8fcb46_1128x210.png 1272w, https://substackcdn.com/image/fetch/$s_!bC0n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc287274c-d3ce-47af-b7a1-32510e8fcb46_1128x210.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Secure access scheme</figcaption></figure></div><ul><li><p><a href="https://github.com/cloudflare/cloudflared">cloudflared</a> - this is installed on the server and proxies the traffic through Cloudflare to the origin (your device in this case).</p></li><li><p><a href="https://developers.cloudflare.com/cloudflare-one/">Cloudflare Zero Trust</a> - a security framework that allows you to set access rules to services that you want to protect. It ensures that devices are trustworthy before allowing access.</p><ul><li><p><a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-devices/warp/">Cloudflare WARP</a> is a part of Zero Trust. When WARP client is connected, it allows you to access services that you secured with Zero Trust.</p><ul><li><p>You can download it from the Zero Trust portal by going to the: <strong>Settings</strong> &#8594; <strong>Downloads</strong></p></li></ul></li></ul></li></ul><p>After everything is in place, you will be able to connect to your machine using its private IP, but only while connected to the WARP client. Zero Trust will prevent access otherwise.</p><p>That being said, there is no more need for keeping port <strong>22</strong> open/accessible.</p><blockquote><p>Note: While connected to the WARP client, you will be able to access everything on the machine even if your firewall/security group is preventing access as everything will be routed through <strong>cloudflared</strong> and <strong>Zero Trust</strong>. You can still allow access from the public internet by opening ports in your firewall/security group.</p></blockquote><div><hr></div><h1>How to do it?</h1><h2>1. Create a tunnel in Cloudflare Zero Trust</h2><ol><li><p>Login to your Cloudflare account, or create one</p></li><li><p>Go to <strong>Zero Trust</strong></p></li><li><p>Networks &#8594; Tunnels &#8594; Create a tunnel</p></li><li><p>Select Cloudflared &#8594; Next</p></li><li><p>Set a name</p></li><li><p>Select OS and architecture of your server</p></li><li><p>Copy and run the commands shown</p><ol><li><p>Wait until you see your tunnel is <strong>connected</strong></p></li></ol></li><li><p>Select Private Networks</p></li><li><p>CIDR</p><ol><li><p>Type in the <strong>private IP</strong> address of your server (or a range that includes your server private IP - /32 or lower)</p><ol><li><p>For example, if your server private IP was <strong>10.0.2.3</strong> - you&#8217;d need to write <strong>10.0.2.3/32</strong> or a range - e.g. <strong>10.0.0.1/16</strong> would work too</p><ol><li><p><a href="https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing">What is CIDR?</a></p></li></ol></li></ol></li><li><p>Description if you&#8217;d like</p></li></ol></li><li><p>Save tunnel</p></li></ol><p>Here are some images to help you out:</p><blockquote><p>Note: For this setup, I am using <strong>Ubuntu 24.04 (LTS) x64 system</strong>.</p></blockquote><div class="image-gallery-embed" data-attrs="{&quot;gallery&quot;:{&quot;images&quot;:[{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cb7115e8-46f2-4701-b3f3-1df61e3086a6_1890x722.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/007a2719-c6e6-4966-a0b0-449ea14af921_1892x529.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cafdd10d-5118-46f6-b009-2bcd2e9147df_1663x898.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/098e9fbd-de7c-4fa2-8b40-471dbf421e85_1900x685.png&quot;}],&quot;caption&quot;:&quot;Cloudflare tunnel setup&quot;,&quot;alt&quot;:&quot;Cloudflare tunnel setup&quot;,&quot;staticGalleryImage&quot;:{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ad471ec5-ea50-4b25-848e-fcd8518daff1_1456x1456.png&quot;}},&quot;isEditorNode&quot;:true}"></div><p>One more thing - remember that you configured Cloudflare tunnel with a <strong>private network CIDR</strong>? Let&#8217;s now check <strong>split tunnel</strong> settings because, by default, WARP <strong>excludes</strong> traffic to/from <a href="https://en.wikipedia.org/wiki/Private_network">IP address ranges reserved for private networks</a>:</p><ul><li><p><strong>10.0.0.0/8</strong> (10.0.0.0 - 10.255.255.255)</p></li><li><p><strong>172.16.0.0/12</strong> (172.16.0.0 - 172.31.255.255)</p></li><li><p><strong>192.168.0.0/16</strong> (192.168.0.0 - 192.168.255.255)</p></li></ul><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.kaumnen.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 kaumnen's Cloud Dispatch! To stay updated with new posts, subscribe for free to my newsletter.</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><hr></div><ol><li><p>Go to Cloudflare Zero Trust portal</p></li><li><p>Settings &#8594; WARP Client &#8594; Device Settings</p></li><li><p>Select Default profile name</p></li><li><p>Edit &#8594; Scroll down &#8594; Split Tunnels</p></li><li><p>Check which option is selected &#8594; Manage</p><ol><li><p>If <strong>Exclude&#8230;</strong> is selected, find CIDR that includes your tunnel&#8217;s CIDR and <strong>delete</strong> it from the list</p></li><li><p>If <strong>Include&#8230;</strong> is selected, <strong>add</strong> your tunnel&#8217;s CIDR to the list</p></li></ol></li></ol><blockquote><p>Note: If you do have a service on your <strong>local network</strong> that is running on the same IP address as your (cloud) server, it will <strong>not</strong> be accessible anymore as traffic to that IP will now be routed through WARP client and Cloudflare Zero Trust.</p></blockquote><div><hr></div><h2>2. Install and setup WARP client</h2><ol><li><p><a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-devices/warp/download-warp/">Install</a> WARP client</p></li><li><p>Once it is running, open settings</p></li><li><p>Go to Account tab</p></li><li><p>Login to Cloudflare Zero Trust</p><ol><li><p>When it prompts you on the <strong>team's name</strong>, if you don&#8217;t know it you can find it in the Zero Trust dashboard: <strong>Settings</strong> &#8594; <strong>Custom Pages</strong> &#8594; <strong>Team domain</strong>. Your team's name is the subdomain there.</p><ol><li><p><strong>&lt;team_name&gt;</strong>.cloudflareaccess.com</p></li></ol></li></ol></li></ol><div><hr></div><h2>3. Test it out</h2><blockquote><p>Check your server firewall/security group. Feel free to disable all <strong>incoming</strong> connections.</p></blockquote><ol><li><p>Open WARP client on your device</p></li><li><p>Connect</p></li><li><p>Open your shell/ssh connections manager app</p></li><li><p>Connect to your server via ssh protocol and <strong>public IP</strong> address</p></li></ol><p>Not working. If it is working, disable your <strong>ssh</strong> <strong>port</strong>.</p><p>Now try the same with the <strong>private IP</strong> address. It will work if you set everything up.</p><div><hr></div><h1>That&#8217;s it!</h1><p>Now, your machine is accessible only while connected to the WARP client, over the private IP address <strong>unless</strong> you allow a port to be accessible from the public internet. </p><blockquote><p>You can also test it by running the <strong>nginx</strong> service on your machine, or anything else that needs an open port. Try accessing <strong>&lt;server_private_ip&gt;:&lt;port&gt;</strong> in your browser. You should be able to see your server&#8217;s <strong>nginx</strong> welcome page while connected to your Zero Trust (Cloudflare) account through WARP client.</p><p>Or try to ping your servers&#8217; private IP from your device. You will see the packets transmitting. While your WARP client is in the connected state, your (cloud) server will be accessible as would any other server be on your local network.</p></blockquote><div><hr></div><p>This way, you can protect your server ports from public internet - for free! SSH Connection? Private DNS instance? Private Minecraft server to play with friends? A bit more work but easy enough to set up. Will probably try this out myself.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.kaumnen.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 kaumnen's Cloud Dispatch! 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[AWS Nitro System: Secure And Efficient Virtualization Technology]]></title><description><![CDATA[Learn more about virtualization technology that supports high-level security, performance and efficiency of EC2 instances.]]></description><link>https://www.kaumnen.com/p/aws-nitro-virtualization-system</link><guid isPermaLink="false">https://www.kaumnen.com/p/aws-nitro-virtualization-system</guid><dc:creator><![CDATA[kaumnen]]></dc:creator><pubDate>Sat, 15 Jun 2024 15:18:43 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/2691308a-8662-4e85-90a2-7a13850cf280_1920x1080.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The AWS Nitro System transforms EC2 virtualization with dedicated and optimized hardware and software. This setup is offloading many tasks to specialized components. Let&#8217;s explore the key parts and check how they work.</p><div><hr></div><h1>What is it?</h1><p>AWS Nitro System is a collection of hardware and software components from AWS that are used for the virtualization of the EC2 servers. The Nitro System enables higher performance, availability and security than traditional virtualization.</p><h3>What is virtualization? </h3><blockquote><p>Virtualization is a technology that you can use to create virtual representations of servers, storage, networks, and other physical machines. Virtual software mimics the functions of physical hardware to run multiple virtual machines simultaneously on a single physical machine - <a href="https://aws.amazon.com/what-is/virtualization/">link</a>.</p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jeHE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5459a49-ce8f-4e7a-948b-a3e72f8bc94f_631x367.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jeHE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5459a49-ce8f-4e7a-948b-a3e72f8bc94f_631x367.png 424w, https://substackcdn.com/image/fetch/$s_!jeHE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5459a49-ce8f-4e7a-948b-a3e72f8bc94f_631x367.png 848w, https://substackcdn.com/image/fetch/$s_!jeHE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5459a49-ce8f-4e7a-948b-a3e72f8bc94f_631x367.png 1272w, https://substackcdn.com/image/fetch/$s_!jeHE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5459a49-ce8f-4e7a-948b-a3e72f8bc94f_631x367.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jeHE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5459a49-ce8f-4e7a-948b-a3e72f8bc94f_631x367.png" width="631" height="367" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e5459a49-ce8f-4e7a-948b-a3e72f8bc94f_631x367.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:367,&quot;width&quot;:631,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:28788,&quot;alt&quot;:&quot;Traditional virtualization&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Traditional virtualization" title="Traditional virtualization" srcset="https://substackcdn.com/image/fetch/$s_!jeHE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5459a49-ce8f-4e7a-948b-a3e72f8bc94f_631x367.png 424w, https://substackcdn.com/image/fetch/$s_!jeHE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5459a49-ce8f-4e7a-948b-a3e72f8bc94f_631x367.png 848w, https://substackcdn.com/image/fetch/$s_!jeHE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5459a49-ce8f-4e7a-948b-a3e72f8bc94f_631x367.png 1272w, https://substackcdn.com/image/fetch/$s_!jeHE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5459a49-ce8f-4e7a-948b-a3e72f8bc94f_631x367.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><figcaption class="image-caption">Traditional virtualization - page 7 - <a href="https://docs.aws.amazon.com/pdfs/whitepapers/latest/security-design-of-aws-nitro-system/security-design-of-aws-nitro-system.pdf">link</a></figcaption></figure></div><p>The Nitro System is the underlying platform for a vast majority of EC2 instances.  If you&#8217;d like to check which instances support the Nitro system - check this <a href="https://docs.aws.amazon.com/ec2/latest/instancetypes/ec2-nitro-instances.html">link</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wOmW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7004ef25-98b8-4263-b45a-3a8a15c06505_666x634.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wOmW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7004ef25-98b8-4263-b45a-3a8a15c06505_666x634.png 424w, https://substackcdn.com/image/fetch/$s_!wOmW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7004ef25-98b8-4263-b45a-3a8a15c06505_666x634.png 848w, https://substackcdn.com/image/fetch/$s_!wOmW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7004ef25-98b8-4263-b45a-3a8a15c06505_666x634.png 1272w, https://substackcdn.com/image/fetch/$s_!wOmW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7004ef25-98b8-4263-b45a-3a8a15c06505_666x634.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wOmW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7004ef25-98b8-4263-b45a-3a8a15c06505_666x634.png" width="666" height="634" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7004ef25-98b8-4263-b45a-3a8a15c06505_666x634.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:634,&quot;width&quot;:666,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:41248,&quot;alt&quot;:&quot;Nitro System virtualization&quot;,&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="Nitro System virtualization" title="Nitro System virtualization" srcset="https://substackcdn.com/image/fetch/$s_!wOmW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7004ef25-98b8-4263-b45a-3a8a15c06505_666x634.png 424w, https://substackcdn.com/image/fetch/$s_!wOmW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7004ef25-98b8-4263-b45a-3a8a15c06505_666x634.png 848w, https://substackcdn.com/image/fetch/$s_!wOmW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7004ef25-98b8-4263-b45a-3a8a15c06505_666x634.png 1272w, https://substackcdn.com/image/fetch/$s_!wOmW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7004ef25-98b8-4263-b45a-3a8a15c06505_666x634.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">Nitro System virtualization - page 9 - <a href="https://docs.aws.amazon.com/pdfs/whitepapers/latest/security-design-of-aws-nitro-system/security-design-of-aws-nitro-system.pdf">link</a></figcaption></figure></div><p>It ensures the confidentiality, security and performance of the EC2 instances by moving most of the traditional virtualization functions to the dedicated hardware and firmware. This allows the core system to have more power for the actual workloads. </p><div><hr></div><p>Three main parts of the Nitro are:</p><ol><li><p><strong>Nitro Cards</strong></p></li><li><p><strong>Nitro Security Chip</strong></p></li><li><p><strong>Nitro Hypervisor</strong></p></li></ol><p>There are 2 additional parts of the system:</p><ol><li><p><strong>Nitro TPM</strong></p></li><li><p><strong>Nitro Enclaves</strong></p></li></ol><p>Let&#8217;s check how they are designed and what their responsibilities are within the Nitro System.</p><div><hr></div><h1>Nitro cards</h1><p>EC2 server consists of 2 parts: </p><ol><li><p><strong>System board</strong> (bare-metal)</p></li><li><p><strong>Nitro Cards</strong></p></li></ol><p>System boards have the CPU and memory. </p><p>Nitro Cards are a crucial component in the Nitro System. They function as separate components on the system boards. Some of the key characteristics and functions are:</p><h3>1. System control and I/O Virtualization</h3><p>Nitro cards provide overall system control and input/output virtualization independent of the system board. They have their CPU and memory. This separation enhances the performance of the core system.</p><h3>2. Dedicated hardware and firmware</h3><p>Nitro cards have their own SoC - System on Chip package which is developed in-house by the dedicated team within AWS - Annapurna Labs. Those SoCs need firmware to run - that firmware is created by the AWS dedicated teams too, meaning that the whole system is performance and security-optimized.</p><h3>3. Specialized Nitro Cards for different I/O functions</h3><p>There are specialized Nitro Cards too (with the same SoC and base firmware designs), specifically optimized for different workloads:</p><ol><li><p><strong>Nitro Cards for VPC</strong> - networking</p></li><li><p><strong>Nitro Cards for EBS</strong> - storage</p></li><li><p><strong>Nitro Cards for Local NVMe Storage</strong></p></li></ol><h3>4. Hardware-Accelerated Encryption</h3><p>Nitro cards use hardware offload engines for data encryption in networking and storage. This means that data and the traffic are encrypted without system performance impact. Secure key storage is integrated into the SoC.</p><div><hr></div><h3>Nitro Controller</h3><p>Nitro Controller is the primary Nitro Card in the AWS Nitro System and with that - the hardware root of trust for the entire system.  It manages various Nitro components and their interactions, including the loaded firmware.</p><h3>What are the responsibilities of a Nitro Controller?</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LX2S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84612cdf-134a-495d-8266-47de10d20089_666x281.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LX2S!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84612cdf-134a-495d-8266-47de10d20089_666x281.png 424w, https://substackcdn.com/image/fetch/$s_!LX2S!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84612cdf-134a-495d-8266-47de10d20089_666x281.png 848w, https://substackcdn.com/image/fetch/$s_!LX2S!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84612cdf-134a-495d-8266-47de10d20089_666x281.png 1272w, https://substackcdn.com/image/fetch/$s_!LX2S!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84612cdf-134a-495d-8266-47de10d20089_666x281.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LX2S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84612cdf-134a-495d-8266-47de10d20089_666x281.png" width="666" height="281" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/84612cdf-134a-495d-8266-47de10d20089_666x281.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:281,&quot;width&quot;:666,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:17262,&quot;alt&quot;:&quot;AWS Nitro System control architecture&quot;,&quot;title&quot;:&quot;AWS Nitro System control architecture&quot;,&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="AWS Nitro System control architecture" title="AWS Nitro System control architecture" srcset="https://substackcdn.com/image/fetch/$s_!LX2S!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84612cdf-134a-495d-8266-47de10d20089_666x281.png 424w, https://substackcdn.com/image/fetch/$s_!LX2S!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84612cdf-134a-495d-8266-47de10d20089_666x281.png 848w, https://substackcdn.com/image/fetch/$s_!LX2S!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84612cdf-134a-495d-8266-47de10d20089_666x281.png 1272w, https://substackcdn.com/image/fetch/$s_!LX2S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84612cdf-134a-495d-8266-47de10d20089_666x281.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">AWS Nitro System control architecture - page 13 - <a href="https://docs.aws.amazon.com/pdfs/whitepapers/latest/security-design-of-aws-nitro-system/security-design-of-aws-nitro-system.pdf">link</a></figcaption></figure></div><p>The Nitro Controller presents a set of strongly authenticated and encrypted APIs for system management. </p><p>On the left is an EC2 Control Plane - a set of services responsible for managing customer configuration (e.g. creating, modifying, deleting resources).</p><p>On the right is a Nitro Hypervisor. We&#8217;ll talk about it a bit later.</p><div><hr></div><h1>Nitro Security Chip</h1><p>Please note that:</p><blockquote><p>The nitro Controller and other Nitro Cards together operate as one domain in a Nitro System and the system main board with processors, where customer workloads are run.</p></blockquote><p>The Nitro Security Chip is a critical component of the AWS Nitro System. It serves as a bridge between the Nitro Controller and the system board by extending the root hardware of trust (Nitro Controller chain of trust) and control over to the system main board.</p><p>The NSC (Nitro Security Chip) sits between the <a href="https://www.techtarget.com/searchnetworking/definition/baseboard-management-controller">BMC</a> (Baseboard Management Controller) and the main system CPU, on the high-speed PCI connection. </p><p>You probably guessed why - by being there, Nitro Security Chip is effectively acting as a firewall on production systems. Because it is controlled by the Nitro Controller, NSC can validate updates to the firmware or other programming of the non-volatile devices (ones that retain information even when the power is off), either on the system main board or the other Nitro Cards.</p><p></p><h3>Secure Boot and Reset control</h3><p>One of the most important things when it comes to the security of the system is BIOS integrity. It is the heart of the system in a way.</p><p>So, how does the NSC help here?</p><p>It controls the physical reset pins of the system main board, including the CPU and BMC. </p><p>This allows the Nitro Controller to complete its secure boot and verify the integrity of the BIOS, BMC and every other system firmware. Only after all checks are complete, NSC is instructed to release CPUs and BMC from being held in reset. </p><blockquote><p>Note: Nitro Security Chip is playing a crucial role in the EC2 bare-metal mode too. There is no hypervisor as the EC2 instance system board is not shared, so NSC is making sure that the main system CPUs cannot update the firmware in bare-metal mode. But even when Nitro Hypervisor is present (shared system board), NSC has the same role. Just a different approach.</p></blockquote><div><hr></div><h1>Nitro Hypervisor</h1><p>Who is running and managing EC2 instances on shared hardware? Nitro Hypervisor - another part of the Nitro System that is purpose in-house built.</p><div class="pullquote"><p>The Nitro Hypervisor is a limited and carefully designed component that has been intentionally minimized and purpose built with the capabilities needed to perform its assigned functions, and no more.</p><p>The Security Design of the AWS Nitro System - page 16 - <a href="https://docs.aws.amazon.com/pdfs/whitepapers/latest/security-design-of-aws-nitro-system/security-design-of-aws-nitro-system.pdf">link</a></p></div><p>This system minimizes the possibility of vulnerabilities that could be exploited by attackers. It manages the allocation of resources (CPU, memory) and is controlled by the Nitro Controller.</p><p>Think of the AWS Nitro System as a busy office with specialized roles to ensure efficiency:</p><p>&#8226; <strong>Nitro Hypervisor</strong>: Like a specialized and efficient receptionist, its primary task is to allocate resources (meeting rooms and equipment) to different teams (virtual machines). It ensures security by maintaining strict boundaries between teams but does not handle tasks such as taking phone calls or managing schedules.</p><p>&#8226; <strong>Nitro Controller</strong>: Think of it as the office manager setting the policies and ensuring that the environment is efficiently operating. It sets the ground rules and policies for resource usage but also controls the coordination between the receptionist (Nitro Hypervisor) and other office functions, ensuring everything runs smoothly.</p><div><hr></div><p>Let&#8217;s break down Nitro Hypervisor functions and characteristics:</p><ol><li><p><strong>Resource Management:</strong> Manages CPU and memory allocation as instructed by the Nitro Controller.</p></li><li><p><strong>Hardware Device Assignment:</strong> Assigns GPUs to the VMs and manages error recovery.</p></li><li><p><strong>Simple design, optimized security and performance:</strong> There is no networking stack, file system of any sort or any drivers. Meaning? It&#8217;s simple, secure and performant. </p></li><li><p><strong>Storage:</strong> Firmware is stored on an encrypted storage device connected to the Nitro Controller. It is linked to the NC&#8217;s root of trust too, which means its integrity is validated.</p></li><li><p><strong>Firmware updates:</strong> Live updates are possible. That means that Nitro Hypervisor firmware can be updated or even replaced without disruption to running instances!</p></li><li><p><strong>Bare Metal instances:</strong> In this case, system management, I/O virtualization and monitoring are handled by the Nitro Cards directly. Nitro Hypervisor is an optional discrete component in this case.</p></li><li><p><strong>Passive communication:</strong> Passive communication design principle means that during production operation, components of the system (any system) do not initiate outbound communication. Nitro Hypervisor follows this principle. Remember - there is no networking stack. It waits for commands from the Nitro Controller via a private channel over the PCIe interface. </p></li></ol><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.kaumnen.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 kaumnen's Cloud Dispatch! Subscribe for free to receive new posts.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h1>Nitro TPM</h1><p>This is another important part of the Nitro System and is utilized during the Secure Boot process.</p><p>Let&#8217;s check Nitro TPMs function:</p><ol><li><p><strong>Measurement and Verification:</strong> During system initialization, the TPM records measurements of the initial boot code. These measurements are then used to verify the integrity of the next stages of system firmware as they are loaded.</p></li><li><p><strong>System Integrity:</strong> The TPM utilizes its embedded tamper-resistant cryptographic keys to generate digital signatures for the set of system measurements taken during the boot process. This digitally signed file serves as a reference point for future boots. Think of it as a boot history/archive.</p></li><li><p><strong>Boot-Time Integrity Checks:</strong> Each time the system reboots, the TPM compares the newly generated system measurements against the signed file created during the initial secure boot. This comparison allows the system to detect any unauthorized changes or modifications to the system firmware.</p></li><li><p><strong>Controlled Decryption:</strong> If the TPM verifies that no unauthorized changes have occurred, it enables the decryption of additional system data, allowing the boot process to proceed. But, if any mismatch is detected, this decryption process (including the Secure Boot) is halted and the system is taken offline, preventing it from hosting customer workloads.</p></li></ol><div class="pullquote"><p>Note: In the case of <a href="https://aws.amazon.com/outposts/">AWS Outposts</a> deployments, a Nitro Security Key is also used along with a TPM and the secure boot features of the SoC to protect the encryption key for the SSD, which is connected directly to the Nitro Controller.</p><p>The Security Design of the AWS Nitro System - page 12 <a href="https://docs.aws.amazon.com/pdfs/whitepapers/latest/security-design-of-aws-nitro-system/security-design-of-aws-nitro-system.pdf">link</a></p></div><p></p><p>It checks the integrity of the firmware. If something has been changed since the initial boot, without authorization, it is clear that something is wrong and the machine becomes unavailable.</p><div><hr></div><h1>Nitro Enclaves</h1><p>Nitro Enclaves is a capability of the Nitro System that enables users to separate workloads into distinct components. They also allow the processing of data and highly trusted code running to which even the EC2 instance administrators do not have access to.</p><p>Nitro Enclaves characteristics:</p><ol><li><p><strong>Enhanced Isolation:</strong> Nitro Enclaves inherit the robust isolation specific to EC2 instances operating on the Nitro System. This means that there is a high level of security and protection for sensitive workloads.</p></li><li><p><strong>Resource Allocation:</strong> Parent EC2 instance allocates a dedicated set of virtual CPUs (minimum one full core) and memory pages. These resources are isolated from the parent instance and dedicated to the enclave's operation.</p></li><li><p><strong>Secure Communication:</strong> There is no IP networking capability, intentionally. This limits the attack surface and provides a secure communication model with the parent instance or other authorized systems/devices.</p></li><li><p><strong>Persistence:</strong> Nitro Enclaves don&#8217;t have persistent storage, by design. This guarantees that sensitive data is not stored within the enclave's environment when it is deleted.</p></li></ol><p></p><p>So, the primary objective of Nitro Enclaves is to provide an additional layer of isolation (and therefore security) to the Nitro System for (very) sensitive tasks. One of the key features is to specifically safeguard the Enclave against unauthorized access from users and software running on the &#8216;main&#8217; EC2 instance.</p><p></p><h2>Usage</h2><p>You might ask - where is this useful? </p><ol><li><p><strong>Healthcare:</strong> Processing this highly-sensitive data securely - patient records, medical history, test results&#8230;</p></li><li><p><strong>Financial services:</strong> Processing sensitive financial data - transactions, account information, financial analytics&#8230;</p></li><li><p><strong>Machine learning:</strong> Running machine learning models on sensitive data without exposing the data to the host system or users.</p></li><li><p><strong>Confidential collaboration:</strong> Enclaves enable multiple parties to collaborate on sensitive data without exposing it to each other or the underlying infrastructure. For example, imagine two companies, one has the data, other one has the ML model. They do not want to share their IP (intellectual property)/data. In that case, Nitro enclaves provide a way for them to collaborate while ensuring confidentiality for both parties.</p></li></ol><div><hr></div><p>So, there you have it &#8211; the <a href="https://aws.amazon.com/ec2/nitro/">AWS Nitro System</a> in a nutshell. It&#8217;s a complex virtualization system that provides a high level of security, performance and efficiency. </p><p>Whether you&#8217;re handling (or planning to) sensitive data in healthcare, finance, or any other industry, Nitro System ensures your workloads are secure and running smoothly. </p>]]></content:encoded></item><item><title><![CDATA[How To Host Private Cloud Storage - Nextcloud On AWS]]></title><description><![CDATA[Learn how to deploy Nextcloud on AWS with a Graviton EC2 instance, S3 external storage and configure Cloudflare for enhanced security and performance.]]></description><link>https://www.kaumnen.com/p/how-to-host-private-cloud-storage-nextcloud-aws</link><guid isPermaLink="false">https://www.kaumnen.com/p/how-to-host-private-cloud-storage-nextcloud-aws</guid><dc:creator><![CDATA[kaumnen]]></dc:creator><pubDate>Wed, 01 May 2024 16:29:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/341c9b73-77e9-453f-a3a4-74c9c7d414f4_2000x1125.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Let's install and run Nextcloud in AWS on the Graviton (AWS) EC2 instance. The primary file storage will be an S3 bucket with double file encryption. And it's all free (<strong>only if your AWS Account is eligible for Free Trial, and you stay within it</strong>).</p><h3>What will be used?</h3><ol><li><p><strong>Nextcloud</strong> - free and open-source</p></li><li><p><strong>Graviton EC2 <a href="https://aws.amazon.com/ec2/instance-types/t4/">t4g</a>.small instance</strong> - up to 750 hours free per month, until 31. DEC 2026.</p></li><li><p><strong>EBS</strong> - 30 GB included in the <a href="https://aws.amazon.com/free/">free tier</a></p></li><li><p><strong>Elastic IP</strong> - 750 hours per month included in the <a href="https://aws.amazon.com/free">free tier</a></p></li><li><p><strong>S3 Storage</strong> - 5GB included in the <a href="https://aws.amazon.com/free">free tier</a></p></li><li><p><strong>IAM</strong> - free</p></li><li><p><strong>A domain (or subdomain)</strong> - host on your own domain, or get a subdomain for free &#8211; <a href="https://noip.com">noip</a>, <a href="https://duckdns.org">duckDNS</a> or similar</p></li><li><p><strong>Cloudflare</strong> (only if you have your own domain) - free</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yFt0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bdcc491-5809-4889-abcc-b8a2d9791823_847x554.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yFt0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bdcc491-5809-4889-abcc-b8a2d9791823_847x554.png 424w, https://substackcdn.com/image/fetch/$s_!yFt0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bdcc491-5809-4889-abcc-b8a2d9791823_847x554.png 848w, https://substackcdn.com/image/fetch/$s_!yFt0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bdcc491-5809-4889-abcc-b8a2d9791823_847x554.png 1272w, https://substackcdn.com/image/fetch/$s_!yFt0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bdcc491-5809-4889-abcc-b8a2d9791823_847x554.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yFt0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bdcc491-5809-4889-abcc-b8a2d9791823_847x554.png" width="847" height="554" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5bdcc491-5809-4889-abcc-b8a2d9791823_847x554.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:554,&quot;width&quot;:847,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:18476,&quot;alt&quot;:&quot;Simple architecture&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Simple architecture" title="Simple architecture" srcset="https://substackcdn.com/image/fetch/$s_!yFt0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bdcc491-5809-4889-abcc-b8a2d9791823_847x554.png 424w, https://substackcdn.com/image/fetch/$s_!yFt0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bdcc491-5809-4889-abcc-b8a2d9791823_847x554.png 848w, https://substackcdn.com/image/fetch/$s_!yFt0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bdcc491-5809-4889-abcc-b8a2d9791823_847x554.png 1272w, https://substackcdn.com/image/fetch/$s_!yFt0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bdcc491-5809-4889-abcc-b8a2d9791823_847x554.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><figcaption class="image-caption">Simple architecture</figcaption></figure></div><blockquote><p>You can also try to do everything with t2.micro or t3.micro (available in Bahrain and Stockholm) EC2 instances. Everything is the same except for instance launch.</p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mEos!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1881d7d0-81a2-41c3-9020-e5e4e3075139_2336x190.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mEos!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1881d7d0-81a2-41c3-9020-e5e4e3075139_2336x190.png 424w, https://substackcdn.com/image/fetch/$s_!mEos!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1881d7d0-81a2-41c3-9020-e5e4e3075139_2336x190.png 848w, https://substackcdn.com/image/fetch/$s_!mEos!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1881d7d0-81a2-41c3-9020-e5e4e3075139_2336x190.png 1272w, https://substackcdn.com/image/fetch/$s_!mEos!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1881d7d0-81a2-41c3-9020-e5e4e3075139_2336x190.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mEos!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1881d7d0-81a2-41c3-9020-e5e4e3075139_2336x190.png" width="1456" height="118" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1881d7d0-81a2-41c3-9020-e5e4e3075139_2336x190.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:118,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5508,&quot;alt&quot;:&quot;Nextcloud, with the basic install, is consuming just shy of 900 MB of memory while idling.&quot;,&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="Nextcloud, with the basic install, is consuming just shy of 900 MB of memory while idling." title="Nextcloud, with the basic install, is consuming just shy of 900 MB of memory while idling." srcset="https://substackcdn.com/image/fetch/$s_!mEos!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1881d7d0-81a2-41c3-9020-e5e4e3075139_2336x190.png 424w, https://substackcdn.com/image/fetch/$s_!mEos!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1881d7d0-81a2-41c3-9020-e5e4e3075139_2336x190.png 848w, https://substackcdn.com/image/fetch/$s_!mEos!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1881d7d0-81a2-41c3-9020-e5e4e3075139_2336x190.png 1272w, https://substackcdn.com/image/fetch/$s_!mEos!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1881d7d0-81a2-41c3-9020-e5e4e3075139_2336x190.png 1456w" sizes="100vw"></picture><div></div></div></a><figcaption class="image-caption">Nextcloud, with the basic install, is consuming just shy of 900 MB of memory while idling.</figcaption></figure></div><div><hr></div><h2><strong>Graviton</strong></h2><p>As per <a href="https://aws.amazon.com/ec2/graviton/">documentation</a> &#8211; AWS Graviton (ARM Processor) is a family of processors designed to deliver the best price performance for your cloud workloads running in Amazon Elastic Compute Cloud (Amazon EC2).</p><p>We will use t4g.small instance, which has:</p><ul><li><p>2 GiB of Memory</p></li><li><p>2 vCPUs</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tj5_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d750ea6-6c86-4e9e-aab0-dd5ce5665526_1520x480.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tj5_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d750ea6-6c86-4e9e-aab0-dd5ce5665526_1520x480.png 424w, https://substackcdn.com/image/fetch/$s_!tj5_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d750ea6-6c86-4e9e-aab0-dd5ce5665526_1520x480.png 848w, https://substackcdn.com/image/fetch/$s_!tj5_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d750ea6-6c86-4e9e-aab0-dd5ce5665526_1520x480.png 1272w, https://substackcdn.com/image/fetch/$s_!tj5_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d750ea6-6c86-4e9e-aab0-dd5ce5665526_1520x480.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tj5_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d750ea6-6c86-4e9e-aab0-dd5ce5665526_1520x480.png" width="1456" height="460" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3d750ea6-6c86-4e9e-aab0-dd5ce5665526_1520x480.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:460,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:172878,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.kaumnen.com/i/144272866?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d750ea6-6c86-4e9e-aab0-dd5ce5665526_1520x480.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!tj5_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d750ea6-6c86-4e9e-aab0-dd5ce5665526_1520x480.png 424w, https://substackcdn.com/image/fetch/$s_!tj5_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d750ea6-6c86-4e9e-aab0-dd5ce5665526_1520x480.png 848w, https://substackcdn.com/image/fetch/$s_!tj5_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d750ea6-6c86-4e9e-aab0-dd5ce5665526_1520x480.png 1272w, https://substackcdn.com/image/fetch/$s_!tj5_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d750ea6-6c86-4e9e-aab0-dd5ce5665526_1520x480.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">AWS EC2 FAQs - <a href="https://aws.amazon.com/ec2/faqs/#t4g-instances">https://aws.amazon.com/ec2/faqs/#t4g-instances</a></figcaption></figure></div><p>Also, make sure you choose the right settings to avoid unintended charges to your account. Just follow along and you'll be good to go.</p><p><a href="https://x.com/kaumnen/status/1783939334506258605">https://x.com/kaumnen/status/1783939334506258605</a></p><div><hr></div><h2>Create graviton EC2</h2><p>Login to your AWS account. Head over to the EC2 console. Click <em>Launch Instances</em>.</p><h4>Graviton EC2 t4g.small config</h4><ul><li><p><strong>Name:</strong> nextcloud-root (you can set this to your liking)</p></li><li><p><strong>AMI:</strong> Ubuntu Server 24.04 LTS (HVM), SSD Volume Type</p></li><li><p><strong>Architecture:</strong> 64-bit (Arm)</p></li><li><p><strong>Instance type:</strong> t4g.small</p></li><li><p><strong>Key pair:</strong> Proceed without a key pair</p></li><li><p><strong>Network (click Edit):</strong></p></li><li><p>New security group</p></li><li><p><strong>Open ports:</strong></p><ul><li><p><strong>22</strong> - EC2 Instance Connect (consider restricting source IPs, more info below)</p></li><li><p><strong>80</strong> - Initial HTTP Nextcloud setup (Source 0.0.0.0/0)</p></li><li><p><strong>443 </strong>- HTTPS Apache container (Source 0.0.0.0/0)</p></li><li><p><strong>8443</strong> - SSL/TLS Nextcloud (Source 0.0.0.0/0)</p></li></ul></li><li><p><strong>Storage:</strong> 1x 30GB gp3 (Nextcloud needs about 5GB of space for storage. Feel free to adjust this to your needs. 8GB is the minimum)</p></li><li><p><strong>Advanced settings:</strong></p><ul><li><p><strong>Credit specification:</strong> Standard (take a look at the tweet above for more info)</p></li></ul></li></ul><blockquote><p>You can restrict access for port 22. I will be using EC2 Instance Connect to connect to the instance directly from the AWS Console.</p></blockquote><div><hr></div><p>If you want to restrict access to the port 22:</p><ol><li><p>Go to this docs page &#8211; <a href="https://docs.aws.amazon.com/vpc/latest/userguide/aws-ip-ranges.html#aws-ip-download">https://docs.aws.amazon.com/vpc/latest/userguide/aws-ip-ranges.html#aws-ip-download</a></p></li><li><p>Click on the link for the <em>ip-ranges</em> json file</p></li><li><p>Search for <strong>EC2_INSTANCE_CONNECT</strong></p></li><li><p>Find your region and CIDR IP. You can set that CIDR IP address as the source IP for port 22 in the security group.</p></li><li><p>As of now (25. APR 2024.) CIDR IP for the eu-central-1 (<strong>Frankfurt</strong>) region I will be using is: <strong>3.120.181.40/29</strong></p></li></ol><p>You can leave everything else as default. Click <em>Launch instance</em>.</p><div><hr></div><blockquote><p><strong>Update - Sept. 2024</strong></p></blockquote><p>You can use <a href="https://github.com/kaumnen/cipr">cipr</a> - a CLI tool I created to find and filter CIDR ranges from various cloud providers. An example command for the CIDR needed in this case:</p><pre><code>cipr aws --filter-service EC2_INSTANCE_CONNECT --filter-region eu-central-1</code></pre><p>If you&#8217;d like to learn more about cipr - check the docs at: <a href="https://cipr.sh/docs/intro">https://cipr.sh</a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.kaumnen.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">Subscribe for free to get fresh content delivered directly to your inbox and help support my work. It's quick, easy, no spam!</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><hr></div><h2>Elastic IP and Domain (sub-domain) setup</h2><p>Now that we have EC2 instance, we can first create an Elastic IP, and after that an A DNS record. Then we can proceed with EC2 setup. In the meantime, DNS records will be propagated.</p><blockquote><p>A domain is required for Nextcloud. If you do not have a domain, you can buy one, or get a subdomain for free from services like duckdns.org, noip.com or others.</p></blockquote><p>Let's start with Elastic IP.</p><ol><li><p>Find <strong>Elastic IPs</strong> in the navigation panel on the left</p></li><li><p>Click <em>Allocate Elastic IP address</em></p></li><li><p>Click <em>Allocate</em></p></li></ol><p>You can now select it, go to associate Elastic IP address, select your instance, Private IP address, and click Associate.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!D_OL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43c95dc7-6b1e-4b65-8441-64ae7c363674_4224x454.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!D_OL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43c95dc7-6b1e-4b65-8441-64ae7c363674_4224x454.png 424w, https://substackcdn.com/image/fetch/$s_!D_OL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43c95dc7-6b1e-4b65-8441-64ae7c363674_4224x454.png 848w, https://substackcdn.com/image/fetch/$s_!D_OL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43c95dc7-6b1e-4b65-8441-64ae7c363674_4224x454.png 1272w, https://substackcdn.com/image/fetch/$s_!D_OL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43c95dc7-6b1e-4b65-8441-64ae7c363674_4224x454.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!D_OL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43c95dc7-6b1e-4b65-8441-64ae7c363674_4224x454.png" width="1456" height="156" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/43c95dc7-6b1e-4b65-8441-64ae7c363674_4224x454.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:156,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:39546,&quot;alt&quot;:&quot;Elastic IP Allocation&quot;,&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="Elastic IP Allocation" title="Elastic IP Allocation" srcset="https://substackcdn.com/image/fetch/$s_!D_OL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43c95dc7-6b1e-4b65-8441-64ae7c363674_4224x454.png 424w, https://substackcdn.com/image/fetch/$s_!D_OL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43c95dc7-6b1e-4b65-8441-64ae7c363674_4224x454.png 848w, https://substackcdn.com/image/fetch/$s_!D_OL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43c95dc7-6b1e-4b65-8441-64ae7c363674_4224x454.png 1272w, https://substackcdn.com/image/fetch/$s_!D_OL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43c95dc7-6b1e-4b65-8441-64ae7c363674_4224x454.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Elastic IP Allocation</figcaption></figure></div><p>Okay. Now, we can create an A DNS record, and point a subdomain (or domain) to the nextcloud EC2 instance.</p><ol><li><p>Copy your <em>Elastic IP</em> address</p></li><li><p>Create a DNS record:</p></li><li><p><strong>Type</strong>: A</p><ul><li><p><strong>Name</strong>: nextcloud</p></li><li><p>This can be whatever you want. Your subdomain will look like: Name.domain.tld</p><ul><li><p>In this case, your subdomain for Nextcloud would be: <em>nextcloud</em>.domain.tld</p></li></ul></li><li><p><strong>IPv4 address</strong>: Paste your Elastic IP address</p></li><li><p><strong>TTL</strong>: Leave it at Auto</p></li></ul></li></ol><blockquote><p>If you are using Cloudflare for your domain DNS management, set the <strong>Proxy status</strong> to <strong>DNS only</strong>!</p></blockquote><div><hr></div><h2>Nextcloud installation</h2><p>While your new DNS record is propagating, let's install Nextcloud on the Graviton EC2 instance.</p><h3>Connect to the instance with the EC2 Instance Connect</h3><ol><li><p>Select your instance</p></li><li><p>Click <em>Connect </em>(top-right)</p></li><li><p>Select <em>EC2 Instance Connect</em></p></li><li><p>Select <em>Connect using EC2 Instance Connect</em></p></li><li><p>Make sure <strong>ubuntu</strong> is the username</p></li><li><p>Click <em>Connect</em></p></li></ol><h3>Update/Upgrade system, just in case</h3><p>Run this command:</p><pre><code>sudo apt update &amp;&amp; sudo apt upgrade</code></pre><h3>Install docker</h3><p>Run this command:</p><pre><code>curl -fsSL https://get.docker.com | sudo sh</code></pre><h3>Test docker installation</h3><p>Run this command:</p><pre><code>sudo docker run hello-world</code></pre><h3>Install Nextcloud</h3><p>Run this command:</p><pre><code>sudo docker run \
--init \
--sig-proxy=false \
--name nextcloud-aio-mastercontainer \
--restart always \
--publish 80:80 \
--publish 8080:8080 \
--publish 8443:8443 \
--volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \
--volume /var/run/docker.sock:/var/run/docker.sock:ro \
nextcloud/all-in-one:latest</code></pre><div><hr></div><h2>Nextcloud Setup</h2><p>Output of the last docker command should give you something similar to this:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DN0f!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056aec77-b0f6-4de1-aeaf-b2dde908e67c_1523x118.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DN0f!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056aec77-b0f6-4de1-aeaf-b2dde908e67c_1523x118.png 424w, https://substackcdn.com/image/fetch/$s_!DN0f!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056aec77-b0f6-4de1-aeaf-b2dde908e67c_1523x118.png 848w, https://substackcdn.com/image/fetch/$s_!DN0f!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056aec77-b0f6-4de1-aeaf-b2dde908e67c_1523x118.png 1272w, https://substackcdn.com/image/fetch/$s_!DN0f!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056aec77-b0f6-4de1-aeaf-b2dde908e67c_1523x118.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DN0f!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056aec77-b0f6-4de1-aeaf-b2dde908e67c_1523x118.png" width="1456" height="113" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/056aec77-b0f6-4de1-aeaf-b2dde908e67c_1523x118.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:113,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8817,&quot;alt&quot;:&quot;Result of the last Nextcloud AIO Docker command&quot;,&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="Result of the last Nextcloud AIO Docker command" title="Result of the last Nextcloud AIO Docker command" srcset="https://substackcdn.com/image/fetch/$s_!DN0f!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056aec77-b0f6-4de1-aeaf-b2dde908e67c_1523x118.png 424w, https://substackcdn.com/image/fetch/$s_!DN0f!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056aec77-b0f6-4de1-aeaf-b2dde908e67c_1523x118.png 848w, https://substackcdn.com/image/fetch/$s_!DN0f!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056aec77-b0f6-4de1-aeaf-b2dde908e67c_1523x118.png 1272w, https://substackcdn.com/image/fetch/$s_!DN0f!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056aec77-b0f6-4de1-aeaf-b2dde908e67c_1523x118.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Result of the last Nextcloud AIO Docker command</figcaption></figure></div><p>You can head to:</p><p><strong>https://your_domain_that_points_to_this_server.tld:8443</strong></p><p>because subdomain (or domain) is hopefully propagated. If browser is stuck loading, DNS records haven't been propagated yet, you need to wait until that happens. Or you can access your Nextcloud installation page at the <em>Elastic IP,</em> port 8080:</p><p><strong>https://internal.ip.of.this.server:8080</strong></p><p>You should land on a page like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eh4Y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51ea37e5-cf07-4ac1-aba0-6fad0800b232_1250x1128.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eh4Y!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51ea37e5-cf07-4ac1-aba0-6fad0800b232_1250x1128.png 424w, https://substackcdn.com/image/fetch/$s_!eh4Y!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51ea37e5-cf07-4ac1-aba0-6fad0800b232_1250x1128.png 848w, https://substackcdn.com/image/fetch/$s_!eh4Y!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51ea37e5-cf07-4ac1-aba0-6fad0800b232_1250x1128.png 1272w, https://substackcdn.com/image/fetch/$s_!eh4Y!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51ea37e5-cf07-4ac1-aba0-6fad0800b232_1250x1128.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eh4Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51ea37e5-cf07-4ac1-aba0-6fad0800b232_1250x1128.png" width="1250" height="1128" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/51ea37e5-cf07-4ac1-aba0-6fad0800b232_1250x1128.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1128,&quot;width&quot;:1250,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:52219,&quot;alt&quot;:&quot;Nextcloud initial config page&quot;,&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="Nextcloud initial config page" title="Nextcloud initial config page" srcset="https://substackcdn.com/image/fetch/$s_!eh4Y!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51ea37e5-cf07-4ac1-aba0-6fad0800b232_1250x1128.png 424w, https://substackcdn.com/image/fetch/$s_!eh4Y!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51ea37e5-cf07-4ac1-aba0-6fad0800b232_1250x1128.png 848w, https://substackcdn.com/image/fetch/$s_!eh4Y!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51ea37e5-cf07-4ac1-aba0-6fad0800b232_1250x1128.png 1272w, https://substackcdn.com/image/fetch/$s_!eh4Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51ea37e5-cf07-4ac1-aba0-6fad0800b232_1250x1128.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">Nextcloud initial config page</figcaption></figure></div><ol><li><p>Copy your P<em>assword</em>, open <em>Nextcloud AIO</em> login and login</p></li><li><p>Type in the domain (or subdomain) you created record for previously</p></li><li><p>Click <em>Submit domain</em></p></li></ol><p>After that, the only thing that is left is the actual installation.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!00A0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a486aa5-c43a-451a-941d-de82c0362a0d_1194x1902.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!00A0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a486aa5-c43a-451a-941d-de82c0362a0d_1194x1902.png 424w, https://substackcdn.com/image/fetch/$s_!00A0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a486aa5-c43a-451a-941d-de82c0362a0d_1194x1902.png 848w, https://substackcdn.com/image/fetch/$s_!00A0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a486aa5-c43a-451a-941d-de82c0362a0d_1194x1902.png 1272w, https://substackcdn.com/image/fetch/$s_!00A0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a486aa5-c43a-451a-941d-de82c0362a0d_1194x1902.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!00A0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a486aa5-c43a-451a-941d-de82c0362a0d_1194x1902.png" width="1194" height="1902" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8a486aa5-c43a-451a-941d-de82c0362a0d_1194x1902.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1902,&quot;width&quot;:1194,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:129701,&quot;alt&quot;:&quot;Nextcloud installation panel&quot;,&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="Nextcloud installation panel" title="Nextcloud installation panel" srcset="https://substackcdn.com/image/fetch/$s_!00A0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a486aa5-c43a-451a-941d-de82c0362a0d_1194x1902.png 424w, https://substackcdn.com/image/fetch/$s_!00A0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a486aa5-c43a-451a-941d-de82c0362a0d_1194x1902.png 848w, https://substackcdn.com/image/fetch/$s_!00A0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a486aa5-c43a-451a-941d-de82c0362a0d_1194x1902.png 1272w, https://substackcdn.com/image/fetch/$s_!00A0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a486aa5-c43a-451a-941d-de82c0362a0d_1194x1902.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">Nextcloud installation panel</figcaption></figure></div><ol><li><p>De-select everything except <em>Imaginary</em>, click <em>Save changes</em></p></li><li><p>Select <em>Install Nextcloud 29</em>. Then click <em>Download and start containers</em></p></li></ol><p>Wait on the page until everything is started (should restart automagically when everything is ready)</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JSG-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0aa7d0-d516-4bf3-87e1-52a13fbc8eec_1158x1088.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JSG-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0aa7d0-d516-4bf3-87e1-52a13fbc8eec_1158x1088.png 424w, https://substackcdn.com/image/fetch/$s_!JSG-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0aa7d0-d516-4bf3-87e1-52a13fbc8eec_1158x1088.png 848w, https://substackcdn.com/image/fetch/$s_!JSG-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0aa7d0-d516-4bf3-87e1-52a13fbc8eec_1158x1088.png 1272w, https://substackcdn.com/image/fetch/$s_!JSG-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0aa7d0-d516-4bf3-87e1-52a13fbc8eec_1158x1088.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JSG-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0aa7d0-d516-4bf3-87e1-52a13fbc8eec_1158x1088.png" width="1158" height="1088" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ef0aa7d0-d516-4bf3-87e1-52a13fbc8eec_1158x1088.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1088,&quot;width&quot;:1158,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:48251,&quot;alt&quot;:&quot;Nextcloud installation - successful&quot;,&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="Nextcloud installation - successful" title="Nextcloud installation - successful" srcset="https://substackcdn.com/image/fetch/$s_!JSG-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0aa7d0-d516-4bf3-87e1-52a13fbc8eec_1158x1088.png 424w, https://substackcdn.com/image/fetch/$s_!JSG-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0aa7d0-d516-4bf3-87e1-52a13fbc8eec_1158x1088.png 848w, https://substackcdn.com/image/fetch/$s_!JSG-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0aa7d0-d516-4bf3-87e1-52a13fbc8eec_1158x1088.png 1272w, https://substackcdn.com/image/fetch/$s_!JSG-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef0aa7d0-d516-4bf3-87e1-52a13fbc8eec_1158x1088.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">Nextcloud installation - successful</figcaption></figure></div><p>Now that everything is set, click on <em>Open your Nextcloud</em> and login with the info provided to you by the installation page.</p><p>Okay, now that you are logged in, first let's change the admin password.</p><ol><li><p>Profile icon (top-right)</p></li><li><p>Administration settings</p></li><li><p>Under Personal - Security</p></li><li><p>Change password</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eEtb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F286bd2f2-2b3b-42eb-8130-a6c33f8a0f29_1528x640.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eEtb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F286bd2f2-2b3b-42eb-8130-a6c33f8a0f29_1528x640.png 424w, https://substackcdn.com/image/fetch/$s_!eEtb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F286bd2f2-2b3b-42eb-8130-a6c33f8a0f29_1528x640.png 848w, https://substackcdn.com/image/fetch/$s_!eEtb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F286bd2f2-2b3b-42eb-8130-a6c33f8a0f29_1528x640.png 1272w, https://substackcdn.com/image/fetch/$s_!eEtb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F286bd2f2-2b3b-42eb-8130-a6c33f8a0f29_1528x640.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eEtb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F286bd2f2-2b3b-42eb-8130-a6c33f8a0f29_1528x640.png" width="1456" height="610" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/286bd2f2-2b3b-42eb-8130-a6c33f8a0f29_1528x640.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:610,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:24037,&quot;alt&quot;:&quot;Nextcloud password change&quot;,&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="Nextcloud password change" title="Nextcloud password change" srcset="https://substackcdn.com/image/fetch/$s_!eEtb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F286bd2f2-2b3b-42eb-8130-a6c33f8a0f29_1528x640.png 424w, https://substackcdn.com/image/fetch/$s_!eEtb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F286bd2f2-2b3b-42eb-8130-a6c33f8a0f29_1528x640.png 848w, https://substackcdn.com/image/fetch/$s_!eEtb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F286bd2f2-2b3b-42eb-8130-a6c33f8a0f29_1528x640.png 1272w, https://substackcdn.com/image/fetch/$s_!eEtb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F286bd2f2-2b3b-42eb-8130-a6c33f8a0f29_1528x640.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">Nextcloud password change</figcaption></figure></div><div><hr></div><h2>Enable server-side encryption</h2><ol><li><p>Click on your profile picture</p></li><li><p>Click on <em>Apps</em></p></li><li><p>Click on Disabled apps and enable <em>Default encryption module</em></p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RmYX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b67bdf3-94b3-463a-88f0-76af45fda169_4802x1112.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RmYX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b67bdf3-94b3-463a-88f0-76af45fda169_4802x1112.png 424w, https://substackcdn.com/image/fetch/$s_!RmYX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b67bdf3-94b3-463a-88f0-76af45fda169_4802x1112.png 848w, https://substackcdn.com/image/fetch/$s_!RmYX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b67bdf3-94b3-463a-88f0-76af45fda169_4802x1112.png 1272w, https://substackcdn.com/image/fetch/$s_!RmYX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b67bdf3-94b3-463a-88f0-76af45fda169_4802x1112.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RmYX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b67bdf3-94b3-463a-88f0-76af45fda169_4802x1112.png" width="1456" height="337" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7b67bdf3-94b3-463a-88f0-76af45fda169_4802x1112.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:337,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:68300,&quot;alt&quot;:&quot;Disabled apps view. Nextcloud 29&quot;,&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="Disabled apps view. Nextcloud 29" title="Disabled apps view. Nextcloud 29" srcset="https://substackcdn.com/image/fetch/$s_!RmYX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b67bdf3-94b3-463a-88f0-76af45fda169_4802x1112.png 424w, https://substackcdn.com/image/fetch/$s_!RmYX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b67bdf3-94b3-463a-88f0-76af45fda169_4802x1112.png 848w, https://substackcdn.com/image/fetch/$s_!RmYX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b67bdf3-94b3-463a-88f0-76af45fda169_4802x1112.png 1272w, https://substackcdn.com/image/fetch/$s_!RmYX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b67bdf3-94b3-463a-88f0-76af45fda169_4802x1112.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Disabled apps view. Nextcloud 29</figcaption></figure></div><blockquote><p>While you are on that page, you can also enable <em>External storage support</em>. Or you can do that later on.</p></blockquote><p>Now just enable Server-Side Encryption in the admin settings.</p><ol><li><p>Profile picture</p></li><li><p><em>Administration settings</em></p></li><li><p>Under <em>Administration</em> - <em>Security</em></p></li><li><p>Turn the slider next to the <em>Enable server-side encryption</em> on and click on <em>Enable encryption</em></p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!G1SW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c765d1-7ac8-4f56-9c9c-cdcc281a9d7e_2722x1202.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!G1SW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c765d1-7ac8-4f56-9c9c-cdcc281a9d7e_2722x1202.png 424w, https://substackcdn.com/image/fetch/$s_!G1SW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c765d1-7ac8-4f56-9c9c-cdcc281a9d7e_2722x1202.png 848w, https://substackcdn.com/image/fetch/$s_!G1SW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c765d1-7ac8-4f56-9c9c-cdcc281a9d7e_2722x1202.png 1272w, https://substackcdn.com/image/fetch/$s_!G1SW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c765d1-7ac8-4f56-9c9c-cdcc281a9d7e_2722x1202.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!G1SW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c765d1-7ac8-4f56-9c9c-cdcc281a9d7e_2722x1202.png" width="1456" height="643" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d9c765d1-7ac8-4f56-9c9c-cdcc281a9d7e_2722x1202.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:643,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:103878,&quot;alt&quot;:&quot;Server-Side Encryption slider&quot;,&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="Server-Side Encryption slider" title="Server-Side Encryption slider" srcset="https://substackcdn.com/image/fetch/$s_!G1SW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c765d1-7ac8-4f56-9c9c-cdcc281a9d7e_2722x1202.png 424w, https://substackcdn.com/image/fetch/$s_!G1SW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c765d1-7ac8-4f56-9c9c-cdcc281a9d7e_2722x1202.png 848w, https://substackcdn.com/image/fetch/$s_!G1SW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c765d1-7ac8-4f56-9c9c-cdcc281a9d7e_2722x1202.png 1272w, https://substackcdn.com/image/fetch/$s_!G1SW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c765d1-7ac8-4f56-9c9c-cdcc281a9d7e_2722x1202.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">Server-Side Encryption slider</figcaption></figure></div><div><hr></div><h2>Configure S3 as an external storage</h2><p>Unfortunately, the only supported option to do authN/authZ with the AWS S3 API is by using <strong>security credentials.</strong></p><p>Let's first create an S3 bucket because we will need its ARN for a custom policy.</p><p>After that, you'll need to create a new user in the AWS Account, and security credentials after that.</p><h3>S3 bucket creation</h3><ol><li><p>Go to the S3 console</p></li><li><p>Click on <em>Create bucket</em></p></li><li><p><strong>Bucket name</strong>: Whatever you want. Keep in mind that it has to be globally unique</p></li><li><p>Keep everything else as-is</p></li><li><p>Create a sbucket and note the bucket name</p></li><li><p>Copy the ARN</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DzQh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c65932-a290-4cb9-8473-b7e336e5ad0d_4064x1230.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DzQh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c65932-a290-4cb9-8473-b7e336e5ad0d_4064x1230.png 424w, https://substackcdn.com/image/fetch/$s_!DzQh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c65932-a290-4cb9-8473-b7e336e5ad0d_4064x1230.png 848w, https://substackcdn.com/image/fetch/$s_!DzQh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c65932-a290-4cb9-8473-b7e336e5ad0d_4064x1230.png 1272w, https://substackcdn.com/image/fetch/$s_!DzQh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c65932-a290-4cb9-8473-b7e336e5ad0d_4064x1230.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DzQh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c65932-a290-4cb9-8473-b7e336e5ad0d_4064x1230.png" width="1456" height="441" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/93c65932-a290-4cb9-8473-b7e336e5ad0d_4064x1230.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:441,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:70198,&quot;alt&quot;:&quot;S3 bucket - ARN location&quot;,&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="S3 bucket - ARN location" title="S3 bucket - ARN location" srcset="https://substackcdn.com/image/fetch/$s_!DzQh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c65932-a290-4cb9-8473-b7e336e5ad0d_4064x1230.png 424w, https://substackcdn.com/image/fetch/$s_!DzQh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c65932-a290-4cb9-8473-b7e336e5ad0d_4064x1230.png 848w, https://substackcdn.com/image/fetch/$s_!DzQh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c65932-a290-4cb9-8473-b7e336e5ad0d_4064x1230.png 1272w, https://substackcdn.com/image/fetch/$s_!DzQh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c65932-a290-4cb9-8473-b7e336e5ad0d_4064x1230.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">S3 bucket - ARN location</figcaption></figure></div><blockquote><p>Using only common words in the S3 bucket name is <strong>a bad practice</strong>. Even if the bucket is private, you will be billed for every request, including those that result in <strong>4xx</strong> errors (<em>DELETE</em> and <em>CANCEL</em> are free in both cases). <a href="https://medium.com/@maciej.pocwierz/how-an-empty-s3-bucket-can-make-your-aws-bill-explode-934a383cb8b1">This post</a> discusses how even an empty AWS S3 bucket can lead to unexpected charges on your AWS bill.</p></blockquote><h3>IAM Policy creation</h3><ol><li><p>Go to the<em> IAM Console</em></p></li><li><p>Click <em>Policies</em></p></li><li><p>Click <em>Create policy</em></p></li><li><p>Click on <em>JSON</em></p></li><li><p>Paste this <em>JSON</em></p></li></ol><pre><code>{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowNextcloudToAccessS3Objects",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject",
                "s3:CreateBucket"
            ],
            "Resource": [
                "arn:aws:s3:::s3-nextcloud-external-storage-test",
                "arn:aws:s3:::s3-nextcloud-external-storage-test/*"
            ]
        }
    ]
}</code></pre><ol start="6"><li><p><strong>Update resource ARNs</strong> with your S3 bucket name</p></li><li><p>Click <em>Next</em></p></li><li><p>Type in a policy name, I chose - nextcloud-root-s3-policy</p></li><li><p><em>Create policy</em></p></li></ol><p>Your new IAM policy should look like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yE6o!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1f8019-2cd0-441d-8d23-f8b24a7700b6_4114x1688.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yE6o!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1f8019-2cd0-441d-8d23-f8b24a7700b6_4114x1688.png 424w, https://substackcdn.com/image/fetch/$s_!yE6o!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1f8019-2cd0-441d-8d23-f8b24a7700b6_4114x1688.png 848w, https://substackcdn.com/image/fetch/$s_!yE6o!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1f8019-2cd0-441d-8d23-f8b24a7700b6_4114x1688.png 1272w, https://substackcdn.com/image/fetch/$s_!yE6o!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1f8019-2cd0-441d-8d23-f8b24a7700b6_4114x1688.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yE6o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1f8019-2cd0-441d-8d23-f8b24a7700b6_4114x1688.png" width="1456" height="597" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1f1f8019-2cd0-441d-8d23-f8b24a7700b6_4114x1688.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:597,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:85466,&quot;alt&quot;:&quot;Custom IAM Policy for the Nextcloud S3 user&quot;,&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="Custom IAM Policy for the Nextcloud S3 user" title="Custom IAM Policy for the Nextcloud S3 user" srcset="https://substackcdn.com/image/fetch/$s_!yE6o!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1f8019-2cd0-441d-8d23-f8b24a7700b6_4114x1688.png 424w, https://substackcdn.com/image/fetch/$s_!yE6o!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1f8019-2cd0-441d-8d23-f8b24a7700b6_4114x1688.png 848w, https://substackcdn.com/image/fetch/$s_!yE6o!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1f8019-2cd0-441d-8d23-f8b24a7700b6_4114x1688.png 1272w, https://substackcdn.com/image/fetch/$s_!yE6o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1f8019-2cd0-441d-8d23-f8b24a7700b6_4114x1688.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">Custom IAM Policy for the Nextcloud S3 user</figcaption></figure></div><blockquote><p>You can also use the <em>AmazonS3FullAccess</em> AWS Managed policy, but why would you give more permissions than needed to the S3 IAM User?</p></blockquote><h3>IAM User creation</h3><ol><li><p>Click <em>Users </em>in the IAM Console</p></li><li><p>Click <em>Create user</em></p></li><li><p>Type in a user name that you like</p></li><li><p>Leave <em>Provide user access to the AWS Management Console </em>- unchecked</p></li><li><p>Click <em>Attach policies directly</em></p></li><li><p>From <em>Filter by Type</em> choose <em>Customer managed</em> and choose your policy</p></li><li><p>Or you can type in the search field the name of the <em>custom IAM Policy</em> that you just created</p></li><li><p>Search and select your IAM<em> </em>policy (in my case that is nextcloud-root-s3-policy) and create your user</p></li></ol><p>Now create security credentials.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Wwjv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9dfd630-9fcd-435f-9664-8dd6a33bf38e_4044x1982.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Wwjv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9dfd630-9fcd-435f-9664-8dd6a33bf38e_4044x1982.png 424w, https://substackcdn.com/image/fetch/$s_!Wwjv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9dfd630-9fcd-435f-9664-8dd6a33bf38e_4044x1982.png 848w, https://substackcdn.com/image/fetch/$s_!Wwjv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9dfd630-9fcd-435f-9664-8dd6a33bf38e_4044x1982.png 1272w, https://substackcdn.com/image/fetch/$s_!Wwjv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9dfd630-9fcd-435f-9664-8dd6a33bf38e_4044x1982.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Wwjv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9dfd630-9fcd-435f-9664-8dd6a33bf38e_4044x1982.png" width="1456" height="714" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c9dfd630-9fcd-435f-9664-8dd6a33bf38e_4044x1982.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:714,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:88936,&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_!Wwjv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9dfd630-9fcd-435f-9664-8dd6a33bf38e_4044x1982.png 424w, https://substackcdn.com/image/fetch/$s_!Wwjv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9dfd630-9fcd-435f-9664-8dd6a33bf38e_4044x1982.png 848w, https://substackcdn.com/image/fetch/$s_!Wwjv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9dfd630-9fcd-435f-9664-8dd6a33bf38e_4044x1982.png 1272w, https://substackcdn.com/image/fetch/$s_!Wwjv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9dfd630-9fcd-435f-9664-8dd6a33bf38e_4044x1982.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">IAM User overview screen</figcaption></figure></div><ol><li><p>Click on a user you just created</p></li><li><p>Select tab <em>Security credentials</em></p></li><li><p>In the <em>Access keys</em> - click <em>Create access key</em></p></li><li><p>Select<em> Other</em>, read all the bullet points</p></li><li><p>Create key. And keep them somewhere secure!</p></li></ol><h3>Nextcloud external storage setup</h3><p>Go back to the Nextcloud console and get the S3 integration done.</p><blockquote><p>For <em>External storage </em>to work, <em>External storage support</em> app needs to be enabled. If you did not enable it before, do it now. It is required.</p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!70nj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53aebcaf-0ba5-499d-9862-5ec04b57610e_4816x866.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!70nj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53aebcaf-0ba5-499d-9862-5ec04b57610e_4816x866.png 424w, https://substackcdn.com/image/fetch/$s_!70nj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53aebcaf-0ba5-499d-9862-5ec04b57610e_4816x866.png 848w, https://substackcdn.com/image/fetch/$s_!70nj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53aebcaf-0ba5-499d-9862-5ec04b57610e_4816x866.png 1272w, https://substackcdn.com/image/fetch/$s_!70nj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53aebcaf-0ba5-499d-9862-5ec04b57610e_4816x866.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!70nj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53aebcaf-0ba5-499d-9862-5ec04b57610e_4816x866.png" width="1456" height="262" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/53aebcaf-0ba5-499d-9862-5ec04b57610e_4816x866.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:262,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:55690,&quot;alt&quot;:&quot;Nextcloud Disabled Apps page&quot;,&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="Nextcloud Disabled Apps page" title="Nextcloud Disabled Apps page" srcset="https://substackcdn.com/image/fetch/$s_!70nj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53aebcaf-0ba5-499d-9862-5ec04b57610e_4816x866.png 424w, https://substackcdn.com/image/fetch/$s_!70nj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53aebcaf-0ba5-499d-9862-5ec04b57610e_4816x866.png 848w, https://substackcdn.com/image/fetch/$s_!70nj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53aebcaf-0ba5-499d-9862-5ec04b57610e_4816x866.png 1272w, https://substackcdn.com/image/fetch/$s_!70nj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53aebcaf-0ba5-499d-9862-5ec04b57610e_4816x866.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Nextcloud Disabled Apps page</figcaption></figure></div><p>After app for external storage is enabled, do the following:</p><ol><li><p>Open <em>Administration settings</em></p></li><li><p>Under <em>Administration</em> &#8211; <em>External Storage</em></p></li><li><p>Under the <em>Authentication</em> drop-down menu, select <em>Access key</em></p></li><li><p>You can leave <em>Hostname</em>, <em>Port</em>, <em>Storage</em> <em>Class</em> empty, as well as <em>Enable</em> <em>Path</em> <em>Style</em> and <em>Legacy (v2) authentication</em> unselected</p></li><li><p>Click on the submit button on the far right</p></li><li><p>If you see a <em>green symbol</em> on the left, all good!</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OHZR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F855ee2b3-77ba-4a27-b18b-d132b57bfe65_4824x1754.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OHZR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F855ee2b3-77ba-4a27-b18b-d132b57bfe65_4824x1754.png 424w, https://substackcdn.com/image/fetch/$s_!OHZR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F855ee2b3-77ba-4a27-b18b-d132b57bfe65_4824x1754.png 848w, https://substackcdn.com/image/fetch/$s_!OHZR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F855ee2b3-77ba-4a27-b18b-d132b57bfe65_4824x1754.png 1272w, https://substackcdn.com/image/fetch/$s_!OHZR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F855ee2b3-77ba-4a27-b18b-d132b57bfe65_4824x1754.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OHZR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F855ee2b3-77ba-4a27-b18b-d132b57bfe65_4824x1754.png" width="1456" height="529" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/855ee2b3-77ba-4a27-b18b-d132b57bfe65_4824x1754.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:529,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:113817,&quot;alt&quot;:&quot;Nextcloud External storage setup page&quot;,&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="Nextcloud External storage setup page" title="Nextcloud External storage setup page" srcset="https://substackcdn.com/image/fetch/$s_!OHZR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F855ee2b3-77ba-4a27-b18b-d132b57bfe65_4824x1754.png 424w, https://substackcdn.com/image/fetch/$s_!OHZR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F855ee2b3-77ba-4a27-b18b-d132b57bfe65_4824x1754.png 848w, https://substackcdn.com/image/fetch/$s_!OHZR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F855ee2b3-77ba-4a27-b18b-d132b57bfe65_4824x1754.png 1272w, https://substackcdn.com/image/fetch/$s_!OHZR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F855ee2b3-77ba-4a27-b18b-d132b57bfe65_4824x1754.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">Nextcloud External storage setup page</figcaption></figure></div><blockquote><p>Note that if you leave Region field empty, eu-west-1 (Ireland) will be selected by default.</p></blockquote><p>Now, when you return to the Files page, you will see the S3 folder there.</p><p>Open it, try to upload something.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!733k!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a4baad-cb31-478e-b14f-b9314df39494_1582x790.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!733k!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a4baad-cb31-478e-b14f-b9314df39494_1582x790.png 424w, https://substackcdn.com/image/fetch/$s_!733k!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a4baad-cb31-478e-b14f-b9314df39494_1582x790.png 848w, https://substackcdn.com/image/fetch/$s_!733k!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a4baad-cb31-478e-b14f-b9314df39494_1582x790.png 1272w, https://substackcdn.com/image/fetch/$s_!733k!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a4baad-cb31-478e-b14f-b9314df39494_1582x790.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!733k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a4baad-cb31-478e-b14f-b9314df39494_1582x790.png" width="1456" height="727" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/31a4baad-cb31-478e-b14f-b9314df39494_1582x790.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:727,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:26737,&quot;alt&quot;:&quot;Test file uploaded to the S3 external storage.&quot;,&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="Test file uploaded to the S3 external storage." title="Test file uploaded to the S3 external storage." srcset="https://substackcdn.com/image/fetch/$s_!733k!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a4baad-cb31-478e-b14f-b9314df39494_1582x790.png 424w, https://substackcdn.com/image/fetch/$s_!733k!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a4baad-cb31-478e-b14f-b9314df39494_1582x790.png 848w, https://substackcdn.com/image/fetch/$s_!733k!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a4baad-cb31-478e-b14f-b9314df39494_1582x790.png 1272w, https://substackcdn.com/image/fetch/$s_!733k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a4baad-cb31-478e-b14f-b9314df39494_1582x790.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">Test file uploaded to the S3 external storage.</figcaption></figure></div><p>Let's now check if we can see the file in the S3 bucket.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vwH0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe47536f4-ad3f-4a3c-a7df-156f569a66f4_1404x830.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vwH0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe47536f4-ad3f-4a3c-a7df-156f569a66f4_1404x830.png 424w, https://substackcdn.com/image/fetch/$s_!vwH0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe47536f4-ad3f-4a3c-a7df-156f569a66f4_1404x830.png 848w, https://substackcdn.com/image/fetch/$s_!vwH0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe47536f4-ad3f-4a3c-a7df-156f569a66f4_1404x830.png 1272w, https://substackcdn.com/image/fetch/$s_!vwH0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe47536f4-ad3f-4a3c-a7df-156f569a66f4_1404x830.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vwH0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe47536f4-ad3f-4a3c-a7df-156f569a66f4_1404x830.png" width="1404" height="830" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e47536f4-ad3f-4a3c-a7df-156f569a66f4_1404x830.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:830,&quot;width&quot;:1404,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:33688,&quot;alt&quot;:&quot;Test file uploaded from the Nextcloud instance.&quot;,&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="Test file uploaded from the Nextcloud instance." title="Test file uploaded from the Nextcloud instance." srcset="https://substackcdn.com/image/fetch/$s_!vwH0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe47536f4-ad3f-4a3c-a7df-156f569a66f4_1404x830.png 424w, https://substackcdn.com/image/fetch/$s_!vwH0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe47536f4-ad3f-4a3c-a7df-156f569a66f4_1404x830.png 848w, https://substackcdn.com/image/fetch/$s_!vwH0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe47536f4-ad3f-4a3c-a7df-156f569a66f4_1404x830.png 1272w, https://substackcdn.com/image/fetch/$s_!vwH0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe47536f4-ad3f-4a3c-a7df-156f569a66f4_1404x830.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">Test file uploaded from the Nextcloud instance.</figcaption></figure></div><p>Perfect. But what would happen if you:</p><ol><li><p>Selected that file in the S3 bucket</p></li><li><p>Click <em>Open</em> from the menu above</p></li></ol><p>It didn't open. You do have enough permissions to see the file. Why did it not open?</p><p>Because of the server-side encryption in Ghost! When you upload a file to your Nextcloud instance, it is first encrypted and then saved.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.kaumnen.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.kaumnen.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h2>Bonus</h2><p>If you are using Cloudflare, you can benefit from the free DDoS protection, and <a href="https://developers.cloudflare.com/dns/manage-dns-records/reference/proxied-dns-records/">other useful features</a>. But your website DNS record needs to be proxied. You can take a look at the gallery below to check your setup.</p><p>Before proxy is turned on in the DNS Records management panel, you need to make sure that requests to the Nextcloud bypass <em>Cache and Rocket Loader</em>.</p><div><hr></div><h4>How to configure a Cloudflare Cache Rule</h4><ol><li><p>Login to your <em>Cloudflare</em> account</p></li><li><p>Select your <em>domain</em></p></li><li><p>Select <em>Caching</em> in the left menu</p></li><li><p><em>Cache rules</em></p></li><li><p><em>Create rule</em></p></li><li><p>Write your <em>Rule name</em></p></li><li><p><strong>Field:</strong> Hostname</p></li><li><p><strong>Operator:</strong> equals</p></li><li><p><strong>Value:</strong> a sub-domain (or domain) where you access your Nextcloud</p></li><li><p><strong>Cache eligibility: </strong>Bypass cache</p></li><li><p>Leave everything else as-is</p></li><li><p><em>Deploy </em>rule</p></li></ol><div><hr></div><h4>How to disable Rocker Loader</h4><ol><li><p>Select <em>Rules</em> in the left menu</p></li><li><p><em>Configuration rules</em></p></li><li><p><em>Create rule</em></p></li><li><p><strong>Field:</strong> Hostname</p></li><li><p><strong>Operator: </strong>equals</p></li><li><p><strong>Value:</strong> a sub-domain (or domain) where you access your Nextcloud</p></li><li><p>Scroll down</p></li><li><p>Click on <strong>+ Add</strong> next to the <em>Rocket loader</em></p></li><li><p>Leave it turned off</p></li><li><p><em>Deploy</em> rule</p></li></ol><div><hr></div><p>Now you can use Cloudflare Trace, to check if you set the rules correctly.</p><ol><li><p>Go to the root of your <em>Cloudflare</em> account</p></li><li><p>Click <em>Trace</em> in the left menu</p></li><li><p><em>Begin Trace</em></p></li><li><p>Type in your url (with the protocol - <strong>https://</strong>)</p></li><li><p><strong>HTTP Method:</strong> GET</p></li><li><p>Leave everything else as-is</p></li><li><p><em>Send Trace</em> and check if the trace result is showing 2 rules you just created</p></li></ol><div class="image-gallery-embed" data-attrs="{&quot;gallery&quot;:{&quot;images&quot;:[{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aa1aba99-e705-4784-beee-492354e05d71_2128x4714.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8c9cf934-2438-43ba-962a-613620833e42_2128x2000.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2619c10a-def5-442d-8ac4-1670fb95360c_2450x2544.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0838326d-7062-40ed-9599-ba1fe39dc047_4286x1554.png&quot;}],&quot;caption&quot;:&quot;Cloudflare rules setup and Cloudflare Trace results&quot;,&quot;alt&quot;:&quot;Cloudflare rules setup and Cloudflare Trace results&quot;,&quot;staticGalleryImage&quot;:{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5d04120b-4218-47b1-bb48-e292d8b3010d_1456x1456.png&quot;}},&quot;isEditorNode&quot;:true}"></div><p>If it looks similar, good to go! If you haven't already &#8211; you can check your Nextcloud instance now.</p><p>Easy way to check if your website is actually going through the Cloudflare proxy and bypassing the cache is:</p><ol><li><p>Open <em>dev tools</em> in the browser</p></li><li><p><em>Network</em> tab</p></li><li><p>Refresh the page</p></li><li><p>Select the first request</p><ol><li><p>This one will be named <em>dashboard/</em> probably (or your subdomain/domain)</p></li></ol></li><li><p>Select the <em>Headers</em> tab and check the <em>Response Headers</em>:</p><ol><li><p><strong>Cf-Cache-Status:</strong></p><ol><li><p><em>DYNAMIC</em> - <strong>NOT cached</strong>, going through the proxy</p></li><li><p><em>HIT</em> - <strong>IS cached</strong>, going through the proxy</p></li></ol></li></ol></li></ol><div><hr></div><p><strong>That's it!</strong> If you're looking to further refine and enhance your Nextcloud setup, consider the following suggestions:</p><ol><li><p>Create a folder for temporary files (e.g. 30 days temporary storage) and utilize S3 Lifecycle Policies to delete files from that folder&nbsp;only</p><ol><li><p>A notification mechanism which will email you a reminder about file deletion. SNS? SES? Lambda? S3 Event Notifications? EventBridge?</p></li></ol></li><li><p>Set S3 object (file) replication to another region</p><ol><li><p>S3 standard storage provides&nbsp;<a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/DataDurability.html?ref=kaumnen.com">99.999999999% durability and 99.99% availability of objects over a given year</a>. But it's always good to have additional safety for important files.</p></li></ol></li></ol><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.kaumnen.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">Subscribe for free to get fresh content delivered directly to your inbox and help support my work. It's quick, easy, no spam!</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[Don’t fully trust AI in dev work! /yet]]></title><description><![CDATA[Let&#8217;s talk about AI tools for code completion.]]></description><link>https://www.kaumnen.com/p/dont-fully-trust-ai-in-dev-work-yet</link><guid isPermaLink="false">https://www.kaumnen.com/p/dont-fully-trust-ai-in-dev-work-yet</guid><dc:creator><![CDATA[kaumnen]]></dc:creator><pubDate>Tue, 18 Jan 2022 17:26:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/eafd5608-b533-4313-b741-a1e5c643edb4_800x420.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>After spending quite a bit of time debugging my code, what&#8217;s wrong with it, I&#8217;ve found the &#8216;bug&#8217;. Not the ordinary one.</p><p>Don&#8217;t fully rely on AI. Seems simple right? However, when you are doing some easy/repetitive stuff, you might fall under influence of just &#8216;tabbing&#8217;.</p><div><hr></div><h3>What was the &#8216;bug&#8217; anyway?</h3><p>I was making a Twitter bot in NodeJS. Get some data from Reddit, and post it on <a href="https://twitter.com/RedditTweetz">Twitter bot</a> account.</p><p>First off, I need a library, to simplify things about auth and whatever. A&#8217;ight, done.</p><p>npm install, make file structure, git init.</p><p>Here comes the fun part. I&#8217;m writing a constructor for a Twitter client. It needs 4 elements:</p><ul><li><p>API key</p></li><li><p>API secret</p></li><li><p>Access token</p></li><li><p>Access secret</p></li></ul><p>Okay, fair enough.</p><div><hr></div><h3>Constructing the constructor</h3><p>First one, it&#8217;s okay. TAB.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xT2C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a33b838-7e46-4b92-954b-3a33896c5414_369x84.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xT2C!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a33b838-7e46-4b92-954b-3a33896c5414_369x84.png 424w, https://substackcdn.com/image/fetch/$s_!xT2C!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a33b838-7e46-4b92-954b-3a33896c5414_369x84.png 848w, https://substackcdn.com/image/fetch/$s_!xT2C!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a33b838-7e46-4b92-954b-3a33896c5414_369x84.png 1272w, https://substackcdn.com/image/fetch/$s_!xT2C!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a33b838-7e46-4b92-954b-3a33896c5414_369x84.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xT2C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a33b838-7e46-4b92-954b-3a33896c5414_369x84.png" width="369" height="84" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3a33b838-7e46-4b92-954b-3a33896c5414_369x84.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:84,&quot;width&quot;:369,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!xT2C!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a33b838-7e46-4b92-954b-3a33896c5414_369x84.png 424w, https://substackcdn.com/image/fetch/$s_!xT2C!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a33b838-7e46-4b92-954b-3a33896c5414_369x84.png 848w, https://substackcdn.com/image/fetch/$s_!xT2C!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a33b838-7e46-4b92-954b-3a33896c5414_369x84.png 1272w, https://substackcdn.com/image/fetch/$s_!xT2C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a33b838-7e46-4b92-954b-3a33896c5414_369x84.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Seems good, TAB!</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XLb0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9c50065-8bff-4769-b709-640186d1fae8_394x102.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XLb0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9c50065-8bff-4769-b709-640186d1fae8_394x102.png 424w, https://substackcdn.com/image/fetch/$s_!XLb0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9c50065-8bff-4769-b709-640186d1fae8_394x102.png 848w, https://substackcdn.com/image/fetch/$s_!XLb0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9c50065-8bff-4769-b709-640186d1fae8_394x102.png 1272w, https://substackcdn.com/image/fetch/$s_!XLb0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9c50065-8bff-4769-b709-640186d1fae8_394x102.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XLb0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9c50065-8bff-4769-b709-640186d1fae8_394x102.png" width="394" height="102" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f9c50065-8bff-4769-b709-640186d1fae8_394x102.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:102,&quot;width&quot;:394,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!XLb0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9c50065-8bff-4769-b709-640186d1fae8_394x102.png 424w, https://substackcdn.com/image/fetch/$s_!XLb0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9c50065-8bff-4769-b709-640186d1fae8_394x102.png 848w, https://substackcdn.com/image/fetch/$s_!XLb0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9c50065-8bff-4769-b709-640186d1fae8_394x102.png 1272w, https://substackcdn.com/image/fetch/$s_!XLb0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9c50065-8bff-4769-b709-640186d1fae8_394x102.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Awesome. GitHub Copilot is great!</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kdfz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc47528e2-491f-42bc-9470-0d67666d7e38_491x118.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kdfz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc47528e2-491f-42bc-9470-0d67666d7e38_491x118.png 424w, https://substackcdn.com/image/fetch/$s_!kdfz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc47528e2-491f-42bc-9470-0d67666d7e38_491x118.png 848w, https://substackcdn.com/image/fetch/$s_!kdfz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc47528e2-491f-42bc-9470-0d67666d7e38_491x118.png 1272w, https://substackcdn.com/image/fetch/$s_!kdfz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc47528e2-491f-42bc-9470-0d67666d7e38_491x118.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kdfz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc47528e2-491f-42bc-9470-0d67666d7e38_491x118.png" width="491" height="118" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c47528e2-491f-42bc-9470-0d67666d7e38_491x118.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:118,&quot;width&quot;:491,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!kdfz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc47528e2-491f-42bc-9470-0d67666d7e38_491x118.png 424w, https://substackcdn.com/image/fetch/$s_!kdfz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc47528e2-491f-42bc-9470-0d67666d7e38_491x118.png 848w, https://substackcdn.com/image/fetch/$s_!kdfz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc47528e2-491f-42bc-9470-0d67666d7e38_491x118.png 1272w, https://substackcdn.com/image/fetch/$s_!kdfz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc47528e2-491f-42bc-9470-0d67666d7e38_491x118.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>It&#8217;s so easy. TAB and there we go. Constructor finished!</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.kaumnen.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">Subscribe for free to get fresh content delivered directly to your inbox and help support my work. It's quick, easy, no spam!</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><hr></div><h3>Testing</h3><p>Let&#8217;s try to get a simple &#8216;Hello World!&#8217; tweet out there.</p><p><strong>401, Unauthorized.</strong></p><p>Umm, what? Let&#8217;s go to the .env file, let&#8217;s check if the naming is correct. Copy, paste.</p><p>Check.</p><p><strong>401, Unauthorized.</strong></p><p>Okay, let&#8217;s check for Twitter stuff. Check permissions, regenerate keys.</p><p>Check.</p><p><strong>401, Unauthorized.</strong></p><p>Now comes the part where I tried to debug code, try a different library that supports Twitter&#8217;s V2 API. No success.</p><div><hr></div><h3>Debugging</h3><p>Google, google, google. Try this, try that. Progress: <strong>NULL</strong></p><p>I go for a walk, hoping for an &#8216;Aha!&#8217; moment.</p><p>No luck. Back to work! Open Postman. Input parameters. Check headers, check body.</p><p>Send.</p><p><strong>It worked!</strong></p><p>Hmm, what could it be? Open postman, copy the curl request. Paste it in Notepad++.</p><p>I previously turned on debug mode in my code, copied the curl request from there too. Paste it in Notepad++.</p><p>Double-click one. Check.</p><p>Double-click another one. Check.</p><p>Another one. Check.</p><p>&#8230;</p><p><strong>One is missing.</strong> How&#8217;s that possible??</p><p>Now I went to the library docs.</p><p>Do you know what I did? Doesn&#8217;t make sense, but let&#8217;s try. Better than nothing.</p><p><em>Search for a method to input custom headers.</em></p><p>Nope. I did google (a lot) previously, about errors, and whatnot, but either there was no answer, or it was a typo in the .env file.</p><div><hr></div><h3>&#8216;Aha!&#8217; Moment</h3><p>Maybe&#8230; It&#8217;s the wrong naming of the constructor fields. So I check. Now I rely on IntelliSense and typing fields.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aHZZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca8dd939-c09e-422d-9be6-812111b70a80_499x58.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aHZZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca8dd939-c09e-422d-9be6-812111b70a80_499x58.png 424w, https://substackcdn.com/image/fetch/$s_!aHZZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca8dd939-c09e-422d-9be6-812111b70a80_499x58.png 848w, https://substackcdn.com/image/fetch/$s_!aHZZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca8dd939-c09e-422d-9be6-812111b70a80_499x58.png 1272w, https://substackcdn.com/image/fetch/$s_!aHZZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca8dd939-c09e-422d-9be6-812111b70a80_499x58.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aHZZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca8dd939-c09e-422d-9be6-812111b70a80_499x58.png" width="499" height="58" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ca8dd939-c09e-422d-9be6-812111b70a80_499x58.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:58,&quot;width&quot;:499,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!aHZZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca8dd939-c09e-422d-9be6-812111b70a80_499x58.png 424w, https://substackcdn.com/image/fetch/$s_!aHZZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca8dd939-c09e-422d-9be6-812111b70a80_499x58.png 848w, https://substackcdn.com/image/fetch/$s_!aHZZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca8dd939-c09e-422d-9be6-812111b70a80_499x58.png 1272w, https://substackcdn.com/image/fetch/$s_!aHZZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca8dd939-c09e-422d-9be6-812111b70a80_499x58.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Seems good.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!luqB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0081a865-6045-4561-ba7b-99baa505d244_499x79.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!luqB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0081a865-6045-4561-ba7b-99baa505d244_499x79.png 424w, https://substackcdn.com/image/fetch/$s_!luqB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0081a865-6045-4561-ba7b-99baa505d244_499x79.png 848w, https://substackcdn.com/image/fetch/$s_!luqB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0081a865-6045-4561-ba7b-99baa505d244_499x79.png 1272w, https://substackcdn.com/image/fetch/$s_!luqB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0081a865-6045-4561-ba7b-99baa505d244_499x79.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!luqB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0081a865-6045-4561-ba7b-99baa505d244_499x79.png" width="499" height="79" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0081a865-6045-4561-ba7b-99baa505d244_499x79.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:79,&quot;width&quot;:499,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!luqB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0081a865-6045-4561-ba7b-99baa505d244_499x79.png 424w, https://substackcdn.com/image/fetch/$s_!luqB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0081a865-6045-4561-ba7b-99baa505d244_499x79.png 848w, https://substackcdn.com/image/fetch/$s_!luqB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0081a865-6045-4561-ba7b-99baa505d244_499x79.png 1272w, https://substackcdn.com/image/fetch/$s_!luqB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0081a865-6045-4561-ba7b-99baa505d244_499x79.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Keep on.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jP17!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5985dbc2-d28e-4c5e-b66b-e5fda2d7f543_523x99.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jP17!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5985dbc2-d28e-4c5e-b66b-e5fda2d7f543_523x99.png 424w, https://substackcdn.com/image/fetch/$s_!jP17!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5985dbc2-d28e-4c5e-b66b-e5fda2d7f543_523x99.png 848w, https://substackcdn.com/image/fetch/$s_!jP17!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5985dbc2-d28e-4c5e-b66b-e5fda2d7f543_523x99.png 1272w, https://substackcdn.com/image/fetch/$s_!jP17!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5985dbc2-d28e-4c5e-b66b-e5fda2d7f543_523x99.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jP17!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5985dbc2-d28e-4c5e-b66b-e5fda2d7f543_523x99.png" width="523" height="99" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5985dbc2-d28e-4c5e-b66b-e5fda2d7f543_523x99.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:99,&quot;width&quot;:523,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!jP17!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5985dbc2-d28e-4c5e-b66b-e5fda2d7f543_523x99.png 424w, https://substackcdn.com/image/fetch/$s_!jP17!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5985dbc2-d28e-4c5e-b66b-e5fda2d7f543_523x99.png 848w, https://substackcdn.com/image/fetch/$s_!jP17!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5985dbc2-d28e-4c5e-b66b-e5fda2d7f543_523x99.png 1272w, https://substackcdn.com/image/fetch/$s_!jP17!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5985dbc2-d28e-4c5e-b66b-e5fda2d7f543_523x99.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Okay. Onto the last one.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_FsR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76350b04-1c97-434d-bccc-beea30c90f66_580x140.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_FsR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76350b04-1c97-434d-bccc-beea30c90f66_580x140.png 424w, https://substackcdn.com/image/fetch/$s_!_FsR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76350b04-1c97-434d-bccc-beea30c90f66_580x140.png 848w, https://substackcdn.com/image/fetch/$s_!_FsR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76350b04-1c97-434d-bccc-beea30c90f66_580x140.png 1272w, https://substackcdn.com/image/fetch/$s_!_FsR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76350b04-1c97-434d-bccc-beea30c90f66_580x140.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_FsR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76350b04-1c97-434d-bccc-beea30c90f66_580x140.png" width="580" height="140" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/76350b04-1c97-434d-bccc-beea30c90f66_580x140.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:140,&quot;width&quot;:580,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!_FsR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76350b04-1c97-434d-bccc-beea30c90f66_580x140.png 424w, https://substackcdn.com/image/fetch/$s_!_FsR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76350b04-1c97-434d-bccc-beea30c90f66_580x140.png 848w, https://substackcdn.com/image/fetch/$s_!_FsR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76350b04-1c97-434d-bccc-beea30c90f66_580x140.png 1272w, https://substackcdn.com/image/fetch/$s_!_FsR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76350b04-1c97-434d-bccc-beea30c90f66_580x140.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Wait, what? Wasn&#8217;t it <em>accessToken..</em>? My literal reaction was: <strong>NO WAY! Are you kidding me?!</strong> &#128514;</p><div><hr></div><p>GitHub Copilot:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KJKq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febe1b433-6a28-4261-bc3e-cfeaafb83d67_491x118.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KJKq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febe1b433-6a28-4261-bc3e-cfeaafb83d67_491x118.png 424w, https://substackcdn.com/image/fetch/$s_!KJKq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febe1b433-6a28-4261-bc3e-cfeaafb83d67_491x118.png 848w, https://substackcdn.com/image/fetch/$s_!KJKq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febe1b433-6a28-4261-bc3e-cfeaafb83d67_491x118.png 1272w, https://substackcdn.com/image/fetch/$s_!KJKq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febe1b433-6a28-4261-bc3e-cfeaafb83d67_491x118.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KJKq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febe1b433-6a28-4261-bc3e-cfeaafb83d67_491x118.png" width="491" height="118" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ebe1b433-6a28-4261-bc3e-cfeaafb83d67_491x118.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:118,&quot;width&quot;:491,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!KJKq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febe1b433-6a28-4261-bc3e-cfeaafb83d67_491x118.png 424w, https://substackcdn.com/image/fetch/$s_!KJKq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febe1b433-6a28-4261-bc3e-cfeaafb83d67_491x118.png 848w, https://substackcdn.com/image/fetch/$s_!KJKq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febe1b433-6a28-4261-bc3e-cfeaafb83d67_491x118.png 1272w, https://substackcdn.com/image/fetch/$s_!KJKq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febe1b433-6a28-4261-bc3e-cfeaafb83d67_491x118.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>IntelliSense:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lQed!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8f193d5-b1ce-4e5f-b8d5-8f794a685a0a_580x140.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lQed!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8f193d5-b1ce-4e5f-b8d5-8f794a685a0a_580x140.png 424w, https://substackcdn.com/image/fetch/$s_!lQed!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8f193d5-b1ce-4e5f-b8d5-8f794a685a0a_580x140.png 848w, https://substackcdn.com/image/fetch/$s_!lQed!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8f193d5-b1ce-4e5f-b8d5-8f794a685a0a_580x140.png 1272w, https://substackcdn.com/image/fetch/$s_!lQed!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8f193d5-b1ce-4e5f-b8d5-8f794a685a0a_580x140.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lQed!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8f193d5-b1ce-4e5f-b8d5-8f794a685a0a_580x140.png" width="580" height="140" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f8f193d5-b1ce-4e5f-b8d5-8f794a685a0a_580x140.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:140,&quot;width&quot;:580,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!lQed!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8f193d5-b1ce-4e5f-b8d5-8f794a685a0a_580x140.png 424w, https://substackcdn.com/image/fetch/$s_!lQed!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8f193d5-b1ce-4e5f-b8d5-8f794a685a0a_580x140.png 848w, https://substackcdn.com/image/fetch/$s_!lQed!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8f193d5-b1ce-4e5f-b8d5-8f794a685a0a_580x140.png 1272w, https://substackcdn.com/image/fetch/$s_!lQed!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8f193d5-b1ce-4e5f-b8d5-8f794a685a0a_580x140.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h3>&#8230;</h3><div><hr></div><h3>Keep going!</h3><p>These are my .02 cents. Don&#8217;t let code completion AI tools rule your work. I&#8217;m sure there is a lot of funny stories like this. But we all make mistakes. Embrace them as learning opportunities.</p><p>I don&#8217;t blame GHC for this. I blame myself. But whatever. At least I got some experience. There is always space for improvement.</p><p>Fun one for sure.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.kaumnen.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">Subscribe for free to get fresh content delivered directly to your inbox and help support my work. It's quick, easy, no spam!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Introduction to Data Structures]]></title><description><![CDATA[You will hear about them no matter in what stage of SE career you are at. Understanding them, how they work, is essential if you want to become a good programmer.]]></description><link>https://www.kaumnen.com/p/introduction-to-data-structures</link><guid isPermaLink="false">https://www.kaumnen.com/p/introduction-to-data-structures</guid><dc:creator><![CDATA[kaumnen]]></dc:creator><pubDate>Tue, 07 Dec 2021 17:13:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/eddbe43a-5b40-475f-9297-ab1a21827d73_1024x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p><a href="https://www.azquotes.com/quotes/topics/data-structures.html#:~:text=Data%20Structures%20Quotes-,Bad%20programmers%20worry%20about%20the%20code.%20Good%20programmers%20worry%20about%20data%20structures%20and%20their%20relationships.,-Linus%20Torvalds">Bad programmers worry about the code. Good programmers worry about data structures and their relationships.&#8202;&#8212;&#8202;Linus Torvalds</a></p></blockquote><p><strong>What are they? Which ones exist? Pros and cons of each one?</strong><br>If this is looking<strong> </strong><em><strong>hmm</strong> </em>to you, well all of us were in that phase. But don&#8217;t worry! I will try to explain all of those questions in this introductory blog post. You got it!</p><h3><strong>What are Data Structures?</strong></h3><blockquote><p><em><a href="https://en.wikipedia.org/wiki/Data_structure">In computer science, a </a><strong><a href="https://en.wikipedia.org/wiki/Data_structure">data structure</a></strong><a href="https://en.wikipedia.org/wiki/Data_structure"> is a data organization, management, and storage format that enables efficient access and modification.</a></em></p></blockquote><p>So essentially, the data structure is a way to<strong> efficiently manipulate and organize data.</strong></p><p>We are using data structures every day! For example:</p><ul><li><p>In Microsoft Word, undo and redo operations?&#8202;&#8212;&#8202;<strong>Stacks!</strong></p></li><li><p>Social networks feeds?&#8202;&#8212;<strong>&#8202;Linked list or Hash table!</strong></p></li><li><p>Storing an image?&#8202;&#8212;&#8202;<strong>Arrays!</strong></p></li><li><p>Go back functionality in browsers?&#8202;&#8212;&#8202;<strong>Stacks!</strong></p></li><li><p>Friend list, connections, who is a friend with who?&#8202;&#8212;&#8202;<strong>Graph!</strong></p></li><li><p>etc.</p></li></ul><p><strong>Data structures are everywhere!</strong></p><p>They are the backbone of every good and quality software and software engineer!</p><div><hr></div><h3>Which Data Structures exist?</h3><p>I will cover the following Data Structures.</p><h4>Array</h4><blockquote><p><em><a href="https://en.wikipedia.org/wiki/Array_data_structure">In computer science, an </a><strong><a href="https://en.wikipedia.org/wiki/Array_data_structure">array data structure</a></strong><a href="https://en.wikipedia.org/wiki/Array_data_structure">, or simply an </a><strong><a href="https://en.wikipedia.org/wiki/Array_data_structure">array</a></strong><a href="https://en.wikipedia.org/wiki/Array_data_structure">, is a data structure consisting of a collection of elements (values or variables), each identified by at least one array index or key.</a></em></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Dq5C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4766c1f-593c-44ed-9235-850818b2c8a9_800x185.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Dq5C!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4766c1f-593c-44ed-9235-850818b2c8a9_800x185.png 424w, https://substackcdn.com/image/fetch/$s_!Dq5C!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4766c1f-593c-44ed-9235-850818b2c8a9_800x185.png 848w, https://substackcdn.com/image/fetch/$s_!Dq5C!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4766c1f-593c-44ed-9235-850818b2c8a9_800x185.png 1272w, https://substackcdn.com/image/fetch/$s_!Dq5C!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4766c1f-593c-44ed-9235-850818b2c8a9_800x185.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Dq5C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4766c1f-593c-44ed-9235-850818b2c8a9_800x185.png" width="800" height="185" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e4766c1f-593c-44ed-9235-850818b2c8a9_800x185.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:185,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Dq5C!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4766c1f-593c-44ed-9235-850818b2c8a9_800x185.png 424w, https://substackcdn.com/image/fetch/$s_!Dq5C!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4766c1f-593c-44ed-9235-850818b2c8a9_800x185.png 848w, https://substackcdn.com/image/fetch/$s_!Dq5C!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4766c1f-593c-44ed-9235-850818b2c8a9_800x185.png 1272w, https://substackcdn.com/image/fetch/$s_!Dq5C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4766c1f-593c-44ed-9235-850818b2c8a9_800x185.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Linear array or one-dimensional array is<strong> the simplest</strong> type of data structure. <strong>Arrays </strong>are present everywhere! Basically, it is just a continuous stream of cells.</p><p><strong>Array</strong> pros:</p><ul><li><p>They are quick! If you know the exact number, that data is retrieved almost instantly.</p></li></ul><p><strong>Array </strong>cons:</p><ul><li><p>Arrays have to be <strong>continuous</strong>. Before, it was quite common to run into memory problems as they grow in size. <strong>Memory management</strong> is nowadays a lot more automated/secure (Python, JavaScript), but you still have to keep in mind this, in order to either <strong>write or troubleshoot code</strong> well (C, C++).</p></li></ul><p>We can find the <strong>Array </strong>data structure here:</p><ul><li><p><strong>Sorted </strong>leaderboards</p></li><li><p>2D arrays, <strong>matrices</strong>, are used in<strong> image</strong> processing and manipulation</p></li></ul><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.kaumnen.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">Subscribe for free to get fresh content delivered directly to your inbox and help support my work. It's quick, easy, no spam!</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><hr></div><h4>Linked List</h4><blockquote><p><em>A <strong>linked list</strong> is a linear collection of data elements whose order is not given by their physical placement in memory. Instead, each element points to the next.</em></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!j2_x!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F540f5c12-393a-4fe9-af13-fab199cbe4d1_721x191.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!j2_x!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F540f5c12-393a-4fe9-af13-fab199cbe4d1_721x191.jpeg 424w, https://substackcdn.com/image/fetch/$s_!j2_x!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F540f5c12-393a-4fe9-af13-fab199cbe4d1_721x191.jpeg 848w, https://substackcdn.com/image/fetch/$s_!j2_x!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F540f5c12-393a-4fe9-af13-fab199cbe4d1_721x191.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!j2_x!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F540f5c12-393a-4fe9-af13-fab199cbe4d1_721x191.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!j2_x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F540f5c12-393a-4fe9-af13-fab199cbe4d1_721x191.jpeg" width="721" height="191" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/540f5c12-393a-4fe9-af13-fab199cbe4d1_721x191.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:191,&quot;width&quot;:721,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!j2_x!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F540f5c12-393a-4fe9-af13-fab199cbe4d1_721x191.jpeg 424w, https://substackcdn.com/image/fetch/$s_!j2_x!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F540f5c12-393a-4fe9-af13-fab199cbe4d1_721x191.jpeg 848w, https://substackcdn.com/image/fetch/$s_!j2_x!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F540f5c12-393a-4fe9-af13-fab199cbe4d1_721x191.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!j2_x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F540f5c12-393a-4fe9-af13-fab199cbe4d1_721x191.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>A linked list is <strong>not continuous,</strong> or at least it <strong>doesn't have</strong> to be.</p><p>It consists of a <strong>collection of nodes.</strong> Basically, each node contains <strong>data</strong> and a <strong>pointer</strong> to the <strong>next node</strong> in the sequence. The <strong>last node</strong> contains a pointer to <em>nothing </em>(it has a value of <strong>Null/None</strong>).</p><p>The <strong>first and last nodes</strong> are known as <strong>HEAD </strong>and <strong>TAIL </strong>ones.</p><p><strong>Linked List</strong> pros:</p><ul><li><p>You can easily <strong>add or delete</strong> a node. All you need is to <strong>change the pointer</strong>, as each node is aware only of the node next to it (or node before it, if it&#8217;s <strong>double-linked</strong>)</p></li></ul><p><strong>Linked List</strong> cons:</p><ul><li><p>They can be slow because, in order <strong>to find</strong> a node, you have to (in the <strong>worst</strong> case, <strong>TAIL </strong>has the <strong>data </strong>you are looking for) traverse the whole <strong>Linked List</strong>.</p></li></ul><p>We can find the <strong>Linked List </strong>data structure here:</p><ul><li><p><strong>Previous </strong>web pages in browsers</p></li><li><p><strong>Switching </strong>music in music players</p></li><li><p><strong>Turns </strong>in mobile games</p></li></ul><div><hr></div><h4>Hash Table</h4><blockquote><p><em><strong><a href="https://www.tutorialspoint.com/data_structures_algorithms/hash_data_structure.htm">Hash Table</a></strong><a href="https://www.tutorialspoint.com/data_structures_algorithms/hash_data_structure.htm"> is a data structure which stores data in an </a><strong><a href="https://www.tutorialspoint.com/data_structures_algorithms/hash_data_structure.htm">associative</a></strong><a href="https://www.tutorialspoint.com/data_structures_algorithms/hash_data_structure.htm"> manner. In a </a><strong><a href="https://www.tutorialspoint.com/data_structures_algorithms/hash_data_structure.htm">hash table</a></strong><a href="https://www.tutorialspoint.com/data_structures_algorithms/hash_data_structure.htm">, data is stored in an </a><strong><a href="https://www.tutorialspoint.com/data_structures_algorithms/hash_data_structure.htm">array</a></strong><a href="https://www.tutorialspoint.com/data_structures_algorithms/hash_data_structure.htm"> format, where each data value has its own </a><strong><a href="https://www.tutorialspoint.com/data_structures_algorithms/hash_data_structure.htm">unique index</a></strong><a href="https://www.tutorialspoint.com/data_structures_algorithms/hash_data_structure.htm"> value. </a><strong><a href="https://www.tutorialspoint.com/data_structures_algorithms/hash_data_structure.htm">Access</a></strong><a href="https://www.tutorialspoint.com/data_structures_algorithms/hash_data_structure.htm"> of data becomes very fast if we know the </a><strong><a href="https://www.tutorialspoint.com/data_structures_algorithms/hash_data_structure.htm">index </a></strong><a href="https://www.tutorialspoint.com/data_structures_algorithms/hash_data_structure.htm">of the desired data.</a></em></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NC32!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1194263-4657-4631-9470-daab497688bb_600x166.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NC32!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1194263-4657-4631-9470-daab497688bb_600x166.jpeg 424w, https://substackcdn.com/image/fetch/$s_!NC32!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1194263-4657-4631-9470-daab497688bb_600x166.jpeg 848w, https://substackcdn.com/image/fetch/$s_!NC32!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1194263-4657-4631-9470-daab497688bb_600x166.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!NC32!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1194263-4657-4631-9470-daab497688bb_600x166.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NC32!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1194263-4657-4631-9470-daab497688bb_600x166.jpeg" width="600" height="166" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c1194263-4657-4631-9470-daab497688bb_600x166.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:166,&quot;width&quot;:600,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!NC32!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1194263-4657-4631-9470-daab497688bb_600x166.jpeg 424w, https://substackcdn.com/image/fetch/$s_!NC32!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1194263-4657-4631-9470-daab497688bb_600x166.jpeg 848w, https://substackcdn.com/image/fetch/$s_!NC32!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1194263-4657-4631-9470-daab497688bb_600x166.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!NC32!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1194263-4657-4631-9470-daab497688bb_600x166.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>So essentially, it uses <strong>arrays </strong>as an <strong>underlying </strong>data structure. <strong>Hash Table</strong> functions in a <strong>key-value</strong> manner. It has <strong>a function</strong>, which computes an <strong>index</strong> (hash node). That <strong>index </strong>is used for <strong>data </strong>(value) to be stored.</p><p><strong>Hash Table</strong> pros:</p><ul><li><p>As per the nature of Hash Table functioning, they are <strong>fast </strong>when it comes to the <strong>addition</strong> or <strong>retrieval </strong>of data</p></li></ul><p><strong>Hash Table</strong> cons:</p><ul><li><p>The hash function can cause a collision! There are workarounds, but you need to keep in mind that two different inputs can cause the same output, which could make a problem in memory and potential data loss.</p></li></ul><p><em>off-topic: Recently, there was <strong>a collision</strong> problem in <strong>Apple&#8217;s </strong>security system. Read more about it <a href="https://www.theverge.com/2021/8/18/22630439/apple-csam-neuralhash-collision-vulnerability-flaw-cryptography">here</a>.</em></p><p>We can find the <strong>Hash Table </strong>data structure here:</p><ul><li><p>Databases, passwords</p></li><li><p><strong>Searching </strong>in web-browsers</p></li><li><p><strong>Files </strong>on devices, filename, and file path</p></li></ul><div><hr></div><h4>Stack and Queue</h4><p><em>Stack is a container of objects that are inserted and removed according to the last-in first-out (LIFO) principle.</em></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Yidr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a137607-58d2-4b3d-8ee7-348369b47cdf_265x190.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Yidr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a137607-58d2-4b3d-8ee7-348369b47cdf_265x190.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Yidr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a137607-58d2-4b3d-8ee7-348369b47cdf_265x190.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Yidr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a137607-58d2-4b3d-8ee7-348369b47cdf_265x190.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Yidr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a137607-58d2-4b3d-8ee7-348369b47cdf_265x190.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Yidr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a137607-58d2-4b3d-8ee7-348369b47cdf_265x190.jpeg" width="265" height="190" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2a137607-58d2-4b3d-8ee7-348369b47cdf_265x190.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:190,&quot;width&quot;:265,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Yidr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a137607-58d2-4b3d-8ee7-348369b47cdf_265x190.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Yidr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a137607-58d2-4b3d-8ee7-348369b47cdf_265x190.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Yidr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a137607-58d2-4b3d-8ee7-348369b47cdf_265x190.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Yidr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a137607-58d2-4b3d-8ee7-348369b47cdf_265x190.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>You can think of a stack as a <strong>pile of plates</strong>. You clean them, and the <strong>last one</strong> you place on top, you will use it <strong>first</strong>. So, <strong>last-in </strong>-&gt;<strong> first-out</strong>.</p><p><em>Queue is a container of objects (a linear collection) that are inserted and removed according to the first-in first-out (FIFO) principle.</em></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kIIQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40e8a81c-d87c-41e9-83fe-322fcd1f0ca2_240x156.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kIIQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40e8a81c-d87c-41e9-83fe-322fcd1f0ca2_240x156.jpeg 424w, https://substackcdn.com/image/fetch/$s_!kIIQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40e8a81c-d87c-41e9-83fe-322fcd1f0ca2_240x156.jpeg 848w, https://substackcdn.com/image/fetch/$s_!kIIQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40e8a81c-d87c-41e9-83fe-322fcd1f0ca2_240x156.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!kIIQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40e8a81c-d87c-41e9-83fe-322fcd1f0ca2_240x156.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kIIQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40e8a81c-d87c-41e9-83fe-322fcd1f0ca2_240x156.jpeg" width="240" height="156" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/40e8a81c-d87c-41e9-83fe-322fcd1f0ca2_240x156.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:156,&quot;width&quot;:240,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!kIIQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40e8a81c-d87c-41e9-83fe-322fcd1f0ca2_240x156.jpeg 424w, https://substackcdn.com/image/fetch/$s_!kIIQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40e8a81c-d87c-41e9-83fe-322fcd1f0ca2_240x156.jpeg 848w, https://substackcdn.com/image/fetch/$s_!kIIQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40e8a81c-d87c-41e9-83fe-322fcd1f0ca2_240x156.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!kIIQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40e8a81c-d87c-41e9-83fe-322fcd1f0ca2_240x156.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>You can abstract queue as people waiting to buy something in store. The first one who came will be the first one who will get to buy and go. So,<strong> first-in</strong> -&gt;<strong> first-out</strong>.</p><p><strong>Stack and Queue</strong> pros:</p><ul><li><p>They are <strong>efficient</strong> in <strong>addition </strong>or <strong>removal </strong>of data</p></li></ul><p><strong>Stack and Queue</strong> cons:</p><ul><li><p>They don't have <strong>many</strong> use cases. That doesn't mean you shouldn't learn them!</p></li></ul><p>We can find the <strong>Stack </strong>data structure here:</p><ul><li><p><strong>Undo </strong>operation</p></li><li><p><strong>Syntaxes </strong>in programming languages</p></li><li><p><strong>Virtual </strong>Machines</p></li><li><p><strong>Browser </strong>history</p></li><li><p>Call logs,<strong> e-mails</strong>, gallery, <strong>notifications</strong></p></li></ul><p>We can find the <strong>Queue </strong>data structure here:</p><ul><li><p><strong>Operating </strong>system, job <strong>scheduling</strong></p></li><li><p><strong>Sending </strong>e-mail, it&#8217;s <strong>queued </strong>and <strong>sent </strong>in blocks</p></li><li><p>Server <strong>responding </strong>to request</p></li><li><p><strong>Uploading </strong>and <strong>downloading </strong>files</p></li></ul><div><hr></div><h4>Graphs and Trees</h4><blockquote><p><em><strong><a href="https://techdifferences.com/difference-between-tree-and-graph.html#:~:text=Tree%20and%20graph%20come%20under%20the%20category%20of%20non%2Dlinear%20data%20structure%20where%20tree%20offers%20a%20very%20useful%20way%20of%20representing%20a%20relationship%20between%20the%20nodes%20in%20a%20hierarchical%20structure%20and%20graph%20follows%20a%20network%20model.">Tree</a></strong><a href="https://techdifferences.com/difference-between-tree-and-graph.html#:~:text=Tree%20and%20graph%20come%20under%20the%20category%20of%20non%2Dlinear%20data%20structure%20where%20tree%20offers%20a%20very%20useful%20way%20of%20representing%20a%20relationship%20between%20the%20nodes%20in%20a%20hierarchical%20structure%20and%20graph%20follows%20a%20network%20model."> and </a><strong><a href="https://techdifferences.com/difference-between-tree-and-graph.html#:~:text=Tree%20and%20graph%20come%20under%20the%20category%20of%20non%2Dlinear%20data%20structure%20where%20tree%20offers%20a%20very%20useful%20way%20of%20representing%20a%20relationship%20between%20the%20nodes%20in%20a%20hierarchical%20structure%20and%20graph%20follows%20a%20network%20model.">graph</a></strong><a href="https://techdifferences.com/difference-between-tree-and-graph.html#:~:text=Tree%20and%20graph%20come%20under%20the%20category%20of%20non%2Dlinear%20data%20structure%20where%20tree%20offers%20a%20very%20useful%20way%20of%20representing%20a%20relationship%20between%20the%20nodes%20in%20a%20hierarchical%20structure%20and%20graph%20follows%20a%20network%20model."> come under the category of </a><strong><a href="https://techdifferences.com/difference-between-tree-and-graph.html#:~:text=Tree%20and%20graph%20come%20under%20the%20category%20of%20non%2Dlinear%20data%20structure%20where%20tree%20offers%20a%20very%20useful%20way%20of%20representing%20a%20relationship%20between%20the%20nodes%20in%20a%20hierarchical%20structure%20and%20graph%20follows%20a%20network%20model.">non-linear</a></strong><a href="https://techdifferences.com/difference-between-tree-and-graph.html#:~:text=Tree%20and%20graph%20come%20under%20the%20category%20of%20non%2Dlinear%20data%20structure%20where%20tree%20offers%20a%20very%20useful%20way%20of%20representing%20a%20relationship%20between%20the%20nodes%20in%20a%20hierarchical%20structure%20and%20graph%20follows%20a%20network%20model."> data structures where tree offers a very useful way of representing a relationship between the nodes in a hierarchical structure and graph follows a network model.</a></em></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZLm5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F628f7d4e-3b78-4fd5-b90d-c9f8f6ffa677_430x270.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZLm5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F628f7d4e-3b78-4fd5-b90d-c9f8f6ffa677_430x270.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ZLm5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F628f7d4e-3b78-4fd5-b90d-c9f8f6ffa677_430x270.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ZLm5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F628f7d4e-3b78-4fd5-b90d-c9f8f6ffa677_430x270.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ZLm5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F628f7d4e-3b78-4fd5-b90d-c9f8f6ffa677_430x270.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZLm5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F628f7d4e-3b78-4fd5-b90d-c9f8f6ffa677_430x270.jpeg" width="430" height="270" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/628f7d4e-3b78-4fd5-b90d-c9f8f6ffa677_430x270.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:270,&quot;width&quot;:430,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!ZLm5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F628f7d4e-3b78-4fd5-b90d-c9f8f6ffa677_430x270.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ZLm5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F628f7d4e-3b78-4fd5-b90d-c9f8f6ffa677_430x270.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ZLm5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F628f7d4e-3b78-4fd5-b90d-c9f8f6ffa677_430x270.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ZLm5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F628f7d4e-3b78-4fd5-b90d-c9f8f6ffa677_430x270.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></figure></div><p><strong>How to differentiate them?</strong></p><p><strong>Tree </strong>data structure <strong>has to</strong> be connected, and <strong>can not</strong> have loops.</p><p><strong>Graphs</strong> data structures <strong>don't have</strong> such restrictions.</p><p>They are both <strong>hierarchical</strong> data structures. You can abstract that as <strong>a business</strong>, with <strong>CEO</strong> being on <strong>top </strong>with<strong> </strong>his associates beneath, then the people below him, who have their own associates, and so on.</p><p>Each node is <strong>aware </strong>of the <strong>next node</strong> (kind of like <strong>a linked list</strong>). It contains <strong>data </strong>and the <strong>pointer </strong>to the next one.</p><p><strong>Graphs and Trees</strong> pros:</p><ul><li><p>They provide a quick <strong>addition </strong>of data, as well as <strong>searching </strong>e.g. binary search.</p></li></ul><p><strong>Graphs and Trees</strong> cons:</p><ul><li><p><strong>Modifying </strong>data can be tricky <strong>sometimes</strong>, as you don't have all node indexes at once and you maybe have to traverse them.</p></li></ul><p>We can find the <strong>Graph </strong>data structure here:</p><ul><li><p>Facebook <strong>Graph </strong>API</p></li><li><p><strong>Dijkstra </strong>algorithm which finds <strong>the smallest</strong> path between two nodes, used in <strong>maps </strong>for example</p></li><li><p>Facebook, Instagram, social media <strong>networking</strong></p></li></ul><p>We can find the <strong>Tree </strong>data structure here:</p><ul><li><p>XML <strong>parser</strong></p></li><li><p>Domain Name Server&#8202;&#8212;&#8202;<strong>DNS</strong></p></li><li><p>File <strong>explorer </strong>of any device</p></li><li><p><strong>Posting </strong>questions on Quora, Reddit, etc.</p></li></ul><div><hr></div><h3>Conclusion</h3><p>These <strong>data structures</strong> will give you a <strong>good foundation</strong> for algorithms.</p><p>But don&#8217;t forget: You will become <strong>an expert</strong> at them <strong>only</strong> if you start <strong>applying </strong>them!</p><p>It can be frustrating from time to time, but solving those problems will give you <strong>an experience</strong>, something you <strong>can not</strong> learn.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.kaumnen.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">Subscribe for free to get fresh content delivered directly to your inbox and help support my work. It's quick, easy, no spam!</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[How to configure verified GitHub commits?]]></title><description><![CDATA[Git has a feature to sign commits. But what is commit signing? Why should you use that? Get a verified badge now!]]></description><link>https://www.kaumnen.com/p/how-to-configure-verified-github-commits</link><guid isPermaLink="false">https://www.kaumnen.com/p/how-to-configure-verified-github-commits</guid><dc:creator><![CDATA[kaumnen]]></dc:creator><pubDate>Fri, 03 Dec 2021 17:24:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/42f4928a-e788-4c9e-b555-49aac62220f2_796x310.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>NOTE:</strong> <em>In this blog post, it will be explained how to sign commits on GitHub, with Windows. For other git hosts, please refer to their documentation.</em></p><h3>Why should you sign your commits?</h3><p>First off, let&#8217;s see what is git&#8217;s default behavior.</p><h4>Git&#8217;s default behavior</h4><p>By default, git commits have two properties:</p><ul><li><p>user. email&#8202;&#8212;&#8202;this email is also used so that GitHub can link commits with your account and show you those shiny green squares :)</p></li><li><p>user.name&#8202;&#8212;&#8202;this is the name that will be shown in a commit info</p></li></ul><p>Git <strong>doesn&#8217;t verify</strong> the info you put into those properties, it just <strong>assumes </strong>they are right until you set <strong>commit signing</strong>.</p><h4><strong>What does </strong>&#8593; <strong>this </strong>&#8593;<strong> mean?</strong></h4><p><strong>Someone else</strong> can set those parameters <strong>as yours</strong>, and git will just push it remotely (there are certain repo settings you can set, but I&#8217;m talking about default behavior), <strong>without any checks.</strong></p><p>It will show like <strong>you committed</strong>, with a picture and your email, but you didn&#8217;t! So, basically, <strong>anyone </strong>can set their user.email or user.name to yours, and it will look like you made the commit.</p><h4>How to prove it is really you?</h4><p>You can utilize software called <strong><a href="https://gnupg.org/">GPG </a></strong><a href="https://gnupg.org/">(GNU Privacy Guard)</a>. It allows you to create <strong>public-private</strong> key pairs, and <strong>encrypt/sign</strong> the data.</p><p>It is <strong>important</strong> to understand <strong>public-private</strong> key pairs.</p><h4>What are public-private keys in terms of encryption?</h4><p><strong>The public key</strong> is a public one <em>(wow)</em>. No, seriously, you can share this key with <strong>everyone</strong>. It&#8217;s mainly used by someone else, so they can <strong>encrypt</strong> the message, and send it to you. Then, you <strong>decode </strong>and read it with your <strong>private key</strong>.</p><p><strong>The private key</strong> is a private one <em>(another one)</em>. It&#8217;s like <strong>a password</strong>. Noone, except you, should ever be able to get it. It&#8217;s used to decrypt data, and leaking/exposing it would present a fatal flaw.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.kaumnen.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">Subscribe for free to get fresh content delivered directly to your inbox and help support my work. It's quick, easy, no spam!</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><hr></div><h3>How to Sign Commits in Git(Hub)</h3><h4>Prerequisites</h4><ul><li><p><a href="https://git-scm.com/downloads">Git</a>, or <a href="https://desktop.github.com/">GitHub Desktop</a></p></li><li><p><a href="https://www.gnupg.org/download/">GPG utility</a></p></li></ul><p>You can verify if <strong>GPG </strong>is already installed by running the following command in the terminal:</p><ul><li><p><strong>gpg&#8202;&#8212;&#8202;version</strong></p></li></ul><div><hr></div><h4>Generating a new GPG key</h4><ol><li><p><strong>Download and install</strong> GPG command-line tools for your operating system.</p></li></ol><p>2. Open <strong>terminal</strong>.</p><p>3. Generate a generate an <strong>RSA key pair </strong>with the following command:</p><ul><li><p><strong>gpg --full-generate-key</strong></p></li></ul><p>4. Select what kind of key you want.</p><ul><li><p>We will use <strong>RSA key pair</strong>, default one, so you can just press <strong>Enter </strong>to advance.</p></li></ul><p>5. What keysize do you want?</p><ul><li><p>Although you can use stronger, <strong>4096 </strong>is good, press <strong>Enter.</strong></p></li></ul><p>6. Key is valid for?</p><ul><li><p>I will just press <strong>Enter </strong>which will select default (0&#8202;&#8212;&#8202;doesn&#8217;t expire)</p></li></ul><p>7. Then, input your information.</p><ul><li><p><strong>NOTE:</strong> <strong>When asked for an email, make sure to input the primary email for your GitHub account! You can also use your no-reply GitHub provided an email address, if you have your privacy settings on.</strong></p></li></ul><p>8. Now you need to set a secure passphrase.</p><ul><li><p><strong>NOTE: You can also just press OK with blank fields, but it is recommended to use a password for your encryption! Keep in mind that you will have to type in a passphrase at each commit (it has some time window, but you get the idea)</strong></p></li></ul><div><hr></div><h4>Copying generated key</h4><ol><li><p>Use the following command to list the long-form of GPG keys</p></li></ol><ul><li><p><strong>gpg --list-secret-keys --keyid-format LONG</strong></p></li></ul><p>2. Copy the long form of your <strong>key ID</strong>, from the list.</p><ul><li><p>Find the long form of your key after &gt;<strong>4096R/</strong>&lt;</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yPD6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62fc7df1-d6fb-43aa-9c0d-e080c7c5526f_504x89.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yPD6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62fc7df1-d6fb-43aa-9c0d-e080c7c5526f_504x89.png 424w, https://substackcdn.com/image/fetch/$s_!yPD6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62fc7df1-d6fb-43aa-9c0d-e080c7c5526f_504x89.png 848w, https://substackcdn.com/image/fetch/$s_!yPD6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62fc7df1-d6fb-43aa-9c0d-e080c7c5526f_504x89.png 1272w, https://substackcdn.com/image/fetch/$s_!yPD6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62fc7df1-d6fb-43aa-9c0d-e080c7c5526f_504x89.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yPD6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62fc7df1-d6fb-43aa-9c0d-e080c7c5526f_504x89.png" width="504" height="89" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/62fc7df1-d6fb-43aa-9c0d-e080c7c5526f_504x89.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:89,&quot;width&quot;:504,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!yPD6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62fc7df1-d6fb-43aa-9c0d-e080c7c5526f_504x89.png 424w, https://substackcdn.com/image/fetch/$s_!yPD6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62fc7df1-d6fb-43aa-9c0d-e080c7c5526f_504x89.png 848w, https://substackcdn.com/image/fetch/$s_!yPD6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62fc7df1-d6fb-43aa-9c0d-e080c7c5526f_504x89.png 1272w, https://substackcdn.com/image/fetch/$s_!yPD6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62fc7df1-d6fb-43aa-9c0d-e080c7c5526f_504x89.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>3. Show your public key with the following command:</p><ul><li><p><strong>gpg --armor --export 42653CC58CD62E74</strong></p></li><li><p><strong>NOTE:</strong> Use your own key after <strong>--export </strong>part</p></li></ul><p>4. Copy your GPG key, beginning with:</p><ul><li><p><strong>-----BEGIN PGP PUBLIC KEY BLOCK -----</strong></p></li></ul><p>And ending with:</p><ul><li><p><strong>-----END PGP PUBLIC KEY BLOCK -----</strong></p></li></ul><h4>Adding your key to GitHub</h4><ol><li><p>Go to your <strong>settings</strong></p></li><li><p>In the settings sidebar, go to <strong>SSH and GPG keys</strong></p></li><li><p>Click on <strong>New GPG key</strong></p></li><li><p>In the <strong>&#8216;Key&#8217;</strong> field, paste copied <strong>public</strong> <strong>key</strong></p></li><li><p>Finish with clicking on <strong>Add GPG key</strong> and confirm your password (<strong>GitHub account</strong> password, not the passphrase)</p></li></ol><p>NOTE: Check if the <strong>Key ID on GitHub</strong> is the same one as the <strong>Key ID</strong> you copied earlier:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2DcG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a9ef8ba-db91-4f4d-a932-de64f8038094_758x132.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2DcG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a9ef8ba-db91-4f4d-a932-de64f8038094_758x132.png 424w, https://substackcdn.com/image/fetch/$s_!2DcG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a9ef8ba-db91-4f4d-a932-de64f8038094_758x132.png 848w, https://substackcdn.com/image/fetch/$s_!2DcG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a9ef8ba-db91-4f4d-a932-de64f8038094_758x132.png 1272w, https://substackcdn.com/image/fetch/$s_!2DcG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a9ef8ba-db91-4f4d-a932-de64f8038094_758x132.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2DcG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a9ef8ba-db91-4f4d-a932-de64f8038094_758x132.png" width="758" height="132" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3a9ef8ba-db91-4f4d-a932-de64f8038094_758x132.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:132,&quot;width&quot;:758,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!2DcG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a9ef8ba-db91-4f4d-a932-de64f8038094_758x132.png 424w, https://substackcdn.com/image/fetch/$s_!2DcG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a9ef8ba-db91-4f4d-a932-de64f8038094_758x132.png 848w, https://substackcdn.com/image/fetch/$s_!2DcG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a9ef8ba-db91-4f4d-a932-de64f8038094_758x132.png 1272w, https://substackcdn.com/image/fetch/$s_!2DcG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a9ef8ba-db91-4f4d-a932-de64f8038094_758x132.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>If it&#8217;s not, you did something wrong. If you need help, don&#8217;t hesitate to comment down below!</p><div><hr></div><h4>Configuring Git on your local machine</h4><p>We will modify the .gitconfig file, so this will work for any instance for Git on your windows machine.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wRHg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53f0f9de-2e52-4241-ae2b-0bb53e1abdf9_642x236.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wRHg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53f0f9de-2e52-4241-ae2b-0bb53e1abdf9_642x236.png 424w, https://substackcdn.com/image/fetch/$s_!wRHg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53f0f9de-2e52-4241-ae2b-0bb53e1abdf9_642x236.png 848w, https://substackcdn.com/image/fetch/$s_!wRHg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53f0f9de-2e52-4241-ae2b-0bb53e1abdf9_642x236.png 1272w, https://substackcdn.com/image/fetch/$s_!wRHg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53f0f9de-2e52-4241-ae2b-0bb53e1abdf9_642x236.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wRHg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53f0f9de-2e52-4241-ae2b-0bb53e1abdf9_642x236.png" width="642" height="236" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/53f0f9de-2e52-4241-ae2b-0bb53e1abdf9_642x236.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:236,&quot;width&quot;:642,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!wRHg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53f0f9de-2e52-4241-ae2b-0bb53e1abdf9_642x236.png 424w, https://substackcdn.com/image/fetch/$s_!wRHg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53f0f9de-2e52-4241-ae2b-0bb53e1abdf9_642x236.png 848w, https://substackcdn.com/image/fetch/$s_!wRHg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53f0f9de-2e52-4241-ae2b-0bb53e1abdf9_642x236.png 1272w, https://substackcdn.com/image/fetch/$s_!wRHg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53f0f9de-2e52-4241-ae2b-0bb53e1abdf9_642x236.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The global scope will suffice in this case, navigate and open the .gitconfig file with any editor (I am using Notepad++).</p><ul><li><p>NOTE: If you don't see the .gitconfig file, you probably have to enable showing hidden files on Windows (I am using Windows 11):</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SqTY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e36cccd-7d82-4f88-98b3-d1204adb9212_456x562.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SqTY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e36cccd-7d82-4f88-98b3-d1204adb9212_456x562.png 424w, https://substackcdn.com/image/fetch/$s_!SqTY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e36cccd-7d82-4f88-98b3-d1204adb9212_456x562.png 848w, https://substackcdn.com/image/fetch/$s_!SqTY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e36cccd-7d82-4f88-98b3-d1204adb9212_456x562.png 1272w, https://substackcdn.com/image/fetch/$s_!SqTY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e36cccd-7d82-4f88-98b3-d1204adb9212_456x562.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SqTY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e36cccd-7d82-4f88-98b3-d1204adb9212_456x562.png" width="456" height="562" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0e36cccd-7d82-4f88-98b3-d1204adb9212_456x562.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:562,&quot;width&quot;:456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!SqTY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e36cccd-7d82-4f88-98b3-d1204adb9212_456x562.png 424w, https://substackcdn.com/image/fetch/$s_!SqTY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e36cccd-7d82-4f88-98b3-d1204adb9212_456x562.png 848w, https://substackcdn.com/image/fetch/$s_!SqTY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e36cccd-7d82-4f88-98b3-d1204adb9212_456x562.png 1272w, https://substackcdn.com/image/fetch/$s_!SqTY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e36cccd-7d82-4f88-98b3-d1204adb9212_456x562.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ol><li><p>Add Key ID from before:</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!y8_S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F842cef8b-dbfd-4410-b9f6-b75e2c904afe_356x90.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!y8_S!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F842cef8b-dbfd-4410-b9f6-b75e2c904afe_356x90.png 424w, https://substackcdn.com/image/fetch/$s_!y8_S!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F842cef8b-dbfd-4410-b9f6-b75e2c904afe_356x90.png 848w, https://substackcdn.com/image/fetch/$s_!y8_S!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F842cef8b-dbfd-4410-b9f6-b75e2c904afe_356x90.png 1272w, https://substackcdn.com/image/fetch/$s_!y8_S!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F842cef8b-dbfd-4410-b9f6-b75e2c904afe_356x90.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!y8_S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F842cef8b-dbfd-4410-b9f6-b75e2c904afe_356x90.png" width="356" height="90" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/842cef8b-dbfd-4410-b9f6-b75e2c904afe_356x90.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:90,&quot;width&quot;:356,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!y8_S!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F842cef8b-dbfd-4410-b9f6-b75e2c904afe_356x90.png 424w, https://substackcdn.com/image/fetch/$s_!y8_S!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F842cef8b-dbfd-4410-b9f6-b75e2c904afe_356x90.png 848w, https://substackcdn.com/image/fetch/$s_!y8_S!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F842cef8b-dbfd-4410-b9f6-b75e2c904afe_356x90.png 1272w, https://substackcdn.com/image/fetch/$s_!y8_S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F842cef8b-dbfd-4410-b9f6-b75e2c904afe_356x90.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>2. Add the GPG section which will point to gpg binary you used for generating a key:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!trLP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53192a7f-c60f-4746-a92e-911503d27ecd_560x43.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!trLP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53192a7f-c60f-4746-a92e-911503d27ecd_560x43.png 424w, https://substackcdn.com/image/fetch/$s_!trLP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53192a7f-c60f-4746-a92e-911503d27ecd_560x43.png 848w, https://substackcdn.com/image/fetch/$s_!trLP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53192a7f-c60f-4746-a92e-911503d27ecd_560x43.png 1272w, https://substackcdn.com/image/fetch/$s_!trLP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53192a7f-c60f-4746-a92e-911503d27ecd_560x43.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!trLP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53192a7f-c60f-4746-a92e-911503d27ecd_560x43.png" width="560" height="43" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/53192a7f-c60f-4746-a92e-911503d27ecd_560x43.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:43,&quot;width&quot;:560,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!trLP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53192a7f-c60f-4746-a92e-911503d27ecd_560x43.png 424w, https://substackcdn.com/image/fetch/$s_!trLP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53192a7f-c60f-4746-a92e-911503d27ecd_560x43.png 848w, https://substackcdn.com/image/fetch/$s_!trLP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53192a7f-c60f-4746-a92e-911503d27ecd_560x43.png 1272w, https://substackcdn.com/image/fetch/$s_!trLP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53192a7f-c60f-4746-a92e-911503d27ecd_560x43.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><ul><li><p><strong>NOTE: I had problems with only &#8216;gpg&#8217; or single back-slashes. The method from the picture should work on every Windows 11 machine.</strong></p></li></ul><p>3. Add commit section which will tell git to sign every commit:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Mk4B!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01edf318-47ad-4e7b-8cf7-452af55c44c2_228x42.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Mk4B!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01edf318-47ad-4e7b-8cf7-452af55c44c2_228x42.png 424w, https://substackcdn.com/image/fetch/$s_!Mk4B!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01edf318-47ad-4e7b-8cf7-452af55c44c2_228x42.png 848w, https://substackcdn.com/image/fetch/$s_!Mk4B!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01edf318-47ad-4e7b-8cf7-452af55c44c2_228x42.png 1272w, https://substackcdn.com/image/fetch/$s_!Mk4B!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01edf318-47ad-4e7b-8cf7-452af55c44c2_228x42.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Mk4B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01edf318-47ad-4e7b-8cf7-452af55c44c2_228x42.png" width="228" height="42" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/01edf318-47ad-4e7b-8cf7-452af55c44c2_228x42.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:42,&quot;width&quot;:228,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Mk4B!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01edf318-47ad-4e7b-8cf7-452af55c44c2_228x42.png 424w, https://substackcdn.com/image/fetch/$s_!Mk4B!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01edf318-47ad-4e7b-8cf7-452af55c44c2_228x42.png 848w, https://substackcdn.com/image/fetch/$s_!Mk4B!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01edf318-47ad-4e7b-8cf7-452af55c44c2_228x42.png 1272w, https://substackcdn.com/image/fetch/$s_!Mk4B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01edf318-47ad-4e7b-8cf7-452af55c44c2_228x42.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><strong>That&#8217;s it! Now you are able to push signed commits!</strong></p><div><hr></div><h3>Vigilant Mode</h3><p>If you want to go further, this option will mark every commit you<strong> didn't sign</strong> as <strong>Unverified</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jRb0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5e87a88-61f3-4eb6-92b4-0d0d7d801a58_583x167.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jRb0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5e87a88-61f3-4eb6-92b4-0d0d7d801a58_583x167.png 424w, https://substackcdn.com/image/fetch/$s_!jRb0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5e87a88-61f3-4eb6-92b4-0d0d7d801a58_583x167.png 848w, https://substackcdn.com/image/fetch/$s_!jRb0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5e87a88-61f3-4eb6-92b4-0d0d7d801a58_583x167.png 1272w, https://substackcdn.com/image/fetch/$s_!jRb0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5e87a88-61f3-4eb6-92b4-0d0d7d801a58_583x167.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jRb0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5e87a88-61f3-4eb6-92b4-0d0d7d801a58_583x167.png" width="583" height="167" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f5e87a88-61f3-4eb6-92b4-0d0d7d801a58_583x167.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:167,&quot;width&quot;:583,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!jRb0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5e87a88-61f3-4eb6-92b4-0d0d7d801a58_583x167.png 424w, https://substackcdn.com/image/fetch/$s_!jRb0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5e87a88-61f3-4eb6-92b4-0d0d7d801a58_583x167.png 848w, https://substackcdn.com/image/fetch/$s_!jRb0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5e87a88-61f3-4eb6-92b4-0d0d7d801a58_583x167.png 1272w, https://substackcdn.com/image/fetch/$s_!jRb0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5e87a88-61f3-4eb6-92b4-0d0d7d801a58_583x167.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.kaumnen.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">Subscribe for free to get fresh content delivered directly to your inbox and help support my work. It's quick, easy, no spam!</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>