<?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[PapayaBytes: Code]]></title><description><![CDATA[Guides, articles and snippets on code related items.]]></description><link>https://papayabytes.substack.com/s/code</link><image><url>https://substackcdn.com/image/fetch/$s_!abuH!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e5e0556-7e55-4e5e-8544-a4a6f5bd8a38_1000x1000.png</url><title>PapayaBytes: Code</title><link>https://papayabytes.substack.com/s/code</link></image><generator>Substack</generator><lastBuildDate>Sun, 03 May 2026 01:56:31 GMT</lastBuildDate><atom:link href="https://papayabytes.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[PapayaBytes LLC]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[papayabytes@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[papayabytes@substack.com]]></itunes:email><itunes:name><![CDATA[Rob]]></itunes:name></itunes:owner><itunes:author><![CDATA[Rob]]></itunes:author><googleplay:owner><![CDATA[papayabytes@substack.com]]></googleplay:owner><googleplay:email><![CDATA[papayabytes@substack.com]]></googleplay:email><googleplay:author><![CDATA[Rob]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Godot: Mouse Click Debugging]]></title><description><![CDATA[How to investigate inability to click UI components.]]></description><link>https://papayabytes.substack.com/p/godot-mouse-click-debugging</link><guid isPermaLink="false">https://papayabytes.substack.com/p/godot-mouse-click-debugging</guid><dc:creator><![CDATA[Rob]]></dc:creator><pubDate>Tue, 29 Oct 2024 23:52:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!G6MW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a22603-0423-4444-9762-39632bbecc97_2394x1200.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I will be the first to admit I am fairly new to Godot, so I am still learning the ropes on debugging.  An unfortunate issue I ran into was the culmination of some architectural mistakes, incorrect assumptions, and lack of knowledge how to properly debug Godot.</p><h2>The Issue</h2><p>I had made some small test projects, with buttons that seemed to work fine.  As I worked on a more substantial project, it came time to create a menu for the user, and suddenly, things went off the rails.  The issue?  No UI component would accept mouse clicks.</p><h2>The Bad Assumptions</h2><p>Now, I made lots of incorrect assumptions.  This happened because of:</p><ul><li><p>Leaning on previous experience thinking I knew what was up.</p></li><li><p>Read the docs.  Unless I misunderstood, the code seemed to check out per examples there.</p></li><li><p>History.  I remember smaller projects, where a button click would do something.</p></li><li><p>Deep diving on the Internet.  Lots of similar issues or even the same issue and not fully understanding the root causes.</p></li><li><p>Thought the click coordinates were not in the right spot (since the elements did not react, like hovering over a button didn&#8217;t change it, even though it was correct in the scene in terms of setup).</p></li></ul><h2>The Bad Code</h2><p>Now, the code itself was correct per se.  I lost a lot of time trying to debug, including adding code simply to confirm via <code>_input()</code> where I was clicking.  Essentially all combinations of debugging attempts confirmed activity was happening but no events were being processed by the UI components, regardless of component.</p><h2>Fail Attempt One</h2><p>All UI elements are based on the Control Node type.  It contains a property in the config called mouse_filter, found in the <code>Mouse&#8594;Filter</code> section of the <code>Inspector</code>.  (More information on GUI controls can be found <a href="https://docs.godotengine.org/en/stable/classes/class_control.html">here</a>.). This mouse_filter setting, which is stop, pass, and ignore, dictates what the node should do.  In Godot, for a button to handle a press event from the mouse, it should set this value to stop.  However, all nodes above it in the tree in your scene, should have their <code>mouse_filter</code> set to ignore.  </p><p>To quickly summarize the <code>mouse_filter</code> options:</p><blockquote><p>Stop: The node will consume the event.</p><p>Pass: The node will consume the event and pass it to the parent node to consume.</p><p>Ignore: The node discards the event.</p></blockquote><p>Even knowing this, and confirming many times the settings were correct, it did not work.</p><h2>Fail Attempt Two</h2><p>After reaching deeper into Godot history, I was thinking maybe changes related to how signal processing was handled is causing me an issue.  Maybe I forgot a step in terms of config, as in <code>Project&#8594;Project Settings, Input Map</code>.  I actually had keyboard events working, and they never failed to work for me. As I was using the function <code>_input()</code>, I thought maybe mouse clicks were supposed to be done in a similar way.  I never fully went down this path, but it did lead to more searching.</p><p>I even found references to events failing or being inconsistent, including sometimes on Mac silicon based Macs.  However, that seemed extreme (and often from older posts, before Godot 4.0 was even out).</p><p>However, after much resetting signals, changing event code, testing input maps, still no progress.</p><h2>Break Time</h2><p>Not totally.  I decided to go back to new projects and try again, and as expected, it worked.  So it brought my thinking right back to something that must be wrong in this specific project.</p><h2>Third Attempt is the Charm</h2><p>Finally, hope!  This project I have worked on requires transitioning between scenes.  A <code>TransitionManager</code> was created earlier in the project to fade between scenes.  This will matter in a moment.</p><p>While randomly searching I found a post about one small feature of the Godot debugger.  There is a panel named Misc, which happens to show the node that processed the most recent event.  I was not aware of this.  Immediately I checked it out.  Sure enough, while running just a single scene, not the entire project, it referenced a component in a different scene.  You guessed it, the <code>TransitionManager</code>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!G6MW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a22603-0423-4444-9762-39632bbecc97_2394x1200.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!G6MW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a22603-0423-4444-9762-39632bbecc97_2394x1200.png 424w, https://substackcdn.com/image/fetch/$s_!G6MW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a22603-0423-4444-9762-39632bbecc97_2394x1200.png 848w, https://substackcdn.com/image/fetch/$s_!G6MW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a22603-0423-4444-9762-39632bbecc97_2394x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!G6MW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a22603-0423-4444-9762-39632bbecc97_2394x1200.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!G6MW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a22603-0423-4444-9762-39632bbecc97_2394x1200.png" width="1456" height="730" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/37a22603-0423-4444-9762-39632bbecc97_2394x1200.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:730,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:400998,&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_!G6MW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a22603-0423-4444-9762-39632bbecc97_2394x1200.png 424w, https://substackcdn.com/image/fetch/$s_!G6MW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a22603-0423-4444-9762-39632bbecc97_2394x1200.png 848w, https://substackcdn.com/image/fetch/$s_!G6MW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a22603-0423-4444-9762-39632bbecc97_2394x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!G6MW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a22603-0423-4444-9762-39632bbecc97_2394x1200.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">Location of the Misc tab and node which received the most recent click event, in the debugger.</figcaption></figure></div><p>The <code>TransitionManager</code> has a <code>ColorRect</code>, which is a <code>Control</code> node type.  I blindly assumed a random color rectangle would never block events.  In fact, I never thought about another scene being the issue at all.  What was learned here is, when you autoload a scene (which is in <code>Project&#8594;Project Settings, Globals, Autoload</code>), these scenes last for the duration of the project runtime. By design, visual components generally have mouse_filter set to stop, to avoid causing downstream issues in your scene.  I, like many, presumed most would be set to pass or ignore.  I was wrong.</p><p>The Debugger Misc tab clearly showed the ColorRect was stopping the <code>pressed()</code> event. I jumped over to the TransitionManager scene, went to the <code>ColorRect</code> <code>Mouse&#8594;Filter</code> properties and set it to ignore.  Restarted the scene, everything works just as expected.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9MCz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61e4b023-27c4-4911-b02a-69923eaaf67c_2394x1200.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9MCz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61e4b023-27c4-4911-b02a-69923eaaf67c_2394x1200.png 424w, https://substackcdn.com/image/fetch/$s_!9MCz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61e4b023-27c4-4911-b02a-69923eaaf67c_2394x1200.png 848w, https://substackcdn.com/image/fetch/$s_!9MCz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61e4b023-27c4-4911-b02a-69923eaaf67c_2394x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!9MCz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61e4b023-27c4-4911-b02a-69923eaaf67c_2394x1200.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9MCz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61e4b023-27c4-4911-b02a-69923eaaf67c_2394x1200.png" width="1456" height="730" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/61e4b023-27c4-4911-b02a-69923eaaf67c_2394x1200.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:730,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:325495,&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_!9MCz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61e4b023-27c4-4911-b02a-69923eaaf67c_2394x1200.png 424w, https://substackcdn.com/image/fetch/$s_!9MCz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61e4b023-27c4-4911-b02a-69923eaaf67c_2394x1200.png 848w, https://substackcdn.com/image/fetch/$s_!9MCz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61e4b023-27c4-4911-b02a-69923eaaf67c_2394x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!9MCz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61e4b023-27c4-4911-b02a-69923eaaf67c_2394x1200.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">Fixing the ColorRect config, setting to Ignore!</figcaption></figure></div><h2>Summary</h2><p>While it took more time then I would have liked, I did learn quite a few things along the way, as well as got much better understanding and moving around the Godot editor.  To summarize the issue, if click events are not working as you expect:</p><ul><li><p>Confirm the immediate scene tree Control-based nodes have the correct mouse_filter settings.</p></li><li><p>Double check your signal is configured to the correct script location and function.</p></li><li><p>Running the problematic scene, check inside the Misc debugger panel to see which node consumed the click event.</p></li></ul><h2>Additional Debugging</h2><p>One area that didn&#8217;t really help fix the issue did give me insight into event processing was logging.  For example, in your scenes script:</p><pre><code>func _input(event) -&gt; void:&#9;
&#9;if (event.as_text() == "Left Mouse Button"):
&#9;&#9;print(event.as_text())
&#9;&#9;print(event.get_property_list())</code></pre><p>Events sent by the OS, such as a mouse click, can be captured in the <code>_input(event)</code> function.  You would use this function only to capture the event at the time it happened. I used this for example to get coordinates, etc to see what might be wrong.  Meaning more directly, this function gave me output! </p><p>While informative, it sent me down a very incorrect path in terms of the issue. There is a lot to processing input, whether a one event item like clicking a menu button, to holding down multiple keys at the same time.  You can find more information on which functions to use and when in the official docs <a href="https://docs.godotengine.org/en/stable/tutorials/inputs/inputevent.html">here</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://papayabytes.substack.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 PapayaBytes! 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[Guide: Godot and GitHub Desktop]]></title><description><![CDATA[Setting up Godot with Github Desktop on a Mac.]]></description><link>https://papayabytes.substack.com/p/guide-godot-and-github-desktop</link><guid isPermaLink="false">https://papayabytes.substack.com/p/guide-godot-and-github-desktop</guid><dc:creator><![CDATA[Rob]]></dc:creator><pubDate>Sun, 20 Oct 2024 01:35:43 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-WCp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8230a41f-7fb5-42ac-a6c6-c916e112388a_2056x1456.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This guide is intended to help you quickly setup Godot and Github desktop on your Mac.  The primary driver for this post was due to issues experienced with the Git plugin for Godot.</p><h2>Installation</h2><p>You can directly grab the installer either on Godot&#8217;s website at:</p><p><a href="https://godotengine.org/download/macos/">https://godotengine.org/download/macos/ </a></p><p>You can install view Homebrew but I was wanting to go through their standard process, just to see what gotchas I might hit.  Just download the zip and run the executable.</p><p>As for obtaining GitHub Desktop, you can download here:</p><p><a href="https://desktop.github.com/download/">https://desktop.github.com/download/</a></p><p>Be sure to grab the correct version (in my case the Apple silicon download).</p><p>The Homebrew recipes for both these applications are as follows:</p><pre><code># Godot
brew install --cask godot

# GitHub, not to be confused with the "git" download
brew install --cask github</code></pre><h2>GitHub Desktop Setup</h2><p>After you install the GitHub Desktop application, launch it via Applications or Spotlight.  If you do not have a GitHub account, now would be the time to set it up over at:</p><p><a href="https://github.com/">https://github.com/</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_!-WCp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8230a41f-7fb5-42ac-a6c6-c916e112388a_2056x1456.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-WCp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8230a41f-7fb5-42ac-a6c6-c916e112388a_2056x1456.png 424w, https://substackcdn.com/image/fetch/$s_!-WCp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8230a41f-7fb5-42ac-a6c6-c916e112388a_2056x1456.png 848w, https://substackcdn.com/image/fetch/$s_!-WCp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8230a41f-7fb5-42ac-a6c6-c916e112388a_2056x1456.png 1272w, https://substackcdn.com/image/fetch/$s_!-WCp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8230a41f-7fb5-42ac-a6c6-c916e112388a_2056x1456.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-WCp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8230a41f-7fb5-42ac-a6c6-c916e112388a_2056x1456.png" width="674" height="477.2623626373626" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8230a41f-7fb5-42ac-a6c6-c916e112388a_2056x1456.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1031,&quot;width&quot;:1456,&quot;resizeWidth&quot;:674,&quot;bytes&quot;:519476,&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_!-WCp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8230a41f-7fb5-42ac-a6c6-c916e112388a_2056x1456.png 424w, https://substackcdn.com/image/fetch/$s_!-WCp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8230a41f-7fb5-42ac-a6c6-c916e112388a_2056x1456.png 848w, https://substackcdn.com/image/fetch/$s_!-WCp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8230a41f-7fb5-42ac-a6c6-c916e112388a_2056x1456.png 1272w, https://substackcdn.com/image/fetch/$s_!-WCp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8230a41f-7fb5-42ac-a6c6-c916e112388a_2056x1456.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">Initial login screen.</figcaption></figure></div><p>If you are already logged into Github, it will redirect you to authorize the GitHub Desktop app:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YAl4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F741ad83f-994d-4f07-ac1c-e9f7d57c72cc_708x734.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YAl4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F741ad83f-994d-4f07-ac1c-e9f7d57c72cc_708x734.png 424w, https://substackcdn.com/image/fetch/$s_!YAl4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F741ad83f-994d-4f07-ac1c-e9f7d57c72cc_708x734.png 848w, https://substackcdn.com/image/fetch/$s_!YAl4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F741ad83f-994d-4f07-ac1c-e9f7d57c72cc_708x734.png 1272w, https://substackcdn.com/image/fetch/$s_!YAl4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F741ad83f-994d-4f07-ac1c-e9f7d57c72cc_708x734.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YAl4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F741ad83f-994d-4f07-ac1c-e9f7d57c72cc_708x734.png" width="342" height="354.5593220338983" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/741ad83f-994d-4f07-ac1c-e9f7d57c72cc_708x734.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:734,&quot;width&quot;:708,&quot;resizeWidth&quot;:342,&quot;bytes&quot;:52955,&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_!YAl4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F741ad83f-994d-4f07-ac1c-e9f7d57c72cc_708x734.png 424w, https://substackcdn.com/image/fetch/$s_!YAl4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F741ad83f-994d-4f07-ac1c-e9f7d57c72cc_708x734.png 848w, https://substackcdn.com/image/fetch/$s_!YAl4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F741ad83f-994d-4f07-ac1c-e9f7d57c72cc_708x734.png 1272w, https://substackcdn.com/image/fetch/$s_!YAl4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F741ad83f-994d-4f07-ac1c-e9f7d57c72cc_708x734.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">If this is the correct account click Continue, obviously should have your username!</figcaption></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!n7_O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffdfd19-1343-4f49-a578-94edb2469e9c_932x1110.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!n7_O!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffdfd19-1343-4f49-a578-94edb2469e9c_932x1110.png 424w, https://substackcdn.com/image/fetch/$s_!n7_O!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffdfd19-1343-4f49-a578-94edb2469e9c_932x1110.png 848w, https://substackcdn.com/image/fetch/$s_!n7_O!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffdfd19-1343-4f49-a578-94edb2469e9c_932x1110.png 1272w, https://substackcdn.com/image/fetch/$s_!n7_O!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffdfd19-1343-4f49-a578-94edb2469e9c_932x1110.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!n7_O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffdfd19-1343-4f49-a578-94edb2469e9c_932x1110.png" width="354" height="421.6094420600858" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2ffdfd19-1343-4f49-a578-94edb2469e9c_932x1110.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1110,&quot;width&quot;:932,&quot;resizeWidth&quot;:354,&quot;bytes&quot;:129122,&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_!n7_O!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffdfd19-1343-4f49-a578-94edb2469e9c_932x1110.png 424w, https://substackcdn.com/image/fetch/$s_!n7_O!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffdfd19-1343-4f49-a578-94edb2469e9c_932x1110.png 848w, https://substackcdn.com/image/fetch/$s_!n7_O!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffdfd19-1343-4f49-a578-94edb2469e9c_932x1110.png 1272w, https://substackcdn.com/image/fetch/$s_!n7_O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffdfd19-1343-4f49-a578-94edb2469e9c_932x1110.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">Authorize access.</figcaption></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LCYo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f75c8c-8a1f-43d1-b9d2-9a0f93813b7b_572x1026.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LCYo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f75c8c-8a1f-43d1-b9d2-9a0f93813b7b_572x1026.png 424w, https://substackcdn.com/image/fetch/$s_!LCYo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f75c8c-8a1f-43d1-b9d2-9a0f93813b7b_572x1026.png 848w, https://substackcdn.com/image/fetch/$s_!LCYo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f75c8c-8a1f-43d1-b9d2-9a0f93813b7b_572x1026.png 1272w, https://substackcdn.com/image/fetch/$s_!LCYo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f75c8c-8a1f-43d1-b9d2-9a0f93813b7b_572x1026.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LCYo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f75c8c-8a1f-43d1-b9d2-9a0f93813b7b_572x1026.png" width="280" height="502.23776223776224" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d8f75c8c-8a1f-43d1-b9d2-9a0f93813b7b_572x1026.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1026,&quot;width&quot;:572,&quot;resizeWidth&quot;:280,&quot;bytes&quot;:91317,&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_!LCYo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f75c8c-8a1f-43d1-b9d2-9a0f93813b7b_572x1026.png 424w, https://substackcdn.com/image/fetch/$s_!LCYo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f75c8c-8a1f-43d1-b9d2-9a0f93813b7b_572x1026.png 848w, https://substackcdn.com/image/fetch/$s_!LCYo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f75c8c-8a1f-43d1-b9d2-9a0f93813b7b_572x1026.png 1272w, https://substackcdn.com/image/fetch/$s_!LCYo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f75c8c-8a1f-43d1-b9d2-9a0f93813b7b_572x1026.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">Now verify, you do have MFA setup right?</figcaption></figure></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tSBJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2fbf87e-8cd6-44aa-b0a9-b3cc572e3827_1110x468.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tSBJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2fbf87e-8cd6-44aa-b0a9-b3cc572e3827_1110x468.png 424w, https://substackcdn.com/image/fetch/$s_!tSBJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2fbf87e-8cd6-44aa-b0a9-b3cc572e3827_1110x468.png 848w, https://substackcdn.com/image/fetch/$s_!tSBJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2fbf87e-8cd6-44aa-b0a9-b3cc572e3827_1110x468.png 1272w, https://substackcdn.com/image/fetch/$s_!tSBJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2fbf87e-8cd6-44aa-b0a9-b3cc572e3827_1110x468.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tSBJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2fbf87e-8cd6-44aa-b0a9-b3cc572e3827_1110x468.png" width="446" height="188.04324324324324" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a2fbf87e-8cd6-44aa-b0a9-b3cc572e3827_1110x468.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:468,&quot;width&quot;:1110,&quot;resizeWidth&quot;:446,&quot;bytes&quot;:86006,&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_!tSBJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2fbf87e-8cd6-44aa-b0a9-b3cc572e3827_1110x468.png 424w, https://substackcdn.com/image/fetch/$s_!tSBJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2fbf87e-8cd6-44aa-b0a9-b3cc572e3827_1110x468.png 848w, https://substackcdn.com/image/fetch/$s_!tSBJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2fbf87e-8cd6-44aa-b0a9-b3cc572e3827_1110x468.png 1272w, https://substackcdn.com/image/fetch/$s_!tSBJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2fbf87e-8cd6-44aa-b0a9-b3cc572e3827_1110x468.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Now open up GitHub Desktop!</figcaption></figure></div><p>From this point, you will need to configure Git locally, which is done via the following screen. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MAGa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ca7ec2-f0e1-4eaf-b3a4-7dcee61eb3fb_2056x1456.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MAGa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ca7ec2-f0e1-4eaf-b3a4-7dcee61eb3fb_2056x1456.png 424w, https://substackcdn.com/image/fetch/$s_!MAGa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ca7ec2-f0e1-4eaf-b3a4-7dcee61eb3fb_2056x1456.png 848w, https://substackcdn.com/image/fetch/$s_!MAGa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ca7ec2-f0e1-4eaf-b3a4-7dcee61eb3fb_2056x1456.png 1272w, https://substackcdn.com/image/fetch/$s_!MAGa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ca7ec2-f0e1-4eaf-b3a4-7dcee61eb3fb_2056x1456.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MAGa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ca7ec2-f0e1-4eaf-b3a4-7dcee61eb3fb_2056x1456.png" width="586" height="414.9491758241758" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c8ca7ec2-f0e1-4eaf-b3a4-7dcee61eb3fb_2056x1456.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1031,&quot;width&quot;:1456,&quot;resizeWidth&quot;:586,&quot;bytes&quot;:409633,&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_!MAGa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ca7ec2-f0e1-4eaf-b3a4-7dcee61eb3fb_2056x1456.png 424w, https://substackcdn.com/image/fetch/$s_!MAGa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ca7ec2-f0e1-4eaf-b3a4-7dcee61eb3fb_2056x1456.png 848w, https://substackcdn.com/image/fetch/$s_!MAGa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ca7ec2-f0e1-4eaf-b3a4-7dcee61eb3fb_2056x1456.png 1272w, https://substackcdn.com/image/fetch/$s_!MAGa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ca7ec2-f0e1-4eaf-b3a4-7dcee61eb3fb_2056x1456.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">Add your GitHub account details.</figcaption></figure></div><p>Once you add your details and click finish, you will be greeted with the quick start screen:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cfMt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19a58ca5-063c-450f-9e2f-5525427a0839_1920x1320.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cfMt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19a58ca5-063c-450f-9e2f-5525427a0839_1920x1320.png 424w, https://substackcdn.com/image/fetch/$s_!cfMt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19a58ca5-063c-450f-9e2f-5525427a0839_1920x1320.png 848w, https://substackcdn.com/image/fetch/$s_!cfMt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19a58ca5-063c-450f-9e2f-5525427a0839_1920x1320.png 1272w, https://substackcdn.com/image/fetch/$s_!cfMt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19a58ca5-063c-450f-9e2f-5525427a0839_1920x1320.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cfMt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19a58ca5-063c-450f-9e2f-5525427a0839_1920x1320.png" width="482" height="331.375" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/19a58ca5-063c-450f-9e2f-5525427a0839_1920x1320.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1001,&quot;width&quot;:1456,&quot;resizeWidth&quot;:482,&quot;bytes&quot;:207165,&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_!cfMt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19a58ca5-063c-450f-9e2f-5525427a0839_1920x1320.png 424w, https://substackcdn.com/image/fetch/$s_!cfMt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19a58ca5-063c-450f-9e2f-5525427a0839_1920x1320.png 848w, https://substackcdn.com/image/fetch/$s_!cfMt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19a58ca5-063c-450f-9e2f-5525427a0839_1920x1320.png 1272w, https://substackcdn.com/image/fetch/$s_!cfMt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19a58ca5-063c-450f-9e2f-5525427a0839_1920x1320.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">Ready to rock.</figcaption></figure></div><h2>Godot Project Setup</h2><p>As this is not a tutorial on how to use Godot (the projects 2D tutorial is a great place to start <a href="https://docs.godotengine.org/en/stable/getting_started/first_2d_game/index.html">here</a>), the basic steps to setup Godot with GitHub Desktop (and Git) is:</p><ul><li><p>Create your project OR launch an existing project in Godot. We will create a new one.  </p></li><li><p>Add your Project Name, correct path.  You can ignore the "Version Control Metadata" setting for now and leave it as "Git".  We talk more on this later.</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_!PoQZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe888193c-918f-4d02-9c66-cfa172a35570_1010x962.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PoQZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe888193c-918f-4d02-9c66-cfa172a35570_1010x962.png 424w, https://substackcdn.com/image/fetch/$s_!PoQZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe888193c-918f-4d02-9c66-cfa172a35570_1010x962.png 848w, https://substackcdn.com/image/fetch/$s_!PoQZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe888193c-918f-4d02-9c66-cfa172a35570_1010x962.png 1272w, https://substackcdn.com/image/fetch/$s_!PoQZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe888193c-918f-4d02-9c66-cfa172a35570_1010x962.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PoQZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe888193c-918f-4d02-9c66-cfa172a35570_1010x962.png" width="430" height="409.56435643564356" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e888193c-918f-4d02-9c66-cfa172a35570_1010x962.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:962,&quot;width&quot;:1010,&quot;resizeWidth&quot;:430,&quot;bytes&quot;:175005,&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_!PoQZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe888193c-918f-4d02-9c66-cfa172a35570_1010x962.png 424w, https://substackcdn.com/image/fetch/$s_!PoQZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe888193c-918f-4d02-9c66-cfa172a35570_1010x962.png 848w, https://substackcdn.com/image/fetch/$s_!PoQZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe888193c-918f-4d02-9c66-cfa172a35570_1010x962.png 1272w, https://substackcdn.com/image/fetch/$s_!PoQZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe888193c-918f-4d02-9c66-cfa172a35570_1010x962.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">Example project.</figcaption></figure></div><ul><li><p>Click Create &amp; Edit. You will get a default empty 3D scene:</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0Mzd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f996e7-2afb-47c2-b218-1af7957e85c7_3024x1712.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0Mzd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f996e7-2afb-47c2-b218-1af7957e85c7_3024x1712.png 424w, https://substackcdn.com/image/fetch/$s_!0Mzd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f996e7-2afb-47c2-b218-1af7957e85c7_3024x1712.png 848w, https://substackcdn.com/image/fetch/$s_!0Mzd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f996e7-2afb-47c2-b218-1af7957e85c7_3024x1712.png 1272w, https://substackcdn.com/image/fetch/$s_!0Mzd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f996e7-2afb-47c2-b218-1af7957e85c7_3024x1712.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0Mzd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f996e7-2afb-47c2-b218-1af7957e85c7_3024x1712.png" width="320" height="181.0989010989011" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e7f996e7-2afb-47c2-b218-1af7957e85c7_3024x1712.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:824,&quot;width&quot;:1456,&quot;resizeWidth&quot;:320,&quot;bytes&quot;:1828403,&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_!0Mzd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f996e7-2afb-47c2-b218-1af7957e85c7_3024x1712.png 424w, https://substackcdn.com/image/fetch/$s_!0Mzd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f996e7-2afb-47c2-b218-1af7957e85c7_3024x1712.png 848w, https://substackcdn.com/image/fetch/$s_!0Mzd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f996e7-2afb-47c2-b218-1af7957e85c7_3024x1712.png 1272w, https://substackcdn.com/image/fetch/$s_!0Mzd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f996e7-2afb-47c2-b218-1af7957e85c7_3024x1712.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Default 3D view in Godot.</figcaption></figure></div><h2>Git Repository Creation</h2><ul><li><p>In the GitHub Desktop application, click "Create a New Repository on your Local Drive".</p></li><li><p>Fill in the details:</p><ul><li><p>Name: Your project name.</p><ul><li><p><strong>ALERT:</strong>  Due to the way this works, it will create a nested folder inside your project.  Be sure to use the same name as the top level folder, and remove the duplicate name in the file path before clicking "Create Repository".</p></li></ul></li><li><p>Description: For your repo description.</p></li><li><p>Local Path: Where you have your project located, from the top folder of the project.</p></li><li><p>Click "Initialize this repository with a README", you can add updated content later.</p></li><li><p>In Git Ignore, find Godot and select it.</p></li><li><p>If you care to add a license, select on here as well under License. Godot is released under the MIT license.  You can find more project license details <a href="https://docs.godotengine.org/en/stable/about/complying_with_licenses.html">here</a>.</p></li><li><p>Click Create Repository.</p></li></ul></li></ul><p>Here is a screenshot of my setup:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fDik!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a8e105b-f00f-4840-b222-c57a850986b7_846x1026.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fDik!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a8e105b-f00f-4840-b222-c57a850986b7_846x1026.png 424w, https://substackcdn.com/image/fetch/$s_!fDik!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a8e105b-f00f-4840-b222-c57a850986b7_846x1026.png 848w, https://substackcdn.com/image/fetch/$s_!fDik!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a8e105b-f00f-4840-b222-c57a850986b7_846x1026.png 1272w, https://substackcdn.com/image/fetch/$s_!fDik!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a8e105b-f00f-4840-b222-c57a850986b7_846x1026.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fDik!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a8e105b-f00f-4840-b222-c57a850986b7_846x1026.png" width="416" height="504.51063829787233" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2a8e105b-f00f-4840-b222-c57a850986b7_846x1026.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1026,&quot;width&quot;:846,&quot;resizeWidth&quot;:416,&quot;bytes&quot;:121005,&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_!fDik!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a8e105b-f00f-4840-b222-c57a850986b7_846x1026.png 424w, https://substackcdn.com/image/fetch/$s_!fDik!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a8e105b-f00f-4840-b222-c57a850986b7_846x1026.png 848w, https://substackcdn.com/image/fetch/$s_!fDik!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a8e105b-f00f-4840-b222-c57a850986b7_846x1026.png 1272w, https://substackcdn.com/image/fetch/$s_!fDik!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a8e105b-f00f-4840-b222-c57a850986b7_846x1026.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">Create your local repo.  Will create "Initial commit" for you with existing files present.</figcaption></figure></div><p>I left the misconfigured path above just to drive home the reminder to remove the project folder name from the Local Path before you click "Create Repository".  If you do not, it will create a folder with your options inside your root which you do not want!</p><p>Now presuming all is good, you can click the History tab to see the initial project files and new git files already in your default "Initial commit".  The default screen will state "No local changes" because you have not done anything new since.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eX3X!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba5a2c1-49f1-4049-8931-5bb85080ca12_1920x1320.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eX3X!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba5a2c1-49f1-4049-8931-5bb85080ca12_1920x1320.png 424w, https://substackcdn.com/image/fetch/$s_!eX3X!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba5a2c1-49f1-4049-8931-5bb85080ca12_1920x1320.png 848w, https://substackcdn.com/image/fetch/$s_!eX3X!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba5a2c1-49f1-4049-8931-5bb85080ca12_1920x1320.png 1272w, https://substackcdn.com/image/fetch/$s_!eX3X!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba5a2c1-49f1-4049-8931-5bb85080ca12_1920x1320.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eX3X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba5a2c1-49f1-4049-8931-5bb85080ca12_1920x1320.png" width="472" height="324.5" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cba5a2c1-49f1-4049-8931-5bb85080ca12_1920x1320.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1001,&quot;width&quot;:1456,&quot;resizeWidth&quot;:472,&quot;bytes&quot;:178233,&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_!eX3X!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba5a2c1-49f1-4049-8931-5bb85080ca12_1920x1320.png 424w, https://substackcdn.com/image/fetch/$s_!eX3X!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba5a2c1-49f1-4049-8931-5bb85080ca12_1920x1320.png 848w, https://substackcdn.com/image/fetch/$s_!eX3X!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba5a2c1-49f1-4049-8931-5bb85080ca12_1920x1320.png 1272w, https://substackcdn.com/image/fetch/$s_!eX3X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba5a2c1-49f1-4049-8931-5bb85080ca12_1920x1320.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">Godot and new Git-related files.</figcaption></figure></div><p>Now click on "Public repository", and select your options as desired.  I will keep this private for now in this example:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2Gia!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7af4e4-9b6b-44a6-a4a3-ee4324186c8d_1920x1320.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2Gia!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7af4e4-9b6b-44a6-a4a3-ee4324186c8d_1920x1320.png 424w, https://substackcdn.com/image/fetch/$s_!2Gia!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7af4e4-9b6b-44a6-a4a3-ee4324186c8d_1920x1320.png 848w, https://substackcdn.com/image/fetch/$s_!2Gia!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7af4e4-9b6b-44a6-a4a3-ee4324186c8d_1920x1320.png 1272w, https://substackcdn.com/image/fetch/$s_!2Gia!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7af4e4-9b6b-44a6-a4a3-ee4324186c8d_1920x1320.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2Gia!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7af4e4-9b6b-44a6-a4a3-ee4324186c8d_1920x1320.png" width="424" height="291.5" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ad7af4e4-9b6b-44a6-a4a3-ee4324186c8d_1920x1320.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1001,&quot;width&quot;:1456,&quot;resizeWidth&quot;:424,&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_!2Gia!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7af4e4-9b6b-44a6-a4a3-ee4324186c8d_1920x1320.png 424w, https://substackcdn.com/image/fetch/$s_!2Gia!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7af4e4-9b6b-44a6-a4a3-ee4324186c8d_1920x1320.png 848w, https://substackcdn.com/image/fetch/$s_!2Gia!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7af4e4-9b6b-44a6-a4a3-ee4324186c8d_1920x1320.png 1272w, https://substackcdn.com/image/fetch/$s_!2Gia!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7af4e4-9b6b-44a6-a4a3-ee4324186c8d_1920x1320.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">Setup the GitHub public repo.</figcaption></figure></div><p>From here you can click the "View on GitHub" button to see your new repo:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VxzS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12ab2f05-64d1-4351-97c1-58aba8771e92_1970x1148.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VxzS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12ab2f05-64d1-4351-97c1-58aba8771e92_1970x1148.png 424w, https://substackcdn.com/image/fetch/$s_!VxzS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12ab2f05-64d1-4351-97c1-58aba8771e92_1970x1148.png 848w, https://substackcdn.com/image/fetch/$s_!VxzS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12ab2f05-64d1-4351-97c1-58aba8771e92_1970x1148.png 1272w, https://substackcdn.com/image/fetch/$s_!VxzS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12ab2f05-64d1-4351-97c1-58aba8771e92_1970x1148.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VxzS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12ab2f05-64d1-4351-97c1-58aba8771e92_1970x1148.png" width="434" height="252.76923076923077" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/12ab2f05-64d1-4351-97c1-58aba8771e92_1970x1148.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:848,&quot;width&quot;:1456,&quot;resizeWidth&quot;:434,&quot;bytes&quot;:244697,&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_!VxzS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12ab2f05-64d1-4351-97c1-58aba8771e92_1970x1148.png 424w, https://substackcdn.com/image/fetch/$s_!VxzS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12ab2f05-64d1-4351-97c1-58aba8771e92_1970x1148.png 848w, https://substackcdn.com/image/fetch/$s_!VxzS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12ab2f05-64d1-4351-97c1-58aba8771e92_1970x1148.png 1272w, https://substackcdn.com/image/fetch/$s_!VxzS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12ab2f05-64d1-4351-97c1-58aba8771e92_1970x1148.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">Your repo is now live!</figcaption></figure></div><h2>Why?</h2><p>Why did we even need to go through this?  Currently (as of late 2024) there is a Git plugin integration.  In fact we saw a mention of it earlier during the Godot install.  However, despite the efforts of the Godot Git plugin developers, it remains problematic, especially as Godot itself evolves.  Eventually it will get there.  (The reason for the dropdown itself was to allow other source control tools to be options in the future).</p><p>You could also do all this via the command line if you are comfortable with it, or prefer it.  Given the visual nature of this tool, I opted to use the desktop option simply so I can easily see as I create branches and commits as the game progresses.</p><h2>Summary</h2><p>From here, carry on like normal.  Your source code strategy is up to you.  Just be sure now after you locally test your code and it seems good, be sure to check it in locally to your origin on GitHub!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://papayabytes.substack.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 PapayaBytes! 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[Supabase: Creating Local Backups]]></title><description><![CDATA[How to download your database from your hosted Supabase project.]]></description><link>https://papayabytes.substack.com/p/supabase-creating-local-backups</link><guid isPermaLink="false">https://papayabytes.substack.com/p/supabase-creating-local-backups</guid><dc:creator><![CDATA[Rob]]></dc:creator><pubDate>Mon, 22 Jul 2024 21:46:02 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!W2CV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6dd6f3-c43f-4fdf-bbe6-fc9ce1daf4f7_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The following is a guide for explaining the steps needed to download a copy of your Supabase projects database, schema or data.  Supabase itself performs scheduled backups, which you can read up on <a href="https://supabase.com/docs/guides/platform/backups">here</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_!W2CV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6dd6f3-c43f-4fdf-bbe6-fc9ce1daf4f7_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!W2CV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6dd6f3-c43f-4fdf-bbe6-fc9ce1daf4f7_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!W2CV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6dd6f3-c43f-4fdf-bbe6-fc9ce1daf4f7_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!W2CV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6dd6f3-c43f-4fdf-bbe6-fc9ce1daf4f7_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!W2CV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6dd6f3-c43f-4fdf-bbe6-fc9ce1daf4f7_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!W2CV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6dd6f3-c43f-4fdf-bbe6-fc9ce1daf4f7_1024x1024.png" width="376" height="376" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ea6dd6f3-c43f-4fdf-bbe6-fc9ce1daf4f7_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:376,&quot;bytes&quot;:1532714,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!W2CV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6dd6f3-c43f-4fdf-bbe6-fc9ce1daf4f7_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!W2CV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6dd6f3-c43f-4fdf-bbe6-fc9ce1daf4f7_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!W2CV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6dd6f3-c43f-4fdf-bbe6-fc9ce1daf4f7_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!W2CV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6dd6f3-c43f-4fdf-bbe6-fc9ce1daf4f7_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Prerequisites</h2><p>The following guide is Mac (silicon) based.  However most steps should remain nearly the same between systems.</p><p>To get started:</p><ul><li><p>Log into your Supabase account.</p></li><li><p>Navigate to your project, then to Project Settings&#8594; Configuration (Database) &#8594; Connection String (psql). You will be using configuration data here later.</p></li><li><p>Find your project&#8217;s database password (will be needed later).</p></li></ul><h2>Installing Basic Postgres Tooling</h2><p>We do not need a full instance of Postgres to perform the backup, but we do need the core tooling.  This is available via the libpq library. You can find more information on this library <a href="https://www.postgresql.org/docs/8.1/libpq.html#:~:text=libpq%20is%20the%20C%20application,the%20results%20of%20these%20queries.">here</a>.</p><p>First, update and optionally upgrade homebrew:</p><pre><code>brew update
brew upgrade</code></pre><p>Once this completes, use homebrew to install libpq:</p><pre><code>brew install libpq</code></pre><p>Once finished, you will need to update your environment because brew does not install these tools in any regular location (keg-only).  </p><h3>Might Work</h3><p>One option is to use symlink via:</p><pre><code>brew link --force libpq</code></pre><p>However, for myself, this did not work, so to undo this, drop the force flag and change the subcommand to unlink:</p><pre><code>brew unlink libpq</code></pre><p>If I sort this out later I will update.  </p><h3>Did Work</h3><p>What DID work however is the following (which is part of the final output from <code>brew</code>):</p><pre><code> echo 'export PATH="/opt/homebrew/opt/libpq/bin:$PATH"' &gt;&gt; ~/.zshrc</code></pre><p>Then update your terminal environment via:</p><pre><code>source ~/.zshrc</code></pre><p>From here, you can test that you can reach the various tools by entering <code>pg_dump</code>, <code>pg_restore</code>, etc.</p><h2>Backing Up Your Projects Database</h2><p>Now that the tooling is present, we need to build the correct connection string for the various tools.  For this post, we are focusing only on creating the local backup.</p><p>In your Supabase projects settings you navigated towards earlier, you will see a screen 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_!fzTY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce859237-2914-47ec-abf2-77faccfa8bfb_2506x882.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fzTY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce859237-2914-47ec-abf2-77faccfa8bfb_2506x882.png 424w, https://substackcdn.com/image/fetch/$s_!fzTY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce859237-2914-47ec-abf2-77faccfa8bfb_2506x882.png 848w, https://substackcdn.com/image/fetch/$s_!fzTY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce859237-2914-47ec-abf2-77faccfa8bfb_2506x882.png 1272w, https://substackcdn.com/image/fetch/$s_!fzTY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce859237-2914-47ec-abf2-77faccfa8bfb_2506x882.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fzTY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce859237-2914-47ec-abf2-77faccfa8bfb_2506x882.png" width="1456" height="512" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ce859237-2914-47ec-abf2-77faccfa8bfb_2506x882.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:512,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:190721,&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_!fzTY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce859237-2914-47ec-abf2-77faccfa8bfb_2506x882.png 424w, https://substackcdn.com/image/fetch/$s_!fzTY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce859237-2914-47ec-abf2-77faccfa8bfb_2506x882.png 848w, https://substackcdn.com/image/fetch/$s_!fzTY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce859237-2914-47ec-abf2-77faccfa8bfb_2506x882.png 1272w, https://substackcdn.com/image/fetch/$s_!fzTY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce859237-2914-47ec-abf2-77faccfa8bfb_2506x882.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">Database settings for your project, with project name and id redacted.</figcaption></figure></div><p>The provided connection string for PSQL is nearly exactly what you need.  We simply need to update the command and tweak any options needed.  Given the above (minus the id), here are three backup options. I navigated to ~/Downloads before running these commands:</p><h3>Schema and Data</h3><pre><code>pg_dump -h aws-0-us-west-1.pooler.supabase.com -p 6543 -d postgres -U postgres.&lt;your_project_id&gt; supabase_dump_backup.sql</code></pre><h3>Schema Only</h3><pre><code>pg_dump -h aws-0-us-west-1.pooler.supabase.com -p 6543 -d postgres -U postgres.&lt;your_project_id&gt; --schema-only &gt; supabase_schema_backup.sql</code></pre><h3>Data Only</h3><pre><code>pg_dump -h aws-0-us-west-1.pooler.supabase.com -p 6543 -d postgres -U postgres.&lt;your_project_id&gt; --data-only -Fc &gt; supabase_data_backup.dump</code></pre><p>Alternatively, to get an uncompressed readable version, drop the -Fc flag.  That flag is to help provide a compressed and more convenient version for later usage in pg_restore.</p><p>Do be mindful if you have customer/real data in these backups and keep them in a safe place and also delete if unneeded.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://papayabytes.substack.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 PapayaBytes! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Guide: Expo Go and React Native]]></title><description><![CDATA[Using Expo Go and React Native to build a universal app for Android on a Mac.]]></description><link>https://papayabytes.substack.com/p/guide-expo-go-and-react-native</link><guid isPermaLink="false">https://papayabytes.substack.com/p/guide-expo-go-and-react-native</guid><dc:creator><![CDATA[Rob]]></dc:creator><pubDate>Sun, 12 May 2024 23:32:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!o_pP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e5f000-db72-41dc-a754-c707a296436d_1432x1266.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The following guide here will cover, from scratch, how to set up your local Mac environment to build, debug, and run a React Mobile app on Android using Expo Go and related tools.</p><h2>What is Expo Go?</h2><p>Expo Go is a sandbox for working with the Expo development environments.  Think of it as a tool that will allow you to stand up your React Native app using Expo tooling, and then via Expo Go, deploy the mobile app to your device (Android or iOS).</p><p>Expo Go is not intended for production app deployment.  Your app codebase however is the same.  This means, after you iterate on your app, you can take the codebase and then move into the full Expo environment to eventually get your app in the Play or App stores.  This is done by converting your Expo Go project to an EAS (Expo Application Services) Build style project pipeline, which allows cloud or local builds of your application, shared testing links, app store submission, etc.  Expo Go is free, but Expo EAS does cost money after a free tier.  You can iterate on the bulk of your project development before launching such a build.</p><h3>Prerequisites</h3><p>It&#8217;s best to start by reading the quick start primer for the various things we will be doing here.  The immediate one to focus on is React Native to get a sense how it all ties together:</p><p><a href="https://reactnative.dev/docs/environment-setup?guide=quickstart">React Native Development Environment Setup Quick Start</a></p><p>For this tutorial:</p><ul><li><p>You need to be on a Mac.</p></li><li><p>Have Node installed (one method to do so <a href="https://formulae.brew.sh/formula/node">here</a> is Homebrew).</p></li><li><p>Your Android device will be on the same wifi network as your Mac.</p></li></ul><h2>Initial Steps</h2><h3>Expo Go Installation (on Mac)</h3><p>Via npx, we will use the create-expo-app generator to create a mobile app called ExpoSample. From the command line in your preferred folder:</p><pre><code>npx create-expo-app ExpoSample</code></pre><p>You may be prompted to install an updated generator, if so, proceed:</p><pre><code>rob@Robs-MacBook-Pro-M2-MAX react-native-test % npx create-expo-app ExpoSample
Need to install the following packages:
create-expo-app@2.3.5
Ok to proceed? (y) y</code></pre><p>From here, change into the directory and open Visual Studio Code.</p><pre><code>rob@Robs-MacBook-Pro-M2-MAX react-native-test %  cd ExpoSample 
rob@Robs-MacBook-Pro-M2-MAX ExpoSample % code .</code></pre><p>To smoke test Expo Go is installed and ready to go run:</p><pre><code>rob@Robs-MacBook-Pro-M2-MAX ExpoSample % npx expo start</code></pre><p>The output will look something 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_!o_pP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e5f000-db72-41dc-a754-c707a296436d_1432x1266.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!o_pP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e5f000-db72-41dc-a754-c707a296436d_1432x1266.png 424w, https://substackcdn.com/image/fetch/$s_!o_pP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e5f000-db72-41dc-a754-c707a296436d_1432x1266.png 848w, https://substackcdn.com/image/fetch/$s_!o_pP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e5f000-db72-41dc-a754-c707a296436d_1432x1266.png 1272w, https://substackcdn.com/image/fetch/$s_!o_pP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e5f000-db72-41dc-a754-c707a296436d_1432x1266.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!o_pP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e5f000-db72-41dc-a754-c707a296436d_1432x1266.png" width="1432" height="1266" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a2e5f000-db72-41dc-a754-c707a296436d_1432x1266.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1266,&quot;width&quot;:1432,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:181765,&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_!o_pP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e5f000-db72-41dc-a754-c707a296436d_1432x1266.png 424w, https://substackcdn.com/image/fetch/$s_!o_pP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e5f000-db72-41dc-a754-c707a296436d_1432x1266.png 848w, https://substackcdn.com/image/fetch/$s_!o_pP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e5f000-db72-41dc-a754-c707a296436d_1432x1266.png 1272w, https://substackcdn.com/image/fetch/$s_!o_pP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e5f000-db72-41dc-a754-c707a296436d_1432x1266.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">Expo runtime output in the terminal.</figcaption></figure></div><h3>Expo Go Installation (on Android)</h3><p>There are several ways to run React Native/Expo applications.  In this case we want to quickly get the sample application to a real Android device.  To do this, first we must install Expo Go on the Android device.  </p><ul><li><p>Navigate to the <a href="https://expo.dev">Expo</a> homepage.</p></li><li><p>Click Install Expo Go for Android, currently  the Expo Go SDK is version 51:</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_!yUgt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b99a854-d545-4eab-8ee8-63914a8f89ef_1192x842.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yUgt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b99a854-d545-4eab-8ee8-63914a8f89ef_1192x842.png 424w, https://substackcdn.com/image/fetch/$s_!yUgt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b99a854-d545-4eab-8ee8-63914a8f89ef_1192x842.png 848w, https://substackcdn.com/image/fetch/$s_!yUgt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b99a854-d545-4eab-8ee8-63914a8f89ef_1192x842.png 1272w, https://substackcdn.com/image/fetch/$s_!yUgt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b99a854-d545-4eab-8ee8-63914a8f89ef_1192x842.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yUgt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b99a854-d545-4eab-8ee8-63914a8f89ef_1192x842.png" width="638" height="450.6677852348993" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5b99a854-d545-4eab-8ee8-63914a8f89ef_1192x842.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:842,&quot;width&quot;:1192,&quot;resizeWidth&quot;:638,&quot;bytes&quot;:164022,&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_!yUgt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b99a854-d545-4eab-8ee8-63914a8f89ef_1192x842.png 424w, https://substackcdn.com/image/fetch/$s_!yUgt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b99a854-d545-4eab-8ee8-63914a8f89ef_1192x842.png 848w, https://substackcdn.com/image/fetch/$s_!yUgt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b99a854-d545-4eab-8ee8-63914a8f89ef_1192x842.png 1272w, https://substackcdn.com/image/fetch/$s_!yUgt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b99a854-d545-4eab-8ee8-63914a8f89ef_1192x842.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><p>Via manual installation, scan the QR code from the dialog that opens:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UxzP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7b81d8-c9c7-4a80-a145-37b6e15c99b0_1026x1426.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UxzP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7b81d8-c9c7-4a80-a145-37b6e15c99b0_1026x1426.png 424w, https://substackcdn.com/image/fetch/$s_!UxzP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7b81d8-c9c7-4a80-a145-37b6e15c99b0_1026x1426.png 848w, https://substackcdn.com/image/fetch/$s_!UxzP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7b81d8-c9c7-4a80-a145-37b6e15c99b0_1026x1426.png 1272w, https://substackcdn.com/image/fetch/$s_!UxzP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7b81d8-c9c7-4a80-a145-37b6e15c99b0_1026x1426.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UxzP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7b81d8-c9c7-4a80-a145-37b6e15c99b0_1026x1426.png" width="480" height="667.1345029239766" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/af7b81d8-c9c7-4a80-a145-37b6e15c99b0_1026x1426.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1426,&quot;width&quot;:1026,&quot;resizeWidth&quot;:480,&quot;bytes&quot;:174972,&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_!UxzP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7b81d8-c9c7-4a80-a145-37b6e15c99b0_1026x1426.png 424w, https://substackcdn.com/image/fetch/$s_!UxzP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7b81d8-c9c7-4a80-a145-37b6e15c99b0_1026x1426.png 848w, https://substackcdn.com/image/fetch/$s_!UxzP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7b81d8-c9c7-4a80-a145-37b6e15c99b0_1026x1426.png 1272w, https://substackcdn.com/image/fetch/$s_!UxzP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7b81d8-c9c7-4a80-a145-37b6e15c99b0_1026x1426.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><p><strong>Note:</strong> We are not using Expo Orbit in this example.</p><p>This QR code will take you to the Expo application in Google Play store.  From here, install as you would an app from the Play store.</p><p>Once open, using the Expo Go app, scan the QR code that was presented in the terminal earlier and it will download, across your local wifi network, the application from your computer to the Android device.</p><h2>Modifying ExpoSample</h2><p>For our sample app named ExpoSample, the root page is located in:</p><p><code>/app/(tabs)/index.tsx</code></p><p>Let&#8217;s change the following code:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1hWs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8d15f7d-0c37-4221-83c9-e0cf5ccfc26f_958x204.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1hWs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8d15f7d-0c37-4221-83c9-e0cf5ccfc26f_958x204.png 424w, https://substackcdn.com/image/fetch/$s_!1hWs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8d15f7d-0c37-4221-83c9-e0cf5ccfc26f_958x204.png 848w, https://substackcdn.com/image/fetch/$s_!1hWs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8d15f7d-0c37-4221-83c9-e0cf5ccfc26f_958x204.png 1272w, https://substackcdn.com/image/fetch/$s_!1hWs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8d15f7d-0c37-4221-83c9-e0cf5ccfc26f_958x204.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1hWs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8d15f7d-0c37-4221-83c9-e0cf5ccfc26f_958x204.png" width="958" height="204" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a8d15f7d-0c37-4221-83c9-e0cf5ccfc26f_958x204.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:204,&quot;width&quot;:958,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:50867,&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_!1hWs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8d15f7d-0c37-4221-83c9-e0cf5ccfc26f_958x204.png 424w, https://substackcdn.com/image/fetch/$s_!1hWs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8d15f7d-0c37-4221-83c9-e0cf5ccfc26f_958x204.png 848w, https://substackcdn.com/image/fetch/$s_!1hWs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8d15f7d-0c37-4221-83c9-e0cf5ccfc26f_958x204.png 1272w, https://substackcdn.com/image/fetch/$s_!1hWs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8d15f7d-0c37-4221-83c9-e0cf5ccfc26f_958x204.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>To something more personal like &#8220;Welcome to us!&#8221;, just to see the change reflected in the app:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DYTw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a4738fb-e886-4619-ac8c-1da849af9dce_1008x196.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DYTw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a4738fb-e886-4619-ac8c-1da849af9dce_1008x196.png 424w, https://substackcdn.com/image/fetch/$s_!DYTw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a4738fb-e886-4619-ac8c-1da849af9dce_1008x196.png 848w, https://substackcdn.com/image/fetch/$s_!DYTw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a4738fb-e886-4619-ac8c-1da849af9dce_1008x196.png 1272w, https://substackcdn.com/image/fetch/$s_!DYTw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a4738fb-e886-4619-ac8c-1da849af9dce_1008x196.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DYTw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a4738fb-e886-4619-ac8c-1da849af9dce_1008x196.png" width="1008" height="196" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4a4738fb-e886-4619-ac8c-1da849af9dce_1008x196.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:196,&quot;width&quot;:1008,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:48335,&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_!DYTw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a4738fb-e886-4619-ac8c-1da849af9dce_1008x196.png 424w, https://substackcdn.com/image/fetch/$s_!DYTw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a4738fb-e886-4619-ac8c-1da849af9dce_1008x196.png 848w, https://substackcdn.com/image/fetch/$s_!DYTw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a4738fb-e886-4619-ac8c-1da849af9dce_1008x196.png 1272w, https://substackcdn.com/image/fetch/$s_!DYTw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a4738fb-e886-4619-ac8c-1da849af9dce_1008x196.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Save the file, then in the terminal press the <code>r</code> key to reload the application bundle to see the change. You will see the &#8220;Reloading apps&#8221; message:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vg3R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89311ae6-e955-4a29-b4cc-d0c78cf85110_1062x310.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vg3R!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89311ae6-e955-4a29-b4cc-d0c78cf85110_1062x310.png 424w, https://substackcdn.com/image/fetch/$s_!vg3R!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89311ae6-e955-4a29-b4cc-d0c78cf85110_1062x310.png 848w, https://substackcdn.com/image/fetch/$s_!vg3R!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89311ae6-e955-4a29-b4cc-d0c78cf85110_1062x310.png 1272w, https://substackcdn.com/image/fetch/$s_!vg3R!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89311ae6-e955-4a29-b4cc-d0c78cf85110_1062x310.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vg3R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89311ae6-e955-4a29-b4cc-d0c78cf85110_1062x310.png" width="1062" height="310" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/89311ae6-e955-4a29-b4cc-d0c78cf85110_1062x310.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:310,&quot;width&quot;:1062,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:57431,&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_!vg3R!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89311ae6-e955-4a29-b4cc-d0c78cf85110_1062x310.png 424w, https://substackcdn.com/image/fetch/$s_!vg3R!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89311ae6-e955-4a29-b4cc-d0c78cf85110_1062x310.png 848w, https://substackcdn.com/image/fetch/$s_!vg3R!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89311ae6-e955-4a29-b4cc-d0c78cf85110_1062x310.png 1272w, https://substackcdn.com/image/fetch/$s_!vg3R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89311ae6-e955-4a29-b4cc-d0c78cf85110_1062x310.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><p>In the device, Expo Go will relaunch the app bundle with the new text:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6tlQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4200b774-a242-49aa-b608-9b89d3f5aa09_671x1440.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6tlQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4200b774-a242-49aa-b608-9b89d3f5aa09_671x1440.jpeg 424w, https://substackcdn.com/image/fetch/$s_!6tlQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4200b774-a242-49aa-b608-9b89d3f5aa09_671x1440.jpeg 848w, https://substackcdn.com/image/fetch/$s_!6tlQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4200b774-a242-49aa-b608-9b89d3f5aa09_671x1440.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!6tlQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4200b774-a242-49aa-b608-9b89d3f5aa09_671x1440.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6tlQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4200b774-a242-49aa-b608-9b89d3f5aa09_671x1440.jpeg" width="359" height="770.4321907600596" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4200b774-a242-49aa-b608-9b89d3f5aa09_671x1440.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1440,&quot;width&quot;:671,&quot;resizeWidth&quot;:359,&quot;bytes&quot;:102860,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6tlQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4200b774-a242-49aa-b608-9b89d3f5aa09_671x1440.jpeg 424w, https://substackcdn.com/image/fetch/$s_!6tlQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4200b774-a242-49aa-b608-9b89d3f5aa09_671x1440.jpeg 848w, https://substackcdn.com/image/fetch/$s_!6tlQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4200b774-a242-49aa-b608-9b89d3f5aa09_671x1440.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!6tlQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4200b774-a242-49aa-b608-9b89d3f5aa09_671x1440.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The updated ExpoSample app on the device.</figcaption></figure></div><p>That&#8217;s it.  There are things to consider in this setup.</p><h2>Limitations</h2><p>Expo Go is a sandbox.  What it gives us is a quick way to start building and running React Native apps by providing a simple method to deploy the app to your phone.  More directly, this means in its current setup, you will not be able to run your app outside of Expo Go&#8217;s sandbox on your device. This is by design and is intended to help a developer make progress fast. To make your app available before a proper app build and store deployment include:</p><ul><li><p><a href="https://docs.expo.dev/more/expo-cli/#tunneling">Setting up a tunnel</a> to allow access to your running app.</p></li><li><p>Share dev versions via <a href="https://docs.expo.dev/develop/development-builds/share-with-your-team/">Expo and Expo CLI</a>.</p></li><li><p>Share pre-release versions via OS based <a href="https://docs.expo.dev/guides/sharing-preview-releases/">previews</a>.</p></li><li><p>Google Play Console or Apple App Store TestFlight.</p></li></ul><p>Expo Go itself does not allow custom native code in its sandbox.  Again this is by design.  However the Expo SDK is quite mature already, and supports building your own custom modules into Expo SDK itself, which build later into native projects. You can find more on custom native code <a href="https://docs.expo.dev/workflow/customizing/">here</a>. A regular Expo build however does support custom native code because it&#8217;s just a regular build app build environment.</p><p>The create-expo-app generator is updated quarterly to use the current latest React Native version.  More details on this are found <a href="https://docs.expo.dev/versions/latest/#each-expo-sdk-version-depends-on-a">here</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://papayabytes.substack.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 PapayaBytes! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Guide: Python and Postgres]]></title><description><![CDATA[How to use Python with a local Postgres database.]]></description><link>https://papayabytes.substack.com/p/guide-python-and-postgres</link><guid isPermaLink="false">https://papayabytes.substack.com/p/guide-python-and-postgres</guid><dc:creator><![CDATA[Rob]]></dc:creator><pubDate>Wed, 06 Sep 2023 01:31:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdd30d04-f309-45a3-880c-297e2bf1f913_1818x466.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In today&#8217;s post, we will shift to using Python with a local Docker container running Postgres. The goal here is to get a valid Python script connecting to your Postgres database as quickly as possible.</p><h2>Prerequisites</h2><p>As noted, we will assume:</p><ul><li><p>Visual Studio Code (VS Code) is installed.</p></li><li><p>Docker Desktop is installed.In earlier posts, I have discussed how to setup Visual Studio Code, Python and Docker, which you can see revisit in these previous posts:</p></li></ul><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;6050c34c-b2c6-429a-ab52-60b9f362c278&quot;,&quot;caption&quot;:&quot;The following post will describe how to install the basic developer setup on a Mac from scratch, for working in Python. Homebrew First up, you will need a package manager. Homebrew has become the de facto choice recently on the Mac platform. First, you need to open a command line somewhere, either:&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Guide: Homebrew, Python and Visual Studio Code on Mac&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:153565442,&quot;name&quot;:&quot;Rob&quot;,&quot;bio&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a4137f6b-9752-4f0e-a5c2-e32d8f4ad5d6_1000x1000.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-07-17T23:23:48.475Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/582c19b9-1181-4592-b3c0-919d012acd03_2458x1668.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://papayabytes.substack.com/p/guide-homebrew-python-and-visual&quot;,&quot;section_name&quot;:&quot;Code&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:135137206,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;PapayaBytes&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e5e0556-7e55-4e5e-8544-a4a6f5bd8a38_1000x1000.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;c493d459-028e-4bfe-99cf-c944a423f20f&quot;,&quot;caption&quot;:&quot;Today&#8217;s post is concerned with home to quickly get Docker Desktop and MongoDB up and running on your Mac. Prerequisites As we will be using Homebrew (brew) to install Docker Desktop, if you do not already have it, please read how to install and test Homebrew in the first third of this previous post:&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Guide: Docker Desktop and MongoDB on Mac&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:153565442,&quot;name&quot;:&quot;Rob&quot;,&quot;bio&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a4137f6b-9752-4f0e-a5c2-e32d8f4ad5d6_1000x1000.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-08-19T22:56:04.450Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45d0b588-fb74-4d4d-8aad-76e09a5d4672_2040x1200.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://papayabytes.substack.com/p/guide-docker-desktop-and-mongodb&quot;,&quot;section_name&quot;:&quot;Code&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:136229863,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;PapayaBytes&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e5e0556-7e55-4e5e-8544-a4a6f5bd8a38_1000x1000.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><h2>Postgres</h2><p>As we will need a database to call from our Python script, the first thing we will do is grab the Postgres image and launch it locally. Much like the previous MongoDB Docker image, once you launch Docker Desktop:</p><ul><li><p>In the Search bar, type postgres.</p></li><li><p>Click "Pull", to download the latest image. (Tag is set to "latest" by default.)</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_!C7Pt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8cdbb7a-bad8-4bfb-8486-73164349ea50_2040x1200.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!C7Pt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8cdbb7a-bad8-4bfb-8486-73164349ea50_2040x1200.png 424w, https://substackcdn.com/image/fetch/$s_!C7Pt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8cdbb7a-bad8-4bfb-8486-73164349ea50_2040x1200.png 848w, https://substackcdn.com/image/fetch/$s_!C7Pt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8cdbb7a-bad8-4bfb-8486-73164349ea50_2040x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!C7Pt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8cdbb7a-bad8-4bfb-8486-73164349ea50_2040x1200.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!C7Pt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8cdbb7a-bad8-4bfb-8486-73164349ea50_2040x1200.png" width="1456" height="856" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b8cdbb7a-bad8-4bfb-8486-73164349ea50_2040x1200.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:856,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:278594,&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_!C7Pt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8cdbb7a-bad8-4bfb-8486-73164349ea50_2040x1200.png 424w, https://substackcdn.com/image/fetch/$s_!C7Pt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8cdbb7a-bad8-4bfb-8486-73164349ea50_2040x1200.png 848w, https://substackcdn.com/image/fetch/$s_!C7Pt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8cdbb7a-bad8-4bfb-8486-73164349ea50_2040x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!C7Pt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8cdbb7a-bad8-4bfb-8486-73164349ea50_2040x1200.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">Using Docker Desktop to get the latest postgres image.</figcaption></figure></div><p>Once completed it will have a checkmark next to the "latest" tag.</p><h3>Configure Docker and Run Postgres</h3><p>This is where things slightly diverge from the earlier MongoDB image configuration.  For postgres, we must pass in a default username and password.  As Docker Desktop does not support this, we will do this on the command line now that we have the image (all the tools required to work with Docker were downloaded when we set up Docker Desktop in the first place).</p><ul><li><p>Open a terminal.</p></li><li><p>Run "<code>docker -v</code>" to confirm docker is running.</p></li><li><p>In the terminal run the following:</p></li></ul><pre><code><code>docker run --name local-postgres -p 5432:5432 -e POSTGRES_PASSWORD=mypassword -d postgres</code></code></pre><p>The above command will:</p><ul><li><p>Run a docker container named "local-postgres".</p></li><li><p>On port 5432 locally, so our Python script can later find it.</p></li><li><p><code>POSTGRES_PASSWORD, </code>which is the initial master password, will be passed into the environment variables via -e.</p></li><li><p>Run detached via -d.</p></li></ul><p>At this time, in the Containers view of Docker Desktop, you will see your running "local-postgres" container:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CFtv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F735c990b-c253-4e4b-8cde-4572b2dcd634_2332x1288.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CFtv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F735c990b-c253-4e4b-8cde-4572b2dcd634_2332x1288.png 424w, https://substackcdn.com/image/fetch/$s_!CFtv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F735c990b-c253-4e4b-8cde-4572b2dcd634_2332x1288.png 848w, https://substackcdn.com/image/fetch/$s_!CFtv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F735c990b-c253-4e4b-8cde-4572b2dcd634_2332x1288.png 1272w, https://substackcdn.com/image/fetch/$s_!CFtv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F735c990b-c253-4e4b-8cde-4572b2dcd634_2332x1288.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CFtv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F735c990b-c253-4e4b-8cde-4572b2dcd634_2332x1288.png" width="556" height="307.02197802197804" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/735c990b-c253-4e4b-8cde-4572b2dcd634_2332x1288.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:804,&quot;width&quot;:1456,&quot;resizeWidth&quot;:556,&quot;bytes&quot;:380772,&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_!CFtv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F735c990b-c253-4e4b-8cde-4572b2dcd634_2332x1288.png 424w, https://substackcdn.com/image/fetch/$s_!CFtv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F735c990b-c253-4e4b-8cde-4572b2dcd634_2332x1288.png 848w, https://substackcdn.com/image/fetch/$s_!CFtv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F735c990b-c253-4e4b-8cde-4572b2dcd634_2332x1288.png 1272w, https://substackcdn.com/image/fetch/$s_!CFtv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F735c990b-c253-4e4b-8cde-4572b2dcd634_2332x1288.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">Postgres up and running.</figcaption></figure></div><p>From this point you can now use Docker Desktop to stop and restart your container.</p><p>To test your Postgres instance, let&#8217;s create a database.</p><ul><li><p>Click on your postgres container.</p></li><li><p>Click on the Terminal tab.</p></li><li><p>Optionally move into the bash shell by typing "bash".</p></li><li><p>Log into the running instance of postgres with the default user:</p></li></ul><pre><code>psql -d postgres -U postgres</code></pre><ul><li><p>Now using DDL lets create the initial database and user so we can later access it in our Python script. Run each line individually:</p></li></ul><pre><code><code>CREATE DATABASE test_database;
CREATE USER test_user WITH PASSWORD 'test_password'; 
GRANT ALL PRIVILEGES ON DATABASE test_database TO test_user;</code></code></pre><p>Type "<code>exit</code>" to leave psql.</p><h3>psql</h3><p>psql is the primary command line tool to use to interact with postgres.  If you would like to now connect as the user you just created, your command line in the container terminal will look like:</p><pre><code>psql -d postgres -U test_user -W</code></pre><p>Then enter your password when prompted.</p><p>Once in, you can run the various commands, like list the database via "<code>\list</code>":</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sYc3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdd30d04-f309-45a3-880c-297e2bf1f913_1818x466.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sYc3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdd30d04-f309-45a3-880c-297e2bf1f913_1818x466.png 424w, https://substackcdn.com/image/fetch/$s_!sYc3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdd30d04-f309-45a3-880c-297e2bf1f913_1818x466.png 848w, https://substackcdn.com/image/fetch/$s_!sYc3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdd30d04-f309-45a3-880c-297e2bf1f913_1818x466.png 1272w, https://substackcdn.com/image/fetch/$s_!sYc3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdd30d04-f309-45a3-880c-297e2bf1f913_1818x466.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sYc3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdd30d04-f309-45a3-880c-297e2bf1f913_1818x466.png" width="1456" height="373" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fdd30d04-f309-45a3-880c-297e2bf1f913_1818x466.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:373,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:106159,&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_!sYc3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdd30d04-f309-45a3-880c-297e2bf1f913_1818x466.png 424w, https://substackcdn.com/image/fetch/$s_!sYc3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdd30d04-f309-45a3-880c-297e2bf1f913_1818x466.png 848w, https://substackcdn.com/image/fetch/$s_!sYc3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdd30d04-f309-45a3-880c-297e2bf1f913_1818x466.png 1272w, https://substackcdn.com/image/fetch/$s_!sYc3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdd30d04-f309-45a3-880c-297e2bf1f913_1818x466.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">Using psql to view the databases.</figcaption></figure></div><p>Let&#8217;s add a table and some data for us to work with via Python later.  In psql, we must first connect to the database as the user we are logged in as, so run:</p><pre><code>\c test_database</code></pre><p>Then run the following DML to create a table for user data:</p><pre><code>CREATE TABLE users (
  id SERIAL PRIMARY KEY, 
  firstname VARCHAR(255),
  lastname VARCHAR(255),
  username VARCHAR(255), 
  email VARCHAR(255),
  date_created DATE,
  last_update DATE
);</code></pre><p>Confirm the table was created running "<code>\dt+</code>":</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bI6H!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff0e752-5764-46d7-a9fa-65dfa4e9694f_1418x278.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bI6H!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff0e752-5764-46d7-a9fa-65dfa4e9694f_1418x278.png 424w, https://substackcdn.com/image/fetch/$s_!bI6H!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff0e752-5764-46d7-a9fa-65dfa4e9694f_1418x278.png 848w, https://substackcdn.com/image/fetch/$s_!bI6H!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff0e752-5764-46d7-a9fa-65dfa4e9694f_1418x278.png 1272w, https://substackcdn.com/image/fetch/$s_!bI6H!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff0e752-5764-46d7-a9fa-65dfa4e9694f_1418x278.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bI6H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff0e752-5764-46d7-a9fa-65dfa4e9694f_1418x278.png" width="608" height="119.19887165021157" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6ff0e752-5764-46d7-a9fa-65dfa4e9694f_1418x278.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:278,&quot;width&quot;:1418,&quot;resizeWidth&quot;:608,&quot;bytes&quot;:45963,&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_!bI6H!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff0e752-5764-46d7-a9fa-65dfa4e9694f_1418x278.png 424w, https://substackcdn.com/image/fetch/$s_!bI6H!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff0e752-5764-46d7-a9fa-65dfa4e9694f_1418x278.png 848w, https://substackcdn.com/image/fetch/$s_!bI6H!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff0e752-5764-46d7-a9fa-65dfa4e9694f_1418x278.png 1272w, https://substackcdn.com/image/fetch/$s_!bI6H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff0e752-5764-46d7-a9fa-65dfa4e9694f_1418x278.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">"users" table created.</figcaption></figure></div><p>Note it was created in the public schema.</p><p>Now run the following to insert some rows, each row is one user:</p><pre><code>INSERT INTO users (firstname, lastname, username, email, date_created, last_update)
VALUES
  ('John', 'Doe', 'jdoe123', 'jdoe@example.com', '2023-01-01', '2023-01-01'),
  ('Jane', 'Doe', 'janed', 'jane@example.com', '2023-02-01', '2023-02-01');</code></pre><p>Now you can query the data via SELECT:</p><pre><code>SELECT * FROM users</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_!SL0A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f039c9d-49f8-4037-8edc-0700a2df4dce_1306x236.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SL0A!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f039c9d-49f8-4037-8edc-0700a2df4dce_1306x236.png 424w, https://substackcdn.com/image/fetch/$s_!SL0A!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f039c9d-49f8-4037-8edc-0700a2df4dce_1306x236.png 848w, https://substackcdn.com/image/fetch/$s_!SL0A!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f039c9d-49f8-4037-8edc-0700a2df4dce_1306x236.png 1272w, https://substackcdn.com/image/fetch/$s_!SL0A!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f039c9d-49f8-4037-8edc-0700a2df4dce_1306x236.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SL0A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f039c9d-49f8-4037-8edc-0700a2df4dce_1306x236.png" width="632" height="114.2052067381317" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6f039c9d-49f8-4037-8edc-0700a2df4dce_1306x236.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:236,&quot;width&quot;:1306,&quot;resizeWidth&quot;:632,&quot;bytes&quot;:46128,&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_!SL0A!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f039c9d-49f8-4037-8edc-0700a2df4dce_1306x236.png 424w, https://substackcdn.com/image/fetch/$s_!SL0A!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f039c9d-49f8-4037-8edc-0700a2df4dce_1306x236.png 848w, https://substackcdn.com/image/fetch/$s_!SL0A!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f039c9d-49f8-4037-8edc-0700a2df4dce_1306x236.png 1272w, https://substackcdn.com/image/fetch/$s_!SL0A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f039c9d-49f8-4037-8edc-0700a2df4dce_1306x236.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">We got data!</figcaption></figure></div><p><strong>NOTE:</strong> If you have an issue with the syntax and get an error like "ERROR:  syntax error at or near "SELECT", add a leading semicolon.  If you made an error earlier, sometimes it won&#8217;t detect the closing semicolon from earlier and think you&#8217;re still typing commands. Your query would look like this: ";SELECT * FROM users;".</p><p>Looks like we are good to go.</p><h2>Accessing Postgres via Python</h2><p>The most common Postgres data adapter for Python is currently <a href="https://github.com/psycopg/psycopg2">Psycopg2</a>, so let&#8217;s install it. In VS Code, open a terminal and run:</p><pre><code>pip install psycopg2-binary</code></pre><p>Why the "-binary"?  Because the way psycopg2 is built has some underlying dependencies so we do not want to worry about building it ourselves.</p><p>Now in VS Code create a Python file, app.py and paste the following code:</p><pre><code>import psycopg2

conn = psycopg2.connect(
    host="localhost",
    database="test_database",
    user="test_user",
    password="test_password",
)

cur = conn.cursor()

cur.execute("SELECT * FROM users;")

records = cur.fetchall()
for row in records:
    print(row)

conn.close()</code></pre><p>You can now either run via Run and Debug in VS Code, or in your terminal run "python3 app.py".  Adjust your version of Python and the filename accordingly.</p><p>Your output will look like this:</p><pre><code>rob@Robs-MacBook-Pro-M2-MAX python-postgres % python3 app.py 
(1, 'John', 'Doe', 'jdoe123', 'jdoe@example.com', datetime.date(2023, 1, 1), datetime.date(2023, 1, 1))
(2, 'Jane', 'Doe', 'janed', 'jane@example.com', datetime.date(2023, 2, 1), datetime.date(2023, 2, 1)) </code></pre><h2>Summary</h2><p>That&#8217;s it!  As with any database, there is a lot to consider:</p><ul><li><p>Security (authentication, authorization, roles, etc).</p></li><li><p>Performance (SQL versus your language of choice like Python).</p></li><li><p>RDBMS flavor (example here was Postgres, but other SQL systems will be quite similar like MySQL).</p></li></ul><p>The code for this post can be found on GitHub <a href="https://github.com/robpetty/python-postgres">here</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://papayabytes.substack.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 PapayaBytes! 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[Guide: Building a Simple Web Scraper API]]></title><description><![CDATA[A Node.js web scraping API.]]></description><link>https://papayabytes.substack.com/p/guide-building-a-simple-web-scraper</link><guid isPermaLink="false">https://papayabytes.substack.com/p/guide-building-a-simple-web-scraper</guid><dc:creator><![CDATA[Rob]]></dc:creator><pubDate>Sat, 26 Aug 2023 00:26:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!A3_2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70ee68b3-8254-484b-8f00-0d361323ca7e_2778x992.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!A3_2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70ee68b3-8254-484b-8f00-0d361323ca7e_2778x992.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!A3_2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70ee68b3-8254-484b-8f00-0d361323ca7e_2778x992.png 424w, https://substackcdn.com/image/fetch/$s_!A3_2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70ee68b3-8254-484b-8f00-0d361323ca7e_2778x992.png 848w, https://substackcdn.com/image/fetch/$s_!A3_2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70ee68b3-8254-484b-8f00-0d361323ca7e_2778x992.png 1272w, https://substackcdn.com/image/fetch/$s_!A3_2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70ee68b3-8254-484b-8f00-0d361323ca7e_2778x992.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!A3_2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70ee68b3-8254-484b-8f00-0d361323ca7e_2778x992.png" width="1456" height="520" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/70ee68b3-8254-484b-8f00-0d361323ca7e_2778x992.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:520,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1451611,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!A3_2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70ee68b3-8254-484b-8f00-0d361323ca7e_2778x992.png 424w, https://substackcdn.com/image/fetch/$s_!A3_2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70ee68b3-8254-484b-8f00-0d361323ca7e_2778x992.png 848w, https://substackcdn.com/image/fetch/$s_!A3_2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70ee68b3-8254-484b-8f00-0d361323ca7e_2778x992.png 1272w, https://substackcdn.com/image/fetch/$s_!A3_2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70ee68b3-8254-484b-8f00-0d361323ca7e_2778x992.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If you have spent any amount of time on the Internet, you have most likely come across websites that aggregate data from multiple websites and/or APIs.  Today&#8217;s post is to show just one example of how this activity is accomplished.</p><h2>Prerequisites</h2><p>Like most projects, the tools we will be using here are:</p><ul><li><p>Visual Studio Code.</p></li><li><p>Node.js.</p></li><li><p>Homebrew.</p></li></ul><p>The current version of these tools should be fine as we will not be doing anything crazy right now.  Anything else we need installed we will cover as we go.  If you need refreshers on how to install these tools, you can refer to a couple earlier posts.</p><p><strong>VS Code and Homebrew Installation</strong></p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;badef732-ac6f-42ae-a275-c361736b89f9&quot;,&quot;caption&quot;:&quot;The following post will describe how to install the basic developer setup on a Mac from scratch, for working in Python. Homebrew First up, you will need a package manager. Homebrew has become the de facto choice recently on the Mac platform. First, you need to open a command line somewhere, either:&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Guide: Homebrew, Python and Visual Studio Code on Mac&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:153565442,&quot;name&quot;:&quot;Rob&quot;,&quot;bio&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a4137f6b-9752-4f0e-a5c2-e32d8f4ad5d6_1000x1000.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-07-17T23:23:48.475Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/582c19b9-1181-4592-b3c0-919d012acd03_2458x1668.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://papayabytes.substack.com/p/guide-homebrew-python-and-visual&quot;,&quot;section_name&quot;:&quot;Code&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:135137206,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;PapayaBytes&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e5e0556-7e55-4e5e-8544-a4a6f5bd8a38_1000x1000.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p><strong>Node.js Installation (via Homebrew)</strong></p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;b6367334-bf4b-4efa-a592-e3a7469bcb2d&quot;,&quot;caption&quot;:&quot;React is one of the most popular and powerful JavaScript user interface libraries available today. The React ecosystem now includes all kinds of helpful frameworks, tools, libraries, etc. The goal of this post is to show how fast one can get started with React and drop knowledge along the way to help you down the road.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;React Basics&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:153565442,&quot;name&quot;:&quot;Rob&quot;,&quot;bio&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a4137f6b-9752-4f0e-a5c2-e32d8f4ad5d6_1000x1000.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-08-08T23:53:54.633Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe36adff-7b42-488c-a06c-e4c26b44dad8_1862x1444.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://papayabytes.substack.com/p/react-basics&quot;,&quot;section_name&quot;:&quot;Code&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:135843543,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;PapayaBytes&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e5e0556-7e55-4e5e-8544-a4a6f5bd8a38_1000x1000.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><h2>Basic Application Setup</h2><p>To get started, fire up VS Code and open a new empty folder in your normal repo folder.  </p><ul><li><p>Open a terminal in VS Code, in your folder, in my case <code>/Users/rob/Repos/simple-scraper</code>.</p></li><li><p>To initialize our Node.js project, type:</p></li></ul><pre><code>npm init</code></pre><p>We will leave all these values default, so press enter/return until the process is complete.  You will now have a <code>package.json</code> file with the generated setup.</p><ul><li><p>In the root of your folder, create <code>index.js</code>, which is the point of entry of our server.</p></li></ul><p>Now with the fundamental Node.js application structure in place, let&#8217;s grab the third party libraries we are going to be using.</p><h3><a href="https://www.npmjs.com/package/cheerio">cheerio</a></h3><p>cheerio is a server-side implementation of core jQuery.  We will use this to parse the web pages for information we are interested in (as it allows DOM traversal and manipulation).  </p><p><strong>NOTE:</strong> cheerio does not render a page or run any JavaScript, you need other tools for that.</p><p>To install, in the terminal run:</p><pre><code>npm install cheerio</code></pre><p>Your package.json file (your Node.js application configuration) will now be updated, package-lock.json will be created, and now create node_modules and download the required files.</p><h3><a href="https://www.npmjs.com/package/express">express</a></h3><p>A web framework built for node, that will listen on the network for incoming requests and serves responses.  Think of this as our web application/web server.</p><p>To install express:</p><pre><code>npm install express</code></pre><h3><a href="https://www.npmjs.com/package/axios">axios</a></h3><p>A HTTP client for Node.js.  It allows us to interact with other APIs behind the scenes. Axios is basically what we will use to fetch data.</p><p>To install axios:</p><pre><code>npm install axios</code></pre><p>Great, now we have the three key library dependencies installed. Think of express as our server, and axios as being used to communicate to other servers.</p><h2>Application Buildout</h2><p>Now it&#8217;s time to write some code.  Open up <code>index.js</code> and let&#8217;s get started.</p><p>A common convention is to call your server instance (meaning your instance of express), "<code>app</code>".  It could be called anything, but this is maybe the most common.  (For example, say you had both HTTP and HTTPS services available, you would run something different like app_http and app_https if you wanted to make clear the difference between the servers).</p><p>The basic initial code to import the third party libraries and kick off your express server on port 8080 will look something like this:</p><pre><code>const SERVER_NAME = "simple-scraper";
const SERVER_PORT = 8080;
const express = require("express");
const axios = require("axios");
const cheerio = require("cheerio");

const app = express();

app.listen(SERVER_PORT, () =&gt; {
  console.log(`${SERVER_NAME} running on ${SERVER_PORT}`);
});</code></pre><h3>Running the Application</h3><p>Lets now run our application via <code>npm run start</code>:</p><pre><code>rob@Robs-MacBook-Pro-M2-MAX simple-scraper % npm run start
npm ERR! Missing script: "start"
npm ERR! 
npm ERR! Did you mean one of these?
npm ERR!     npm star # Mark your favorite packages
npm ERR!     npm stars # View packages marked as favorites
npm ERR! 
npm ERR! To see a list of scripts, run:
npm ERR!   npm run

npm ERR! A complete log of this run can be found in: /Users/rob/.npm/_logs/2023-08-25T20_55_36_897Z-debug-0.log</code></pre><p>Disaster! What happened? We did not actually define the command "start".  How do we fix this?  Open package.json, our application configuration, and lets add a <code>start</code> command in the scripts section, as follows:</p><pre><code>  "scripts": {
    "test": "echo \"Error: no test specified\" &amp;&amp; exit 1",
    "start": "nodemon index.js"
  },</code></pre><p>Now when start is run, nodemon will launch and monitor our index.js file for any changes and restart the running node process as necessary to keep it updated. Lets run "<code>npm run start"</code> again:</p><pre><code>rob@Robs-MacBook-Pro-M2-MAX simple-scraper % npm run start        

&gt; simple-scraper@1.0.0 start
&gt; nodemon index.js

sh: nodemon: command not found</code></pre><p>I left this until now to show how to debug aspects of your development environment.  What this is saying is, we need to install nodemon.  To do so run:</p><pre><code>npm i nodemon</code></pre><p>That&#8217;s it (i is shorthand for install). Now we can successfully launch our application via "<code>npm run start</code>":</p><pre><code>rob@Robs-MacBook-Pro-M2-MAX simple-scraper % npm run start

&gt; simple-scraper@1.0.0 start
&gt; nodemon index.js

[nodemon] 3.0.1
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,cjs,json
[nodemon] starting `node index.js`
simple-scraper running on 8080</code></pre><p>While not a lot of useful features yet, it allows us to have a server that is in fact running and listening on port 8080. Back to coding.</p><h3>Basic Functionality</h3><p>Let&#8217;s create our first express route handler, which means to say, lets use Express to listen for an incoming HTTP request.  We will look for the HTTP verb GET, on the URI "/".   In index.js, above your call to app.listen(), add the following function:</p><pre><code>app.get("/", (req, res) =&gt; {
  res.json("Hello World, from simple-scraper!");
});</code></pre><p>Due to nodemon watching for your file to change after it is saved, barring any errors, if you go to http://localhost:8080 on your browser, you will now see that output:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!F5lz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b334e3-c350-40e5-b21a-75e62ffdacdd_710x318.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F5lz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b334e3-c350-40e5-b21a-75e62ffdacdd_710x318.png 424w, https://substackcdn.com/image/fetch/$s_!F5lz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b334e3-c350-40e5-b21a-75e62ffdacdd_710x318.png 848w, https://substackcdn.com/image/fetch/$s_!F5lz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b334e3-c350-40e5-b21a-75e62ffdacdd_710x318.png 1272w, https://substackcdn.com/image/fetch/$s_!F5lz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b334e3-c350-40e5-b21a-75e62ffdacdd_710x318.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F5lz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b334e3-c350-40e5-b21a-75e62ffdacdd_710x318.png" width="398" height="178.25915492957748" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/95b334e3-c350-40e5-b21a-75e62ffdacdd_710x318.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:318,&quot;width&quot;:710,&quot;resizeWidth&quot;:398,&quot;bytes&quot;:23641,&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_!F5lz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b334e3-c350-40e5-b21a-75e62ffdacdd_710x318.png 424w, https://substackcdn.com/image/fetch/$s_!F5lz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b334e3-c350-40e5-b21a-75e62ffdacdd_710x318.png 848w, https://substackcdn.com/image/fetch/$s_!F5lz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b334e3-c350-40e5-b21a-75e62ffdacdd_710x318.png 1272w, https://substackcdn.com/image/fetch/$s_!F5lz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b334e3-c350-40e5-b21a-75e62ffdacdd_710x318.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Hello World!</figcaption></figure></div><p>The critical things to note here:</p><ul><li><p>We are listening on the homepage URI, which is just the forward slash.  Future API endpoints will be something else as you will later.</p></li><li><p>As we are building an API, we return the data as JSON via .json().</p></li></ul><h3>Grabbing a Web Page and Checking It Out</h3><p>Now it&#8217;s time to add an endpoint to grab a webpage and do something with it.  For now, we will just pick the front page of <a href="https://www.reddit.com">Reddit</a>.</p><p>Add a new route, this time named "test-route".  In this route handler, we are going to use the axios library to make a call to Reddit to retrieve the contents of the homepage. Your  code will look something like this:</p><pre><code>app.get("/test-route", (req, res) =&gt; {
  axios.get("https://www.reddit.com").then((response) =&gt; {
    const html = response.data;

    console.log(html);
  });
});</code></pre><p>This is just to show you how to make the call in axios and then get to the HTML in the response object (via a promise-then async pattern, meaning we want to wait for a response from Reddit, then we do something about).</p><p>Lets now add cheerio to the mix, and grab some data from the Reddit homepage HTML and display it back to the browser that made the call to <code>/test-route</code>. We will use the $ select function (as in jQuery). cheerio also <a href="https://cheerio.js.org/docs/basics/selecting">recommends as best practice to prefix your cheerio variables with the dollar sign</a> so it&#8217;s clear what they are.</p><p><strong>NOTE:</strong> Substack renders the two-line version of the dollar sign instead of the one-line variant.</p><p>In our case we will:</p><ul><li><p>Find all the links in the HTML.</p></li><li><p>Push reddit.com links to an array.</p></li><li><p>Push non-reddit.com links to another array.</p></li><li><p>Display the two arrays back as JSON on /test-route in the response.</p></li></ul><p><strong>NOTE:</strong> Many links that actually are Reddit.com links are placed in the non-reddit.com array because they did not contain reddit.com in the href.</p><p>Here is our updated code as described above:</p><pre><code>app.get("/test-route", (req, res) =&gt; {
  axios.get("https://www.reddit.com").then((response) =&gt; {
    const html = response.data;

    const $ = cheerio.load(html);

    $("a", html).each(function () {
      const text = $(this)
        .text()
        .replace(/(\r\n|\n|\r)/gm, "") // remove line breaks
        .replace(/\s+/g, " ") // collapse multiple spaces to one
        .trim(); // remove leading/trailing spaces.
      const href = $(this).attr("href");

      if (href === "#" || href.match(/[./]reddit.com/i)) {
        redditLinks.push({
          text,
          href,
        });
      } else {
        nonRedditLinks.push({
          text,
          href,
        });
      }
    });

    res.json({
      redditLinks,
      nonRedditLinks,
    });
  });
});</code></pre><h4>Response</h4><p>When we get our result in the browser, it is returned with a <code>Content-Type</code> header value of <code>application/json; charset=utf-8</code>. This gives us a wall of JSON 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_!LRkw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e57352a-f81c-4435-b38f-2f4c226e3e64_1692x550.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LRkw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e57352a-f81c-4435-b38f-2f4c226e3e64_1692x550.png 424w, https://substackcdn.com/image/fetch/$s_!LRkw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e57352a-f81c-4435-b38f-2f4c226e3e64_1692x550.png 848w, https://substackcdn.com/image/fetch/$s_!LRkw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e57352a-f81c-4435-b38f-2f4c226e3e64_1692x550.png 1272w, https://substackcdn.com/image/fetch/$s_!LRkw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e57352a-f81c-4435-b38f-2f4c226e3e64_1692x550.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LRkw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e57352a-f81c-4435-b38f-2f4c226e3e64_1692x550.png" width="1456" height="473" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7e57352a-f81c-4435-b38f-2f4c226e3e64_1692x550.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:473,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:276477,&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_!LRkw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e57352a-f81c-4435-b38f-2f4c226e3e64_1692x550.png 424w, https://substackcdn.com/image/fetch/$s_!LRkw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e57352a-f81c-4435-b38f-2f4c226e3e64_1692x550.png 848w, https://substackcdn.com/image/fetch/$s_!LRkw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e57352a-f81c-4435-b38f-2f4c226e3e64_1692x550.png 1272w, https://substackcdn.com/image/fetch/$s_!LRkw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e57352a-f81c-4435-b38f-2f4c226e3e64_1692x550.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">JSON response.</figcaption></figure></div><p><br>We can get a more helpful view of the data with some additional tooling.</p><h4><a href="https://chrome.google.com/webstore/detail/jsonvue/chklaanhfefbnpoihckbnefhakgolnmc">JSONVue</a></h4><p>A helpful Chrome browser extension named JSONVue can be used to give a nice, collapsable view of the returned JSON data from our service. Now when we enable the extension, we get a much nicer view when we refresh the tab, 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_!tH5-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ac7882-fe1f-412c-8fc5-ce1335de45ab_1564x646.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tH5-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ac7882-fe1f-412c-8fc5-ce1335de45ab_1564x646.png 424w, https://substackcdn.com/image/fetch/$s_!tH5-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ac7882-fe1f-412c-8fc5-ce1335de45ab_1564x646.png 848w, https://substackcdn.com/image/fetch/$s_!tH5-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ac7882-fe1f-412c-8fc5-ce1335de45ab_1564x646.png 1272w, https://substackcdn.com/image/fetch/$s_!tH5-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ac7882-fe1f-412c-8fc5-ce1335de45ab_1564x646.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tH5-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ac7882-fe1f-412c-8fc5-ce1335de45ab_1564x646.png" width="1456" height="601" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/01ac7882-fe1f-412c-8fc5-ce1335de45ab_1564x646.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:601,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:107266,&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_!tH5-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ac7882-fe1f-412c-8fc5-ce1335de45ab_1564x646.png 424w, https://substackcdn.com/image/fetch/$s_!tH5-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ac7882-fe1f-412c-8fc5-ce1335de45ab_1564x646.png 848w, https://substackcdn.com/image/fetch/$s_!tH5-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ac7882-fe1f-412c-8fc5-ce1335de45ab_1564x646.png 1272w, https://substackcdn.com/image/fetch/$s_!tH5-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ac7882-fe1f-412c-8fc5-ce1335de45ab_1564x646.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">JSON response, prettified by JSONVue.</figcaption></figure></div><h2>Summary</h2><p>Sweet, you have built your first web scraper.  Now what?  Some thoughts on this project:</p><ul><li><p>We are not saving the data anywhere.  A database feature enhancement is a must if you&#8217;re looking to do any type of analysis on the data over time.</p></li><li><p>Text.  We only grabbed URLs, but what about content?  </p></li><li><p>Abuse.  Not many sites are scraping friendly, even though the Internet is searched automatically by bots, crawlers, scrapers, endlessly.  Be mindful of the resources you are using of the sites you&#8217;re looking at.  </p></li><li><p>Data Security.  PII, GDPR, CCPA and other legal frameworks dictate what data is private and which is not. Be mindful of that.</p></li><li><p><code>"if (href === "#" || href.match(/[./]reddit.com/i)) {",</code> this logic and regex leaves a lot to be desired as noted earlier.  An obvious enhancement is fixing this up to be more realistic to reddit.com&#8217;s structure.</p></li></ul><h3>GitHub</h3><p>In prep for placing this code in GitHub:</p><ul><li><p>A .gitignore file was created, with a single entry "node_modules".  This should be standard on most Node.js projects to avoid copying thousands of unnecessary files.</p></li><li><p>A small README.md was added.</p></li></ul><p>The code for this post can be found on GitHub <a href="https://github.com/robpetty/simple-scraper">here</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://papayabytes.substack.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 PapayaBytes! 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[Guide: Docker Desktop and MongoDB on Mac]]></title><description><![CDATA[How to get Docker and MongoDB working quickly on your Mac.]]></description><link>https://papayabytes.substack.com/p/guide-docker-desktop-and-mongodb</link><guid isPermaLink="false">https://papayabytes.substack.com/p/guide-docker-desktop-and-mongodb</guid><dc:creator><![CDATA[Rob]]></dc:creator><pubDate>Sat, 19 Aug 2023 22:56:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45d0b588-fb74-4d4d-8aad-76e09a5d4672_2040x1200.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Today&#8217;s post is concerned with home to quickly get Docker Desktop and MongoDB up and running on your Mac.  </p><h2>Prerequisites</h2><p>As we will be using Homebrew (brew) to install Docker Desktop, if you do not already have it, please read how to install and test Homebrew in the first third of this previous post:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;71b05792-6322-41bf-9744-58caf2d834ac&quot;,&quot;caption&quot;:&quot;The following post will describe how to install the basic developer setup on a Mac from scratch, for working in Python. Homebrew First up, you will need a package manager. Homebrew has become the de facto choice recently on the Mac platform. First, you need to open a command line somewhere, either:&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Guide: Homebrew, Python and Visual Studio Code on Mac&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:153565442,&quot;name&quot;:&quot;Rob&quot;,&quot;bio&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a4137f6b-9752-4f0e-a5c2-e32d8f4ad5d6_1000x1000.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-07-17T23:23:48.475Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/582c19b9-1181-4592-b3c0-919d012acd03_2458x1668.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://papayabytes.substack.com/p/guide-homebrew-python-and-visual&quot;,&quot;section_name&quot;:&quot;Code&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:135137206,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;PapayaBytes&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e5e0556-7e55-4e5e-8544-a4a6f5bd8a38_1000x1000.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><h2>Docker Desktop</h2><p>Today there are many tools and methods for handling working with containers.  This post is not a critique on any other tools, rather it&#8217;s simply how to get up and running fast with one of the most common.  How fast can we do this:</p><ul><li><p>Open a terminal.</p></li><li><p>Enter:</p></li></ul><pre><code>brew install --cask docker</code></pre><ul><li><p>You will be prompted for your password, so enter it and press enter.</p></li><li><p>If everything was ok, you will see:</p></li></ul><pre><code>&#127866;  docker was successfully installed!</code></pre><p>As its always a good idea to test things are good, enter:</p><pre><code>docker --version</code></pre><p>To confirm docker is installed, reachable and working.  </p><p>Now to confirm Docker Desktop is working, lets run Docker Desktop via the Spotlight feature:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uSHQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefcfef2c-06a6-4fd1-b30c-2e7fd2506249_1350x860.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uSHQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefcfef2c-06a6-4fd1-b30c-2e7fd2506249_1350x860.png 424w, https://substackcdn.com/image/fetch/$s_!uSHQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefcfef2c-06a6-4fd1-b30c-2e7fd2506249_1350x860.png 848w, https://substackcdn.com/image/fetch/$s_!uSHQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefcfef2c-06a6-4fd1-b30c-2e7fd2506249_1350x860.png 1272w, https://substackcdn.com/image/fetch/$s_!uSHQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefcfef2c-06a6-4fd1-b30c-2e7fd2506249_1350x860.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uSHQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefcfef2c-06a6-4fd1-b30c-2e7fd2506249_1350x860.png" width="348" height="221.6888888888889" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/efcfef2c-06a6-4fd1-b30c-2e7fd2506249_1350x860.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:860,&quot;width&quot;:1350,&quot;resizeWidth&quot;:348,&quot;bytes&quot;:137872,&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_!uSHQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefcfef2c-06a6-4fd1-b30c-2e7fd2506249_1350x860.png 424w, https://substackcdn.com/image/fetch/$s_!uSHQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefcfef2c-06a6-4fd1-b30c-2e7fd2506249_1350x860.png 848w, https://substackcdn.com/image/fetch/$s_!uSHQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefcfef2c-06a6-4fd1-b30c-2e7fd2506249_1350x860.png 1272w, https://substackcdn.com/image/fetch/$s_!uSHQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefcfef2c-06a6-4fd1-b30c-2e7fd2506249_1350x860.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Using Spotlight to launch Docker Desktop.</figcaption></figure></div><p>Presuming it launched, as of the time of this posts creation you will see:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0u5O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F806a4943-c174-4ea2-9744-8271a1574223_1600x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0u5O!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F806a4943-c174-4ea2-9744-8271a1574223_1600x1000.png 424w, https://substackcdn.com/image/fetch/$s_!0u5O!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F806a4943-c174-4ea2-9744-8271a1574223_1600x1000.png 848w, https://substackcdn.com/image/fetch/$s_!0u5O!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F806a4943-c174-4ea2-9744-8271a1574223_1600x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!0u5O!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F806a4943-c174-4ea2-9744-8271a1574223_1600x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0u5O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F806a4943-c174-4ea2-9744-8271a1574223_1600x1000.png" width="556" height="347.5" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/806a4943-c174-4ea2-9744-8271a1574223_1600x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:910,&quot;width&quot;:1456,&quot;resizeWidth&quot;:556,&quot;bytes&quot;:709272,&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_!0u5O!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F806a4943-c174-4ea2-9744-8271a1574223_1600x1000.png 424w, https://substackcdn.com/image/fetch/$s_!0u5O!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F806a4943-c174-4ea2-9744-8271a1574223_1600x1000.png 848w, https://substackcdn.com/image/fetch/$s_!0u5O!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F806a4943-c174-4ea2-9744-8271a1574223_1600x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!0u5O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F806a4943-c174-4ea2-9744-8271a1574223_1600x1000.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">Docker Desktop ToS screen.</figcaption></figure></div><p>Click "Accept", if you agree to the ToS and then click "Finish" to use the default configuration.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AjN0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7453563-539a-40cb-9042-924c535f278f_1510x1016.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AjN0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7453563-539a-40cb-9042-924c535f278f_1510x1016.png 424w, https://substackcdn.com/image/fetch/$s_!AjN0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7453563-539a-40cb-9042-924c535f278f_1510x1016.png 848w, https://substackcdn.com/image/fetch/$s_!AjN0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7453563-539a-40cb-9042-924c535f278f_1510x1016.png 1272w, https://substackcdn.com/image/fetch/$s_!AjN0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7453563-539a-40cb-9042-924c535f278f_1510x1016.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AjN0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7453563-539a-40cb-9042-924c535f278f_1510x1016.png" width="506" height="340.5769230769231" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e7453563-539a-40cb-9042-924c535f278f_1510x1016.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:980,&quot;width&quot;:1456,&quot;resizeWidth&quot;:506,&quot;bytes&quot;:656523,&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_!AjN0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7453563-539a-40cb-9042-924c535f278f_1510x1016.png 424w, https://substackcdn.com/image/fetch/$s_!AjN0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7453563-539a-40cb-9042-924c535f278f_1510x1016.png 848w, https://substackcdn.com/image/fetch/$s_!AjN0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7453563-539a-40cb-9042-924c535f278f_1510x1016.png 1272w, https://substackcdn.com/image/fetch/$s_!AjN0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7453563-539a-40cb-9042-924c535f278f_1510x1016.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">Finalizing setup.</figcaption></figure></div><p>You will be prompted to give Docker Desktop access to finish its configuration. It will also add some items in your "Login Items" configuration in the "Allow in the Background" section as seen here:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2znI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57cd3a31-3ed0-4aba-b4b1-94ef0f5b3229_1002x956.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2znI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57cd3a31-3ed0-4aba-b4b1-94ef0f5b3229_1002x956.png 424w, https://substackcdn.com/image/fetch/$s_!2znI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57cd3a31-3ed0-4aba-b4b1-94ef0f5b3229_1002x956.png 848w, https://substackcdn.com/image/fetch/$s_!2znI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57cd3a31-3ed0-4aba-b4b1-94ef0f5b3229_1002x956.png 1272w, https://substackcdn.com/image/fetch/$s_!2znI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57cd3a31-3ed0-4aba-b4b1-94ef0f5b3229_1002x956.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2znI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57cd3a31-3ed0-4aba-b4b1-94ef0f5b3229_1002x956.png" width="418" height="398.81037924151696" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/57cd3a31-3ed0-4aba-b4b1-94ef0f5b3229_1002x956.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:956,&quot;width&quot;:1002,&quot;resizeWidth&quot;:418,&quot;bytes&quot;:124009,&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_!2znI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57cd3a31-3ed0-4aba-b4b1-94ef0f5b3229_1002x956.png 424w, https://substackcdn.com/image/fetch/$s_!2znI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57cd3a31-3ed0-4aba-b4b1-94ef0f5b3229_1002x956.png 848w, https://substackcdn.com/image/fetch/$s_!2znI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57cd3a31-3ed0-4aba-b4b1-94ef0f5b3229_1002x956.png 1272w, https://substackcdn.com/image/fetch/$s_!2znI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57cd3a31-3ed0-4aba-b4b1-94ef0f5b3229_1002x956.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">Login Items Allow in the Background configuration for Docker.</figcaption></figure></div><p>At this point you will be prompted to log into docker.com.  If you have not already created a docker account, now is the time to do so, so you can interact with hub.docker.com. It is not required to have an account to finish the tasks here, but odds are you will spend some time on docker.com in the future.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xuvh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16b97b28-67e6-46f2-a868-c4a2998af11b_1554x1200.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xuvh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16b97b28-67e6-46f2-a868-c4a2998af11b_1554x1200.png 424w, https://substackcdn.com/image/fetch/$s_!xuvh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16b97b28-67e6-46f2-a868-c4a2998af11b_1554x1200.png 848w, https://substackcdn.com/image/fetch/$s_!xuvh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16b97b28-67e6-46f2-a868-c4a2998af11b_1554x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!xuvh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16b97b28-67e6-46f2-a868-c4a2998af11b_1554x1200.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xuvh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16b97b28-67e6-46f2-a868-c4a2998af11b_1554x1200.png" width="488" height="376.72527472527474" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/16b97b28-67e6-46f2-a868-c4a2998af11b_1554x1200.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1124,&quot;width&quot;:1456,&quot;resizeWidth&quot;:488,&quot;bytes&quot;:94676,&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_!xuvh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16b97b28-67e6-46f2-a868-c4a2998af11b_1554x1200.png 424w, https://substackcdn.com/image/fetch/$s_!xuvh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16b97b28-67e6-46f2-a868-c4a2998af11b_1554x1200.png 848w, https://substackcdn.com/image/fetch/$s_!xuvh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16b97b28-67e6-46f2-a868-c4a2998af11b_1554x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!xuvh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16b97b28-67e6-46f2-a868-c4a2998af11b_1554x1200.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">Log into docker.com, or create an account, or continue without.</figcaption></figure></div><h2>MongoDB</h2><h3>Installing MongoDB</h3><p>First thing we want to do is obtain the MongoDB image to run in Docker.  From inside Docker Desktop:</p><ul><li><p>In the Search bar, type mongodb.</p></li><li><p>Click "Pull", to download the latest image. (Tag is set to "latest" by default.)</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_!nM2q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0879ef6-7517-46aa-97ef-6d283c7248de_2040x1200.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nM2q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0879ef6-7517-46aa-97ef-6d283c7248de_2040x1200.png 424w, https://substackcdn.com/image/fetch/$s_!nM2q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0879ef6-7517-46aa-97ef-6d283c7248de_2040x1200.png 848w, https://substackcdn.com/image/fetch/$s_!nM2q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0879ef6-7517-46aa-97ef-6d283c7248de_2040x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!nM2q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0879ef6-7517-46aa-97ef-6d283c7248de_2040x1200.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nM2q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0879ef6-7517-46aa-97ef-6d283c7248de_2040x1200.png" width="500" height="293.95604395604397" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d0879ef6-7517-46aa-97ef-6d283c7248de_2040x1200.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:856,&quot;width&quot;:1456,&quot;resizeWidth&quot;:500,&quot;bytes&quot;:278596,&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_!nM2q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0879ef6-7517-46aa-97ef-6d283c7248de_2040x1200.png 424w, https://substackcdn.com/image/fetch/$s_!nM2q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0879ef6-7517-46aa-97ef-6d283c7248de_2040x1200.png 848w, https://substackcdn.com/image/fetch/$s_!nM2q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0879ef6-7517-46aa-97ef-6d283c7248de_2040x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!nM2q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0879ef6-7517-46aa-97ef-6d283c7248de_2040x1200.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">Using Docker Desktop to get the latest MongoDB image.</figcaption></figure></div><p>Once completed it will have a checkmark next to the "latest" tag.</p><h3>Configure Docker and Run  MongoDB</h3><p>While we have our image, it&#8217;s not quite ready.  We need to expose the running MongoDB daemon inside the running container to your laptop, so you can access it externally from your code and other tools.</p><p>To do so:</p><ul><li><p>Click the "images" icon on the left side.</p></li><li><p>In the mongo Images row, under Actions column, click the arrow icon.</p></li><li><p>Expand the Optional settings section.  </p></li><li><p>Click on "Host port" and enter 27017.  We are essentially having our running container mirror the default mongo port.</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_!aook!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e515d7d-aa9b-4dc3-9e6a-285d0869e34e_2040x1200.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aook!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e515d7d-aa9b-4dc3-9e6a-285d0869e34e_2040x1200.png 424w, https://substackcdn.com/image/fetch/$s_!aook!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e515d7d-aa9b-4dc3-9e6a-285d0869e34e_2040x1200.png 848w, https://substackcdn.com/image/fetch/$s_!aook!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e515d7d-aa9b-4dc3-9e6a-285d0869e34e_2040x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!aook!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e515d7d-aa9b-4dc3-9e6a-285d0869e34e_2040x1200.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aook!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e515d7d-aa9b-4dc3-9e6a-285d0869e34e_2040x1200.png" width="588" height="345.6923076923077" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9e515d7d-aa9b-4dc3-9e6a-285d0869e34e_2040x1200.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:856,&quot;width&quot;:1456,&quot;resizeWidth&quot;:588,&quot;bytes&quot;:241681,&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_!aook!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e515d7d-aa9b-4dc3-9e6a-285d0869e34e_2040x1200.png 424w, https://substackcdn.com/image/fetch/$s_!aook!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e515d7d-aa9b-4dc3-9e6a-285d0869e34e_2040x1200.png 848w, https://substackcdn.com/image/fetch/$s_!aook!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e515d7d-aa9b-4dc3-9e6a-285d0869e34e_2040x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!aook!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e515d7d-aa9b-4dc3-9e6a-285d0869e34e_2040x1200.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">Set the Host Port to expose the container&#8217;s mongo instance.</figcaption></figure></div><ul><li><p>Click "Run".</p></li></ul><p>At this juncture, MongoDB is up and running inside your container.  To confirm things are working (as the default Logs tab might be too confusing if your new):</p><ul><li><p>Click Terminal.</p></li><li><p>Type "mongosh".  This tool, which stands for Mongo Shell, is available inside the container as its part of the Docker image. It will allow us to interact with MongoDB.</p></li><li><p>Type "show databases" to see the default set of databases that in your running database:</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_!0XM0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67495fe5-bffc-4907-9c7f-6b36688c56a8_2040x1200.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0XM0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67495fe5-bffc-4907-9c7f-6b36688c56a8_2040x1200.png 424w, https://substackcdn.com/image/fetch/$s_!0XM0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67495fe5-bffc-4907-9c7f-6b36688c56a8_2040x1200.png 848w, https://substackcdn.com/image/fetch/$s_!0XM0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67495fe5-bffc-4907-9c7f-6b36688c56a8_2040x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!0XM0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67495fe5-bffc-4907-9c7f-6b36688c56a8_2040x1200.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0XM0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67495fe5-bffc-4907-9c7f-6b36688c56a8_2040x1200.png" width="534" height="313.94505494505495" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/67495fe5-bffc-4907-9c7f-6b36688c56a8_2040x1200.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:856,&quot;width&quot;:1456,&quot;resizeWidth&quot;:534,&quot;bytes&quot;:281700,&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_!0XM0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67495fe5-bffc-4907-9c7f-6b36688c56a8_2040x1200.png 424w, https://substackcdn.com/image/fetch/$s_!0XM0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67495fe5-bffc-4907-9c7f-6b36688c56a8_2040x1200.png 848w, https://substackcdn.com/image/fetch/$s_!0XM0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67495fe5-bffc-4907-9c7f-6b36688c56a8_2040x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!0XM0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67495fe5-bffc-4907-9c7f-6b36688c56a8_2040x1200.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">mongosh inside Docker Desktops Terminal running your Docker container.</figcaption></figure></div><p>To confirm your MongoDB instance is reachable from your desktop, in a browser, attempt to reach it by entering <a href="https://localhost:27017">https://localhost:27017</a>. The response will come from MongoDB itself.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!z407!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb56bfc4a-3f04-4269-afe5-87b0ac181324_1652x982.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!z407!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb56bfc4a-3f04-4269-afe5-87b0ac181324_1652x982.png 424w, https://substackcdn.com/image/fetch/$s_!z407!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb56bfc4a-3f04-4269-afe5-87b0ac181324_1652x982.png 848w, https://substackcdn.com/image/fetch/$s_!z407!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb56bfc4a-3f04-4269-afe5-87b0ac181324_1652x982.png 1272w, https://substackcdn.com/image/fetch/$s_!z407!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb56bfc4a-3f04-4269-afe5-87b0ac181324_1652x982.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!z407!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb56bfc4a-3f04-4269-afe5-87b0ac181324_1652x982.png" width="554" height="329.12774725274727" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b56bfc4a-3f04-4269-afe5-87b0ac181324_1652x982.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:865,&quot;width&quot;:1456,&quot;resizeWidth&quot;:554,&quot;bytes&quot;:71929,&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_!z407!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb56bfc4a-3f04-4269-afe5-87b0ac181324_1652x982.png 424w, https://substackcdn.com/image/fetch/$s_!z407!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb56bfc4a-3f04-4269-afe5-87b0ac181324_1652x982.png 848w, https://substackcdn.com/image/fetch/$s_!z407!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb56bfc4a-3f04-4269-afe5-87b0ac181324_1652x982.png 1272w, https://substackcdn.com/image/fetch/$s_!z407!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb56bfc4a-3f04-4269-afe5-87b0ac181324_1652x982.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">Everything is good, even if not clear.</figcaption></figure></div><h4>mongosh</h4><p>As we currently have no way to interact with the database outside of the terminal, let&#8217;s install mongosh on our Mac and use it to interact with the mongo container.</p><p>First install via brew:</p><pre><code>brew install mongosh</code></pre><p>Next, confirm it was successfully installed and works:</p><pre><code>mongosh --version</code></pre><p>Finally, confirm it can reach our running instance by simply typing:</p><pre><code>mongosh</code></pre><p>If everything is working fine, you will land on the default "test" database which has no collections by default.  The output will 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_!IncI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf885cb5-5ce0-4999-96f7-990f6c93193b_1408x658.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IncI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf885cb5-5ce0-4999-96f7-990f6c93193b_1408x658.png 424w, https://substackcdn.com/image/fetch/$s_!IncI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf885cb5-5ce0-4999-96f7-990f6c93193b_1408x658.png 848w, https://substackcdn.com/image/fetch/$s_!IncI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf885cb5-5ce0-4999-96f7-990f6c93193b_1408x658.png 1272w, https://substackcdn.com/image/fetch/$s_!IncI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf885cb5-5ce0-4999-96f7-990f6c93193b_1408x658.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IncI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf885cb5-5ce0-4999-96f7-990f6c93193b_1408x658.png" width="664" height="310.3068181818182" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/df885cb5-5ce0-4999-96f7-990f6c93193b_1408x658.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:658,&quot;width&quot;:1408,&quot;resizeWidth&quot;:664,&quot;bytes&quot;:155306,&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_!IncI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf885cb5-5ce0-4999-96f7-990f6c93193b_1408x658.png 424w, https://substackcdn.com/image/fetch/$s_!IncI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf885cb5-5ce0-4999-96f7-990f6c93193b_1408x658.png 848w, https://substackcdn.com/image/fetch/$s_!IncI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf885cb5-5ce0-4999-96f7-990f6c93193b_1408x658.png 1272w, https://substackcdn.com/image/fetch/$s_!IncI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf885cb5-5ce0-4999-96f7-990f6c93193b_1408x658.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">mongosh in our Mac&#8217;s terminal.</figcaption></figure></div><p>Now you can utilize MongoDB as if it was installed and running locally. If your mongo container is not running you will get the following error:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xoX6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbce13d66-23f0-4667-a5ea-782661f3a5c3_1408x406.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xoX6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbce13d66-23f0-4667-a5ea-782661f3a5c3_1408x406.png 424w, https://substackcdn.com/image/fetch/$s_!xoX6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbce13d66-23f0-4667-a5ea-782661f3a5c3_1408x406.png 848w, https://substackcdn.com/image/fetch/$s_!xoX6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbce13d66-23f0-4667-a5ea-782661f3a5c3_1408x406.png 1272w, https://substackcdn.com/image/fetch/$s_!xoX6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbce13d66-23f0-4667-a5ea-782661f3a5c3_1408x406.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xoX6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbce13d66-23f0-4667-a5ea-782661f3a5c3_1408x406.png" width="1408" height="406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bce13d66-23f0-4667-a5ea-782661f3a5c3_1408x406.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:406,&quot;width&quot;:1408,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:82777,&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_!xoX6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbce13d66-23f0-4667-a5ea-782661f3a5c3_1408x406.png 424w, https://substackcdn.com/image/fetch/$s_!xoX6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbce13d66-23f0-4667-a5ea-782661f3a5c3_1408x406.png 848w, https://substackcdn.com/image/fetch/$s_!xoX6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbce13d66-23f0-4667-a5ea-782661f3a5c3_1408x406.png 1272w, https://substackcdn.com/image/fetch/$s_!xoX6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbce13d66-23f0-4667-a5ea-782661f3a5c3_1408x406.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">Be sure your container is running!</figcaption></figure></div><p><strong>NOTE:</strong> At this juncture, there is nothing configured in terms of security, so your database is wide open. </p><h3>Bonus - Docker Without Docker Desktop</h3><p>Without even knowing it, you have indirectly installed the tools to work with Docker outside of Docker Desktop.  For example, there is a <a href="https://hub.docker.com/_/hello-world">hello-world Docker</a> image that will print out some basic information, more as a proof things are work. From your terminal, simply run the command "<code>docker run hello-world</code>" and it will automatically pull down the latest image for you and run it, like this:</p><pre><code>rob@Robs-MacBook-Pro-M2-MAX ~ % docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
70f5ac315c5a: Pull complete 
Digest: sha256:dcba6daec718f547568c562956fa47e1b03673dd010fe6ee58ca806767031d1c
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (arm64v8)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/
For more examples and ideas, visit:
 https://docs.docker.com/get-started/</code></pre><p>It even shows you how to launch a full <a href="https://hub.docker.com/_/ubuntu">Ubuntu image</a> and start in the bash shell:</p><pre><code>rob@Robs-MacBook-Pro-M2-MAX ~ % docker run -it ubuntu bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
db76c1f8aa17: Pull complete 
Digest: sha256:ec050c32e4a6085b423d36ecd025c0d3ff00c38ab93a3d71a460ff1c44fa6d77
Status: Downloaded newer image for ubuntu:latest
root@9a99929621b3:/# uname -a
Linux 9a99929621b3 5.15.49-linuxkit-pr #1 SMP PREEMPT Thu May 25 07:27:39 UTC 2023 aarch64 aarch64 aarch64 GNU/Linux</code></pre><p>You can view these images and running containers in Docker Desktop too!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rGxQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45d0b588-fb74-4d4d-8aad-76e09a5d4672_2040x1200.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rGxQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45d0b588-fb74-4d4d-8aad-76e09a5d4672_2040x1200.png 424w, https://substackcdn.com/image/fetch/$s_!rGxQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45d0b588-fb74-4d4d-8aad-76e09a5d4672_2040x1200.png 848w, https://substackcdn.com/image/fetch/$s_!rGxQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45d0b588-fb74-4d4d-8aad-76e09a5d4672_2040x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!rGxQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45d0b588-fb74-4d4d-8aad-76e09a5d4672_2040x1200.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rGxQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45d0b588-fb74-4d4d-8aad-76e09a5d4672_2040x1200.png" width="532" height="312.7692307692308" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/45d0b588-fb74-4d4d-8aad-76e09a5d4672_2040x1200.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:856,&quot;width&quot;:1456,&quot;resizeWidth&quot;:532,&quot;bytes&quot;:258306,&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_!rGxQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45d0b588-fb74-4d4d-8aad-76e09a5d4672_2040x1200.png 424w, https://substackcdn.com/image/fetch/$s_!rGxQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45d0b588-fb74-4d4d-8aad-76e09a5d4672_2040x1200.png 848w, https://substackcdn.com/image/fetch/$s_!rGxQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45d0b588-fb74-4d4d-8aad-76e09a5d4672_2040x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!rGxQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45d0b588-fb74-4d4d-8aad-76e09a5d4672_2040x1200.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">Running containers showing our Ubuntu image running.</figcaption></figure></div><h3>Summary</h3><p>The end result of running a container could have been done in many different ways, including Docker without using Docker Desktop.  This tool just gives us a quick and easy way to get going. With the additional step of installing mongosh on your computer, you can now fully interact with your MongoDB instance.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://papayabytes.substack.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 PapayaBytes! 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[Guide: BookRemarks and IndexedDB]]></title><description><![CDATA[Adding better data storage to BookRemarks.]]></description><link>https://papayabytes.substack.com/p/guide-bookremarks-and-indexeddb</link><guid isPermaLink="false">https://papayabytes.substack.com/p/guide-bookremarks-and-indexeddb</guid><dc:creator><![CDATA[Rob]]></dc:creator><pubDate>Sat, 19 Aug 2023 00:49:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!cGMA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04878d2b-2e10-4534-a875-c595acc67162_2126x1482.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cGMA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04878d2b-2e10-4534-a875-c595acc67162_2126x1482.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cGMA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04878d2b-2e10-4534-a875-c595acc67162_2126x1482.png 424w, https://substackcdn.com/image/fetch/$s_!cGMA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04878d2b-2e10-4534-a875-c595acc67162_2126x1482.png 848w, https://substackcdn.com/image/fetch/$s_!cGMA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04878d2b-2e10-4534-a875-c595acc67162_2126x1482.png 1272w, https://substackcdn.com/image/fetch/$s_!cGMA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04878d2b-2e10-4534-a875-c595acc67162_2126x1482.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cGMA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04878d2b-2e10-4534-a875-c595acc67162_2126x1482.png" width="456" height="317.88461538461536" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/04878d2b-2e10-4534-a875-c595acc67162_2126x1482.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1015,&quot;width&quot;:1456,&quot;resizeWidth&quot;:456,&quot;bytes&quot;:708981,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cGMA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04878d2b-2e10-4534-a875-c595acc67162_2126x1482.png 424w, https://substackcdn.com/image/fetch/$s_!cGMA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04878d2b-2e10-4534-a875-c595acc67162_2126x1482.png 848w, https://substackcdn.com/image/fetch/$s_!cGMA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04878d2b-2e10-4534-a875-c595acc67162_2126x1482.png 1272w, https://substackcdn.com/image/fetch/$s_!cGMA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04878d2b-2e10-4534-a875-c595acc67162_2126x1482.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">BookRemarks v0.2.0!</figcaption></figure></div><p>In the previous post on <a href="https://papayabytes.substack.com/p/guide-bookremarks-and-github-releases">adding versioning and releases</a> to BookRemarks ended with talk on adding additional features (and new releases) in the future.  In today&#8217;s post, we will:</p><ul><li><p>Modify the codebase to support IndexedDB to maintain our research sessions across browser restarts and over time.</p></li><li><p>Enhance the UI to work against this new data store and its API.</p></li><li><p>Cut a new version of BookRemarks in GitHub.</p></li></ul><h2>IndexedDB</h2><p><a href="https://en.wikipedia.org/wiki/Indexed_Database_API">IndexedDB</a> is a JavaScript API supported on multiple browsers that allows manipulation of a local <a href="https://en.wikipedia.org/wiki/NoSQL">NoSQL database</a>.  To simplify, it&#8217;s a way for us to store our data in persistent <a href="https://en.wikipedia.org/wiki/JSON">JSON</a> objects.  There are many ways to store data, but any serious software project will need to move beyond things like property (key/value) stores, cookies, in-memory only (does your process never restart?), etc.  The IndexedDB API will give us this ability in our Chrome extension.</p><h2>How to Upgrade BookRemarks</h2><p>In the earlier iteration, we merely were saving our captured data to an array in sidepanel.js:</p><pre><code>sessionData = new Array();</code></pre><p>There are many ways one could go about refactoring here to add IndexedDB support.  For now, let&#8217;s worry less about updating any existing code and add initial support for IndexedDB.</p><h3>New Branch</h3><p>First step is to create a new branch for this feature development.  We are going to branch off of main, NOT the new tagged release we made in the previous version.  We will name the new branch: <code>IndexedDB-Support-Added</code>.</p><h3>Creating a New IndexedDB Database</h3><p>Later we will discuss refactoring the code in relation to removing our previous localStorage code and adding code work with IndexedDB.  For now it will help to understand some fundamentals about using IndexedDB.</p><p>As IndexedDB is an API, there are fundamental "nice to haves" missing.  For example, if you want to search, you need to open a cursor and loop through your data and confirm if its a record you want (you can see this in the getActiveSessionFunction <a href="https://github.com/robpetty/bookremarks/blob/7798c59bb91adf6ba20b84e1a613af8af3d025f4/scripts/indexeddb.js#L85">here</a>).</p><p>To create a reference to IndexedDB and what will become our database, we use the following code (this is for example):</p><pre><code>let db
const db_request = indexedDB.open('BookRemarks', 1);</code></pre><p>It&#8217;s critical to note:</p><ul><li><p>If "BookRemarks", the database, does not exist, this will create it for us.</p></li><li><p>"1" is our version of the database.  This value MUST be a positive integer, do not version your code like a float or decimal.  Changing your version here would indicate you have updated your schema fundamentally.</p></li><li><p><code>open()</code> will create our database if it does not already exist.</p></li></ul><p>The call to open is to a factory method, which will return the reference to the database to us asynchronously.  This means we need to capture the various events that can arise.</p><h3>Event Handlers</h3><p>For now we will need to capture <code>onerror</code> and <code>onsuccess</code> from the earlier request.  We will output to the console some informational messages how it went:</p><pre><code>db_request.onsuccess = (event) =&gt; {
    console.log(event.target.result)
}

db_request.onerror = (event) =&gt; {
    console.log(event.target.result)
}</code></pre><p>When you load up your service worker DevTools window, in the console upon refresh of whatever page you loaded after opening BookRemarks, you will see some output like this (from db_request.onsuccess):</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!k5zx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55dad6cc-369f-4fb3-9003-0a123d5b6740_1836x480.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!k5zx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55dad6cc-369f-4fb3-9003-0a123d5b6740_1836x480.png 424w, https://substackcdn.com/image/fetch/$s_!k5zx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55dad6cc-369f-4fb3-9003-0a123d5b6740_1836x480.png 848w, https://substackcdn.com/image/fetch/$s_!k5zx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55dad6cc-369f-4fb3-9003-0a123d5b6740_1836x480.png 1272w, https://substackcdn.com/image/fetch/$s_!k5zx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55dad6cc-369f-4fb3-9003-0a123d5b6740_1836x480.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!k5zx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55dad6cc-369f-4fb3-9003-0a123d5b6740_1836x480.png" width="520" height="136.07142857142858" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/55dad6cc-369f-4fb3-9003-0a123d5b6740_1836x480.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:381,&quot;width&quot;:1456,&quot;resizeWidth&quot;:520,&quot;bytes&quot;:105185,&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_!k5zx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55dad6cc-369f-4fb3-9003-0a123d5b6740_1836x480.png 424w, https://substackcdn.com/image/fetch/$s_!k5zx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55dad6cc-369f-4fb3-9003-0a123d5b6740_1836x480.png 848w, https://substackcdn.com/image/fetch/$s_!k5zx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55dad6cc-369f-4fb3-9003-0a123d5b6740_1836x480.png 1272w, https://substackcdn.com/image/fetch/$s_!k5zx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55dad6cc-369f-4fb3-9003-0a123d5b6740_1836x480.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Database &#8220;BookRemarks&#8221; successfully created in IndexedDB!</figcaption></figure></div><h3>Refactoring</h3><p>For cleanliness, let&#8217;s do a bit of cleaning up.  The general flow we are looking for given the files involved is like this (using file names from the project):</p><pre><code>blank.js     &lt;---&gt; background.js &lt;---&gt; indexeddb.js
sidepanel.js &lt;---&gt; background.js &lt;---&gt; indexeddb.js
content.js   &lt;---&gt; background.js &lt;---&gt; indexeddb.js</code></pre><p>The intent here is direct interactions with IndexedDB will occur in indexeddb.js.  Given a Chrome extension does all its inter-script communication via its service worker(s), that critical messaging logic will go in background.js.  The UI interactions and user originating events will be of course in the content scripts, blank.js, content.js and sidepanel.js.</p><p>This means relative to v0.1.0, we want to:</p><ul><li><p>Remove all code related to Chrome localStorage, as we will no longer be using it.</p></li><li><p>Add code required to interact with IndexedDB.</p></li></ul><blockquote><p>To see the original code, please view the initial commit <a href="https://github.com/robpetty/bookremarks/commit/c39f6ee7a1d48e2e5dc2e5d22655046b6d4bc102">here</a>.</p></blockquote><p>We will first need to create the code to initialize an IndexedDB instance.  There are third party libraries out there to help make this experience easier, however, I went with the raw API&#8217;s to show what is going on under the hood.  </p><ul><li><p>Create ./scripts/indexeddb.js and add the following code:</p></li></ul><pre><code>// IndexedDB
let db;

// db and object store properties
const dbName = "BookRemarks";
const objectStoreName = "sessions";
const sessionKeyPath = "id";

async function initDb() {
  return new Promise((resolve, reject) =&gt; {
    let request = indexedDB.open(dbName, 1);

    request.onupgradeneeded = (event) =&gt; {
      console.log("idb onupgradeneeded");

      // onsuccess will fire are onupgradeneeded completes
      // so no need to resolve with db here.
      let db = event.target.result;

      let objectStore = db.createObjectStore(objectStoreName, {
        keyPath: sessionKeyPath,
        autoIncrement: true,
      });

      objectStore.createIndex("currentSessionIndex", "currentSession");
    };

    request.onsuccess = (event) =&gt; {
      resolve(event.target.result);
    };

    request.onerror = (event) =&gt; {
      alert("Error Event, check console");
      console.error(event);
    };
  });
}

// initialize database and session
(async () =&gt; {
  console.log("Initializing DB.");
  db = await initDb();
  console.log("DB initialized.");

  // stand up BookRemarks
  getActiveSession();
})();</code></pre><p>This code creates an instance of the database when this file is loaded.  This is done via the initialization code at the end.  Currently you can&#8217;t use "await" on the top level so we have wrapped the initialization code in an anonymous function.  Additionally we obtain the current session from the database, if it already exists. </p><ul><li><p>At the top of background.js add the following importScripts code:</p></li></ul><pre><code>try {
    importScripts('/scripts/indexeddb.js');

    console.log("Scripts imported.")
} catch (e) {
    console.log("Failed to load indexeddb script.")
    console.error(e);
}</code></pre><p>This will synchronously import the indexeddb.js script when background.js loads, helping ensure the availability of the database to the extension.</p><h3>Data (Non-) Schema</h3><p>This is a time to mention that IndexedDB is not a database per se, rather an API on top of a NoSQL database. This means we still have some configuration to do.  Earlier we created the database instance for the extension, but what we did not create was the actual data store inside the database to hold our data.  This is called the Object Store.  Each record (aka a document) represents one object in the Object Store.</p><p>Given the NoSQL nature of this type of database, many people presume it means no-schema.  This is not true.  While the schema can be highly divergent between records in the Object Store, it does not mean its absence of all structure (schema).</p><p>In the BookRemark extension, we capture two types of data:</p><ul><li><p>Bookmarks - Captured during bookmark creation in the browser.</p></li><li><p>Content - Selected text and metadata around it.</p></li></ul><p>We have been saving this data in the sessionData array via two captured events, "bookmarkCreated" and "contentCapture".  Let&#8217;s break down the current structure of the messages (data) sent with these events.</p><h4>Bookmark Data</h4><ul><li><p>type (bookmark or content)</p></li><li><p>url</p></li></ul><h4>Content Data</h4><ul><li><p>type (bookmark or content)</p></li><li><p>selectedText</p></li><li><p>url</p></li><li><p>fullBodyText </p></li><li><p>date</p></li></ul><p>One critical item missing here in our MVP (minimal viable product) is data about the session itself.  No where did we really capture this.  We will expand on this concept to group all these items together into a cohesive structure.</p><h4>Session Data</h4><ul><li><p>id (will use as unique key)</p></li><li><p>currentSession</p></li><li><p>name (name of the session)</p></li><li><p>startDate</p></li><li><p>bookmarks[]</p></li><li><p>contentCapture[]</p></li></ul><p>This structure captures basic data about the research session as well as groups all the data we collected.  A session data record on its own should clearly resemble the over-time data capture activity of the extension.</p><p>To get our data structured how we like, we will need to make a few updates. Conceptually we need to now handle:</p><ul><li><p>Multiple sessions, with only one active at a time.</p></li><li><p>Understand which is the current session (needed for loading the correct data).</p></li><li><p>Ability to switch between sessions.</p></li><li><p>Ability to save sessions.</p></li><li><p>Ability to delete sessions.</p></li></ul><p>Fundamentally we are building out the CRUD processes (create, read, update and delete) which will take a combination of data structure and UI enhancements.</p><h3>Sessions</h3><h4>New Session</h4><p>When the extension loads, we need to see if a session exists, and if so, is it the active session.  If it does not exist, we need to set things up for the new current session.  </p><p>In indexeddb.js we will create a function name <code>getActiveSession()</code> that is called when the extension is loaded and database initialized.  </p><p>Alternatively, when you save and close or delete a session, the side panel will refresh accordingly and place the side panel back into a "new" session state.</p><h4>Changing Sessions</h4><p>A dropdown will be added, to which its options will contain the session id as their values and sessionName as the option text.  Upon selecting a value from the dropdown, the side panel will refresh to show the selected session.</p><h4>Deleting a Session</h4><p>If you delete the current active session, it will be removed from IndexedDB and the side panel again will refresh back into a "new" state.</p><h3>UI Enhancements</h3><p>The initial version of BookRemarks looked pretty sparse.  With the additional functionality added, this was a good time to make the interface better.  While third party libraries could really spruce it up, as these posts are about how to build things, I opted to go with pure DOM manipulation behind the scenes in JavaScript (both for the database and the UI interactions).</p><p>The plan of attack is:</p><ul><li><p>Move the core rendering of the side panel timeline out, to its own timelineRenderer.js file.</p></li><li><p>Extract related and common functionality to its own functions, like rendering of the bottom toolbar where our buttons are and code related to the dropdown. Also not just UI, but state management, like keep tracking the <code>activeSession</code> and resetting state on 'new'.</p></li><li><p>Update the CSS, well, everywhere, to help make it all look nicer.</p></li><li><p>Update bookremarks.html, which is our replacement page for the blank tab in Chrome.  This page gives us a more spaced out view of our saved session(s) as well as its own functionality, such as allowing us to see the full body of text captured when you select text.  This allows you to go back and see what the full text was at the time of capture.</p></li></ul><h2>Debugging</h2><p>Service worker DevTools does not have access to Application&#8594;IndexedDB to see the data.  You must:</p><ul><li><p>Open a visual component&#8217;s DevTools, inspect your popup, side panel or overridden default page (history, bookmarks or about:newtab).</p></li><li><p>If there is no page in your extension, get the ID of your extension from chrome://extensions, and then visit the manifest page of the extension in chrome via:<br><code>chrome-extension://{extension_id_here}/manifest.json</code><br>Then inspect that page to see your extensions instance of IndexedDB.</p></li></ul><p><strong>NOTE:</strong> While you can view and interact in the pages DevTools view, you can only directly run code against the instance in your Service Worker DevTools.  Meaning if you put a function like "<code>saveDummyObject()</code>" to add test data and want to run it from the DevTools console, it has to be done in the background worker DevTools to have context.</p><h2>Summary</h2><p>While on the surface, outside of some UI cleanup and obvious functional additions, not much changed.  However, under the hood, the code took a big step towards something more real.  </p><p>However, there are many aspects of the extension that need looking into, for example:</p><ul><li><p>As it works on all open Chrome browsers (non-incognitio, but that can be added), highlighted text on one page will be recaptured if not deselected when selecting on another page.  Probably not ideal but of course can be handled.  Maybe a good time to look into activeTab permissions instead of universal url access?</p></li><li><p>Third party libraries.  There was no real need outside learning to use the raw API.  One could use the popular Dexie library that wraps IndexedDB for us.  Same with our DOM interactions, why not use a framework or library designed for it?</p></li><li><p>Missing features.  Well, we did not exactly lay any out, so are they truly missing?  But to be a proper extension, it should do what it&#8217;s described to do, and only that.  Has research been made fundamentally better yet? Maybe not, but it&#8217;s a start.</p></li></ul><p>A root though to these three points is product design.  If you do some research on capabilities, along with your own experience, lots of missteps and even needs for refactors could have been avoided with some groundwork done first.  </p><p>The code for this post can be found on GitHub <a href="https://github.com/robpetty/bookremarks">here</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://papayabytes.substack.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 PapayaBytes! 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[Guide: BookRemarks and GitHub Releases]]></title><description><![CDATA[Controlling releases of BookRemarks with Semantic Versioning and GitHub Releases.]]></description><link>https://papayabytes.substack.com/p/guide-bookremarks-and-github-releases</link><guid isPermaLink="false">https://papayabytes.substack.com/p/guide-bookremarks-and-github-releases</guid><dc:creator><![CDATA[Rob]]></dc:creator><pubDate>Sun, 13 Aug 2023 22:49:49 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df7e50-5892-4627-8d92-14d581d1ca08_2346x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the initial BookRemarks post, we built out a basic MVP to showcase more of what can be done as an extension and not a lot yet about being a usable tool.  In this post, we start to address these issues and lay some groundwork for future updates. Feel free to refresh yourself by reading over the original post here:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;854f77ba-2d35-4b09-bff2-44e8abbe67f0&quot;,&quot;caption&quot;:&quot;If you are like lots of people I know, you spend too much time organizing bookmarks in Chrome with the hopes that it will speed up finding some bit of data sometime in the future. You also might be doing research and want to keep some sources organized based on some important text you found.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Guide: Building a Better Bookmark Extension&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:153565442,&quot;name&quot;:&quot;Rob&quot;,&quot;bio&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a4137f6b-9752-4f0e-a5c2-e32d8f4ad5d6_1000x1000.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-08-04T20:00:09.161Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73accda2-4416-4561-8cd0-694bb42ed765_1954x1068.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://papayabytes.substack.com/p/guide-building-a-better-bookmark&quot;,&quot;section_name&quot;:&quot;Code&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:135668927,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;PapayaBytes&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e5e0556-7e55-4e5e-8544-a4a6f5bd8a38_1000x1000.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><h2>Versioning and Releases</h2><p>Previously we added the BookRemarks source to GitHub for source control.  Aside from a best-practice (source control) it allows us to start considering what is a release.  For now what I will show is less about perfect project management and more just to expose how to do it so you can start to think about it in your case.  There are many ways to version (and tag) your release, for example having monthly releases, quarterly releases, releases based on crazy nicknames.  </p><h3>Semantic Versioning</h3><p>To be more methodical, we will use <a href="https://semver.org">Semantic Versioning 2.0.0</a>, which is summarized as:</p><blockquote><p>Given a version number MAJOR.MINOR.PATCH, increment the:</p><ol><li><p>MAJOR version when you make incompatible API changes</p></li><li><p>MINOR version when you add functionality in a backward compatible manner</p></li><li><p>PATCH version when you make backward compatible bug fixes</p></li></ol><p>Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format. </p></blockquote><p>Given the above concepts, means we will now convert the earlier code deployed to GitHub as 0.1.0 (0 as initial version overall, 1 for our basic initial functionality, 0 as it&#8217;s not fixing anything, though no doubt bugs are hiding somewhere in there).  So how to do this with GitHub?</p><h2>GitHub Release</h2><p>For now we are going to use the GitHub website to set up our release, though there are other ways to do it (GitHub Actions for example).  It&#8217;s not a very heavy process however.  The process is as follows:</p><ul><li><p>Navigate to your repo, for myself, this means go over to BookRemarks repo at https://github.com/robpetty/bookremarks.</p></li></ul><p>In the right side of the page you will see a Release section, with a "Create a new release" link:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!M1rp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4391c737-fb04-4285-af79-b9fde5a3dde4_2346x1432.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!M1rp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4391c737-fb04-4285-af79-b9fde5a3dde4_2346x1432.png 424w, https://substackcdn.com/image/fetch/$s_!M1rp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4391c737-fb04-4285-af79-b9fde5a3dde4_2346x1432.png 848w, https://substackcdn.com/image/fetch/$s_!M1rp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4391c737-fb04-4285-af79-b9fde5a3dde4_2346x1432.png 1272w, https://substackcdn.com/image/fetch/$s_!M1rp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4391c737-fb04-4285-af79-b9fde5a3dde4_2346x1432.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!M1rp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4391c737-fb04-4285-af79-b9fde5a3dde4_2346x1432.png" width="524" height="319.9423076923077" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4391c737-fb04-4285-af79-b9fde5a3dde4_2346x1432.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:889,&quot;width&quot;:1456,&quot;resizeWidth&quot;:524,&quot;bytes&quot;:367359,&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_!M1rp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4391c737-fb04-4285-af79-b9fde5a3dde4_2346x1432.png 424w, https://substackcdn.com/image/fetch/$s_!M1rp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4391c737-fb04-4285-af79-b9fde5a3dde4_2346x1432.png 848w, https://substackcdn.com/image/fetch/$s_!M1rp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4391c737-fb04-4285-af79-b9fde5a3dde4_2346x1432.png 1272w, https://substackcdn.com/image/fetch/$s_!M1rp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4391c737-fb04-4285-af79-b9fde5a3dde4_2346x1432.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">Create a new release is on the right side under the Releases label.</figcaption></figure></div><ul><li><p>On your {repo}/releases/new page, you will want to create a tag.  As suggested on the right side, it&#8217;s very common to use your version number with the letter 'v' prefixing the string, like v0.1.0. So click "Choose a tag" and "+ Create new tag" and enter v0.1.0 and press enter:</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vJXk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7487686-4a54-4ec7-85f9-584cb1d73a57_762x334.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vJXk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7487686-4a54-4ec7-85f9-584cb1d73a57_762x334.png 424w, https://substackcdn.com/image/fetch/$s_!vJXk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7487686-4a54-4ec7-85f9-584cb1d73a57_762x334.png 848w, https://substackcdn.com/image/fetch/$s_!vJXk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7487686-4a54-4ec7-85f9-584cb1d73a57_762x334.png 1272w, https://substackcdn.com/image/fetch/$s_!vJXk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7487686-4a54-4ec7-85f9-584cb1d73a57_762x334.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vJXk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7487686-4a54-4ec7-85f9-584cb1d73a57_762x334.png" width="368" height="161.3018372703412" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e7487686-4a54-4ec7-85f9-584cb1d73a57_762x334.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:334,&quot;width&quot;:762,&quot;resizeWidth&quot;:368,&quot;bytes&quot;:46488,&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_!vJXk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7487686-4a54-4ec7-85f9-584cb1d73a57_762x334.png 424w, https://substackcdn.com/image/fetch/$s_!vJXk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7487686-4a54-4ec7-85f9-584cb1d73a57_762x334.png 848w, https://substackcdn.com/image/fetch/$s_!vJXk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7487686-4a54-4ec7-85f9-584cb1d73a57_762x334.png 1272w, https://substackcdn.com/image/fetch/$s_!vJXk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7487686-4a54-4ec7-85f9-584cb1d73a57_762x334.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Creating our first release version tag.</figcaption></figure></div><ul><li><p>From here, a few extra things to note:</p><ul><li><p>We will use the main branch for now, so leave Target: main.</p></li><li><p>Enter a "Release title" and a "description" you find appropriate.</p></li><li><p>Check the "Set as a pre-release" checkbox.  As this is a learning project and not really stable, we want to indicate this is a work in progress.  This could also be done in the tag itself, but GitHub will handle this for us by checking this box.</p></li></ul></li></ul><p>Your screen 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_!S0Uz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25b37386-4cb9-410f-b3fc-d822c696aa23_2346x1642.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!S0Uz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25b37386-4cb9-410f-b3fc-d822c696aa23_2346x1642.png 424w, https://substackcdn.com/image/fetch/$s_!S0Uz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25b37386-4cb9-410f-b3fc-d822c696aa23_2346x1642.png 848w, https://substackcdn.com/image/fetch/$s_!S0Uz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25b37386-4cb9-410f-b3fc-d822c696aa23_2346x1642.png 1272w, https://substackcdn.com/image/fetch/$s_!S0Uz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25b37386-4cb9-410f-b3fc-d822c696aa23_2346x1642.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!S0Uz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25b37386-4cb9-410f-b3fc-d822c696aa23_2346x1642.png" width="598" height="418.51785714285717" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/25b37386-4cb9-410f-b3fc-d822c696aa23_2346x1642.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1019,&quot;width&quot;:1456,&quot;resizeWidth&quot;:598,&quot;bytes&quot;:388259,&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_!S0Uz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25b37386-4cb9-410f-b3fc-d822c696aa23_2346x1642.png 424w, https://substackcdn.com/image/fetch/$s_!S0Uz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25b37386-4cb9-410f-b3fc-d822c696aa23_2346x1642.png 848w, https://substackcdn.com/image/fetch/$s_!S0Uz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25b37386-4cb9-410f-b3fc-d822c696aa23_2346x1642.png 1272w, https://substackcdn.com/image/fetch/$s_!S0Uz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25b37386-4cb9-410f-b3fc-d822c696aa23_2346x1642.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">Config right before creating the initial release.</figcaption></figure></div><p>So far so good, now just click "Publish Release".  The result of this operation will be your first release, v0.1.0, and the assets related to your release zipped and tar+gzipped as seen below:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PLZ6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda2283ae-8043-4c9e-b01c-88321d5e7c0d_2346x1350.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PLZ6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda2283ae-8043-4c9e-b01c-88321d5e7c0d_2346x1350.png 424w, https://substackcdn.com/image/fetch/$s_!PLZ6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda2283ae-8043-4c9e-b01c-88321d5e7c0d_2346x1350.png 848w, https://substackcdn.com/image/fetch/$s_!PLZ6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda2283ae-8043-4c9e-b01c-88321d5e7c0d_2346x1350.png 1272w, https://substackcdn.com/image/fetch/$s_!PLZ6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda2283ae-8043-4c9e-b01c-88321d5e7c0d_2346x1350.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PLZ6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda2283ae-8043-4c9e-b01c-88321d5e7c0d_2346x1350.png" width="550" height="316.5521978021978" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/da2283ae-8043-4c9e-b01c-88321d5e7c0d_2346x1350.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:838,&quot;width&quot;:1456,&quot;resizeWidth&quot;:550,&quot;bytes&quot;:235792,&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_!PLZ6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda2283ae-8043-4c9e-b01c-88321d5e7c0d_2346x1350.png 424w, https://substackcdn.com/image/fetch/$s_!PLZ6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda2283ae-8043-4c9e-b01c-88321d5e7c0d_2346x1350.png 848w, https://substackcdn.com/image/fetch/$s_!PLZ6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda2283ae-8043-4c9e-b01c-88321d5e7c0d_2346x1350.png 1272w, https://substackcdn.com/image/fetch/$s_!PLZ6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda2283ae-8043-4c9e-b01c-88321d5e7c0d_2346x1350.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">The Alpha release v0.1.0!</figcaption></figure></div><p>Now when you click "Releases" from the homepage of your repo you will get a view of your releases, by release version, or by tags:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!INJp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df7e50-5892-4627-8d92-14d581d1ca08_2346x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!INJp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df7e50-5892-4627-8d92-14d581d1ca08_2346x1260.png 424w, https://substackcdn.com/image/fetch/$s_!INJp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df7e50-5892-4627-8d92-14d581d1ca08_2346x1260.png 848w, https://substackcdn.com/image/fetch/$s_!INJp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df7e50-5892-4627-8d92-14d581d1ca08_2346x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!INJp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df7e50-5892-4627-8d92-14d581d1ca08_2346x1260.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!INJp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df7e50-5892-4627-8d92-14d581d1ca08_2346x1260.png" width="532" height="285.7307692307692" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d1df7e50-5892-4627-8d92-14d581d1ca08_2346x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:782,&quot;width&quot;:1456,&quot;resizeWidth&quot;:532,&quot;bytes&quot;:221011,&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_!INJp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df7e50-5892-4627-8d92-14d581d1ca08_2346x1260.png 424w, https://substackcdn.com/image/fetch/$s_!INJp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df7e50-5892-4627-8d92-14d581d1ca08_2346x1260.png 848w, https://substackcdn.com/image/fetch/$s_!INJp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df7e50-5892-4627-8d92-14d581d1ca08_2346x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!INJp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df7e50-5892-4627-8d92-14d581d1ca08_2346x1260.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">The release page.</figcaption></figure></div><h2>Next Release?</h2><p>Ok, so now that we did this, why?  The original extension is an alpha proof of concept. Now it&#8217;s time to start iterating on specific functionality and building a more formalized release process.  Now we know how to "cut" a release, it&#8217;s now time to start building.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://papayabytes.substack.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 PapayaBytes! 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[React Basics]]></title><description><![CDATA[How to create a basic React application and debug in VS Code.]]></description><link>https://papayabytes.substack.com/p/react-basics</link><guid isPermaLink="false">https://papayabytes.substack.com/p/react-basics</guid><dc:creator><![CDATA[Rob]]></dc:creator><pubDate>Tue, 08 Aug 2023 23:53:54 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!dERV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe36adff-7b42-488c-a06c-e4c26b44dad8_1862x1444.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dERV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe36adff-7b42-488c-a06c-e4c26b44dad8_1862x1444.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dERV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe36adff-7b42-488c-a06c-e4c26b44dad8_1862x1444.png 424w, https://substackcdn.com/image/fetch/$s_!dERV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe36adff-7b42-488c-a06c-e4c26b44dad8_1862x1444.png 848w, https://substackcdn.com/image/fetch/$s_!dERV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe36adff-7b42-488c-a06c-e4c26b44dad8_1862x1444.png 1272w, https://substackcdn.com/image/fetch/$s_!dERV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe36adff-7b42-488c-a06c-e4c26b44dad8_1862x1444.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dERV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe36adff-7b42-488c-a06c-e4c26b44dad8_1862x1444.png" width="570" height="441.9848901098901" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/be36adff-7b42-488c-a06c-e4c26b44dad8_1862x1444.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1129,&quot;width&quot;:1456,&quot;resizeWidth&quot;:570,&quot;bytes&quot;:446487,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dERV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe36adff-7b42-488c-a06c-e4c26b44dad8_1862x1444.png 424w, https://substackcdn.com/image/fetch/$s_!dERV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe36adff-7b42-488c-a06c-e4c26b44dad8_1862x1444.png 848w, https://substackcdn.com/image/fetch/$s_!dERV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe36adff-7b42-488c-a06c-e4c26b44dad8_1862x1444.png 1272w, https://substackcdn.com/image/fetch/$s_!dERV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe36adff-7b42-488c-a06c-e4c26b44dad8_1862x1444.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">React via Visual Studio Code</figcaption></figure></div><p>React is one of the most popular and powerful JavaScript user interface libraries available today.  The React ecosystem now includes all kinds of helpful frameworks, tools, libraries, etc.  The goal of this post is to show how fast one can get started with React and drop knowledge along the way to help you down the road.</p><h2>Getting Started</h2><h3>Prerequisites</h3><p>We will be using Visual Studio Code and Node.js as our underlying toolchain. If you do not have these tools installed, if you like to use Homebrew to make installation easy, see this post how to install Homebrew and Visual Studio Code:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;76d45f00-2843-483e-a9fd-89cfb8fc4f56&quot;,&quot;caption&quot;:&quot;The following post will describe how to install the basic developer setup on a Mac from scratch, for working in Python. Homebrew First up, you will need a package manager. Homebrew has become the de facto choice recently on the Mac platform. First, you need to open a command line somewhere, either:&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Guide: Homebrew, Python and Visual Studio Code on Mac&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:153565442,&quot;name&quot;:&quot;Rob&quot;,&quot;bio&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a4137f6b-9752-4f0e-a5c2-e32d8f4ad5d6_1000x1000.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-07-17T23:23:48.475Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/582c19b9-1181-4592-b3c0-919d012acd03_2458x1668.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://papayabytes.substack.com/p/guide-homebrew-python-and-visual&quot;,&quot;section_name&quot;:&quot;Code&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:135137206,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;PapayaBytes&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e5e0556-7e55-4e5e-8544-a4a6f5bd8a38_1000x1000.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>As we will use Node.js and not Python, you can ignore the Python details there, and run the following command to install Node.js after installing Homebrew:</p><pre><code>brew install node</code></pre><p>Why do we need <code>node</code>? Node.js is an open-source server that can run JavaScript outside of the browser.  More directly in our case, it includes a module called "create-react-app" that allows us to generate our initial React app nearly instantly. We will also be using the npm package manager from Node.js, as well as npx (node package execute).</p><h2>Build the App</h2><p>Now that we have the basic toolchain ready, we will speed through the initial creation and then talk about what happened. </p><p><strong>0 - In Visual Studio Code, open a terminal and navigate to your source code folder</strong></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Dbo7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86dc4f29-7248-4b95-9115-117d2dc97457_980x262.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Dbo7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86dc4f29-7248-4b95-9115-117d2dc97457_980x262.png 424w, https://substackcdn.com/image/fetch/$s_!Dbo7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86dc4f29-7248-4b95-9115-117d2dc97457_980x262.png 848w, https://substackcdn.com/image/fetch/$s_!Dbo7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86dc4f29-7248-4b95-9115-117d2dc97457_980x262.png 1272w, https://substackcdn.com/image/fetch/$s_!Dbo7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86dc4f29-7248-4b95-9115-117d2dc97457_980x262.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Dbo7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86dc4f29-7248-4b95-9115-117d2dc97457_980x262.png" width="426" height="113.88979591836734" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/86dc4f29-7248-4b95-9115-117d2dc97457_980x262.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:262,&quot;width&quot;:980,&quot;resizeWidth&quot;:426,&quot;bytes&quot;:29186,&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_!Dbo7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86dc4f29-7248-4b95-9115-117d2dc97457_980x262.png 424w, https://substackcdn.com/image/fetch/$s_!Dbo7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86dc4f29-7248-4b95-9115-117d2dc97457_980x262.png 848w, https://substackcdn.com/image/fetch/$s_!Dbo7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86dc4f29-7248-4b95-9115-117d2dc97457_980x262.png 1272w, https://substackcdn.com/image/fetch/$s_!Dbo7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86dc4f29-7248-4b95-9115-117d2dc97457_980x262.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">VS Code terminal.</figcaption></figure></div><p><strong>NOTE:</strong> We will work out of the terminal in VS Code going forward.</p><p><strong>1 - Install the create-react-app module</strong></p><pre><code>npm install -g create-react-app</code></pre><p><strong>2 - Run create-react-app, pass in the name of your React application</strong></p><pre><code>npx create-react-app react-test-app</code></pre><p><strong>3 - Navigate into your applications folder</strong></p><pre><code>cd react-test-app</code></pre><p><strong>4 - Start your application</strong></p><pre><code>npm start</code></pre><p><strong>NOTE:</strong> You might be prompted to allow VS Code to access Google Chrome (or your default browser) to perform access, click "Ok"</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!l2of!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6ad3c1b-479f-4bd2-9a79-1a3a8649c6a9_520x660.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!l2of!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6ad3c1b-479f-4bd2-9a79-1a3a8649c6a9_520x660.png 424w, https://substackcdn.com/image/fetch/$s_!l2of!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6ad3c1b-479f-4bd2-9a79-1a3a8649c6a9_520x660.png 848w, https://substackcdn.com/image/fetch/$s_!l2of!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6ad3c1b-479f-4bd2-9a79-1a3a8649c6a9_520x660.png 1272w, https://substackcdn.com/image/fetch/$s_!l2of!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6ad3c1b-479f-4bd2-9a79-1a3a8649c6a9_520x660.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!l2of!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6ad3c1b-479f-4bd2-9a79-1a3a8649c6a9_520x660.png" width="250" height="317.3076923076923" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a6ad3c1b-479f-4bd2-9a79-1a3a8649c6a9_520x660.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:660,&quot;width&quot;:520,&quot;resizeWidth&quot;:250,&quot;bytes&quot;:88559,&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_!l2of!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6ad3c1b-479f-4bd2-9a79-1a3a8649c6a9_520x660.png 424w, https://substackcdn.com/image/fetch/$s_!l2of!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6ad3c1b-479f-4bd2-9a79-1a3a8649c6a9_520x660.png 848w, https://substackcdn.com/image/fetch/$s_!l2of!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6ad3c1b-479f-4bd2-9a79-1a3a8649c6a9_520x660.png 1272w, https://substackcdn.com/image/fetch/$s_!l2of!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6ad3c1b-479f-4bd2-9a79-1a3a8649c6a9_520x660.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">Hope we don&#8217;t regret this!</figcaption></figure></div><p>That&#8217;s it! In your browser, on http://localhost:3000 you will see the default index.js page.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pYa6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F501878d1-a252-43c9-b1c7-9b9e3a54ddc7_2288x1564.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pYa6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F501878d1-a252-43c9-b1c7-9b9e3a54ddc7_2288x1564.png 424w, https://substackcdn.com/image/fetch/$s_!pYa6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F501878d1-a252-43c9-b1c7-9b9e3a54ddc7_2288x1564.png 848w, https://substackcdn.com/image/fetch/$s_!pYa6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F501878d1-a252-43c9-b1c7-9b9e3a54ddc7_2288x1564.png 1272w, https://substackcdn.com/image/fetch/$s_!pYa6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F501878d1-a252-43c9-b1c7-9b9e3a54ddc7_2288x1564.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pYa6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F501878d1-a252-43c9-b1c7-9b9e3a54ddc7_2288x1564.png" width="452" height="308.8873626373626" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/501878d1-a252-43c9-b1c7-9b9e3a54ddc7_2288x1564.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:995,&quot;width&quot;:1456,&quot;resizeWidth&quot;:452,&quot;bytes&quot;:210328,&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_!pYa6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F501878d1-a252-43c9-b1c7-9b9e3a54ddc7_2288x1564.png 424w, https://substackcdn.com/image/fetch/$s_!pYa6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F501878d1-a252-43c9-b1c7-9b9e3a54ddc7_2288x1564.png 848w, https://substackcdn.com/image/fetch/$s_!pYa6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F501878d1-a252-43c9-b1c7-9b9e3a54ddc7_2288x1564.png 1272w, https://substackcdn.com/image/fetch/$s_!pYa6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F501878d1-a252-43c9-b1c7-9b9e3a54ddc7_2288x1564.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">That was fast!</figcaption></figure></div><p>In the VS Code terminal you will see the output from npm start, including how to view your page locally as well as on your local network as seen below:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Nyru!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F094dff16-4a65-4ea0-8d02-e5d3c3ba0ad0_1508x430.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Nyru!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F094dff16-4a65-4ea0-8d02-e5d3c3ba0ad0_1508x430.png 424w, https://substackcdn.com/image/fetch/$s_!Nyru!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F094dff16-4a65-4ea0-8d02-e5d3c3ba0ad0_1508x430.png 848w, https://substackcdn.com/image/fetch/$s_!Nyru!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F094dff16-4a65-4ea0-8d02-e5d3c3ba0ad0_1508x430.png 1272w, https://substackcdn.com/image/fetch/$s_!Nyru!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F094dff16-4a65-4ea0-8d02-e5d3c3ba0ad0_1508x430.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Nyru!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F094dff16-4a65-4ea0-8d02-e5d3c3ba0ad0_1508x430.png" width="512" height="145.93406593406593" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/094dff16-4a65-4ea0-8d02-e5d3c3ba0ad0_1508x430.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:415,&quot;width&quot;:1456,&quot;resizeWidth&quot;:512,&quot;bytes&quot;:69799,&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_!Nyru!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F094dff16-4a65-4ea0-8d02-e5d3c3ba0ad0_1508x430.png 424w, https://substackcdn.com/image/fetch/$s_!Nyru!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F094dff16-4a65-4ea0-8d02-e5d3c3ba0ad0_1508x430.png 848w, https://substackcdn.com/image/fetch/$s_!Nyru!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F094dff16-4a65-4ea0-8d02-e5d3c3ba0ad0_1508x430.png 1272w, https://substackcdn.com/image/fetch/$s_!Nyru!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F094dff16-4a65-4ea0-8d02-e5d3c3ba0ad0_1508x430.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Great, we&#8217;re already rocking!</figcaption></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!d3Vg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec7e78bc-6ef2-4bb8-a7a3-cd216676444d_683x1464.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!d3Vg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec7e78bc-6ef2-4bb8-a7a3-cd216676444d_683x1464.jpeg 424w, https://substackcdn.com/image/fetch/$s_!d3Vg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec7e78bc-6ef2-4bb8-a7a3-cd216676444d_683x1464.jpeg 848w, https://substackcdn.com/image/fetch/$s_!d3Vg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec7e78bc-6ef2-4bb8-a7a3-cd216676444d_683x1464.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!d3Vg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec7e78bc-6ef2-4bb8-a7a3-cd216676444d_683x1464.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!d3Vg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec7e78bc-6ef2-4bb8-a7a3-cd216676444d_683x1464.jpeg" width="191" height="409.40556368960466" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ec7e78bc-6ef2-4bb8-a7a3-cd216676444d_683x1464.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1464,&quot;width&quot;:683,&quot;resizeWidth&quot;:191,&quot;bytes&quot;:46457,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!d3Vg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec7e78bc-6ef2-4bb8-a7a3-cd216676444d_683x1464.jpeg 424w, https://substackcdn.com/image/fetch/$s_!d3Vg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec7e78bc-6ef2-4bb8-a7a3-cd216676444d_683x1464.jpeg 848w, https://substackcdn.com/image/fetch/$s_!d3Vg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec7e78bc-6ef2-4bb8-a7a3-cd216676444d_683x1464.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!d3Vg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec7e78bc-6ef2-4bb8-a7a3-cd216676444d_683x1464.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">We can even gauge how this is on a real mobile device now. (Via my cellphone hitting http://10.0.0.77:3000).</figcaption></figure></div><p>But what actually has happened here?</p><h3>npx </h3><p>We initially installed NPX (node package execute, the node package runner), to allow us to execute the create-react-app module we were using in the upcoming steps.</p><h3>create-react-app</h3><p>The create-react-app is a Node.js module that quickly builds out a single-page React application as well as setting up the development environment needed to work on your React app.  It includes a lot of other features however:</p><ul><li><p>ECMAScript version support</p></li><li><p>Asset handling</p></li><li><p>CSS handling</p></li><li><p>ESLint analyzing</p></li><li><p>Instant reload</p></li><li><p>&#8230; and other features</p></li></ul><h3>npm start</h3><p>Thanks to the create-react-app module, our configuration was ready to go for launching our React application through node via the preconfigured package.json files "scripts" config.  In this case, the "start" script runs:</p><p>"react-scripts start"</p><p>Launched the node process and automatically handled VS Code opening Chrome tab to "http://localhost/3000".</p><h2>Application Structure</h2><p>Let&#8217;s talk about the files and folders that were generated for us and what they do.</p><ul><li><p>node_modules (folder) - npm-installed packages (Do not check into GitHub!).</p></li><li><p>public (folder)</p><ul><li><p>favicon.ico - icon generally used by browsers to indicate your web page in the tab(s)</p></li><li><p>index.html - React injects your app code in the <code>&lt;div id="root"&gt;&lt;/div&gt;</code> element.</p></li><li><p>logo192.png and logo512.png</p></li><li><p>manifest.json - contains metadata about your application</p></li><li><p>robots.txt - define what user agents and web crawlers are allowed, or not, to analyze your web site</p></li></ul></li><li><p>src (folder)</p><ul><li><p>App.css - for styling your React components</p></li><li><p>App.js - contains the main logic of your React application, the main component</p></li><li><p>App.test.js - contains your unit tests, run by Jest (which was configured via create-react-app, optional)</p></li><li><p>index.css - for global styling</p></li><li><p>index.js - for any bootstrapping needed</p></li><li><p>logo.svg - scalable logo used in App.js</p></li><li><p>reportWebVitals.js - reports performance of your app (optional)</p></li><li><p>setupTests.js - test configuration (jest by default, optional)</p></li></ul></li><li><p>.gitignore- to prevent folders and files from being checked into Git/GitHub.</p></li><li><p>package-lock.json- npm-generated file to keep track of specifically installed dependencies (and sub dependencies).</p></li><li><p>package.json - node project config and metadata. npm also uses this file to know what dependencies to install.</p></li><li><p>README.md - file used to provide project details in GitHub.</p></li></ul><p><strong>NOTES</strong></p><ul><li><p>Webpack does not read the public folder, so do not place code files in it.</p></li><li><p>%PULIC_URL% URI segments tells React to compile into the output (avoid if possible).</p></li></ul><h2>Debugging React in VS Code</h2><p>It&#8217;s great we can get this running so fast, but a project of any complexity will require being able to debug it.  How can we set up debugging in VS Code?</p><ul><li><p>Click Run and Debug in the left panel.</p></li><li><p>Click "create a launch.json file".</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fRzh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93b19a37-4f3a-4c83-8e75-e5196e796af5_744x410.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fRzh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93b19a37-4f3a-4c83-8e75-e5196e796af5_744x410.png 424w, https://substackcdn.com/image/fetch/$s_!fRzh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93b19a37-4f3a-4c83-8e75-e5196e796af5_744x410.png 848w, https://substackcdn.com/image/fetch/$s_!fRzh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93b19a37-4f3a-4c83-8e75-e5196e796af5_744x410.png 1272w, https://substackcdn.com/image/fetch/$s_!fRzh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93b19a37-4f3a-4c83-8e75-e5196e796af5_744x410.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fRzh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93b19a37-4f3a-4c83-8e75-e5196e796af5_744x410.png" width="338" height="186.26344086021504" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/93b19a37-4f3a-4c83-8e75-e5196e796af5_744x410.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:410,&quot;width&quot;:744,&quot;resizeWidth&quot;:338,&quot;bytes&quot;:45339,&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_!fRzh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93b19a37-4f3a-4c83-8e75-e5196e796af5_744x410.png 424w, https://substackcdn.com/image/fetch/$s_!fRzh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93b19a37-4f3a-4c83-8e75-e5196e796af5_744x410.png 848w, https://substackcdn.com/image/fetch/$s_!fRzh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93b19a37-4f3a-4c83-8e75-e5196e796af5_744x410.png 1272w, https://substackcdn.com/image/fetch/$s_!fRzh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93b19a37-4f3a-4c83-8e75-e5196e796af5_744x410.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Location of "create a launch.json file".</figcaption></figure></div></li><li><p>Click Web App (Chrome), this will create launch.json and add a configuration to launch the Chrome browser on http://localhost:8080 as seen below. These steps will add .vscode/launch.json to your project.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bSXs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb93efdb-3d12-45fd-9964-dc05cede0c7e_1356x336.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bSXs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb93efdb-3d12-45fd-9964-dc05cede0c7e_1356x336.png 424w, https://substackcdn.com/image/fetch/$s_!bSXs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb93efdb-3d12-45fd-9964-dc05cede0c7e_1356x336.png 848w, https://substackcdn.com/image/fetch/$s_!bSXs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb93efdb-3d12-45fd-9964-dc05cede0c7e_1356x336.png 1272w, https://substackcdn.com/image/fetch/$s_!bSXs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb93efdb-3d12-45fd-9964-dc05cede0c7e_1356x336.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bSXs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb93efdb-3d12-45fd-9964-dc05cede0c7e_1356x336.png" width="526" height="130.3362831858407" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/db93efdb-3d12-45fd-9964-dc05cede0c7e_1356x336.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:336,&quot;width&quot;:1356,&quot;resizeWidth&quot;:526,&quot;bytes&quot;:61003,&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_!bSXs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb93efdb-3d12-45fd-9964-dc05cede0c7e_1356x336.png 424w, https://substackcdn.com/image/fetch/$s_!bSXs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb93efdb-3d12-45fd-9964-dc05cede0c7e_1356x336.png 848w, https://substackcdn.com/image/fetch/$s_!bSXs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb93efdb-3d12-45fd-9964-dc05cede0c7e_1356x336.png 1272w, https://substackcdn.com/image/fetch/$s_!bSXs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb93efdb-3d12-45fd-9964-dc05cede0c7e_1356x336.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Multiple browser options, going with Chrome.</figcaption></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fNod!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F730f9566-4639-4668-bfba-b8dfc13b6439_1166x656.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fNod!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F730f9566-4639-4668-bfba-b8dfc13b6439_1166x656.png 424w, https://substackcdn.com/image/fetch/$s_!fNod!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F730f9566-4639-4668-bfba-b8dfc13b6439_1166x656.png 848w, https://substackcdn.com/image/fetch/$s_!fNod!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F730f9566-4639-4668-bfba-b8dfc13b6439_1166x656.png 1272w, https://substackcdn.com/image/fetch/$s_!fNod!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F730f9566-4639-4668-bfba-b8dfc13b6439_1166x656.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fNod!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F730f9566-4639-4668-bfba-b8dfc13b6439_1166x656.png" width="516" height="290.30531732418524" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/730f9566-4639-4668-bfba-b8dfc13b6439_1166x656.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:656,&quot;width&quot;:1166,&quot;resizeWidth&quot;:516,&quot;bytes&quot;:138083,&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_!fNod!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F730f9566-4639-4668-bfba-b8dfc13b6439_1166x656.png 424w, https://substackcdn.com/image/fetch/$s_!fNod!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F730f9566-4639-4668-bfba-b8dfc13b6439_1166x656.png 848w, https://substackcdn.com/image/fetch/$s_!fNod!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F730f9566-4639-4668-bfba-b8dfc13b6439_1166x656.png 1272w, https://substackcdn.com/image/fetch/$s_!fNod!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F730f9566-4639-4668-bfba-b8dfc13b6439_1166x656.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">The new launch.json with Chrome configuration.</figcaption></figure></div><ul><li><p>Edit your launch.json port from 8080 to 3000 since we are running on the default React port.</p></li></ul><p>From here, it's just a matter of using it.  So if you set a breakpoint on a line in index.js:</p><ul><li><p>Launch your application via "npm start".</p></li><li><p>In Run and Debug, click the green arrow next to &#8220;Launch Chrome against localhost" or select "Run Script: start" and press the green arrow.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6JzA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b615b9e-dfd3-4fc3-aae0-9d7e983e3879_1626x580.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6JzA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b615b9e-dfd3-4fc3-aae0-9d7e983e3879_1626x580.png 424w, https://substackcdn.com/image/fetch/$s_!6JzA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b615b9e-dfd3-4fc3-aae0-9d7e983e3879_1626x580.png 848w, https://substackcdn.com/image/fetch/$s_!6JzA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b615b9e-dfd3-4fc3-aae0-9d7e983e3879_1626x580.png 1272w, https://substackcdn.com/image/fetch/$s_!6JzA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b615b9e-dfd3-4fc3-aae0-9d7e983e3879_1626x580.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6JzA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b615b9e-dfd3-4fc3-aae0-9d7e983e3879_1626x580.png" width="542" height="193.19917582417582" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4b615b9e-dfd3-4fc3-aae0-9d7e983e3879_1626x580.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:519,&quot;width&quot;:1456,&quot;resizeWidth&quot;:542,&quot;bytes&quot;:192188,&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_!6JzA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b615b9e-dfd3-4fc3-aae0-9d7e983e3879_1626x580.png 424w, https://substackcdn.com/image/fetch/$s_!6JzA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b615b9e-dfd3-4fc3-aae0-9d7e983e3879_1626x580.png 848w, https://substackcdn.com/image/fetch/$s_!6JzA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b615b9e-dfd3-4fc3-aae0-9d7e983e3879_1626x580.png 1272w, https://substackcdn.com/image/fetch/$s_!6JzA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b615b9e-dfd3-4fc3-aae0-9d7e983e3879_1626x580.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Launch the debugger.</figcaption></figure></div><p>This instructs VS Code to launch the debugger against the running application on http://localhost:3000.  Below you can now see the debugger has hit the breakpoint and waiting on our next commands.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eq9g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78fa7173-ff9a-413f-b74d-9191d7b66302_2358x826.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eq9g!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78fa7173-ff9a-413f-b74d-9191d7b66302_2358x826.png 424w, https://substackcdn.com/image/fetch/$s_!eq9g!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78fa7173-ff9a-413f-b74d-9191d7b66302_2358x826.png 848w, https://substackcdn.com/image/fetch/$s_!eq9g!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78fa7173-ff9a-413f-b74d-9191d7b66302_2358x826.png 1272w, https://substackcdn.com/image/fetch/$s_!eq9g!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78fa7173-ff9a-413f-b74d-9191d7b66302_2358x826.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eq9g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78fa7173-ff9a-413f-b74d-9191d7b66302_2358x826.png" width="536" height="187.74725274725276" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/78fa7173-ff9a-413f-b74d-9191d7b66302_2358x826.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:510,&quot;width&quot;:1456,&quot;resizeWidth&quot;:536,&quot;bytes&quot;:367701,&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_!eq9g!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78fa7173-ff9a-413f-b74d-9191d7b66302_2358x826.png 424w, https://substackcdn.com/image/fetch/$s_!eq9g!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78fa7173-ff9a-413f-b74d-9191d7b66302_2358x826.png 848w, https://substackcdn.com/image/fetch/$s_!eq9g!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78fa7173-ff9a-413f-b74d-9191d7b66302_2358x826.png 1272w, https://substackcdn.com/image/fetch/$s_!eq9g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78fa7173-ff9a-413f-b74d-9191d7b66302_2358x826.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Debug browser launched and debugger waiting at our breakpoint.</figcaption></figure></div><h2>Next Steps</h2><p>From here, it's up to you what you like to do with your React application and components.  </p><p>The code for this post can be found on GitHub <a href="https://github.com/robpetty/react-test-app">here</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://papayabytes.substack.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 PapayaBytes! 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[Guide: A Simple Visual Studio Code Extension]]></title><description><![CDATA[How to build a custom Visual Studio Code extension.]]></description><link>https://papayabytes.substack.com/p/guide-a-simple-visual-studio-code</link><guid isPermaLink="false">https://papayabytes.substack.com/p/guide-a-simple-visual-studio-code</guid><dc:creator><![CDATA[Rob]]></dc:creator><pubDate>Mon, 07 Aug 2023 01:03:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!K4Ec!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36b90699-3525-403f-9bb8-75174b036f8e_1692x992.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!K4Ec!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36b90699-3525-403f-9bb8-75174b036f8e_1692x992.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!K4Ec!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36b90699-3525-403f-9bb8-75174b036f8e_1692x992.png 424w, https://substackcdn.com/image/fetch/$s_!K4Ec!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36b90699-3525-403f-9bb8-75174b036f8e_1692x992.png 848w, https://substackcdn.com/image/fetch/$s_!K4Ec!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36b90699-3525-403f-9bb8-75174b036f8e_1692x992.png 1272w, https://substackcdn.com/image/fetch/$s_!K4Ec!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36b90699-3525-403f-9bb8-75174b036f8e_1692x992.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!K4Ec!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36b90699-3525-403f-9bb8-75174b036f8e_1692x992.png" width="1456" height="854" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/36b90699-3525-403f-9bb8-75174b036f8e_1692x992.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:854,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:233669,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!K4Ec!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36b90699-3525-403f-9bb8-75174b036f8e_1692x992.png 424w, https://substackcdn.com/image/fetch/$s_!K4Ec!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36b90699-3525-403f-9bb8-75174b036f8e_1692x992.png 848w, https://substackcdn.com/image/fetch/$s_!K4Ec!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36b90699-3525-403f-9bb8-75174b036f8e_1692x992.png 1272w, https://substackcdn.com/image/fetch/$s_!K4Ec!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36b90699-3525-403f-9bb8-75174b036f8e_1692x992.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">Yo (Hello World&#8230;) from Yeoman!</figcaption></figure></div><h2>What is a VS Code Extension?</h2><p>Visual Studio Code at its heart, is a source-code editor that can do most of the things one expects when working in a given programming language.  However, its abilities are not limited to just editing code.  It also allows you to extend the IDE in a great many ways, to help assist you in whatever tasks you might have.  Many extensions in the <a href="https://marketplace.visualstudio.com/vscode">Visual Studio Marketplace</a> of course are focused on enhancing your code editing experience.  Other extensions are complete tools by themselves, like <a href="https://marketplace.visualstudio.com/items?itemName=Postman.postman-for-vscode">Postman</a>.</p><h2>Yeoman and Additional Basic Tooling</h2><p>While one could build an extension by hand, even Microsoft has a tutorial that utilizes <a href="https://yeoman.io">Yeoman</a>, a tool that builds the scaffolding of many different projects. In our case, we will use it to scaffold the basic framework of our extension for us.</p><h3>Prerequisites</h3><p>Assumptions here you have installed:</p><ul><li><p>Visual Studio Code</p></li><li><p>Homebrew.</p></li></ul><h3>Tooling Installation</h3><p>You may already have node installed, but just in case we will install here, via <a href="https://formulae.brew.sh/formula/node">Homebrew</a>.</p><h4>Install Node (node)</h4><pre><code>brew install node</code></pre><p>We need node for a variety of reasons, but initially to get NPM (the node package manager) to install Yeoman.</p><h4>Install Yeoman (yo)</h4><p>As Yeoman is a node package, we will use NPM to install yo and the <a href="https://www.npmjs.com/package/generator-code">VS Code Extension Generator</a>:</p><pre><code>npm install -g yo generator-code</code></pre><h2>Building Your First VS Code Extension</h2><p>Now that the underlying frameworks are in place, time to use Yeoman to build our first extension.  There will need to be some decisions made as we go along.</p><p>First, navigate to the location you want your extension to be placed.  Or tooling will create the top level folder for you, so if you have a folder that you place your code in, be sure to run the command inside that folder.</p><p>Now run yeoman pointing to the VS Code Extension generator:</p><pre><code>yo code</code></pre><p>In your terminal you will be presented with an interface asking to fill in the blanks.  It will look something 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_!0iiy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F842385c8-0983-4973-b3b1-f99695f848e4_1670x840.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0iiy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F842385c8-0983-4973-b3b1-f99695f848e4_1670x840.png 424w, https://substackcdn.com/image/fetch/$s_!0iiy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F842385c8-0983-4973-b3b1-f99695f848e4_1670x840.png 848w, https://substackcdn.com/image/fetch/$s_!0iiy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F842385c8-0983-4973-b3b1-f99695f848e4_1670x840.png 1272w, https://substackcdn.com/image/fetch/$s_!0iiy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F842385c8-0983-4973-b3b1-f99695f848e4_1670x840.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0iiy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F842385c8-0983-4973-b3b1-f99695f848e4_1670x840.png" width="532" height="267.46153846153845" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/842385c8-0983-4973-b3b1-f99695f848e4_1670x840.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:732,&quot;width&quot;:1456,&quot;resizeWidth&quot;:532,&quot;bytes&quot;:151805,&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_!0iiy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F842385c8-0983-4973-b3b1-f99695f848e4_1670x840.png 424w, https://substackcdn.com/image/fetch/$s_!0iiy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F842385c8-0983-4973-b3b1-f99695f848e4_1670x840.png 848w, https://substackcdn.com/image/fetch/$s_!0iiy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F842385c8-0983-4973-b3b1-f99695f848e4_1670x840.png 1272w, https://substackcdn.com/image/fetch/$s_!0iiy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F842385c8-0983-4973-b3b1-f99695f848e4_1670x840.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">Default Yeoman questionnaire.</figcaption></figure></div><p>For simplicity we are going to make the following choices:</p><ul><li><p>Select "New Extension (JavaScript)".  Press enter.</p><ul><li><p>TypeScript is fine, however at this moment we did not talk about installing the typescript compiler. Also TS compiles down to JS.</p></li></ul></li><li><p>It will now prompt you for a name. I am using simple-vscode-extension for now. Press enter.</p></li><li><p>What is your extension identifier?  Leaving blank, press enter (will default to your name in question previous to this).</p></li><li><p>What is the description, leave blank, press enter.</p></li><li><p>Enable JavaScript type checking in 'jsconfig.json'? Type y, press enter.</p><ul><li><p>This is nice to have.  While we chose not to use typescript for now, we can get additional tooling help from VS Code by selecting yes.  Read more <a href="https://code.visualstudio.com/docs/nodejs/working-with-javascript">here</a>.</p></li></ul></li><li><p>Initialize a git repository? Type y, press enter.</p></li><li><p>Which package manager to use?  We will stay with npm, so ensure it&#8217;s selected and press enter.</p></li></ul><p>At this point Yeoman will work its magic and create several folders and files for you which you can see in the output:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vFz2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc12e16fe-e3a5-4540-b42e-2bda910b4e4f_1282x774.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vFz2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc12e16fe-e3a5-4540-b42e-2bda910b4e4f_1282x774.png 424w, https://substackcdn.com/image/fetch/$s_!vFz2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc12e16fe-e3a5-4540-b42e-2bda910b4e4f_1282x774.png 848w, https://substackcdn.com/image/fetch/$s_!vFz2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc12e16fe-e3a5-4540-b42e-2bda910b4e4f_1282x774.png 1272w, https://substackcdn.com/image/fetch/$s_!vFz2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc12e16fe-e3a5-4540-b42e-2bda910b4e4f_1282x774.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vFz2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc12e16fe-e3a5-4540-b42e-2bda910b4e4f_1282x774.png" width="570" height="344.13416536661464" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c12e16fe-e3a5-4540-b42e-2bda910b4e4f_1282x774.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:774,&quot;width&quot;:1282,&quot;resizeWidth&quot;:570,&quot;bytes&quot;:172097,&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_!vFz2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc12e16fe-e3a5-4540-b42e-2bda910b4e4f_1282x774.png 424w, https://substackcdn.com/image/fetch/$s_!vFz2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc12e16fe-e3a5-4540-b42e-2bda910b4e4f_1282x774.png 848w, https://substackcdn.com/image/fetch/$s_!vFz2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc12e16fe-e3a5-4540-b42e-2bda910b4e4f_1282x774.png 1272w, https://substackcdn.com/image/fetch/$s_!vFz2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc12e16fe-e3a5-4540-b42e-2bda910b4e4f_1282x774.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">"yo code" generated files.</figcaption></figure></div><p>However we are not quite finished:</p><ul><li><p>Open with 'code' or Skip?  Select Open and press enter.</p></li></ul><p>You will now get a new instance of the VS Code IDE opened to your new extension project.  You might be prompted (depending on your setup) to install various things based on file extensions of the newly created files in your extension.  </p><p>In my case, it was recommended to install 'ESLint' from Microsoft, to which I will choose to install now (but is optional for you). (I intend to work out of VS Code primarily, alternatively you could say no, and then run:</p><pre><code>npm install eslint --global</code></pre><p>To make it available everywhere. <a href="https://eslint.org">ESLint</a> statically analyzes your JavaScript code to help find any errors.</p><h3>What Was Created?</h3><p>As you might now expect, a basic VS Code extension, named simple-vscode-extension has been created.  Inside the folder is a variety of folders and files so let&#8217;s quickly go through them:</p><ul><li><p>.vscode (folder)</p><ul><li><p>extensions.json - tells VS Code what extensions to recommend for installation when working on this project.</p></li><li><p>launch.json - configuration for the VS Code debugger.</p></li></ul></li><li><p>node_modules (folder) - npm-installed packages (Do not check into GitHub!).</p></li><li><p>test (folder)</p><ul><li><p>suite (folder)</p><ul><li><p>extension.test.js - where your tests reside.</p></li><li><p>index.js - configures the test suite (uses Mocha).</p></li></ul></li><li><p>runTest.js - Does setup to run tests.</p></li></ul></li><li><p>.eslintrc.json - for configuring ESLint.</p></li><li><p>.gitignore - to prevent folders and files from being checked into Git/GitHub.</p></li><li><p>CHANGELOG.md - for recording any notable changes to your project.</p></li><li><p>extension.js - primary extension code goes here.</p></li><li><p>jsconfig.json - JavaScript configuration.</p></li><li><p>package-lock.json - npm-generated file to keep track of specifically installed dependencies (and sub dependencies).</p></li><li><p>package.json - node project config and metadata. npm also uses this file to know what dependencies to install.</p></li><li><p>README.md - file used to provide project details in GitHub. </p></li><li><p>vsc-extension-quickstart.md - a guide provided describing key files that were generated, how to run your extension, etc. Some details here might not apply (as the files that have been generated have changed over time.</p></li></ul><p>That might seem like a lot but it all boils down to files that:</p><ul><li><p>Run the code your extension is designed to do.</p></li><li><p>Hook into VS Code, meaning the IDE.</p></li><li><p>Hook into other tooling, like npm, node, GitHub, etc.</p></li><li><p>Describe what we got going on.</p></li></ul><h2>Running the Extension</h2><p>From here, as we only have a source code view of the extension, we need to launch a new VS Code instance with your extension loaded.  Simply press F5.  What happened?</p><ul><li><p>A new instance of VS Code is launched, with your extension enabled.  You can confirm this in the title bar of the IDE:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!D4y4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F042bb40c-3348-4be9-83c3-15e775cb5a98_2044x172.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!D4y4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F042bb40c-3348-4be9-83c3-15e775cb5a98_2044x172.png 424w, https://substackcdn.com/image/fetch/$s_!D4y4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F042bb40c-3348-4be9-83c3-15e775cb5a98_2044x172.png 848w, https://substackcdn.com/image/fetch/$s_!D4y4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F042bb40c-3348-4be9-83c3-15e775cb5a98_2044x172.png 1272w, https://substackcdn.com/image/fetch/$s_!D4y4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F042bb40c-3348-4be9-83c3-15e775cb5a98_2044x172.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!D4y4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F042bb40c-3348-4be9-83c3-15e775cb5a98_2044x172.png" width="1456" height="123" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/042bb40c-3348-4be9-83c3-15e775cb5a98_2044x172.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:123,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:28022,&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_!D4y4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F042bb40c-3348-4be9-83c3-15e775cb5a98_2044x172.png 424w, https://substackcdn.com/image/fetch/$s_!D4y4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F042bb40c-3348-4be9-83c3-15e775cb5a98_2044x172.png 848w, https://substackcdn.com/image/fetch/$s_!D4y4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F042bb40c-3348-4be9-83c3-15e775cb5a98_2044x172.png 1272w, https://substackcdn.com/image/fetch/$s_!D4y4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F042bb40c-3348-4be9-83c3-15e775cb5a98_2044x172.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">VS Code title bar showing your extension is hosted in this instance.</figcaption></figure></div></li><li><p>The original instance of VS Code is now in debug mode:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZFYO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff21fe6e4-3912-43c7-a8f9-1a46696de143_2316x304.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZFYO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff21fe6e4-3912-43c7-a8f9-1a46696de143_2316x304.png 424w, https://substackcdn.com/image/fetch/$s_!ZFYO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff21fe6e4-3912-43c7-a8f9-1a46696de143_2316x304.png 848w, https://substackcdn.com/image/fetch/$s_!ZFYO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff21fe6e4-3912-43c7-a8f9-1a46696de143_2316x304.png 1272w, https://substackcdn.com/image/fetch/$s_!ZFYO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff21fe6e4-3912-43c7-a8f9-1a46696de143_2316x304.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZFYO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff21fe6e4-3912-43c7-a8f9-1a46696de143_2316x304.png" width="1456" height="191" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f21fe6e4-3912-43c7-a8f9-1a46696de143_2316x304.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:191,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:58236,&quot;alt&quot;:&quot;&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!ZFYO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff21fe6e4-3912-43c7-a8f9-1a46696de143_2316x304.png 424w, https://substackcdn.com/image/fetch/$s_!ZFYO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff21fe6e4-3912-43c7-a8f9-1a46696de143_2316x304.png 848w, https://substackcdn.com/image/fetch/$s_!ZFYO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff21fe6e4-3912-43c7-a8f9-1a46696de143_2316x304.png 1272w, https://substackcdn.com/image/fetch/$s_!ZFYO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff21fe6e4-3912-43c7-a8f9-1a46696de143_2316x304.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div></li></ul><p>From here you can execute the default features of the extension given by the generator for us.</p><h3>Default Features</h3><p>Our auto generated code has given us one command to run, via the VS Code command palette (&#8679;&#8984;P), "Hello World".  This command (as in the words to type) is configured in the package.json of your extension under "<code>contributes.commands["title"]</code>". A sibling key here is "<code>command</code>". This key&#8217;s value is how you find what the command does.  So in our case with the value "simple-vscode-extension.helloWorld" we will be registered in extension.js in the activate method.</p><p>The anonymous function tied to this command, is as follows:</p><pre><code>// Display a message box to the user vscode.window.showInformationMessage('Hello World from simple-vscode-extension!');</code></pre><p>After running "Hello World" in the command palette such as:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!x0Kx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62d80754-fed2-40f5-b98d-607eb2df6c35_1830x372.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!x0Kx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62d80754-fed2-40f5-b98d-607eb2df6c35_1830x372.png 424w, https://substackcdn.com/image/fetch/$s_!x0Kx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62d80754-fed2-40f5-b98d-607eb2df6c35_1830x372.png 848w, https://substackcdn.com/image/fetch/$s_!x0Kx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62d80754-fed2-40f5-b98d-607eb2df6c35_1830x372.png 1272w, https://substackcdn.com/image/fetch/$s_!x0Kx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62d80754-fed2-40f5-b98d-607eb2df6c35_1830x372.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!x0Kx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62d80754-fed2-40f5-b98d-607eb2df6c35_1830x372.png" width="616" height="125.23076923076923" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/62d80754-fed2-40f5-b98d-607eb2df6c35_1830x372.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:296,&quot;width&quot;:1456,&quot;resizeWidth&quot;:616,&quot;bytes&quot;:101442,&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_!x0Kx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62d80754-fed2-40f5-b98d-607eb2df6c35_1830x372.png 424w, https://substackcdn.com/image/fetch/$s_!x0Kx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62d80754-fed2-40f5-b98d-607eb2df6c35_1830x372.png 848w, https://substackcdn.com/image/fetch/$s_!x0Kx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62d80754-fed2-40f5-b98d-607eb2df6c35_1830x372.png 1272w, https://substackcdn.com/image/fetch/$s_!x0Kx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62d80754-fed2-40f5-b98d-607eb2df6c35_1830x372.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Command Palette invocation.</figcaption></figure></div><p>You will see an informational dialog open in the bottom right with "<code>Hello World from simple-vscode-extension!"</code> being displayed such as:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GveC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772f03f8-6beb-4cd6-8731-a494942145a7_1360x400.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GveC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772f03f8-6beb-4cd6-8731-a494942145a7_1360x400.png 424w, https://substackcdn.com/image/fetch/$s_!GveC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772f03f8-6beb-4cd6-8731-a494942145a7_1360x400.png 848w, https://substackcdn.com/image/fetch/$s_!GveC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772f03f8-6beb-4cd6-8731-a494942145a7_1360x400.png 1272w, https://substackcdn.com/image/fetch/$s_!GveC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772f03f8-6beb-4cd6-8731-a494942145a7_1360x400.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GveC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772f03f8-6beb-4cd6-8731-a494942145a7_1360x400.png" width="618" height="181.76470588235293" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/772f03f8-6beb-4cd6-8731-a494942145a7_1360x400.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:400,&quot;width&quot;:1360,&quot;resizeWidth&quot;:618,&quot;bytes&quot;:53123,&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_!GveC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772f03f8-6beb-4cd6-8731-a494942145a7_1360x400.png 424w, https://substackcdn.com/image/fetch/$s_!GveC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772f03f8-6beb-4cd6-8731-a494942145a7_1360x400.png 848w, https://substackcdn.com/image/fetch/$s_!GveC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772f03f8-6beb-4cd6-8731-a494942145a7_1360x400.png 1272w, https://substackcdn.com/image/fetch/$s_!GveC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772f03f8-6beb-4cd6-8731-a494942145a7_1360x400.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Informational message displayed by VS Code.</figcaption></figure></div><p>Back in your original VS Code instance, in the DEBUG CONSOLE tab, you will also see output from the <code>active(content)</code> function:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4aDr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7162d1a4-aa8d-42cb-8794-35b9e4ab0e4e_1516x378.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4aDr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7162d1a4-aa8d-42cb-8794-35b9e4ab0e4e_1516x378.png 424w, https://substackcdn.com/image/fetch/$s_!4aDr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7162d1a4-aa8d-42cb-8794-35b9e4ab0e4e_1516x378.png 848w, https://substackcdn.com/image/fetch/$s_!4aDr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7162d1a4-aa8d-42cb-8794-35b9e4ab0e4e_1516x378.png 1272w, https://substackcdn.com/image/fetch/$s_!4aDr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7162d1a4-aa8d-42cb-8794-35b9e4ab0e4e_1516x378.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4aDr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7162d1a4-aa8d-42cb-8794-35b9e4ab0e4e_1516x378.png" width="624" height="155.57142857142858" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7162d1a4-aa8d-42cb-8794-35b9e4ab0e4e_1516x378.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:363,&quot;width&quot;:1456,&quot;resizeWidth&quot;:624,&quot;bytes&quot;:63907,&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_!4aDr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7162d1a4-aa8d-42cb-8794-35b9e4ab0e4e_1516x378.png 424w, https://substackcdn.com/image/fetch/$s_!4aDr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7162d1a4-aa8d-42cb-8794-35b9e4ab0e4e_1516x378.png 848w, https://substackcdn.com/image/fetch/$s_!4aDr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7162d1a4-aa8d-42cb-8794-35b9e4ab0e4e_1516x378.png 1272w, https://substackcdn.com/image/fetch/$s_!4aDr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7162d1a4-aa8d-42cb-8794-35b9e4ab0e4e_1516x378.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Console output from extension.js activate function.</figcaption></figure></div><h2>Whats Next?</h2><p>There you have it, the standard out of the box VS Code extension and details about what is going on.  As a typical "Hello World" type of application, this is merely the beginning.  In a future post we will discuss enhancing the extension to do more realistic tasks, expose additional functionality, testing your extension, how to debug it, etc.</p><p>The code for this post can be found on GitHub <a href="https://github.com/robpetty/simple-vscode-extension">here</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://papayabytes.substack.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 PapayaBytes! 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[Chrome Extension DevTools Debugger Access]]></title><description><![CDATA[Details on how to gain access to the DevTools debugging experience for your extension.]]></description><link>https://papayabytes.substack.com/p/chrome-extension-devtools-debugger</link><guid isPermaLink="false">https://papayabytes.substack.com/p/chrome-extension-devtools-debugger</guid><dc:creator><![CDATA[Rob]]></dc:creator><pubDate>Sat, 05 Aug 2023 20:59:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!p18W!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2bd77f-224e-4a2a-a80d-fada5f4c250e_2568x1282.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!p18W!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2bd77f-224e-4a2a-a80d-fada5f4c250e_2568x1282.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!p18W!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2bd77f-224e-4a2a-a80d-fada5f4c250e_2568x1282.png 424w, https://substackcdn.com/image/fetch/$s_!p18W!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2bd77f-224e-4a2a-a80d-fada5f4c250e_2568x1282.png 848w, https://substackcdn.com/image/fetch/$s_!p18W!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2bd77f-224e-4a2a-a80d-fada5f4c250e_2568x1282.png 1272w, https://substackcdn.com/image/fetch/$s_!p18W!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2bd77f-224e-4a2a-a80d-fada5f4c250e_2568x1282.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!p18W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2bd77f-224e-4a2a-a80d-fada5f4c250e_2568x1282.png" width="1456" height="727" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1b2bd77f-224e-4a2a-a80d-fada5f4c250e_2568x1282.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;:748632,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!p18W!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2bd77f-224e-4a2a-a80d-fada5f4c250e_2568x1282.png 424w, https://substackcdn.com/image/fetch/$s_!p18W!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2bd77f-224e-4a2a-a80d-fada5f4c250e_2568x1282.png 848w, https://substackcdn.com/image/fetch/$s_!p18W!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2bd77f-224e-4a2a-a80d-fada5f4c250e_2568x1282.png 1272w, https://substackcdn.com/image/fetch/$s_!p18W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2bd77f-224e-4a2a-a80d-fada5f4c250e_2568x1282.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">The Chrome Developer Tools, aka DevTools, aka the Chrome Debugger.</figcaption></figure></div><p>This post is intended to help understand how to access the Chrome DevTools debugger from various aspects of your Chrome extension as it&#8217;s not always straight-forward.</p><p>It&#8217;s a an on-going culmination of learnings from my own Chrome extension development which you can read about in these earlier posts:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;ba62f609-1a23-4499-a198-99d38a9e9ef4&quot;,&quot;caption&quot;:&quot;Google Chrome is already filled with lots of tools to help with building and debugging websites. However, there are many times a site is lacking a feature, or an entire class of web applications would be better off if some feature could be added, or aspect changed. Essentially, can you extend Chrome, to do helpful things? The answer of course is yes,&#8230;&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Guide: How to Build a Simple Chrome Extension&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:153565442,&quot;name&quot;:&quot;Rob&quot;,&quot;bio&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bd0bbf9c-d781-4cc6-81bc-df2256a6e2c8_144x144.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-07-28T00:23:05.850Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad59d61f-79fb-44a6-b5c5-e6f6484deb70_1220x596.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://papayabytes.substack.com/p/guide-how-to-build-a-simple-chrome&quot;,&quot;section_name&quot;:&quot;Code&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:131029067,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;PapayaBytes&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd0bbf9c-d781-4cc6-81bc-df2256a6e2c8_144x144.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;e260328c-7a12-4498-be39-d2702fda91af&quot;,&quot;caption&quot;:&quot;Risky Business Most modern browsers offer a wide array of extensibility options in the form of extensions (sometimes called plugins). Extensions are generally obtained through an extension marketplace such as Chrome Web Store (for Chrome) and Firefox Browser Add-ons&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Guide: Building a Chrome Network Listener&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:153565442,&quot;name&quot;:&quot;Rob&quot;,&quot;bio&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bd0bbf9c-d781-4cc6-81bc-df2256a6e2c8_144x144.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-08-01T20:20:02.945Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35f779c7-d33b-45ce-bafa-4975e032dfc9_2206x1152.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://papayabytes.substack.com/p/guide-building-a-chrome-network-listener&quot;,&quot;section_name&quot;:&quot;Code&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:135633922,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;PapayaBytes&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd0bbf9c-d781-4cc6-81bc-df2256a6e2c8_144x144.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;bedbe6f9-fa82-442e-9adc-40c853f3dd5a&quot;,&quot;caption&quot;:&quot;If you are like lots of people I know, you spend too much time organizing bookmarks in Chrome with the hopes that it will speed up finding some bit of data sometime in the future. You also might be doing research and want to keep some sources organized based on some important text you found.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Guide: Building a Better Bookmark Extension&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:153565442,&quot;name&quot;:&quot;Rob&quot;,&quot;bio&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bd0bbf9c-d781-4cc6-81bc-df2256a6e2c8_144x144.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-08-04T20:00:09.161Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73accda2-4416-4561-8cd0-694bb42ed765_1954x1068.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://papayabytes.substack.com/p/guide-building-a-better-bookmark&quot;,&quot;section_name&quot;:&quot;Code&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:135668927,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;PapayaBytes&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd0bbf9c-d781-4cc6-81bc-df2256a6e2c8_144x144.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><h2>Launching DevTools by Extension Component</h2><h2>content.js (Content Scripts)</h2><p>By default extension content scripts are excluded from the debugger so they are a bit difficult to find.  I was not aware of this initially, so to find my content.js in an earlier project I used a trick to discover it.  I placed a console.log() message at the top of your script, so when I opened the DevTools on the web page I was debugging, that message got me the link to the source file I needed.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YOUe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb73a9c3f-56c2-420e-998e-a1fab8343be7_1382x226.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YOUe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb73a9c3f-56c2-420e-998e-a1fab8343be7_1382x226.png 424w, https://substackcdn.com/image/fetch/$s_!YOUe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb73a9c3f-56c2-420e-998e-a1fab8343be7_1382x226.png 848w, https://substackcdn.com/image/fetch/$s_!YOUe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb73a9c3f-56c2-420e-998e-a1fab8343be7_1382x226.png 1272w, https://substackcdn.com/image/fetch/$s_!YOUe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb73a9c3f-56c2-420e-998e-a1fab8343be7_1382x226.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YOUe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb73a9c3f-56c2-420e-998e-a1fab8343be7_1382x226.png" width="604" height="98.77279305354558" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b73a9c3f-56c2-420e-998e-a1fab8343be7_1382x226.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:226,&quot;width&quot;:1382,&quot;resizeWidth&quot;:604,&quot;bytes&quot;:67963,&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_!YOUe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb73a9c3f-56c2-420e-998e-a1fab8343be7_1382x226.png 424w, https://substackcdn.com/image/fetch/$s_!YOUe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb73a9c3f-56c2-420e-998e-a1fab8343be7_1382x226.png 848w, https://substackcdn.com/image/fetch/$s_!YOUe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb73a9c3f-56c2-420e-998e-a1fab8343be7_1382x226.png 1272w, https://substackcdn.com/image/fetch/$s_!YOUe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb73a9c3f-56c2-420e-998e-a1fab8343be7_1382x226.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>This gives you a hook, by clicking content.js, that will now open the Sources panel view of this file and prompt you to either remove from the ignore list or give you an option to Configure the list.</p><p>Here is a view of the script waiting on your decision:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RadY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fded304e8-8549-4fd2-91ee-5a2488fa1dfe_1380x852.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RadY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fded304e8-8549-4fd2-91ee-5a2488fa1dfe_1380x852.png 424w, https://substackcdn.com/image/fetch/$s_!RadY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fded304e8-8549-4fd2-91ee-5a2488fa1dfe_1380x852.png 848w, https://substackcdn.com/image/fetch/$s_!RadY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fded304e8-8549-4fd2-91ee-5a2488fa1dfe_1380x852.png 1272w, https://substackcdn.com/image/fetch/$s_!RadY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fded304e8-8549-4fd2-91ee-5a2488fa1dfe_1380x852.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RadY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fded304e8-8549-4fd2-91ee-5a2488fa1dfe_1380x852.png" width="600" height="370.4347826086956" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ded304e8-8549-4fd2-91ee-5a2488fa1dfe_1380x852.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:852,&quot;width&quot;:1380,&quot;resizeWidth&quot;:600,&quot;bytes&quot;:313978,&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_!RadY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fded304e8-8549-4fd2-91ee-5a2488fa1dfe_1380x852.png 424w, https://substackcdn.com/image/fetch/$s_!RadY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fded304e8-8549-4fd2-91ee-5a2488fa1dfe_1380x852.png 848w, https://substackcdn.com/image/fetch/$s_!RadY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fded304e8-8549-4fd2-91ee-5a2488fa1dfe_1380x852.png 1272w, https://substackcdn.com/image/fetch/$s_!RadY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fded304e8-8549-4fd2-91ee-5a2488fa1dfe_1380x852.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><p>If you click Configure it goes to the DevTools Settings tab (which is the little gear icon on the right in the toolbar:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GQ0a!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb472023-1ef3-48dc-95d1-3742e8c6545b_1382x64.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GQ0a!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb472023-1ef3-48dc-95d1-3742e8c6545b_1382x64.png 424w, https://substackcdn.com/image/fetch/$s_!GQ0a!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb472023-1ef3-48dc-95d1-3742e8c6545b_1382x64.png 848w, https://substackcdn.com/image/fetch/$s_!GQ0a!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb472023-1ef3-48dc-95d1-3742e8c6545b_1382x64.png 1272w, https://substackcdn.com/image/fetch/$s_!GQ0a!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb472023-1ef3-48dc-95d1-3742e8c6545b_1382x64.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GQ0a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb472023-1ef3-48dc-95d1-3742e8c6545b_1382x64.png" width="602" height="27.878437047756876" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/db472023-1ef3-48dc-95d1-3742e8c6545b_1382x64.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:64,&quot;width&quot;:1382,&quot;resizeWidth&quot;:602,&quot;bytes&quot;:19419,&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_!GQ0a!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb472023-1ef3-48dc-95d1-3742e8c6545b_1382x64.png 424w, https://substackcdn.com/image/fetch/$s_!GQ0a!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb472023-1ef3-48dc-95d1-3742e8c6545b_1382x64.png 848w, https://substackcdn.com/image/fetch/$s_!GQ0a!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb472023-1ef3-48dc-95d1-3742e8c6545b_1382x64.png 1272w, https://substackcdn.com/image/fetch/$s_!GQ0a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb472023-1ef3-48dc-95d1-3742e8c6545b_1382x64.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Z0Ll!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0241695-e53e-4227-873b-774d35f4b3e7_1380x576.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Z0Ll!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0241695-e53e-4227-873b-774d35f4b3e7_1380x576.png 424w, https://substackcdn.com/image/fetch/$s_!Z0Ll!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0241695-e53e-4227-873b-774d35f4b3e7_1380x576.png 848w, https://substackcdn.com/image/fetch/$s_!Z0Ll!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0241695-e53e-4227-873b-774d35f4b3e7_1380x576.png 1272w, https://substackcdn.com/image/fetch/$s_!Z0Ll!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0241695-e53e-4227-873b-774d35f4b3e7_1380x576.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Z0Ll!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0241695-e53e-4227-873b-774d35f4b3e7_1380x576.png" width="602" height="251.26956521739132" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b0241695-e53e-4227-873b-774d35f4b3e7_1380x576.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:576,&quot;width&quot;:1380,&quot;resizeWidth&quot;:602,&quot;bytes&quot;:101566,&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_!Z0Ll!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0241695-e53e-4227-873b-774d35f4b3e7_1380x576.png 424w, https://substackcdn.com/image/fetch/$s_!Z0Ll!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0241695-e53e-4227-873b-774d35f4b3e7_1380x576.png 848w, https://substackcdn.com/image/fetch/$s_!Z0Ll!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0241695-e53e-4227-873b-774d35f4b3e7_1380x576.png 1272w, https://substackcdn.com/image/fetch/$s_!Z0Ll!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0241695-e53e-4227-873b-774d35f4b3e7_1380x576.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><p>You also don&#8217;t have to make a choice here.  You can now debug the file without changing your environment (for example you can now add a breakpoint and refresh the page and it will be hit).</p><h3>background.js (Background Worker)</h3><p>In chrome://extensions, click &#8220;Inspect views: service worker&#8221; to get debugger for just this script.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2GzW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1a95581-5e0e-43c8-a54e-a9e4584f3450_1068x854.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2GzW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1a95581-5e0e-43c8-a54e-a9e4584f3450_1068x854.png 424w, https://substackcdn.com/image/fetch/$s_!2GzW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1a95581-5e0e-43c8-a54e-a9e4584f3450_1068x854.png 848w, https://substackcdn.com/image/fetch/$s_!2GzW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1a95581-5e0e-43c8-a54e-a9e4584f3450_1068x854.png 1272w, https://substackcdn.com/image/fetch/$s_!2GzW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1a95581-5e0e-43c8-a54e-a9e4584f3450_1068x854.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2GzW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1a95581-5e0e-43c8-a54e-a9e4584f3450_1068x854.png" width="526" height="420.60299625468167" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d1a95581-5e0e-43c8-a54e-a9e4584f3450_1068x854.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:854,&quot;width&quot;:1068,&quot;resizeWidth&quot;:526,&quot;bytes&quot;:121477,&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_!2GzW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1a95581-5e0e-43c8-a54e-a9e4584f3450_1068x854.png 424w, https://substackcdn.com/image/fetch/$s_!2GzW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1a95581-5e0e-43c8-a54e-a9e4584f3450_1068x854.png 848w, https://substackcdn.com/image/fetch/$s_!2GzW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1a95581-5e0e-43c8-a54e-a9e4584f3450_1068x854.png 1272w, https://substackcdn.com/image/fetch/$s_!2GzW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1a95581-5e0e-43c8-a54e-a9e4584f3450_1068x854.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">Click the service worker to get open DevTools with your background.js script loaded.</figcaption></figure></div><h3>sidepanel.js (Side Panel)</h3><p>Right-click once open, click inspect. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3CyN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc24492f7-a151-40bd-af2a-cd3097304f25_650x660.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3CyN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc24492f7-a151-40bd-af2a-cd3097304f25_650x660.png 424w, https://substackcdn.com/image/fetch/$s_!3CyN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc24492f7-a151-40bd-af2a-cd3097304f25_650x660.png 848w, https://substackcdn.com/image/fetch/$s_!3CyN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc24492f7-a151-40bd-af2a-cd3097304f25_650x660.png 1272w, https://substackcdn.com/image/fetch/$s_!3CyN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc24492f7-a151-40bd-af2a-cd3097304f25_650x660.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3CyN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc24492f7-a151-40bd-af2a-cd3097304f25_650x660.png" width="276" height="280.24615384615385" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c24492f7-a151-40bd-af2a-cd3097304f25_650x660.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:660,&quot;width&quot;:650,&quot;resizeWidth&quot;:276,&quot;bytes&quot;:106736,&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_!3CyN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc24492f7-a151-40bd-af2a-cd3097304f25_650x660.png 424w, https://substackcdn.com/image/fetch/$s_!3CyN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc24492f7-a151-40bd-af2a-cd3097304f25_650x660.png 848w, https://substackcdn.com/image/fetch/$s_!3CyN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc24492f7-a151-40bd-af2a-cd3097304f25_650x660.png 1272w, https://substackcdn.com/image/fetch/$s_!3CyN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc24492f7-a151-40bd-af2a-cd3097304f25_650x660.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">How to get to DevTools for your Side panel scripts.</figcaption></figure></div><p><strong>NOTE:</strong> If you have other DevTools running, like one for the background worker, you will be able to see it in this view as well.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jrjh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0020bc83-7d1d-459e-b26d-9aa2b4fcc3ab_950x570.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jrjh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0020bc83-7d1d-459e-b26d-9aa2b4fcc3ab_950x570.png 424w, https://substackcdn.com/image/fetch/$s_!jrjh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0020bc83-7d1d-459e-b26d-9aa2b4fcc3ab_950x570.png 848w, https://substackcdn.com/image/fetch/$s_!jrjh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0020bc83-7d1d-459e-b26d-9aa2b4fcc3ab_950x570.png 1272w, https://substackcdn.com/image/fetch/$s_!jrjh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0020bc83-7d1d-459e-b26d-9aa2b4fcc3ab_950x570.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jrjh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0020bc83-7d1d-459e-b26d-9aa2b4fcc3ab_950x570.png" width="472" height="283.2" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0020bc83-7d1d-459e-b26d-9aa2b4fcc3ab_950x570.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:570,&quot;width&quot;:950,&quot;resizeWidth&quot;:472,&quot;bytes&quot;:163420,&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_!jrjh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0020bc83-7d1d-459e-b26d-9aa2b4fcc3ab_950x570.png 424w, https://substackcdn.com/image/fetch/$s_!jrjh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0020bc83-7d1d-459e-b26d-9aa2b4fcc3ab_950x570.png 848w, https://substackcdn.com/image/fetch/$s_!jrjh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0020bc83-7d1d-459e-b26d-9aa2b4fcc3ab_950x570.png 1272w, https://substackcdn.com/image/fetch/$s_!jrjh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0020bc83-7d1d-459e-b26d-9aa2b4fcc3ab_950x570.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">Side panel DevTools allows access to other scripts, but not all.</figcaption></figure></div><h3>popup.js (Popup)</h3><p>To debug the popup page and its scripts, simply right-click on the extension icon and select "Inspect Popup".</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ONsM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95364018-934c-44b1-83f2-54602dd9dd1b_812x590.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ONsM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95364018-934c-44b1-83f2-54602dd9dd1b_812x590.png 424w, https://substackcdn.com/image/fetch/$s_!ONsM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95364018-934c-44b1-83f2-54602dd9dd1b_812x590.png 848w, https://substackcdn.com/image/fetch/$s_!ONsM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95364018-934c-44b1-83f2-54602dd9dd1b_812x590.png 1272w, https://substackcdn.com/image/fetch/$s_!ONsM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95364018-934c-44b1-83f2-54602dd9dd1b_812x590.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ONsM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95364018-934c-44b1-83f2-54602dd9dd1b_812x590.png" width="276" height="200.54187192118226" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/95364018-934c-44b1-83f2-54602dd9dd1b_812x590.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:590,&quot;width&quot;:812,&quot;resizeWidth&quot;:276,&quot;bytes&quot;:174807,&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_!ONsM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95364018-934c-44b1-83f2-54602dd9dd1b_812x590.png 424w, https://substackcdn.com/image/fetch/$s_!ONsM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95364018-934c-44b1-83f2-54602dd9dd1b_812x590.png 848w, https://substackcdn.com/image/fetch/$s_!ONsM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95364018-934c-44b1-83f2-54602dd9dd1b_812x590.png 1272w, https://substackcdn.com/image/fetch/$s_!ONsM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95364018-934c-44b1-83f2-54602dd9dd1b_812x590.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Right click on your extension icon to view your popup related scripts.</figcaption></figure></div><h3>Page Override (Bookmarks, History, about:blank)</h3><p>These are just regular pages, once your new &#8220;blank tab&#8221; page is loaded (or history or bookmark replace pages), right-click on the page and go to inspect. From here you can see your resources and scripts as normal. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uJZ2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c1e27d-5e06-4e60-a7d5-23f6649589ee_876x694.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uJZ2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c1e27d-5e06-4e60-a7d5-23f6649589ee_876x694.png 424w, https://substackcdn.com/image/fetch/$s_!uJZ2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c1e27d-5e06-4e60-a7d5-23f6649589ee_876x694.png 848w, https://substackcdn.com/image/fetch/$s_!uJZ2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c1e27d-5e06-4e60-a7d5-23f6649589ee_876x694.png 1272w, https://substackcdn.com/image/fetch/$s_!uJZ2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c1e27d-5e06-4e60-a7d5-23f6649589ee_876x694.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uJZ2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c1e27d-5e06-4e60-a7d5-23f6649589ee_876x694.png" width="362" height="286.78995433789953" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/97c1e27d-5e06-4e60-a7d5-23f6649589ee_876x694.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:694,&quot;width&quot;:876,&quot;resizeWidth&quot;:362,&quot;bytes&quot;:128445,&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_!uJZ2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c1e27d-5e06-4e60-a7d5-23f6649589ee_876x694.png 424w, https://substackcdn.com/image/fetch/$s_!uJZ2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c1e27d-5e06-4e60-a7d5-23f6649589ee_876x694.png 848w, https://substackcdn.com/image/fetch/$s_!uJZ2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c1e27d-5e06-4e60-a7d5-23f6649589ee_876x694.png 1272w, https://substackcdn.com/image/fetch/$s_!uJZ2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c1e27d-5e06-4e60-a7d5-23f6649589ee_876x694.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">about:blank override, right click and click Inspect like a normal web page.</figcaption></figure></div><h2>Summary</h2><p>Hopefully this page has saved you some time finding this critical development tool.  Down the road I will post about how to go about using the debugger to help speed up solving your code issues.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://papayabytes.substack.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 PapayaBytes! 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[Guide: BookRemarks, a Better Bookmark Extension]]></title><description><![CDATA[Can we do better then "Yahoo"ing our bookmarks and research? No offense Yahoo.]]></description><link>https://papayabytes.substack.com/p/guide-building-a-better-bookmark</link><guid isPermaLink="false">https://papayabytes.substack.com/p/guide-building-a-better-bookmark</guid><dc:creator><![CDATA[Rob]]></dc:creator><pubDate>Fri, 04 Aug 2023 20:00:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!_H_h!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73accda2-4416-4561-8cd0-694bb42ed765_1954x1068.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_H_h!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73accda2-4416-4561-8cd0-694bb42ed765_1954x1068.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_H_h!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73accda2-4416-4561-8cd0-694bb42ed765_1954x1068.png 424w, https://substackcdn.com/image/fetch/$s_!_H_h!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73accda2-4416-4561-8cd0-694bb42ed765_1954x1068.png 848w, https://substackcdn.com/image/fetch/$s_!_H_h!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73accda2-4416-4561-8cd0-694bb42ed765_1954x1068.png 1272w, https://substackcdn.com/image/fetch/$s_!_H_h!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73accda2-4416-4561-8cd0-694bb42ed765_1954x1068.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_H_h!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73accda2-4416-4561-8cd0-694bb42ed765_1954x1068.png" width="582" height="318.18131868131866" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/73accda2-4416-4561-8cd0-694bb42ed765_1954x1068.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:796,&quot;width&quot;:1456,&quot;resizeWidth&quot;:582,&quot;bytes&quot;:364125,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_H_h!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73accda2-4416-4561-8cd0-694bb42ed765_1954x1068.png 424w, https://substackcdn.com/image/fetch/$s_!_H_h!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73accda2-4416-4561-8cd0-694bb42ed765_1954x1068.png 848w, https://substackcdn.com/image/fetch/$s_!_H_h!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73accda2-4416-4561-8cd0-694bb42ed765_1954x1068.png 1272w, https://substackcdn.com/image/fetch/$s_!_H_h!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73accda2-4416-4561-8cd0-694bb42ed765_1954x1068.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">Researching the greatest NFL team ever fielded.</figcaption></figure></div><p>If you are like lots of people I know, you spend too much time organizing bookmarks in Chrome with the hopes that it will speed up finding some bit of data sometime in the future.  You also might be doing research and want to keep some sources organized based on some important text you found.  </p><p>Is there a better way, or at least a way with less manual effort, one can do?  Let&#8217;s find out!  </p><p>In this post we are going to build a basic bookmarking research extension that saves aspects of the data you care about. I am calling the extension BookRemarks!</p><h2>Problems We Are Solving For?</h2><p>The number one issue I face with bookmarks is the cumbersome nature of managing large volumes of them, along with remembering where some key detail was I cared about on their respective pages.  With those two issues in mind (and whatever else comes along), some design goals here in relation to these are:</p><ul><li><p>Keeping the extension itself from being burdensome.  When you capture some text you like, ideally we will:</p><ul><li><p>Capture the full textual content of your selection.</p></li><li><p>The URL of the page you are on.</p></li><li><p>When you captured the copy.  This will help in our organization.  (Not perfect of course as you might look up multiple topics at the same time.)</p></li></ul></li><li><p>Ease of access.  The less steps to get back to your data, the better.</p></li><li><p>Enriching.  How can we do better than &#8220;somewhere we have a bookmark in hopefully the correct folder&#8221;?</p></li></ul><p>What we are not doing:</p><ul><li><p>Replace core Chrome bookmarking.  They are safe, for now.</p></li></ul><h2>Basic Architecture</h2><p>No surprises here if you have see my previous posts on building Chrome extensions here:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;f929f0e4-599f-4f01-91b7-11c4031a1a7e&quot;,&quot;caption&quot;:&quot;Google Chrome is already filled with lots of tools to help with building and debugging websites. However, there are many times a site is lacking a feature, or an entire class of web applications would be better off if some feature could be added, or aspect changed. Essentially, can you extend Chrome, to do helpful things? The answer of course is yes,&#8230;&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Guide: How to Build a Simple Chrome Extension&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:153565442,&quot;name&quot;:&quot;Rob&quot;,&quot;bio&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bd0bbf9c-d781-4cc6-81bc-df2256a6e2c8_144x144.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-07-28T00:23:05.850Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad59d61f-79fb-44a6-b5c5-e6f6484deb70_1220x596.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://papayabytes.substack.com/p/guide-how-to-build-a-simple-chrome&quot;,&quot;section_name&quot;:&quot;Code&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:131029067,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;PapayaBytes&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd0bbf9c-d781-4cc6-81bc-df2256a6e2c8_144x144.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>and here:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;e3c4340e-8901-47a5-bebe-d31897f3dc2d&quot;,&quot;caption&quot;:&quot;Risky Business Most modern browsers offer a wide array of extensibility options in the form of extensions (sometimes called plugins). Extensions are generally obtained through an extension marketplace such as Chrome Web Store (for Chrome) and Firefox Browser Add-ons&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Guide: Building a Chrome Network Listener&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:153565442,&quot;name&quot;:&quot;Rob&quot;,&quot;bio&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bd0bbf9c-d781-4cc6-81bc-df2256a6e2c8_144x144.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-08-01T20:20:02.945Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35f779c7-d33b-45ce-bafa-4975e032dfc9_2206x1152.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://papayabytes.substack.com/p/guide-building-a-chrome-network-listener&quot;,&quot;section_name&quot;:&quot;Code&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:135633922,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;PapayaBytes&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd0bbf9c-d781-4cc6-81bc-df2256a6e2c8_144x144.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>Building off what we have learned, initially this extension will work as a side panel extension, with additional functionality, including saving details locally.</p><h3>Basic Architecture</h3><p>Here will be our initial file layout:</p><ul><li><p>manifest.json file</p></li><li><p>popup.html</p></li><li><p>content.js</p></li><li><p>README.md</p></li><li><p>scripts/background.js</p></li><li><p>sidepanel.html</p></li><li><p>sidepanel.js</p></li></ul><p>Like I said, no surprises here.  So what will be new?  </p><ul><li><p>bookremarks.html, we are going to override the default blank new tab with our customer bookRemark.html.  Intent here is you can get a view of your research soon as you open up the browser and a new (blank) tab.</p></li><li><p>blank.js, the script file we will use in bookremarks.html (named in our of the about:blank tab we are replacing later).</p></li><li><p>styles.css, to spruce the place up.</p></li></ul><p>We will also be:</p><ul><li><p>Accessing additional APIs, more as the post progresses.</p></li><li><p>Accessing a data store. Got to put this stuff somewhere!</p></li></ul><h4>Replacing "about:blank"</h4><p>Chrome gives you options to replace various functionality including replacing the bookmarks page, or history and in our case the "new" blank tab, functionally referring to "about:blank". You will still be about to go to a true blank tab going directly to the blank endpoint.  However, using this technique we will be able to load a custom HTML page when you fire off a new tab. For now, we will put a placeholder that looks like this:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oTJC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfb8ce5-0c7e-4ff9-8e9b-9403fa83608a_954x378.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oTJC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfb8ce5-0c7e-4ff9-8e9b-9403fa83608a_954x378.png 424w, https://substackcdn.com/image/fetch/$s_!oTJC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfb8ce5-0c7e-4ff9-8e9b-9403fa83608a_954x378.png 848w, https://substackcdn.com/image/fetch/$s_!oTJC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfb8ce5-0c7e-4ff9-8e9b-9403fa83608a_954x378.png 1272w, https://substackcdn.com/image/fetch/$s_!oTJC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfb8ce5-0c7e-4ff9-8e9b-9403fa83608a_954x378.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oTJC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfb8ce5-0c7e-4ff9-8e9b-9403fa83608a_954x378.png" width="496" height="196.52830188679246" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/adfb8ce5-0c7e-4ff9-8e9b-9403fa83608a_954x378.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:378,&quot;width&quot;:954,&quot;resizeWidth&quot;:496,&quot;bytes&quot;:34800,&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_!oTJC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfb8ce5-0c7e-4ff9-8e9b-9403fa83608a_954x378.png 424w, https://substackcdn.com/image/fetch/$s_!oTJC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfb8ce5-0c7e-4ff9-8e9b-9403fa83608a_954x378.png 848w, https://substackcdn.com/image/fetch/$s_!oTJC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfb8ce5-0c7e-4ff9-8e9b-9403fa83608a_954x378.png 1272w, https://substackcdn.com/image/fetch/$s_!oTJC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfb8ce5-0c7e-4ff9-8e9b-9403fa83608a_954x378.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Temporary new blank tab.</figcaption></figure></div><p>Why, though?  The intent here is so when you open a tab you will be able to see a more complete view of the work you have been doing, versus what will be captured and shown in the side panel view.</p><p>How was this done?  Aside from creating your custom HTML page (I called this bookremarks.html), you need to update your manifest to include a reference to your page and which functional section you are looking to replace, in our case, the blank tab:</p><pre><code>"chrome_url_overrides": {"newtab": "bookremarks.html"}</code></pre><p>More info on overriding pages in Chrome can be found <a href="https://developer.chrome.com/docs/extensions/mv3/override/">here</a>.</p><h2>Functionality</h2><p>It&#8217;s not enough to capture text we are interested in, we are looking to capture metadata about the research session, the URLs involved, etc.  While we did note we did not want to replace basic bookmark functionality, we are interested in capturing them.  So how can we do that as they are created?</p><h3>Bookmarks</h3><p>The chrome.bookmarks API requires:</p><ul><li><p>The "bookmarks" permission in the manifest.</p></li><li><p>Code related to working with them will be placed in the background worker (background.js in our case).</p></li></ul><p>For now, lets just print out what was captured to get a sense of how one access the bookmark data:</p><pre><code>chrome.bookmarks.onCreated.addListener((id) =&gt; {
    console.log("chrome.bookmarks.onCreated")
    console.log(id)

    chrome.bookmarks.get(id, (result) =&gt; {
        console.log(JSON.stringify(result))
    })
});</code></pre><p>With this code, once a bookmark is successfully created, we can capture its <code>id</code> (which may also be a bookmarks folder <code>id</code> as well).  Using the <code>get</code> method, we can pull up details about the bookmark. We will later add this data to our research session.</p><h3>Capturing Text, Metadata and Saving It</h3><p>The primary function of this extension was intended to:</p><ul><li><p>Capture selected text, as it&#8217;s of the most interest.</p></li><li><p>Capture metadata about the text, such as the page URL, when you copied it, etc.</p></li><li><p>Save this detail to a data store.</p></li></ul><p>So let&#8217;s break this down:</p><h4>content.js - Data Extraction</h4><p>To interact with the DOM of a page, we need to place our code in the content script.  Additionally, for the code to be injected, we need to set permissions to allow this:</p><pre><code>"permissions": ["bookmarks","tabs"],</code></pre><p><code>bookmarks</code> were added previously.  tabs allows us to get the url and other details.</p><p>We will capture the details we are interested in and send it on via <code>sendMessage</code> for our side panel to process. Here is what the code looks like to capture the selected text, the full text of the page itself, the url of the page, and the time we captured this detail, all before sending onto sidepanel.js to visualize:</p><pre><code>document.addEventListener("mouseup", function (event) {
    const target = event.target;
    const selection = window.getSelection();
    const selectionAsString = selection.toString().trim()
    const fullBodyText = document.body.innerText

    if (selectionAsString.length &gt; 0) {
        console.log(selectionAsString)

        data = {
            'selectedText':selectionAsString,
            'url':document.location.href,
            'date':new Date(),
            'fullBodyText':fullBodyText
        }

        chrome.runtime.sendMessage({ type: 'contentCapture', data: data });
    }
});</code></pre><h4>sidepanel.js - Session Visualization</h4><p>Before anything, the side panel requires the &#8220;sidePanel&#8221; permission to be added to your manifest permissions array.</p><p>Once a message is received from the content script, we need to take the data and place it as we would like in the sidepanel.html. The design choice here is to create a timeline type view that will take the <code>selectedText</code> out of the payload and place it into the timeline on the sidepanel.html page. Note, there are many ways to do this and I chose direct DOM manipulation here for streamlined control.</p><p>Aside from visualizing the data, this is where we will retain our session until time to save it.  Again, this data could reside elsewhere, but for simplicity, we will use a new array named "<code>sessionData</code>".</p><p>The flow of the sidepanel.js script is:</p><ul><li><p>On script load, register a function, <code>onDOMContentLoaded()</code>.  We will use this function to set the header of our session, in this case the time the extension launched.  This function also registers our "Save Session" button and <code>saveSession()</code> function that we append to the "bottom" <code>div</code> of the sidepanel.html page.</p></li><li><p><code>onMessage</code> listener, where we wait for onCompleted events either from bookmark creation, or selected content capture.  When either are hit, we will render aspects of the content to the timeline. This function also appends the data to our <code>sessionData</code> array defined earlier.</p></li><li><p><code>createSeparator()</code>, <code>addNewDivWithSeparator()</code>, helper functions for rendering our content. </p></li><li><p><code>saveSession()</code>, will send our sessionData out to be captured by the background.js script, as it has access to localStorage, our data store of choice.</p></li></ul><p>Here is an example of the side panel with some text captured:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!z7_Z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae2ed492-bddb-49f1-843e-a0ef54286f70_1950x980.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!z7_Z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae2ed492-bddb-49f1-843e-a0ef54286f70_1950x980.png 424w, https://substackcdn.com/image/fetch/$s_!z7_Z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae2ed492-bddb-49f1-843e-a0ef54286f70_1950x980.png 848w, https://substackcdn.com/image/fetch/$s_!z7_Z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae2ed492-bddb-49f1-843e-a0ef54286f70_1950x980.png 1272w, https://substackcdn.com/image/fetch/$s_!z7_Z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae2ed492-bddb-49f1-843e-a0ef54286f70_1950x980.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!z7_Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae2ed492-bddb-49f1-843e-a0ef54286f70_1950x980.png" width="1456" height="732" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ae2ed492-bddb-49f1-843e-a0ef54286f70_1950x980.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:732,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:300225,&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_!z7_Z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae2ed492-bddb-49f1-843e-a0ef54286f70_1950x980.png 424w, https://substackcdn.com/image/fetch/$s_!z7_Z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae2ed492-bddb-49f1-843e-a0ef54286f70_1950x980.png 848w, https://substackcdn.com/image/fetch/$s_!z7_Z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae2ed492-bddb-49f1-843e-a0ef54286f70_1950x980.png 1272w, https://substackcdn.com/image/fetch/$s_!z7_Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae2ed492-bddb-49f1-843e-a0ef54286f70_1950x980.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">Example session timeline in the side panel.</figcaption></figure></div><p>Additionally some care was taken to prevent duplicates.  This might seem obvious but:</p><ul><li><p>A text selection could be a duplicate of one much further down the page and not obvious.</p></li><li><p>Double-clicking when text is highlighted causes a capture, but of the highlighted text, which could be a duplicate and easy to happen clicking around a page.</p></li></ul><p>On to saving the data.</p><h4>background.js - Data Management</h4><p>The background worker script, background.js is focused primarily on our localStore database interactions with one exception.</p><h5>Bookmark Creation Capture</h5><p>During your working session you might want to bookmark the page. That&#8217;s perfectly fine to do while using this extension.  However we can capture that operation to send the bookmark details on to the side panel where we can save and visualize it. To do this we add a listener to <code>chrome.bookmarks.onCreated</code>.</p><h4>localStorage Database Management</h4><p>The flow of managing our data in background.js is as follows:</p><ul><li><p>On loading the script we remove the data we placed in storage.  As this version of the extension is just for learning it allows us to keep things clean for now. (<strong>NOTE:</strong> When you remove the extension, it also removes your data.  Otherwise, across browser reboots, it will remain.)</p></li><li><p>Getting data. We listen for a message with action set to "<code>getSavedText</code>", which comes from the loading of the bookremarks.html page, to retrieve our session data and display it on the page.</p></li><li><p>Setting data. We also listen for "<code>savedText</code>", sent from clicking the "Save Session" button on our side panel, to save the data that is passed into localStorage.</p></li></ul><h4>&#8220;about:blank&#8221;/New Tab - Overriding Default Pages</h4><p>While we could have chosen to build out a more robust popup.html, secondary side panel, edit options on the original side panel, etc, I decided to show how to override one of the basic Chrome components, in this case the "new tab".  Earlier I showed how to do a basic replacement of this page, now it&#8217;s time to add some functionality to it.</p><p>Upon opening a new Chrome tab, instead of the regular blank (or other option you setup) page you would see, you will now get a view of the data collected by the extension. As one of the options is the full text of the page, I wrote a few small helper functions to strip out newlines, remove HTML, and collapse whitespace to one space for ease of viewing.  Now after another small session and saving that data, upon opening a new tab, we see:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qarZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31c9aba1-78a9-425b-957d-a5ef9db44b14_1978x908.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qarZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31c9aba1-78a9-425b-957d-a5ef9db44b14_1978x908.png 424w, https://substackcdn.com/image/fetch/$s_!qarZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31c9aba1-78a9-425b-957d-a5ef9db44b14_1978x908.png 848w, https://substackcdn.com/image/fetch/$s_!qarZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31c9aba1-78a9-425b-957d-a5ef9db44b14_1978x908.png 1272w, https://substackcdn.com/image/fetch/$s_!qarZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31c9aba1-78a9-425b-957d-a5ef9db44b14_1978x908.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qarZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31c9aba1-78a9-425b-957d-a5ef9db44b14_1978x908.png" width="1456" height="668" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/31c9aba1-78a9-425b-957d-a5ef9db44b14_1978x908.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:668,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:231546,&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_!qarZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31c9aba1-78a9-425b-957d-a5ef9db44b14_1978x908.png 424w, https://substackcdn.com/image/fetch/$s_!qarZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31c9aba1-78a9-425b-957d-a5ef9db44b14_1978x908.png 848w, https://substackcdn.com/image/fetch/$s_!qarZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31c9aba1-78a9-425b-957d-a5ef9db44b14_1978x908.png 1272w, https://substackcdn.com/image/fetch/$s_!qarZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31c9aba1-78a9-425b-957d-a5ef9db44b14_1978x908.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">Using the replaced blank tab as a page to view more details about the captured data.</figcaption></figure></div><h2>What&#8217;s Next?</h2><p>That seems like a lot, but once you check the code itself in GitHub, you will see it&#8217;s not so bad.  Did we solve bookmarks, or the actual issue, finding the data that we bookmarked?  Um, a little bit.</p><p>So now what?  The first bit was to learn how to further build out your own extensions.  This post included:</p><ul><li><p>Overriding basic Chrome functionality.</p></li><li><p>Saving data in a more permanent location (but is it the best?)</p></li><li><p>Sending data via messages between the various components of your extension.</p></li><li><p>Showing that most of what you see in Chrome, are just web pages, so can be interacted with directly via JavaScript.</p></li></ul><p>Seeing these things can now lead to the next level of features:</p><ul><li><p>Data stores.  Instead of saving data in the localStorage database, what about IndexDB (which given we are using the larger full text of pages in our objects maybe would be a better choice), or even sending the data to a service?</p></li><li><p>Data considerations.  Do we really need to get the full text for each snippet?  Sure the page might change in time, but do you expect it to change during your session?  Maybe rearchitecting the data format here would be a good area to focus.</p></li><li><p>Better visualization, a given!</p></li><li><p>Could more be done with popup.html?</p></li><li><p>Sharing your bookmarks and research?</p></li><li><p>Print the data to a PDF?</p></li><li><p>This extension works on all browser instances and all tabs once open.  Maybe in some cases this is not ideal?</p></li></ul><p>The code for this post can be found on GitHub <a href="https://github.com/robpetty/bookremarks">here</a>.</p><p>Next step, versioning:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;3f7994ef-2928-48fe-a688-9c571c3d9a31&quot;,&quot;caption&quot;:&quot;In the initial BookRemarks post, we built out a basic MVP to showcase more of what can be done as an extension and not a lot yet about being a usable tool. In this post, we start to address these issues and lay some groundwork for future updates. Feel free to refresh yourself by reading over the original post here:&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Guide: BookRemarks and GitHub Releases&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:153565442,&quot;name&quot;:&quot;Rob&quot;,&quot;bio&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a4137f6b-9752-4f0e-a5c2-e32d8f4ad5d6_1000x1000.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-08-13T22:49:49.257Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df7e50-5892-4627-8d92-14d581d1ca08_2346x1260.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://papayabytes.substack.com/p/guide-bookremarks-and-github-releases&quot;,&quot;section_name&quot;:&quot;Code&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:136007574,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;PapayaBytes&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e5e0556-7e55-4e5e-8544-a4a6f5bd8a38_1000x1000.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://papayabytes.substack.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 PapayaBytes! 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[Guide: Building a Chrome Network Listener]]></title><description><![CDATA[Building a Chrome extension to listen to network requests.]]></description><link>https://papayabytes.substack.com/p/guide-building-a-chrome-network-listener</link><guid isPermaLink="false">https://papayabytes.substack.com/p/guide-building-a-chrome-network-listener</guid><dc:creator><![CDATA[Rob]]></dc:creator><pubDate>Tue, 01 Aug 2023 20:20:02 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Xc-R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35f779c7-d33b-45ce-bafa-4975e032dfc9_2206x1152.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Xc-R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35f779c7-d33b-45ce-bafa-4975e032dfc9_2206x1152.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Xc-R!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35f779c7-d33b-45ce-bafa-4975e032dfc9_2206x1152.png 424w, https://substackcdn.com/image/fetch/$s_!Xc-R!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35f779c7-d33b-45ce-bafa-4975e032dfc9_2206x1152.png 848w, https://substackcdn.com/image/fetch/$s_!Xc-R!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35f779c7-d33b-45ce-bafa-4975e032dfc9_2206x1152.png 1272w, https://substackcdn.com/image/fetch/$s_!Xc-R!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35f779c7-d33b-45ce-bafa-4975e032dfc9_2206x1152.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Xc-R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35f779c7-d33b-45ce-bafa-4975e032dfc9_2206x1152.png" width="482" height="251.5934065934066" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/35f779c7-d33b-45ce-bafa-4975e032dfc9_2206x1152.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:760,&quot;width&quot;:1456,&quot;resizeWidth&quot;:482,&quot;bytes&quot;:779793,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Xc-R!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35f779c7-d33b-45ce-bafa-4975e032dfc9_2206x1152.png 424w, https://substackcdn.com/image/fetch/$s_!Xc-R!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35f779c7-d33b-45ce-bafa-4975e032dfc9_2206x1152.png 848w, https://substackcdn.com/image/fetch/$s_!Xc-R!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35f779c7-d33b-45ce-bafa-4975e032dfc9_2206x1152.png 1272w, https://substackcdn.com/image/fetch/$s_!Xc-R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35f779c7-d33b-45ce-bafa-4975e032dfc9_2206x1152.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">Chrome Network Listener extension in use.</figcaption></figure></div><h2>Risky Business</h2><p>Most modern browsers offer a wide array of extensibility options in the form of extensions (sometimes called plugins).  Extensions are generally obtained through an extension marketplace such as <a href="https://chrome.google.com">Chrome Web Store</a> (for Chrome) and <a href="https://addons.mozilla.org/en-US/firefox/">Firefox Browser Add-ons</a> (for Firefox).</p><p>A major concern however with extensions is trusting them.  For most people, going to a web store and clicking &#8220;Add to Chrome&#8221; and accepting any permissions needed is about a deep interaction outside the extension they will go to.  This is reasonable behavior, but risky.  This risk is magnified greatly if you install extensions from third party marketplaces as well as one-off extensions, like the one we are making today!</p><blockquote><p>For more information on Chrome extension packaging, look up the <a href="https://docs.fileformat.com/misc/crx/">CRX format</a>.</p></blockquote><h2>Basic Architecture</h2><p>Today&#8217;s post is an iteration of &#8220;<a href="https://papayabytes.substack.com/p/guide-how-to-build-a-simple-chrome">Guide: How to Build a Simple Chrome Extension</a>&#8221;. If you have never built an extension locally before please give it a read to get your footing.  </p><p>It&#8217;s one thing to capture data, it&#8217;s another to visualize it.  The goal of the extension is to not only capture requests made by Chrome as requests complete, but also clearly display them so you can possibly take some action.  What kind of action?  Perhaps you have a local firewall and you like to block some particular tracker. This extension will show you the precise domain the request is being made out toward.</p><p>The general file layout will remain the same as our previous extension:</p><ul><li><p>manifest.json file.</p></li><li><p>popup.html file.</p></li><li><p>content.js script (unused but required).</p></li><li><p>README.md (not a Chrome extension requirement, rather for GitHub).</p></li></ul><p>However there are some new files we need for the additional functionality. What are those?</p><ul><li><p>background.js in the scripts directory.  This is where we will capture the data.</p></li><li><p>sidepanel.html. How we will visualize our extension, via Chrome Side panel functionality.</p></li><li><p>sidepanel.js.  A script we will use to receive messages from background.js. We then take those messages and display the data in sidepanel.html.</p></li></ul><p>Let&#8217;s talk about what is going on with these files one by one.</p><h3>manifest.json</h3><p>This file is the heart of the configuration to your extension.  Key (new) items required for our extension:</p><ul><li><p>permissions. We will need two new permissions:</p><ul><li><p>webNavigation: Required for background.js (our background worker) to interact with the chrome.webNavigation API.</p></li><li><p>sidePanel: Required permission to interact with the Chrome Side panel functionality.</p></li></ul></li><li><p>side_panel:</p><ul><li><p>default_path child key with a value of sidepanel.html.  This is so Chrome knows what HTML file to display in the side panel.</p></li></ul></li></ul><h3>scripts/background.js</h3><p>background.js is the background worker of our extension.  This file will work in tandem with the Chrome APIs available behind the scenes to obtain data, and your visualization components (which in our case is the side panel we are building, but more generically with content.js scripts that interact with the pages rendered).</p><p>This file (available in GitHub) essentially flows like:</p><ul><li><p>Initialize some variables (domainData and urls) used to track where our requests are going.</p></li><li><p>Print a message to the console that the background.js is loaded (more on debugging later).</p></li><li><p>Register a listener. Once registered, listen for webNavigation requests to complete, process them to get the base domain of the URL, and save that data locally.  Send the updated key/value object (domain and how many times it was hit) to sidepanel.js,</p></li></ul><h4>What is a Listener?</h4><p>An extension&#8217;s files have restrictions based on permissions, which define what functionality goes where.  </p><p>A background worker is specifically prevented from accessing the page&#8217;s DOM.  What it is allowed to do is interact with the various browser APIs behind the scenes.  In our case, we want to add a listener to a specific event.  A listener is specifically a function registered to listen for one or more events in the lifecycle of an API.  </p><p>To listen to general network activity, we want to listen for the &#8220;onCompleted&#8221; event.  To add a listener to this event, we add code that looks like this:</p><pre><code>chrome.webNavigation.onCompleted.addListener();</code></pre><p>Our function will be passed anonymously to it.  Essentially we know some data will be passed to the function when &#8220;onCompleted&#8221; is emitted.  We can call this whatever we like, so for now I named this parameter &#8220;details&#8221;.  So now the generalized structure, and adding printing of this data out in a format you can see, would like like:</p><pre><code>chrome.webNavigation.onCompleted.addListener((details) =&gt;    {console.log(JSON.stringify(details)});</code></pre><h4>Debugging background.js</h4><p>How do we debug the background.js file?  Unlike debugging a web page simply by opening the Developer Tools feature, you need to fire off a separate instance for background.js. To do this (presuming you have loaded your extension already):</p><ul><li><p>Navigate to chrome://extensions.</p></li><li><p>In Inspect views click &#8220;Service worker&#8221;.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QNd8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F847b43b1-7c42-4fb8-a7e7-7aca0641ba7a_822x428.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QNd8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F847b43b1-7c42-4fb8-a7e7-7aca0641ba7a_822x428.png 424w, https://substackcdn.com/image/fetch/$s_!QNd8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F847b43b1-7c42-4fb8-a7e7-7aca0641ba7a_822x428.png 848w, https://substackcdn.com/image/fetch/$s_!QNd8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F847b43b1-7c42-4fb8-a7e7-7aca0641ba7a_822x428.png 1272w, https://substackcdn.com/image/fetch/$s_!QNd8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F847b43b1-7c42-4fb8-a7e7-7aca0641ba7a_822x428.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QNd8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F847b43b1-7c42-4fb8-a7e7-7aca0641ba7a_822x428.png" width="418" height="217.64476885644768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/847b43b1-7c42-4fb8-a7e7-7aca0641ba7a_822x428.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:428,&quot;width&quot;:822,&quot;resizeWidth&quot;:418,&quot;bytes&quot;:58943,&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_!QNd8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F847b43b1-7c42-4fb8-a7e7-7aca0641ba7a_822x428.png 424w, https://substackcdn.com/image/fetch/$s_!QNd8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F847b43b1-7c42-4fb8-a7e7-7aca0641ba7a_822x428.png 848w, https://substackcdn.com/image/fetch/$s_!QNd8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F847b43b1-7c42-4fb8-a7e7-7aca0641ba7a_822x428.png 1272w, https://substackcdn.com/image/fetch/$s_!QNd8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F847b43b1-7c42-4fb8-a7e7-7aca0641ba7a_822x428.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Extensions view to launch DevTools for background.js.</figcaption></figure></div></li></ul><p>This will open a dedicated DevTools instance, 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_!yP7b!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19353160-30d7-482b-b87d-d77bad154858_1838x1234.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yP7b!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19353160-30d7-482b-b87d-d77bad154858_1838x1234.png 424w, https://substackcdn.com/image/fetch/$s_!yP7b!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19353160-30d7-482b-b87d-d77bad154858_1838x1234.png 848w, https://substackcdn.com/image/fetch/$s_!yP7b!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19353160-30d7-482b-b87d-d77bad154858_1838x1234.png 1272w, https://substackcdn.com/image/fetch/$s_!yP7b!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19353160-30d7-482b-b87d-d77bad154858_1838x1234.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yP7b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19353160-30d7-482b-b87d-d77bad154858_1838x1234.png" width="608" height="408.3956043956044" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/19353160-30d7-482b-b87d-d77bad154858_1838x1234.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:978,&quot;width&quot;:1456,&quot;resizeWidth&quot;:608,&quot;bytes&quot;:164072,&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_!yP7b!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19353160-30d7-482b-b87d-d77bad154858_1838x1234.png 424w, https://substackcdn.com/image/fetch/$s_!yP7b!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19353160-30d7-482b-b87d-d77bad154858_1838x1234.png 848w, https://substackcdn.com/image/fetch/$s_!yP7b!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19353160-30d7-482b-b87d-d77bad154858_1838x1234.png 1272w, https://substackcdn.com/image/fetch/$s_!yP7b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19353160-30d7-482b-b87d-d77bad154858_1838x1234.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">DevTools instance for your extensions background.js.</figcaption></figure></div><h4>background.js Functionality</h4><p>As noted in the flow earlier, code in this anonymous function is where we will slice and dice the url property from the &#8220;details&#8221; data sent to our function once onCompleted fired for a given request.</p><p>Key items to note here:</p><ul><li><p>Grab the url and obtain the hostname.</p><ul><li><p>NOTE: Some resources will fail, some will be from cache, some will be malware, etc. Meaning the URL might not contain a proper hostname property.  In this case we use the entire url.  Example is &#8220;about:blank&#8221;.</p></li></ul></li><li><p>Save the parsed value as <code>domain</code> and add it to the <code>url</code> object.</p><ul><li><p>Increment the hit count if we have seen this domain before.</p></li></ul></li><li><p>Order the domains by number of hits each as received so we can see most to least in the side panel.</p></li><li><p>Send this ordered data object to the sidepanel.js file, by utilizing <code>chrome.runtime.sendMessage(sortedDomainsByCount)</code>.</p></li></ul><h3>sidepanel.html</h3><p>To visualize our data, we need somewhere to place it.  As we opted to use the Side panel functionality of Chrome, we simply need to create a basic page.  For this extension we are simply making a labeled table, that looks like this:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yKKs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba301e6-8994-4a6c-9211-83cff75a14c8_728x548.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yKKs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba301e6-8994-4a6c-9211-83cff75a14c8_728x548.png 424w, https://substackcdn.com/image/fetch/$s_!yKKs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba301e6-8994-4a6c-9211-83cff75a14c8_728x548.png 848w, https://substackcdn.com/image/fetch/$s_!yKKs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba301e6-8994-4a6c-9211-83cff75a14c8_728x548.png 1272w, https://substackcdn.com/image/fetch/$s_!yKKs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba301e6-8994-4a6c-9211-83cff75a14c8_728x548.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yKKs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba301e6-8994-4a6c-9211-83cff75a14c8_728x548.png" width="318" height="239.37362637362637" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bba301e6-8994-4a6c-9211-83cff75a14c8_728x548.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:548,&quot;width&quot;:728,&quot;resizeWidth&quot;:318,&quot;bytes&quot;:41865,&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_!yKKs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba301e6-8994-4a6c-9211-83cff75a14c8_728x548.png 424w, https://substackcdn.com/image/fetch/$s_!yKKs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba301e6-8994-4a6c-9211-83cff75a14c8_728x548.png 848w, https://substackcdn.com/image/fetch/$s_!yKKs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba301e6-8994-4a6c-9211-83cff75a14c8_728x548.png 1272w, https://substackcdn.com/image/fetch/$s_!yKKs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba301e6-8994-4a6c-9211-83cff75a14c8_728x548.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Default Chrome Network Listener view.</figcaption></figure></div><p>Aside from visualizing, it&#8217;s critical to note, in this HTML is where we refer to sidepanel.js, the JavaScript script we will use to receive information from the background.js worker and update our HTML to view the data.</p><h3>sidepanel.js</h3><p>The flow of sidepanel.js is:</p><ul><li><p>Log the file was loaded.</p></li><li><p>Add a listener, this time for the onMessage event.</p></li><li><p>A helper function for better visualization.</p></li></ul><p>To add more color to what&#8217;s happening here.  When we receive a message from the background worker, we want to take the data passed to us, and use it in our anonymous function.  We will take that data, re-render the table back to its default state (as with each <code>onComplete</code> we fire out an updated <code>url</code> object.</p><h4>DOM Accessibility</h4><p>As noted earlier, different scripts have access to different API functionality based on their permissions.  sidepanel.js works much like a content.js script, it has access to the DOM.  In this case, not a regular web page&#8217;s DOM but instead the DOM of our sidepanel.html.</p><p>This allows us to manipulate the HTML directly. In our case we simply add a new row to the table, and in the first column add the domain, and the second add the count.</p><h4>Visualization Tweak</h4><p>Some domains (especially due to subdomains) get really long.  This will cause the side panel to add a horizontal scroll bar and push the counts off the screen pretty quickly. This is not ideal behavior.  A basic remedy we can do is truncate the values.  </p><p>This is why we added the <code>truncateDomain(domain)</code> method. It is currently designed that:</p><ul><li><p>If a domain has more than 30 characters, and more than 2 segments (meaning it detected at least two periods in the domain)&#8230;</p></li><li><p>Grab the subdomain and grab its last five characters&#8230;</p></li><li><p>Then return the subdomain prefixed with &#8220;&#8230;&#8221;, and reattach to the base domain.</p></li></ul><p>Not a perfect solution, but intended to show how to make a basic visualization a bit better.</p><h2>Security</h2><p>This post is by no means complete in terms of security, but there are several security related items to observe here:</p><ul><li><p>This extension is watching aspects of your network traffic.  It&#8217;s intended to show how this type of activity is possible.</p></li><li><p>Changing the data.  While we simply parsed the domains for visibility, it shows how data can be changed, aggregated, etc before being sent.</p></li><li><p>The extension is not limited to any one URL, meaning once installed and active, it listens to all instances of Chrome and all tabs within (with exception of incognito tabs, which could be watched as well but require a special property to do so).  This is done via a config in the manifest.json:</p><pre><code>"content_scripts"."matches": ["&lt;all_urls&gt;"]</code></pre></li><li><p>Data is captured temporarily, locally.  Per the source code in GitHub you will see this data is not stored in any local data store (cookies, database, etc), or sent off on the network to a third party service.  That is the next step an extension would take to capture your data on a more permanent basis.</p></li></ul><h2>Wrap Up</h2><p>This post is not to scare you from ever using extensions.  It was intended to give a sense of what is possible, how to do actionable and realistic things with an extension and give you pause for concern of what could go wrong. Extensions are a great way to make your day to day life easier!  Like all things tech related, be mindful of the security implications, for your data, and others!</p><p>The code for this post can be found on GitHub <a href="https://github.com/robpetty/chrome-network-listener">here</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://papayabytes.substack.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 PapayaBytes! 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[Guide: Visual Studio Code and Github, Part 2 ]]></title><description><![CDATA[Authenticating with GitHub, adding and using source control with a local codebase, etc.]]></description><link>https://papayabytes.substack.com/p/guide-visual-studio-code-and-github-81f</link><guid isPermaLink="false">https://papayabytes.substack.com/p/guide-visual-studio-code-and-github-81f</guid><dc:creator><![CDATA[Rob]]></dc:creator><pubDate>Fri, 28 Jul 2023 22:57:05 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e90d73d-a7ac-4831-ab99-86a68c29056a_672x492.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>From the <a href="https://papayabytes.substack.com/p/guide-visual-studio-code-and-github">previous post</a> regarding GitHub and Visual Studio Code, we will continue to build out how to utilize these tools to manage your source code in GitHub.  </p><h2>Prerequisites</h2><p>I will presume you have created a small project that you would like to add source control to.  If you like you can follow this post to build a small Chrome extension to use (as we will here).  Alternatively if you do not have anything ready, all you need to do is create a folder and inside that folder create a README.md file, like this:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ATio!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86f2b576-eef6-41bd-b174-5af2e622323a_1172x312.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ATio!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86f2b576-eef6-41bd-b174-5af2e622323a_1172x312.png 424w, https://substackcdn.com/image/fetch/$s_!ATio!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86f2b576-eef6-41bd-b174-5af2e622323a_1172x312.png 848w, https://substackcdn.com/image/fetch/$s_!ATio!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86f2b576-eef6-41bd-b174-5af2e622323a_1172x312.png 1272w, https://substackcdn.com/image/fetch/$s_!ATio!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86f2b576-eef6-41bd-b174-5af2e622323a_1172x312.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ATio!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86f2b576-eef6-41bd-b174-5af2e622323a_1172x312.png" width="502" height="133.63822525597269" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/86f2b576-eef6-41bd-b174-5af2e622323a_1172x312.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:312,&quot;width&quot;:1172,&quot;resizeWidth&quot;:502,&quot;bytes&quot;:46987,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ATio!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86f2b576-eef6-41bd-b174-5af2e622323a_1172x312.png 424w, https://substackcdn.com/image/fetch/$s_!ATio!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86f2b576-eef6-41bd-b174-5af2e622323a_1172x312.png 848w, https://substackcdn.com/image/fetch/$s_!ATio!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86f2b576-eef6-41bd-b174-5af2e622323a_1172x312.png 1272w, https://substackcdn.com/image/fetch/$s_!ATio!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86f2b576-eef6-41bd-b174-5af2e622323a_1172x312.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption">Sample README.md</figcaption></figure></div><h2>Setting Up Authentication</h2><p>First step here is to confirm you are logged into the GitHub Pull Requests and Issues extension.  You can confirm by clicking your accounts icon in the bottom left and confirm if you see a message to log into it, such as this:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UqUf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a25e74-ec79-4440-9f24-a015681948a5_930x366.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UqUf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a25e74-ec79-4440-9f24-a015681948a5_930x366.png 424w, https://substackcdn.com/image/fetch/$s_!UqUf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a25e74-ec79-4440-9f24-a015681948a5_930x366.png 848w, https://substackcdn.com/image/fetch/$s_!UqUf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a25e74-ec79-4440-9f24-a015681948a5_930x366.png 1272w, https://substackcdn.com/image/fetch/$s_!UqUf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a25e74-ec79-4440-9f24-a015681948a5_930x366.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UqUf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a25e74-ec79-4440-9f24-a015681948a5_930x366.png" width="508" height="199.9225806451613" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/31a25e74-ec79-4440-9f24-a015681948a5_930x366.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:366,&quot;width&quot;:930,&quot;resizeWidth&quot;:508,&quot;bytes&quot;:87174,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!UqUf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a25e74-ec79-4440-9f24-a015681948a5_930x366.png 424w, https://substackcdn.com/image/fetch/$s_!UqUf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a25e74-ec79-4440-9f24-a015681948a5_930x366.png 848w, https://substackcdn.com/image/fetch/$s_!UqUf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a25e74-ec79-4440-9f24-a015681948a5_930x366.png 1272w, https://substackcdn.com/image/fetch/$s_!UqUf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a25e74-ec79-4440-9f24-a015681948a5_930x366.png 1456w" sizes="100vw"></picture><div></div></div></a><figcaption class="image-caption">Logging into the GitHub Pull Requests and Issues extension.</figcaption></figure></div><p>Clicking here will redirect you to your browser to log into GitHub and then prompt to open the *.dev link via Visual Studio Code.  Accept this and VS Code will refresh and you will be good to go.</p><h2>Repo Initialization</h2><p>The first step towards getting your local code into GitHub is initializing a local git repo for your code.  Open your desired directory via Visual Studio code if it&#8217;s not already open.  On the left side, click &#8220;Source Control&#8221;, you will see a screen 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_!b6fU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a9d0912-a888-421a-b61f-3058ce1ed215_810x778.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!b6fU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a9d0912-a888-421a-b61f-3058ce1ed215_810x778.png 424w, https://substackcdn.com/image/fetch/$s_!b6fU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a9d0912-a888-421a-b61f-3058ce1ed215_810x778.png 848w, https://substackcdn.com/image/fetch/$s_!b6fU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a9d0912-a888-421a-b61f-3058ce1ed215_810x778.png 1272w, https://substackcdn.com/image/fetch/$s_!b6fU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a9d0912-a888-421a-b61f-3058ce1ed215_810x778.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!b6fU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a9d0912-a888-421a-b61f-3058ce1ed215_810x778.png" width="440" height="422.61728395061726" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1a9d0912-a888-421a-b61f-3058ce1ed215_810x778.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:778,&quot;width&quot;:810,&quot;resizeWidth&quot;:440,&quot;bytes&quot;:113320,&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_!b6fU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a9d0912-a888-421a-b61f-3058ce1ed215_810x778.png 424w, https://substackcdn.com/image/fetch/$s_!b6fU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a9d0912-a888-421a-b61f-3058ce1ed215_810x778.png 848w, https://substackcdn.com/image/fetch/$s_!b6fU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a9d0912-a888-421a-b61f-3058ce1ed215_810x778.png 1272w, https://substackcdn.com/image/fetch/$s_!b6fU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a9d0912-a888-421a-b61f-3058ce1ed215_810x778.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">Default source control view.</figcaption></figure></div><p>From here, it is as easy as it looks, click &#8220;Initialize Repository&#8221;. The view will now change, but what happened?  </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3NaL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7155d338-86d3-46d6-af8e-589cce5e3cab_792x516.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3NaL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7155d338-86d3-46d6-af8e-589cce5e3cab_792x516.png 424w, https://substackcdn.com/image/fetch/$s_!3NaL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7155d338-86d3-46d6-af8e-589cce5e3cab_792x516.png 848w, https://substackcdn.com/image/fetch/$s_!3NaL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7155d338-86d3-46d6-af8e-589cce5e3cab_792x516.png 1272w, https://substackcdn.com/image/fetch/$s_!3NaL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7155d338-86d3-46d6-af8e-589cce5e3cab_792x516.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3NaL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7155d338-86d3-46d6-af8e-589cce5e3cab_792x516.png" width="504" height="328.3636363636364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7155d338-86d3-46d6-af8e-589cce5e3cab_792x516.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:516,&quot;width&quot;:792,&quot;resizeWidth&quot;:504,&quot;bytes&quot;:60046,&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_!3NaL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7155d338-86d3-46d6-af8e-589cce5e3cab_792x516.png 424w, https://substackcdn.com/image/fetch/$s_!3NaL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7155d338-86d3-46d6-af8e-589cce5e3cab_792x516.png 848w, https://substackcdn.com/image/fetch/$s_!3NaL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7155d338-86d3-46d6-af8e-589cce5e3cab_792x516.png 1272w, https://substackcdn.com/image/fetch/$s_!3NaL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7155d338-86d3-46d6-af8e-589cce5e3cab_792x516.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">Files being added to source control.</figcaption></figure></div><p>In your terminal (if not already, you can open in VS code via Terminal&#8594;New Terminal), you can type ls -a to see a new directory has been created named .git, and in it are several new files and folders.  This folder is how git will maintain your version control history, credential configuration, etc.</p><p>In the earlier screenshot, you will see a variety of items.  Critical things to know here:</p><ul><li><p>Nothing is actually in source control yet, this is just preparing it.</p></li><li><p>Default is placing the files into an initial branch called &#8220;main&#8221;.  You can also see what branch your on in the bottom left corner of VS Code:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ozw2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b6edeb0-fc1c-439e-8724-59cc14343b24_392x70.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ozw2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b6edeb0-fc1c-439e-8724-59cc14343b24_392x70.png 424w, https://substackcdn.com/image/fetch/$s_!ozw2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b6edeb0-fc1c-439e-8724-59cc14343b24_392x70.png 848w, https://substackcdn.com/image/fetch/$s_!ozw2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b6edeb0-fc1c-439e-8724-59cc14343b24_392x70.png 1272w, https://substackcdn.com/image/fetch/$s_!ozw2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b6edeb0-fc1c-439e-8724-59cc14343b24_392x70.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ozw2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b6edeb0-fc1c-439e-8724-59cc14343b24_392x70.png" width="296" height="52.857142857142854" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1b6edeb0-fc1c-439e-8724-59cc14343b24_392x70.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:70,&quot;width&quot;:392,&quot;resizeWidth&quot;:296,&quot;bytes&quot;:10728,&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_!ozw2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b6edeb0-fc1c-439e-8724-59cc14343b24_392x70.png 424w, https://substackcdn.com/image/fetch/$s_!ozw2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b6edeb0-fc1c-439e-8724-59cc14343b24_392x70.png 848w, https://substackcdn.com/image/fetch/$s_!ozw2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b6edeb0-fc1c-439e-8724-59cc14343b24_392x70.png 1272w, https://substackcdn.com/image/fetch/$s_!ozw2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b6edeb0-fc1c-439e-8724-59cc14343b24_392x70.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">VS Code showing your current branch, asterisk shows changes have been made.</figcaption></figure></div></li><li><p>The files that we can choose to add now have a letter U, for untracked.</p></li></ul><p>The next steps here are to take our existing files, and get them into the local main branch on our computer.  How do we do this:</p><ul><li><p>First step is to stage the changes.  This means we are adding them to the main (our current) branch.  This is done because as your code becomes more complex you might not want to include all new/updated files into this branch.  In our case we want to add all, so to the left of the blue circle (which shows number of changed files) click the + sign to &#8220;stage all changes&#8221;:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EkCB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3278eba-02ff-4276-b09b-ba80f76fd173_848x244.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EkCB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3278eba-02ff-4276-b09b-ba80f76fd173_848x244.png 424w, https://substackcdn.com/image/fetch/$s_!EkCB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3278eba-02ff-4276-b09b-ba80f76fd173_848x244.png 848w, https://substackcdn.com/image/fetch/$s_!EkCB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3278eba-02ff-4276-b09b-ba80f76fd173_848x244.png 1272w, https://substackcdn.com/image/fetch/$s_!EkCB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3278eba-02ff-4276-b09b-ba80f76fd173_848x244.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EkCB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3278eba-02ff-4276-b09b-ba80f76fd173_848x244.png" width="486" height="139.83962264150944" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d3278eba-02ff-4276-b09b-ba80f76fd173_848x244.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:244,&quot;width&quot;:848,&quot;resizeWidth&quot;:486,&quot;bytes&quot;:39107,&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_!EkCB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3278eba-02ff-4276-b09b-ba80f76fd173_848x244.png 424w, https://substackcdn.com/image/fetch/$s_!EkCB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3278eba-02ff-4276-b09b-ba80f76fd173_848x244.png 848w, https://substackcdn.com/image/fetch/$s_!EkCB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3278eba-02ff-4276-b09b-ba80f76fd173_848x244.png 1272w, https://substackcdn.com/image/fetch/$s_!EkCB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3278eba-02ff-4276-b09b-ba80f76fd173_848x244.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Staging all your new code in preparation to commit to the main branch.</figcaption></figure></div></li><li><p>The tree will now change, to include a &#8220;Staged Changes&#8221; folder with our files, and the &#8220;Changes&#8221; folder now empty beneath it:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tI7y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e90d73d-a7ac-4831-ab99-86a68c29056a_672x492.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tI7y!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e90d73d-a7ac-4831-ab99-86a68c29056a_672x492.png 424w, https://substackcdn.com/image/fetch/$s_!tI7y!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e90d73d-a7ac-4831-ab99-86a68c29056a_672x492.png 848w, https://substackcdn.com/image/fetch/$s_!tI7y!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e90d73d-a7ac-4831-ab99-86a68c29056a_672x492.png 1272w, https://substackcdn.com/image/fetch/$s_!tI7y!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e90d73d-a7ac-4831-ab99-86a68c29056a_672x492.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tI7y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e90d73d-a7ac-4831-ab99-86a68c29056a_672x492.png" width="372" height="272.35714285714283" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5e90d73d-a7ac-4831-ab99-86a68c29056a_672x492.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:492,&quot;width&quot;:672,&quot;resizeWidth&quot;:372,&quot;bytes&quot;:50691,&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_!tI7y!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e90d73d-a7ac-4831-ab99-86a68c29056a_672x492.png 424w, https://substackcdn.com/image/fetch/$s_!tI7y!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e90d73d-a7ac-4831-ab99-86a68c29056a_672x492.png 848w, https://substackcdn.com/image/fetch/$s_!tI7y!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e90d73d-a7ac-4831-ab99-86a68c29056a_672x492.png 1272w, https://substackcdn.com/image/fetch/$s_!tI7y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e90d73d-a7ac-4831-ab99-86a68c29056a_672x492.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">Updated view, showing staged changes. &#8220;A&#8221; means file has been added.</figcaption></figure></div></li></ul><p>Now it&#8217;s time to commit our staged changes to the main branch!  As is tradition for many repositories around the world, a simple message of &#8220;Initial commit&#8221;, or anything you like to describe your initial code/function of your branch, can be added to the Message text box.  To commit:</p><ul><li><p>Add your Message.  In my case &#8220;Initial commit&#8221;.</p></li><li><p>Click Commit.</p></li></ul><p>This results in:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Cbei!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dcb3c2a-15ff-40d4-873a-dad5f5ba0f42_560x604.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Cbei!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dcb3c2a-15ff-40d4-873a-dad5f5ba0f42_560x604.png 424w, https://substackcdn.com/image/fetch/$s_!Cbei!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dcb3c2a-15ff-40d4-873a-dad5f5ba0f42_560x604.png 848w, https://substackcdn.com/image/fetch/$s_!Cbei!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dcb3c2a-15ff-40d4-873a-dad5f5ba0f42_560x604.png 1272w, https://substackcdn.com/image/fetch/$s_!Cbei!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dcb3c2a-15ff-40d4-873a-dad5f5ba0f42_560x604.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Cbei!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dcb3c2a-15ff-40d4-873a-dad5f5ba0f42_560x604.png" width="306" height="330.04285714285714" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9dcb3c2a-15ff-40d4-873a-dad5f5ba0f42_560x604.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:604,&quot;width&quot;:560,&quot;resizeWidth&quot;:306,&quot;bytes&quot;:89711,&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_!Cbei!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dcb3c2a-15ff-40d4-873a-dad5f5ba0f42_560x604.png 424w, https://substackcdn.com/image/fetch/$s_!Cbei!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dcb3c2a-15ff-40d4-873a-dad5f5ba0f42_560x604.png 848w, https://substackcdn.com/image/fetch/$s_!Cbei!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dcb3c2a-15ff-40d4-873a-dad5f5ba0f42_560x604.png 1272w, https://substackcdn.com/image/fetch/$s_!Cbei!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dcb3c2a-15ff-40d4-873a-dad5f5ba0f42_560x604.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">Error!  Actually, you just need to add your account details.</figcaption></figure></div><p>Disaster! What happened here?</p><p>I left this intentionally just to show how to do some light git debugging and to help understand how to properly configure.  So click &#8220;Open Git Log&#8221; to see what happened.</p><h2>Debugging Git</h2><p>If you scroll up a bit you will see the fatal error relating to this message as well as some other messages about things not configured properly. In this case, the primary section concerns our identity:</p><pre><code>2023-07-28 13:22:01.958 [info] Author identity unknown

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: no email was given and auto-detection is disabled</code></pre><p>Git needs proper details to help track changes in the files it is tasked to version.  Luckily in this case, it literally tells us what to do.  As this is our local development host and odds are we are working out of our own personal GitHub account, it&#8217;s safe to use the &#8212;global flag when setting these things up.  To resolve this:</p><ul><li><p>In the terminal run, after updating to your GitHub email address.<br><code>git config --global user.email "you@example.com"</code></p></li><li><p>In the terminal run, after updating the name:<br><code>git config --global user.name "Your Name"</code></p></li></ul><p>If you were curious and checked your directory for .git/config you will notice no update there.  This is because we are using the global setting which will be in your home directory, so you can view like this:</p><pre><code>rob@Robs-MacBook-Pro-M2-MAX .git % cat ~/.gitconfig 
[user]
        email = "you@example.com"
        name = "Your name"</code></pre><p>Now that we have updated, please click Commit again and watch your initial files land on the "main branch&#8221;.</p><h2>Publishing Your Repo to GitHub</h2><p>You might have noticed the button changed to &#8220;Publish Branch&#8221;.  </p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PGdv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b7454ee-00f5-43e7-9cf7-463a73a748e4_772x234.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PGdv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b7454ee-00f5-43e7-9cf7-463a73a748e4_772x234.png 424w, https://substackcdn.com/image/fetch/$s_!PGdv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b7454ee-00f5-43e7-9cf7-463a73a748e4_772x234.png 848w, https://substackcdn.com/image/fetch/$s_!PGdv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b7454ee-00f5-43e7-9cf7-463a73a748e4_772x234.png 1272w, https://substackcdn.com/image/fetch/$s_!PGdv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b7454ee-00f5-43e7-9cf7-463a73a748e4_772x234.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PGdv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b7454ee-00f5-43e7-9cf7-463a73a748e4_772x234.png" width="386" height="117" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5b7454ee-00f5-43e7-9cf7-463a73a748e4_772x234.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:234,&quot;width&quot;:772,&quot;resizeWidth&quot;:386,&quot;bytes&quot;:26295,&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_!PGdv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b7454ee-00f5-43e7-9cf7-463a73a748e4_772x234.png 424w, https://substackcdn.com/image/fetch/$s_!PGdv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b7454ee-00f5-43e7-9cf7-463a73a748e4_772x234.png 848w, https://substackcdn.com/image/fetch/$s_!PGdv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b7454ee-00f5-43e7-9cf7-463a73a748e4_772x234.png 1272w, https://substackcdn.com/image/fetch/$s_!PGdv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b7454ee-00f5-43e7-9cf7-463a73a748e4_772x234.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Publish your main branch to GitHub.</figcaption></figure></div><p>As there doesn&#8217;t seem to be much else to do, let&#8217;s click it.  What, failed again?</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!j3-I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ab43b4-c89d-484e-82ca-ee3e6934f844_550x414.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!j3-I!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ab43b4-c89d-484e-82ca-ee3e6934f844_550x414.png 424w, https://substackcdn.com/image/fetch/$s_!j3-I!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ab43b4-c89d-484e-82ca-ee3e6934f844_550x414.png 848w, https://substackcdn.com/image/fetch/$s_!j3-I!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ab43b4-c89d-484e-82ca-ee3e6934f844_550x414.png 1272w, https://substackcdn.com/image/fetch/$s_!j3-I!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ab43b4-c89d-484e-82ca-ee3e6934f844_550x414.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!j3-I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ab43b4-c89d-484e-82ca-ee3e6934f844_550x414.png" width="206" height="155.06181818181818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b8ab43b4-c89d-484e-82ca-ee3e6934f844_550x414.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:414,&quot;width&quot;:550,&quot;resizeWidth&quot;:206,&quot;bytes&quot;:54646,&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_!j3-I!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ab43b4-c89d-484e-82ca-ee3e6934f844_550x414.png 424w, https://substackcdn.com/image/fetch/$s_!j3-I!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ab43b4-c89d-484e-82ca-ee3e6934f844_550x414.png 848w, https://substackcdn.com/image/fetch/$s_!j3-I!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ab43b4-c89d-484e-82ca-ee3e6934f844_550x414.png 1272w, https://substackcdn.com/image/fetch/$s_!j3-I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ab43b4-c89d-484e-82ca-ee3e6934f844_550x414.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Needs to let the extension have permission to publish.</figcaption></figure></div><p>Ok not so much a failure, rather as it&#8217;s our first go around, we need to allow the extension to work directly with GitHub so click allow. You will be prompted to allow the extension to open the authentication endpoint, so click Open:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!N_ww!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a8e60fe-a177-46f4-9830-dd2426572110_540x674.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!N_ww!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a8e60fe-a177-46f4-9830-dd2426572110_540x674.png 424w, https://substackcdn.com/image/fetch/$s_!N_ww!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a8e60fe-a177-46f4-9830-dd2426572110_540x674.png 848w, https://substackcdn.com/image/fetch/$s_!N_ww!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a8e60fe-a177-46f4-9830-dd2426572110_540x674.png 1272w, https://substackcdn.com/image/fetch/$s_!N_ww!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a8e60fe-a177-46f4-9830-dd2426572110_540x674.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!N_ww!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a8e60fe-a177-46f4-9830-dd2426572110_540x674.png" width="276" height="344.4888888888889" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8a8e60fe-a177-46f4-9830-dd2426572110_540x674.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:674,&quot;width&quot;:540,&quot;resizeWidth&quot;:276,&quot;bytes&quot;:87329,&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_!N_ww!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a8e60fe-a177-46f4-9830-dd2426572110_540x674.png 424w, https://substackcdn.com/image/fetch/$s_!N_ww!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a8e60fe-a177-46f4-9830-dd2426572110_540x674.png 848w, https://substackcdn.com/image/fetch/$s_!N_ww!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a8e60fe-a177-46f4-9830-dd2426572110_540x674.png 1272w, https://substackcdn.com/image/fetch/$s_!N_ww!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a8e60fe-a177-46f4-9830-dd2426572110_540x674.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">VS Code permission checks.</figcaption></figure></div><p>You might miss what&#8217;s next so be careful.  VS Code will prompt you to add either to a private or a public repository.  Given I am creating this post, I will place it in a public repository.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FLco!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad07f306-f30c-4e5e-937a-c2f697539f15_2236x306.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FLco!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad07f306-f30c-4e5e-937a-c2f697539f15_2236x306.png 424w, https://substackcdn.com/image/fetch/$s_!FLco!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad07f306-f30c-4e5e-937a-c2f697539f15_2236x306.png 848w, https://substackcdn.com/image/fetch/$s_!FLco!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad07f306-f30c-4e5e-937a-c2f697539f15_2236x306.png 1272w, https://substackcdn.com/image/fetch/$s_!FLco!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad07f306-f30c-4e5e-937a-c2f697539f15_2236x306.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FLco!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad07f306-f30c-4e5e-937a-c2f697539f15_2236x306.png" width="1456" height="199" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ad07f306-f30c-4e5e-937a-c2f697539f15_2236x306.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:199,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:97792,&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_!FLco!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad07f306-f30c-4e5e-937a-c2f697539f15_2236x306.png 424w, https://substackcdn.com/image/fetch/$s_!FLco!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad07f306-f30c-4e5e-937a-c2f697539f15_2236x306.png 848w, https://substackcdn.com/image/fetch/$s_!FLco!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad07f306-f30c-4e5e-937a-c2f697539f15_2236x306.png 1272w, https://substackcdn.com/image/fetch/$s_!FLco!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad07f306-f30c-4e5e-937a-c2f697539f15_2236x306.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Public or private repo options.</figcaption></figure></div><p>Immediately, barring any issue, you will multiple dialog boxes pop up, such as below:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1lvc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde7beda6-e23b-40b7-8936-74ad208fec75_1080x794.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1lvc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde7beda6-e23b-40b7-8936-74ad208fec75_1080x794.png 424w, https://substackcdn.com/image/fetch/$s_!1lvc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde7beda6-e23b-40b7-8936-74ad208fec75_1080x794.png 848w, https://substackcdn.com/image/fetch/$s_!1lvc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde7beda6-e23b-40b7-8936-74ad208fec75_1080x794.png 1272w, https://substackcdn.com/image/fetch/$s_!1lvc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde7beda6-e23b-40b7-8936-74ad208fec75_1080x794.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1lvc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde7beda6-e23b-40b7-8936-74ad208fec75_1080x794.png" width="446" height="327.8925925925926" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/de7beda6-e23b-40b7-8936-74ad208fec75_1080x794.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:1080,&quot;resizeWidth&quot;:446,&quot;bytes&quot;:168352,&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_!1lvc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde7beda6-e23b-40b7-8936-74ad208fec75_1080x794.png 424w, https://substackcdn.com/image/fetch/$s_!1lvc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde7beda6-e23b-40b7-8936-74ad208fec75_1080x794.png 848w, https://substackcdn.com/image/fetch/$s_!1lvc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde7beda6-e23b-40b7-8936-74ad208fec75_1080x794.png 1272w, https://substackcdn.com/image/fetch/$s_!1lvc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde7beda6-e23b-40b7-8936-74ad208fec75_1080x794.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">VS Code lost its damn mind!</figcaption></figure></div><h3>VS Code Dialogs After Publish Branch</h3><p>The critical one here is the middle on, go ahead and click &#8220;Open on GitHub&#8221; to see your now hosted repository there:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4k09!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb49513fd-f949-4889-a5d6-6a14716e2c1e_2250x1286.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4k09!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb49513fd-f949-4889-a5d6-6a14716e2c1e_2250x1286.png 424w, https://substackcdn.com/image/fetch/$s_!4k09!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb49513fd-f949-4889-a5d6-6a14716e2c1e_2250x1286.png 848w, https://substackcdn.com/image/fetch/$s_!4k09!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb49513fd-f949-4889-a5d6-6a14716e2c1e_2250x1286.png 1272w, https://substackcdn.com/image/fetch/$s_!4k09!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb49513fd-f949-4889-a5d6-6a14716e2c1e_2250x1286.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4k09!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb49513fd-f949-4889-a5d6-6a14716e2c1e_2250x1286.png" width="602" height="344" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b49513fd-f949-4889-a5d6-6a14716e2c1e_2250x1286.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:602,&quot;bytes&quot;:334193,&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_!4k09!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb49513fd-f949-4889-a5d6-6a14716e2c1e_2250x1286.png 424w, https://substackcdn.com/image/fetch/$s_!4k09!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb49513fd-f949-4889-a5d6-6a14716e2c1e_2250x1286.png 848w, https://substackcdn.com/image/fetch/$s_!4k09!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb49513fd-f949-4889-a5d6-6a14716e2c1e_2250x1286.png 1272w, https://substackcdn.com/image/fetch/$s_!4k09!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb49513fd-f949-4889-a5d6-6a14716e2c1e_2250x1286.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">Your code/repo now lives in GitHub! Well mine anyway.</figcaption></figure></div><p>The URL will be basically your account name/folder name, so in this case:<br>https://github.com/robpetty/simple-chrome-extension</p><p>Notice your README.md, becomes the README file you see on the repo default landing page in the &#8220;&lt;&gt; Code&#8221; section.</p><p>As to the other dialog boxes:</p><ul><li><p>As we just published our initial code to GitHub, there are no updates to make so we do not need to &#8220;Create Pull Request&#8230;&#8221; at this time.  A pull request is a merge request, meaning to pull a new branch (maybe has files for a new feature, or updates to existing code) back into the main branch (or parent branch if you have a large branching codebase).  So just &#8220;X&#8221; out of it for now.</p></li><li><p>VS Code is asking to run &#8220;git fetch&#8221; periodically.  This is good if you&#8217;re working with others, so you can see code updates that have been merged.  You would want to know this if you need to update your working branch to include some new code, or looking to avoid conflicts, etc.  So to this, click &#8220;Yes&#8221;.</p></li></ul><h2>Summary</h2><p>VS Code, GitHub and Git combine to make a powerful feature set for keeping your source code safe and its progress understandable.  Additional information can be found <a href="https://code.visualstudio.com/docs/sourcecontrol/overview">here</a>.</p><p>There is a great detail more one can do with these tools, but that&#8217;s for another day, another post.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://papayabytes.substack.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 PapayaBytes! 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[Guide: How to Build a Simple Chrome Extension]]></title><description><![CDATA[How to build a basic Chrome extension.]]></description><link>https://papayabytes.substack.com/p/guide-how-to-build-a-simple-chrome</link><guid isPermaLink="false">https://papayabytes.substack.com/p/guide-how-to-build-a-simple-chrome</guid><dc:creator><![CDATA[Rob]]></dc:creator><pubDate>Fri, 28 Jul 2023 00:23:05 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad59d61f-79fb-44a6-b5c5-e6f6484deb70_1220x596.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Google Chrome is already filled with lots of tools to help with building and debugging websites.  However, there are many times a site is lacking a feature, or an entire class of web applications would be better off if some feature could be added, or aspect changed.  Essentially, can you extend Chrome, to do helpful things?  The answer of course is yes, and they come in the form of Chrome Extensions.</p><p>The goal of this post is to share how to build a simple Chrome Extension and give clarity to various aspects of how this is done, limitations, expose features, etc.</p><p>To see some of the hundreds of thousands of Chrome Extensions, please visit the <a href="https://chrome.google.com/webstore/">Chrome Web Store</a>.</p><h2>Basic Architecture</h2><p>The basic extension architecture consists of a mix of folders and files.  For our example extension, that we will call &#8220;simple-chrome-extension&#8221;, contains the following file system items, starting with the root folder:</p><ul><li><p>simple-chrome-extension (folder)</p><ul><li><p>manifest.json</p></li><li><p>scripts (folder)</p><ul><li><p>content-script.js</p></li></ul></li></ul></li></ul><p><strong>NOTE:</strong> You can structure your extension in many ways, the only true requirement is manifest.json must be in the root of the extension folder.  Additionally, there are many other files not listed here, as extensions will vary. </p><p>So what do each of these files mean:</p><ul><li><p><a href="https://developer.chrome.com/docs/extensions/mv3/manifest/">manifest.json</a> - The confirmation file of the extension.  Everything from the name, its current version number, what icons to display, Chrome API keys, permissions that are needed, what file represents the extension service worker, option popup HTML, etc. See <a href="https://developer.chrome.com/docs/extensions/mv3/manifest/">manifest file format</a> and <a href="https://developer.chrome.com/docs/extensions/mv3/manifest/#manifest-examples">manifest examples</a> for more details.</p></li><li><p><a href="https://developer.chrome.com/docs/extensions/mv3/content_scripts/">content-script.js</a> - Contains the code that is injected into the web page.  This is where your code will reside if you need to interact with a web page directly via the DOM.  A content script does not have full access to the Chrome APIs, but you can interact with the full API via messaging with the service worker.</p></li></ul><p>There is another key file I will call out here even though we will not use it in this example, the service worker script.</p><ul><li><p><a href="https://developer.chrome.com/docs/extensions/mv3/service_workers/">service-worker.js</a> - The core script that will run in the background.  The service-worker.js specifically is to organize the functionality of the extension and listen for events.  It is isolated from the page itself so is unable to directly interact with it. See <a href="https://developer.chrome.com/docs/extensions/reference/">Chrome Extensions API</a>.</p></li></ul><p>You can find other relevant files and how they work in the architecture overview docs <a href="https://developer.chrome.com/docs/extensions/mv3/architecture-overview/">here</a>.</p><h2>Extension Buildout</h2><p>So what are we building?  This extension will simply replace a word you select, with the word &#8220;Boof!&#8221; in honor of the small dog this blog is dedicated to.  The first thing you want to do is create a folder named after the extension, so in this case, in my Repos folder:</p><pre><code>/Users/rob/Repos/simple-chrome-extension</code></pre><h3>manifest.json</h3><p>As noted earlier, the most critical file (and location of said file) is the manifest.json, placed inside the root of the folder we just created. By later selecting this folder Chrome will then look inside it, for the manifest, to properly load your extension (which we will get to later).</p><p>Here is the contents for this simple extension&#8217;s manifest:</p><pre><code>{
    "manifest_version": 3,
    "name": "Simple Chrome Extension",
    "version": "1.0",
    "description": "Changes a clicked word to say Boof!!!",
    "permissions": [
        "activeTab"
    ],
    "action": {
        "default_popup": "popup.html"
    },
    "content_scripts": [
        {
            "matches": [
                "&lt;all_urls&gt;"
            ],
            "js": [
                "content.js"
            ]
        }
    ]
}</code></pre><p>A few observations here:</p><ul><li><p>Note we called the content script file just &#8220;content.js&#8221;.  We can call it anything you like, it&#8217;s just a common practice to use content-script.js as its name but is not a hard requirement.</p></li><li><p>We are targeting version 3 of the manifest format, though earlier versions are still supported. </p></li><li><p>In terms of permissions we only added activeTab so it can give the extension temporary access to the page when loaded.  More details can be found <a href="https://developer.chrome.com/docs/extensions/mv3/manifest/activeTab/">here</a>.</p></li><li><p>We left content_scripts.matches with a value of &#8220;all_urls&#8221;, which actually could have been left out due to the activeTab permission.  This was left purely for our local development.</p></li><li><p>The popup action, which refers to when you click your icon in the extensions toolbar opening a popup, this is the popup it opens.</p></li></ul><h3>popup.html</h3><p>Speaking of the popup, here is the HTML for this file:</p><pre><code>&lt;!-- popup.html --&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;Simple Chrome Extension&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h3&gt;Simple Chrome Extension&lt;/h3&gt;
    &lt;p&gt;Click a letter in a word, and get barked at by Mya Papaya!&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;</code></pre><h3>content.js</h3><p>Now for the heavy lifting (not really).  Our content.js will be the file that is allowed to interact with the DOM of the page, so this is where we will place our Javascript code to do our interaction.  Of course, the interaction is to change the word clicked to say &#8220;Boof!!!&#8221;.  Here is the code along with some helpful comments describing it:</p><pre><code>// content.js
document.addEventListener("click", function (event) {
    const target = event.target;
    const clickedChar = getClickedCharacter(event); // Get the clicked character
    const parentElement = event.target.parentElement;
    const textContent = parentElement.textContent;

    // Find the start index of the word
    let startIndex = textContent.lastIndexOf(' ', clickedChar.index) + 1;

    // Find the end index of the word
    let endIndex = textContent.indexOf(' ', clickedChar.index);

    if (endIndex === -1) {
        endIndex = textContent.length;
    }

    const clickedWord = textContent.slice(startIndex, endIndex);

    // Replace the clicked word with the new word
    const newWord = "Boof!!!"; // Replace with the word you want
    const newTextContent = textContent.slice(0, startIndex) + newWord + textContent.slice(endIndex);
    target.textContent = newTextContent;
});

function getClickedCharacter(event) {
    const selection = window.getSelection();
    const range = selection.getRangeAt(0);
    const clickedCharacter = range.startContainer.textContent[range.startOffset];
    const clickedIndex = range.startOffset;

    return {
        character: clickedCharacter,
        index: clickedIndex
    };
};</code></pre><h2>Deploying the Extension Locally</h2><p>In this post we are only going to discuss running this extension locally, not sharing on the Chrome Web Store.  You can however share the extension with others, as long as they enable development mode in their instance of Chrome to run it.</p><p>One way to add your new extension to Chrome, using one of the <a href="https://papayabytes.substack.com/p/chrome-urls">Chrome URL</a> endpoints, is simply open a new tab and navigate to:</p><pre><code>chrome://extensions</code></pre><p>Depending on your browser, Chrome will look something 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_!5HQi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba3af3f-2e68-4a61-bd56-3c8793a59c8b_2188x1146.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5HQi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba3af3f-2e68-4a61-bd56-3c8793a59c8b_2188x1146.png 424w, https://substackcdn.com/image/fetch/$s_!5HQi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba3af3f-2e68-4a61-bd56-3c8793a59c8b_2188x1146.png 848w, https://substackcdn.com/image/fetch/$s_!5HQi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba3af3f-2e68-4a61-bd56-3c8793a59c8b_2188x1146.png 1272w, https://substackcdn.com/image/fetch/$s_!5HQi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba3af3f-2e68-4a61-bd56-3c8793a59c8b_2188x1146.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5HQi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba3af3f-2e68-4a61-bd56-3c8793a59c8b_2188x1146.png" width="1456" height="763" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cba3af3f-2e68-4a61-bd56-3c8793a59c8b_2188x1146.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:763,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:415460,&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_!5HQi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba3af3f-2e68-4a61-bd56-3c8793a59c8b_2188x1146.png 424w, https://substackcdn.com/image/fetch/$s_!5HQi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba3af3f-2e68-4a61-bd56-3c8793a59c8b_2188x1146.png 848w, https://substackcdn.com/image/fetch/$s_!5HQi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba3af3f-2e68-4a61-bd56-3c8793a59c8b_2188x1146.png 1272w, https://substackcdn.com/image/fetch/$s_!5HQi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcba3af3f-2e68-4a61-bd56-3c8793a59c8b_2188x1146.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">Chrome URL extensions endpoint, showing any installed extensions, enabled or not.</figcaption></figure></div><p>See in the top right corner?  You will need to click the &#8220;Developer mode&#8221; slider to unlock Chrome to allow your local extension to be loaded. The page should have updated to include additional features to load, pack, and update extensions, as well as new functionality on any installed extensions, such as you see here:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ec_H!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2893f3bb-1a62-4e8d-be03-085cb5a1bf7c_2188x1146.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ec_H!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2893f3bb-1a62-4e8d-be03-085cb5a1bf7c_2188x1146.png 424w, https://substackcdn.com/image/fetch/$s_!Ec_H!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2893f3bb-1a62-4e8d-be03-085cb5a1bf7c_2188x1146.png 848w, https://substackcdn.com/image/fetch/$s_!Ec_H!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2893f3bb-1a62-4e8d-be03-085cb5a1bf7c_2188x1146.png 1272w, https://substackcdn.com/image/fetch/$s_!Ec_H!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2893f3bb-1a62-4e8d-be03-085cb5a1bf7c_2188x1146.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ec_H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2893f3bb-1a62-4e8d-be03-085cb5a1bf7c_2188x1146.png" width="1456" height="763" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2893f3bb-1a62-4e8d-be03-085cb5a1bf7c_2188x1146.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:763,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:451013,&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_!Ec_H!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2893f3bb-1a62-4e8d-be03-085cb5a1bf7c_2188x1146.png 424w, https://substackcdn.com/image/fetch/$s_!Ec_H!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2893f3bb-1a62-4e8d-be03-085cb5a1bf7c_2188x1146.png 848w, https://substackcdn.com/image/fetch/$s_!Ec_H!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2893f3bb-1a62-4e8d-be03-085cb5a1bf7c_2188x1146.png 1272w, https://substackcdn.com/image/fetch/$s_!Ec_H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2893f3bb-1a62-4e8d-be03-085cb5a1bf7c_2188x1146.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">Enabling Developer mode in Chrome, to allow loading a local file system extension.</figcaption></figure></div><p>From here all you need to do:</p><ul><li><p>Click Load unpacked.</p></li><li><p>Navigate to your extensions folder, in my case, /Users/rob/Repos/simple-chrome-extension.</p></li><li><p>Click select (on the folder level, not any file inside it).</p></li></ul><p>Barring any mistakes, you will see it loaded in Chrome 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_!jxxH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61fe5ef5-66c5-41a5-a4c8-5bace60e28e8_2188x1146.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jxxH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61fe5ef5-66c5-41a5-a4c8-5bace60e28e8_2188x1146.png 424w, https://substackcdn.com/image/fetch/$s_!jxxH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61fe5ef5-66c5-41a5-a4c8-5bace60e28e8_2188x1146.png 848w, https://substackcdn.com/image/fetch/$s_!jxxH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61fe5ef5-66c5-41a5-a4c8-5bace60e28e8_2188x1146.png 1272w, https://substackcdn.com/image/fetch/$s_!jxxH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61fe5ef5-66c5-41a5-a4c8-5bace60e28e8_2188x1146.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jxxH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61fe5ef5-66c5-41a5-a4c8-5bace60e28e8_2188x1146.png" width="1456" height="763" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/61fe5ef5-66c5-41a5-a4c8-5bace60e28e8_2188x1146.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:763,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:484372,&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_!jxxH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61fe5ef5-66c5-41a5-a4c8-5bace60e28e8_2188x1146.png 424w, https://substackcdn.com/image/fetch/$s_!jxxH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61fe5ef5-66c5-41a5-a4c8-5bace60e28e8_2188x1146.png 848w, https://substackcdn.com/image/fetch/$s_!jxxH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61fe5ef5-66c5-41a5-a4c8-5bace60e28e8_2188x1146.png 1272w, https://substackcdn.com/image/fetch/$s_!jxxH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61fe5ef5-66c5-41a5-a4c8-5bace60e28e8_2188x1146.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">Updated Extensions screen showing &#8220;Simple Chrome Extension&#8221; being loaded and enabled.</figcaption></figure></div><p>A few things to note here:</p><ul><li><p>You can remove your extension here by clicking Remove.</p></li><li><p>You can disable it by clicking the extensions slider.</p></li><li><p>If you update something, like your description in the manifest.json, you can refresh here by clicking the refresh icon (after you save your file).</p></li><li><p>&#8220;Details&#8221; will open a detailed view of your extension where most of the main page functionality is duplicated, but also you can control things like what sites it can access, if it works in Incognito mode, works against file system files that are loaded in Chrome, etc.</p></li></ul><h3>Using the Extension</h3><p>While we are not setting the world on fire here, it&#8217;s still good to confirm things are working as intended.  First, you can check the popup by clicking your extension icon, the result will look something like this:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mFLM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad59d61f-79fb-44a6-b5c5-e6f6484deb70_1220x596.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mFLM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad59d61f-79fb-44a6-b5c5-e6f6484deb70_1220x596.png 424w, https://substackcdn.com/image/fetch/$s_!mFLM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad59d61f-79fb-44a6-b5c5-e6f6484deb70_1220x596.png 848w, https://substackcdn.com/image/fetch/$s_!mFLM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad59d61f-79fb-44a6-b5c5-e6f6484deb70_1220x596.png 1272w, https://substackcdn.com/image/fetch/$s_!mFLM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad59d61f-79fb-44a6-b5c5-e6f6484deb70_1220x596.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mFLM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad59d61f-79fb-44a6-b5c5-e6f6484deb70_1220x596.png" width="466" height="227.65245901639344" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ad59d61f-79fb-44a6-b5c5-e6f6484deb70_1220x596.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:596,&quot;width&quot;:1220,&quot;resizeWidth&quot;:466,&quot;bytes&quot;:89460,&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_!mFLM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad59d61f-79fb-44a6-b5c5-e6f6484deb70_1220x596.png 424w, https://substackcdn.com/image/fetch/$s_!mFLM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad59d61f-79fb-44a6-b5c5-e6f6484deb70_1220x596.png 848w, https://substackcdn.com/image/fetch/$s_!mFLM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad59d61f-79fb-44a6-b5c5-e6f6484deb70_1220x596.png 1272w, https://substackcdn.com/image/fetch/$s_!mFLM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad59d61f-79fb-44a6-b5c5-e6f6484deb70_1220x596.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Showing the extension mini toolbar popup.</figcaption></figure></div><p>To validate the functionality, we are going to go to <a href="https://www.lipsum.com/">https://www.lipsum.com/</a>, which currently looks 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_!gekj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aabe945-94e9-4d78-8b23-5394d98d0731_2046x692.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gekj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aabe945-94e9-4d78-8b23-5394d98d0731_2046x692.png 424w, https://substackcdn.com/image/fetch/$s_!gekj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aabe945-94e9-4d78-8b23-5394d98d0731_2046x692.png 848w, https://substackcdn.com/image/fetch/$s_!gekj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aabe945-94e9-4d78-8b23-5394d98d0731_2046x692.png 1272w, https://substackcdn.com/image/fetch/$s_!gekj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aabe945-94e9-4d78-8b23-5394d98d0731_2046x692.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gekj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aabe945-94e9-4d78-8b23-5394d98d0731_2046x692.png" width="1456" height="492" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9aabe945-94e9-4d78-8b23-5394d98d0731_2046x692.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:492,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:192584,&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_!gekj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aabe945-94e9-4d78-8b23-5394d98d0731_2046x692.png 424w, https://substackcdn.com/image/fetch/$s_!gekj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aabe945-94e9-4d78-8b23-5394d98d0731_2046x692.png 848w, https://substackcdn.com/image/fetch/$s_!gekj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aabe945-94e9-4d78-8b23-5394d98d0731_2046x692.png 1272w, https://substackcdn.com/image/fetch/$s_!gekj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aabe945-94e9-4d78-8b23-5394d98d0731_2046x692.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><p>Given the extension is ready to go, now clicking a few words, you can see some inspirational &#8220;Boof!!!&#8221; from Mya Papaya:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Sprc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F332a13e6-bca9-4c00-b2ab-4118411f7839_916x344.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Sprc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F332a13e6-bca9-4c00-b2ab-4118411f7839_916x344.png 424w, https://substackcdn.com/image/fetch/$s_!Sprc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F332a13e6-bca9-4c00-b2ab-4118411f7839_916x344.png 848w, https://substackcdn.com/image/fetch/$s_!Sprc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F332a13e6-bca9-4c00-b2ab-4118411f7839_916x344.png 1272w, https://substackcdn.com/image/fetch/$s_!Sprc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F332a13e6-bca9-4c00-b2ab-4118411f7839_916x344.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Sprc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F332a13e6-bca9-4c00-b2ab-4118411f7839_916x344.png" width="632" height="237.34497816593887" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/332a13e6-bca9-4c00-b2ab-4118411f7839_916x344.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:344,&quot;width&quot;:916,&quot;resizeWidth&quot;:632,&quot;bytes&quot;:72916,&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_!Sprc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F332a13e6-bca9-4c00-b2ab-4118411f7839_916x344.png 424w, https://substackcdn.com/image/fetch/$s_!Sprc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F332a13e6-bca9-4c00-b2ab-4118411f7839_916x344.png 848w, https://substackcdn.com/image/fetch/$s_!Sprc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F332a13e6-bca9-4c00-b2ab-4118411f7839_916x344.png 1272w, https://substackcdn.com/image/fetch/$s_!Sprc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F332a13e6-bca9-4c00-b2ab-4118411f7839_916x344.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Mya &#8220;Boof!!!&#8221;'ing on the Internet.</figcaption></figure></div><h2>Wrap Up</h2><p>Of course this is a trivial example but it was critical to understand the underlying basics of an extension.  Next steps here would be of course to expand the extension to be relevant to your needs, including interacting outside of Chrome itself!</p><p>The code for this post can be found on GitHub <a href="https://github.com/robpetty/simple-chrome-extension">here</a>.</p><h4>Update</h4><p>Here is a link to a slightly more advanced Chrome extension, one that can listen to all the network requests and list out their domains in the side panel while you browse:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;88ab6061-4436-4c7a-9ad8-1182378112e9&quot;,&quot;caption&quot;:&quot;Risky Business Most modern browsers offer a wide array of extensibility options in the form of extensions (sometimes called plugins). Extensions are generally obtained through an extension marketplace such as Chrome Web Store (for Chrome) and Firefox Browser Add-ons&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Guide: Building a Chrome Network Listener&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:153565442,&quot;name&quot;:&quot;Rob&quot;,&quot;bio&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bd0bbf9c-d781-4cc6-81bc-df2256a6e2c8_144x144.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-08-01T20:20:02.945Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35f779c7-d33b-45ce-bafa-4975e032dfc9_2206x1152.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://papayabytes.substack.com/p/guide-building-a-chrome-network-listener&quot;,&quot;section_name&quot;:&quot;Code&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:135633922,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;PapayaBytes&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd0bbf9c-d781-4cc6-81bc-df2256a6e2c8_144x144.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://papayabytes.substack.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 PapayaBytes! 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[Guide: Visual Studio Code and Github, Part 1]]></title><description><![CDATA[How to configure Visual Studio Code to work with Github on Mac.]]></description><link>https://papayabytes.substack.com/p/guide-visual-studio-code-and-github</link><guid isPermaLink="false">https://papayabytes.substack.com/p/guide-visual-studio-code-and-github</guid><dc:creator><![CDATA[Rob]]></dc:creator><pubDate>Tue, 25 Jul 2023 23:35:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!1Qwd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F227bbe26-24e6-41ae-b02e-50e2f350b5e4_1510x636.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Today&#8217;s post is about how to set up Visual Studio Code on a Mac to work with Github, on its most basic level. The goal is to show you to clone a repository from GitHub successfully from inside Visual Studio Code.</p><h4>Prerequisites</h4><p>A few presumptions will be made here:</p><ul><li><p>You are on a Mac.</p></li><li><p>Homebrew and Visual Studio Code are installed.  If not please see:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;aa3e3f1f-2324-423a-b3d4-152dcfcd1b6f&quot;,&quot;caption&quot;:&quot;The following post will describe how to install the basic developer setup on a Mac from scratch, for working in Python. Homebrew First up, need a package manager. Homebrew has become the de facto choice recently on the Mac platform. First, you need to open a command line somewhere, either:&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Guide: Homebrew, Python and Visual Studio Code on Mac&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:153565442,&quot;name&quot;:&quot;Rob&quot;,&quot;bio&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bd0bbf9c-d781-4cc6-81bc-df2256a6e2c8_144x144.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-07-17T23:23:48.475Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/582c19b9-1181-4592-b3c0-919d012acd03_2458x1668.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://papayabytes.substack.com/p/guide-homebrew-python-and-visual&quot;,&quot;section_name&quot;:&quot;Code&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:135137206,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;PapayaBytes&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd0bbf9c-d781-4cc6-81bc-df2256a6e2c8_144x144.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p><strong>NOTE:</strong> You can skip installing Python if going by that previous post.</p></li><li><p>You have an account on Github.com.  If not, join <a href="https://github.com/signup">here</a>.</p></li></ul><h2>Initial Steps</h2><h3>Git Installation</h3><p>For any git source control to work, you must first install git itself. Using brew, this is as simple as opening a terminal and running:</p><pre><code>brew install git</code></pre><p><strong>NOTE:</strong> Details can be found on the formulae itself <a href="https://formulae.brew.sh/formula/git">here</a>.</p><p>Confirm your installation by running:</p><pre><code>rob@Robs-MacBook-Pro-M2-MAX ~ % git --version
git version 2.39.2 (Apple Git-143)</code></pre><h3>GitHub Pull Requests and Issues Extension Installation</h3><p>The official Visual Studio Code extension for working with GitHub is the &#8220;GitHub Pull Requests and Issues&#8221; extension, which can be found in the marketplace <a href="https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-pull-request-github">here</a>. Installation will be done here directly in Visual Studio Code. The steps are:</p><ul><li><p>Open Visual Studio Code.</p></li><li><p>Click Extensions on the left side of the window.</p></li><li><p>Start to type the name of the extension.  As the list filters, you will see it finally at the top as to not get confused with the many other git related extensions</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1Qwd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F227bbe26-24e6-41ae-b02e-50e2f350b5e4_1510x636.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1Qwd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F227bbe26-24e6-41ae-b02e-50e2f350b5e4_1510x636.png 424w, https://substackcdn.com/image/fetch/$s_!1Qwd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F227bbe26-24e6-41ae-b02e-50e2f350b5e4_1510x636.png 848w, https://substackcdn.com/image/fetch/$s_!1Qwd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F227bbe26-24e6-41ae-b02e-50e2f350b5e4_1510x636.png 1272w, https://substackcdn.com/image/fetch/$s_!1Qwd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F227bbe26-24e6-41ae-b02e-50e2f350b5e4_1510x636.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1Qwd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F227bbe26-24e6-41ae-b02e-50e2f350b5e4_1510x636.png" width="544" height="229.03296703296704" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/227bbe26-24e6-41ae-b02e-50e2f350b5e4_1510x636.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:613,&quot;width&quot;:1456,&quot;resizeWidth&quot;:544,&quot;bytes&quot;:145966,&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_!1Qwd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F227bbe26-24e6-41ae-b02e-50e2f350b5e4_1510x636.png 424w, https://substackcdn.com/image/fetch/$s_!1Qwd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F227bbe26-24e6-41ae-b02e-50e2f350b5e4_1510x636.png 848w, https://substackcdn.com/image/fetch/$s_!1Qwd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F227bbe26-24e6-41ae-b02e-50e2f350b5e4_1510x636.png 1272w, https://substackcdn.com/image/fetch/$s_!1Qwd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F227bbe26-24e6-41ae-b02e-50e2f350b5e4_1510x636.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">GitHub Pull Requests and Issues in VS Code Extension Marketplace.</figcaption></figure></div><ul><li><p>Click install.</p></li></ul><p>Once completed the informational page will 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_!fEoU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F222ed5a6-f93d-452c-89e9-1a25a49251db_1300x730.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fEoU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F222ed5a6-f93d-452c-89e9-1a25a49251db_1300x730.png 424w, https://substackcdn.com/image/fetch/$s_!fEoU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F222ed5a6-f93d-452c-89e9-1a25a49251db_1300x730.png 848w, https://substackcdn.com/image/fetch/$s_!fEoU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F222ed5a6-f93d-452c-89e9-1a25a49251db_1300x730.png 1272w, https://substackcdn.com/image/fetch/$s_!fEoU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F222ed5a6-f93d-452c-89e9-1a25a49251db_1300x730.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fEoU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F222ed5a6-f93d-452c-89e9-1a25a49251db_1300x730.png" width="548" height="307.7230769230769" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/222ed5a6-f93d-452c-89e9-1a25a49251db_1300x730.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:730,&quot;width&quot;:1300,&quot;resizeWidth&quot;:548,&quot;bytes&quot;:149293,&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_!fEoU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F222ed5a6-f93d-452c-89e9-1a25a49251db_1300x730.png 424w, https://substackcdn.com/image/fetch/$s_!fEoU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F222ed5a6-f93d-452c-89e9-1a25a49251db_1300x730.png 848w, https://substackcdn.com/image/fetch/$s_!fEoU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F222ed5a6-f93d-452c-89e9-1a25a49251db_1300x730.png 1272w, https://substackcdn.com/image/fetch/$s_!fEoU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F222ed5a6-f93d-452c-89e9-1a25a49251db_1300x730.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">Github Pull Requests and Issues extension informational screen.</figcaption></figure></div><h3>Extension Configuration</h3><p><strong>NOTE:</strong> For this example I have logged out of GitHub.</p><p>Now we need to connect your local git setup to GitHub via the extension.  First, on the left side of VS Code, click the GitHub cat icon. We are going to clone a project called &#8220;The Algorithms&#8221;, which is a popular Python project for learning how various algorithms are made in Python. The GitHub page can be found <a href="https://github.com/TheAlgorithms/Python">here</a>.</p><p>As this is a new setup your screen will 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_!4QrO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd53fd27-2eb2-4029-a9f2-f2ba8c8c897f_1964x962.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4QrO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd53fd27-2eb2-4029-a9f2-f2ba8c8c897f_1964x962.png 424w, https://substackcdn.com/image/fetch/$s_!4QrO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd53fd27-2eb2-4029-a9f2-f2ba8c8c897f_1964x962.png 848w, https://substackcdn.com/image/fetch/$s_!4QrO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd53fd27-2eb2-4029-a9f2-f2ba8c8c897f_1964x962.png 1272w, https://substackcdn.com/image/fetch/$s_!4QrO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd53fd27-2eb2-4029-a9f2-f2ba8c8c897f_1964x962.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4QrO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd53fd27-2eb2-4029-a9f2-f2ba8c8c897f_1964x962.png" width="564" height="276.18956043956047" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fd53fd27-2eb2-4029-a9f2-f2ba8c8c897f_1964x962.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:713,&quot;width&quot;:1456,&quot;resizeWidth&quot;:564,&quot;bytes&quot;:251509,&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_!4QrO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd53fd27-2eb2-4029-a9f2-f2ba8c8c897f_1964x962.png 424w, https://substackcdn.com/image/fetch/$s_!4QrO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd53fd27-2eb2-4029-a9f2-f2ba8c8c897f_1964x962.png 848w, https://substackcdn.com/image/fetch/$s_!4QrO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd53fd27-2eb2-4029-a9f2-f2ba8c8c897f_1964x962.png 1272w, https://substackcdn.com/image/fetch/$s_!4QrO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd53fd27-2eb2-4029-a9f2-f2ba8c8c897f_1964x962.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><p>Using the VS Code Command Palette (&#8679;&#8984;P), we can clone this repo by typing:</p><pre><code>Git: Clone</code></pre><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fpTy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F098e1265-1d35-4eff-80ec-e6e585ce3d84_1218x248.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fpTy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F098e1265-1d35-4eff-80ec-e6e585ce3d84_1218x248.png 424w, https://substackcdn.com/image/fetch/$s_!fpTy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F098e1265-1d35-4eff-80ec-e6e585ce3d84_1218x248.png 848w, https://substackcdn.com/image/fetch/$s_!fpTy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F098e1265-1d35-4eff-80ec-e6e585ce3d84_1218x248.png 1272w, https://substackcdn.com/image/fetch/$s_!fpTy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F098e1265-1d35-4eff-80ec-e6e585ce3d84_1218x248.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fpTy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F098e1265-1d35-4eff-80ec-e6e585ce3d84_1218x248.png" width="1218" height="248" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/098e1265-1d35-4eff-80ec-e6e585ce3d84_1218x248.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:248,&quot;width&quot;:1218,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:41834,&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_!fpTy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F098e1265-1d35-4eff-80ec-e6e585ce3d84_1218x248.png 424w, https://substackcdn.com/image/fetch/$s_!fpTy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F098e1265-1d35-4eff-80ec-e6e585ce3d84_1218x248.png 848w, https://substackcdn.com/image/fetch/$s_!fpTy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F098e1265-1d35-4eff-80ec-e6e585ce3d84_1218x248.png 1272w, https://substackcdn.com/image/fetch/$s_!fpTy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F098e1265-1d35-4eff-80ec-e6e585ce3d84_1218x248.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Once you select  the command, enter the URL for the repo which is:</p><pre><code>https://github.com/TheAlgorithms/Python.git</code></pre><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SFue!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09d3bd34-b9b5-413a-9dc3-9b4cad5474dc_1226x246.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SFue!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09d3bd34-b9b5-413a-9dc3-9b4cad5474dc_1226x246.png 424w, https://substackcdn.com/image/fetch/$s_!SFue!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09d3bd34-b9b5-413a-9dc3-9b4cad5474dc_1226x246.png 848w, https://substackcdn.com/image/fetch/$s_!SFue!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09d3bd34-b9b5-413a-9dc3-9b4cad5474dc_1226x246.png 1272w, https://substackcdn.com/image/fetch/$s_!SFue!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09d3bd34-b9b5-413a-9dc3-9b4cad5474dc_1226x246.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SFue!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09d3bd34-b9b5-413a-9dc3-9b4cad5474dc_1226x246.png" width="1226" height="246" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/09d3bd34-b9b5-413a-9dc3-9b4cad5474dc_1226x246.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:246,&quot;width&quot;:1226,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:44585,&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_!SFue!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09d3bd34-b9b5-413a-9dc3-9b4cad5474dc_1226x246.png 424w, https://substackcdn.com/image/fetch/$s_!SFue!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09d3bd34-b9b5-413a-9dc3-9b4cad5474dc_1226x246.png 848w, https://substackcdn.com/image/fetch/$s_!SFue!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09d3bd34-b9b5-413a-9dc3-9b4cad5474dc_1226x246.png 1272w, https://substackcdn.com/image/fetch/$s_!SFue!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09d3bd34-b9b5-413a-9dc3-9b4cad5474dc_1226x246.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Now press enter or click &#8220;Clone from GitHub&#8221;.</p><p>You will be prompted as to where you would like to store this repository (repo).  In my case I am using:</p><pre><code>/Users/rob/Repos</code></pre><p>Click to your preferred top level folder then click &#8220;Select as Repository Destination&#8221;.</p><p>You will be prompted to either open the cloned repo, or add to your current workspace.  For now just click &#8220;Open&#8221;.  This will refresh Visual Studio Code and reopen, with the Explorer view rooted at the folder &#8220;Python&#8221;.  This folder lives inside /Users/rob/Repos in my case and is called Python because the .git file was named that.</p><p>Your Visual Studio Code instance will now 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_!9ZvS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc4ed4d-3398-41c1-8ec0-c01927677c49_1578x884.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9ZvS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc4ed4d-3398-41c1-8ec0-c01927677c49_1578x884.png 424w, https://substackcdn.com/image/fetch/$s_!9ZvS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc4ed4d-3398-41c1-8ec0-c01927677c49_1578x884.png 848w, https://substackcdn.com/image/fetch/$s_!9ZvS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc4ed4d-3398-41c1-8ec0-c01927677c49_1578x884.png 1272w, https://substackcdn.com/image/fetch/$s_!9ZvS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc4ed4d-3398-41c1-8ec0-c01927677c49_1578x884.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9ZvS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc4ed4d-3398-41c1-8ec0-c01927677c49_1578x884.png" width="1456" height="816" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9cc4ed4d-3398-41c1-8ec0-c01927677c49_1578x884.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:816,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:153256,&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_!9ZvS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc4ed4d-3398-41c1-8ec0-c01927677c49_1578x884.png 424w, https://substackcdn.com/image/fetch/$s_!9ZvS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc4ed4d-3398-41c1-8ec0-c01927677c49_1578x884.png 848w, https://substackcdn.com/image/fetch/$s_!9ZvS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc4ed4d-3398-41c1-8ec0-c01927677c49_1578x884.png 1272w, https://substackcdn.com/image/fetch/$s_!9ZvS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc4ed4d-3398-41c1-8ec0-c01927677c49_1578x884.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><h3>Summary</h3><p>There is a lot one can do with Visual Studio Code, GitHub and various extensions.  In a future post, we will continue the journey of how to finish initial git configuration and then create a local repository and push it to GitHub via the tooling installed here. We did not make use of your GitHub account yet, that was just preparation for the next steps.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://papayabytes.substack.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 PapayaBytes! 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[Chrome Screenshots]]></title><description><![CDATA[How to use Chrome to take screenshots of itself.]]></description><link>https://papayabytes.substack.com/p/chrome-screenshots</link><guid isPermaLink="false">https://papayabytes.substack.com/p/chrome-screenshots</guid><dc:creator><![CDATA[Rob]]></dc:creator><pubDate>Tue, 18 Jul 2023 22:06:37 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c4e12ae5-9a9f-43aa-b8a0-5d9995032a04_1214x668.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Chrome Developer Tools offer a great set of features to help debug and inspect web pages, traffic, data and even local files.  One overlooked feature is built-in screen capture.  There are four modes of screen capture available today.</p><h2>Where is the Screenshot Feature?</h2><p>Presuming you have launched Chrome, the first thing you will want to do once you are on the page you wish to capture, is launch the Developer Tools.  There are multiple ways to do this.</p><ul><li><p>On a Mac, <code>command-option-i</code>, will open the Developer Tools panel.</p></li><li><p>You can also use the three ellipses, aka the kebab menu, in the top right corner.  Click the three vertical dot button&#8594;More Tools&#8594;Developer Tools, as seen below.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AtHl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffadb5b4d-b6c0-4725-a162-b88f938f9e4f_1640x1202.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AtHl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffadb5b4d-b6c0-4725-a162-b88f938f9e4f_1640x1202.png 424w, https://substackcdn.com/image/fetch/$s_!AtHl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffadb5b4d-b6c0-4725-a162-b88f938f9e4f_1640x1202.png 848w, https://substackcdn.com/image/fetch/$s_!AtHl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffadb5b4d-b6c0-4725-a162-b88f938f9e4f_1640x1202.png 1272w, https://substackcdn.com/image/fetch/$s_!AtHl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffadb5b4d-b6c0-4725-a162-b88f938f9e4f_1640x1202.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AtHl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffadb5b4d-b6c0-4725-a162-b88f938f9e4f_1640x1202.png" width="1456" height="1067" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fadb5b4d-b6c0-4725-a162-b88f938f9e4f_1640x1202.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1067,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:328092,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AtHl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffadb5b4d-b6c0-4725-a162-b88f938f9e4f_1640x1202.png 424w, https://substackcdn.com/image/fetch/$s_!AtHl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffadb5b4d-b6c0-4725-a162-b88f938f9e4f_1640x1202.png 848w, https://substackcdn.com/image/fetch/$s_!AtHl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffadb5b4d-b6c0-4725-a162-b88f938f9e4f_1640x1202.png 1272w, https://substackcdn.com/image/fetch/$s_!AtHl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffadb5b4d-b6c0-4725-a162-b88f938f9e4f_1640x1202.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div></li></ul><p>From this point you have multiple ways to get to the screen capture tool(s):</p><ul><li><p>Press <code>command-shift-p</code>, and type screenshot.</p></li><li><p>Press the kebab menu button and click &#8220;Run command&#8221;. Then type screenshot as before.</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_!2tyj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe2ddfe6-3061-4dbe-8238-dc1301fc4482_1300x500.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2tyj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe2ddfe6-3061-4dbe-8238-dc1301fc4482_1300x500.png 424w, https://substackcdn.com/image/fetch/$s_!2tyj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe2ddfe6-3061-4dbe-8238-dc1301fc4482_1300x500.png 848w, https://substackcdn.com/image/fetch/$s_!2tyj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe2ddfe6-3061-4dbe-8238-dc1301fc4482_1300x500.png 1272w, https://substackcdn.com/image/fetch/$s_!2tyj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe2ddfe6-3061-4dbe-8238-dc1301fc4482_1300x500.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2tyj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe2ddfe6-3061-4dbe-8238-dc1301fc4482_1300x500.png" width="1300" height="500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/be2ddfe6-3061-4dbe-8238-dc1301fc4482_1300x500.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:500,&quot;width&quot;:1300,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:78707,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2tyj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe2ddfe6-3061-4dbe-8238-dc1301fc4482_1300x500.png 424w, https://substackcdn.com/image/fetch/$s_!2tyj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe2ddfe6-3061-4dbe-8238-dc1301fc4482_1300x500.png 848w, https://substackcdn.com/image/fetch/$s_!2tyj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe2ddfe6-3061-4dbe-8238-dc1301fc4482_1300x500.png 1272w, https://substackcdn.com/image/fetch/$s_!2tyj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe2ddfe6-3061-4dbe-8238-dc1301fc4482_1300x500.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></figure></div><h2>Screenshot Modes</h2><p>There are currently four modes to work with in the screenshot tool.</p><h3>Capture Area Screenshot</h3><p>A more traditional style of capture, where you will be presented with a crosshair to select a visible area of the page for capture.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!P0Mo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedda4dfb-29dc-40a2-a4da-4edc25554a88_808x644.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!P0Mo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedda4dfb-29dc-40a2-a4da-4edc25554a88_808x644.png 424w, https://substackcdn.com/image/fetch/$s_!P0Mo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedda4dfb-29dc-40a2-a4da-4edc25554a88_808x644.png 848w, https://substackcdn.com/image/fetch/$s_!P0Mo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedda4dfb-29dc-40a2-a4da-4edc25554a88_808x644.png 1272w, https://substackcdn.com/image/fetch/$s_!P0Mo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedda4dfb-29dc-40a2-a4da-4edc25554a88_808x644.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!P0Mo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedda4dfb-29dc-40a2-a4da-4edc25554a88_808x644.png" width="808" height="644" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/edda4dfb-29dc-40a2-a4da-4edc25554a88_808x644.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:644,&quot;width&quot;:808,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:53154,&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_!P0Mo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedda4dfb-29dc-40a2-a4da-4edc25554a88_808x644.png 424w, https://substackcdn.com/image/fetch/$s_!P0Mo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedda4dfb-29dc-40a2-a4da-4edc25554a88_808x644.png 848w, https://substackcdn.com/image/fetch/$s_!P0Mo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedda4dfb-29dc-40a2-a4da-4edc25554a88_808x644.png 1272w, https://substackcdn.com/image/fetch/$s_!P0Mo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedda4dfb-29dc-40a2-a4da-4edc25554a88_808x644.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><h3>Capture Full Size Screenshot</h3><p>To capture the entire page, even the part beneath the fold, you would use this option.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RK2N!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6195ca9-7797-4430-a52b-3c1e7307730c_1072x1276.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RK2N!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6195ca9-7797-4430-a52b-3c1e7307730c_1072x1276.png 424w, https://substackcdn.com/image/fetch/$s_!RK2N!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6195ca9-7797-4430-a52b-3c1e7307730c_1072x1276.png 848w, https://substackcdn.com/image/fetch/$s_!RK2N!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6195ca9-7797-4430-a52b-3c1e7307730c_1072x1276.png 1272w, https://substackcdn.com/image/fetch/$s_!RK2N!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6195ca9-7797-4430-a52b-3c1e7307730c_1072x1276.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RK2N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6195ca9-7797-4430-a52b-3c1e7307730c_1072x1276.png" width="1072" height="1276" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a6195ca9-7797-4430-a52b-3c1e7307730c_1072x1276.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1276,&quot;width&quot;:1072,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:116090,&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_!RK2N!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6195ca9-7797-4430-a52b-3c1e7307730c_1072x1276.png 424w, https://substackcdn.com/image/fetch/$s_!RK2N!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6195ca9-7797-4430-a52b-3c1e7307730c_1072x1276.png 848w, https://substackcdn.com/image/fetch/$s_!RK2N!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6195ca9-7797-4430-a52b-3c1e7307730c_1072x1276.png 1272w, https://substackcdn.com/image/fetch/$s_!RK2N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6195ca9-7797-4430-a52b-3c1e7307730c_1072x1276.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><h3>Capture Node Screenshot</h3><p>To capture a specific DOM element, you would first select it while the debugging tools open.  Two options are:</p><ul><li><p><code>command-shift-c</code>, then select the item of interest.</p></li><li><p>In the debug tool menu strip, click the cursor on the box icon in the top left, then select the item of interest.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!G0I9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F256bcd1b-dd97-4fb8-a95b-3e0e738c186b_1598x250.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!G0I9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F256bcd1b-dd97-4fb8-a95b-3e0e738c186b_1598x250.png 424w, https://substackcdn.com/image/fetch/$s_!G0I9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F256bcd1b-dd97-4fb8-a95b-3e0e738c186b_1598x250.png 848w, https://substackcdn.com/image/fetch/$s_!G0I9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F256bcd1b-dd97-4fb8-a95b-3e0e738c186b_1598x250.png 1272w, https://substackcdn.com/image/fetch/$s_!G0I9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F256bcd1b-dd97-4fb8-a95b-3e0e738c186b_1598x250.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!G0I9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F256bcd1b-dd97-4fb8-a95b-3e0e738c186b_1598x250.png" width="1456" height="228" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/256bcd1b-dd97-4fb8-a95b-3e0e738c186b_1598x250.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:228,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:50252,&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_!G0I9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F256bcd1b-dd97-4fb8-a95b-3e0e738c186b_1598x250.png 424w, https://substackcdn.com/image/fetch/$s_!G0I9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F256bcd1b-dd97-4fb8-a95b-3e0e738c186b_1598x250.png 848w, https://substackcdn.com/image/fetch/$s_!G0I9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F256bcd1b-dd97-4fb8-a95b-3e0e738c186b_1598x250.png 1272w, https://substackcdn.com/image/fetch/$s_!G0I9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F256bcd1b-dd97-4fb8-a95b-3e0e738c186b_1598x250.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>In this sample image I clicked the search box on the default page of Chrome.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!k8yt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13014377-887a-4b64-b5cc-2746e5872c20_674x88.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!k8yt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13014377-887a-4b64-b5cc-2746e5872c20_674x88.png 424w, https://substackcdn.com/image/fetch/$s_!k8yt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13014377-887a-4b64-b5cc-2746e5872c20_674x88.png 848w, https://substackcdn.com/image/fetch/$s_!k8yt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13014377-887a-4b64-b5cc-2746e5872c20_674x88.png 1272w, https://substackcdn.com/image/fetch/$s_!k8yt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13014377-887a-4b64-b5cc-2746e5872c20_674x88.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!k8yt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13014377-887a-4b64-b5cc-2746e5872c20_674x88.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/13014377-887a-4b64-b5cc-2746e5872c20_674x88.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:11976,&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_!k8yt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13014377-887a-4b64-b5cc-2746e5872c20_674x88.png 424w, https://substackcdn.com/image/fetch/$s_!k8yt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13014377-887a-4b64-b5cc-2746e5872c20_674x88.png 848w, https://substackcdn.com/image/fetch/$s_!k8yt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13014377-887a-4b64-b5cc-2746e5872c20_674x88.png 1272w, https://substackcdn.com/image/fetch/$s_!k8yt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13014377-887a-4b64-b5cc-2746e5872c20_674x88.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><strong>NOTE:</strong> You can also navigate the DOM in the Elements tab to highlight your node of interest before running the node screenshot capture.</p><h3>Capture Screenshot</h3><p>The most basic option, to capture the currently displayed viewport portion of the page (which may be incomplete) can be captured by this option. So in this example I moved the bottom of my browser up to cut off part of the page to show the impact versus using the previously mentioned &#8220;Capture Full Size Screenshot&#8221;.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!i8IJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89f24249-3dc9-493f-907e-567a87a5fc62_1332x1042.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!i8IJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89f24249-3dc9-493f-907e-567a87a5fc62_1332x1042.png 424w, https://substackcdn.com/image/fetch/$s_!i8IJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89f24249-3dc9-493f-907e-567a87a5fc62_1332x1042.png 848w, https://substackcdn.com/image/fetch/$s_!i8IJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89f24249-3dc9-493f-907e-567a87a5fc62_1332x1042.png 1272w, https://substackcdn.com/image/fetch/$s_!i8IJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89f24249-3dc9-493f-907e-567a87a5fc62_1332x1042.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!i8IJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89f24249-3dc9-493f-907e-567a87a5fc62_1332x1042.png" width="1332" height="1042" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/89f24249-3dc9-493f-907e-567a87a5fc62_1332x1042.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1042,&quot;width&quot;:1332,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:117345,&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_!i8IJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89f24249-3dc9-493f-907e-567a87a5fc62_1332x1042.png 424w, https://substackcdn.com/image/fetch/$s_!i8IJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89f24249-3dc9-493f-907e-567a87a5fc62_1332x1042.png 848w, https://substackcdn.com/image/fetch/$s_!i8IJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89f24249-3dc9-493f-907e-567a87a5fc62_1332x1042.png 1272w, https://substackcdn.com/image/fetch/$s_!i8IJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89f24249-3dc9-493f-907e-567a87a5fc62_1332x1042.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><p>This feature set has helped save me lots of time when having to bulk produce images of web pages versus externalized tools.  To be clear, there is still need for other tools (for example if you wanted to open the Developer Tools and take an area screenshot of the tools themselves).</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://papayabytes.substack.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 PapayaBytes! 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[Guide: Homebrew, Python and Visual Studio Code on Mac]]></title><description><![CDATA[How to set up the basic developer environment on a Mac.]]></description><link>https://papayabytes.substack.com/p/guide-homebrew-python-and-visual</link><guid isPermaLink="false">https://papayabytes.substack.com/p/guide-homebrew-python-and-visual</guid><dc:creator><![CDATA[Rob]]></dc:creator><pubDate>Mon, 17 Jul 2023 23:23:48 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/582c19b9-1181-4592-b3c0-919d012acd03_2458x1668.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The following post will describe how to install the basic developer setup on a Mac from scratch, for working in Python.</p><h2>Homebrew</h2><p>First up, you will need a package manager.  Homebrew has become the de facto choice recently on the Mac platform.  First, you need to open a command line somewhere, either:</p><ul><li><p>Open Launchpad, &#8220;Search&#8221; for &#8220;Terminal&#8221;, click it, or&#8230;</p></li><li><p>Open Spotlight search field, by pressing command + spacebar and type &#8220;Terminal&#8221;, press enter (or click it in the dropdown). </p></li></ul><p>Now it&#8217;s time to actually install Homebrew.  On the command line, paste the following command:</p><pre><code>/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"</code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2F0C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec42ab43-1878-4a2d-86b5-19beb71fdf5b_1674x490.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2F0C!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec42ab43-1878-4a2d-86b5-19beb71fdf5b_1674x490.png 424w, https://substackcdn.com/image/fetch/$s_!2F0C!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec42ab43-1878-4a2d-86b5-19beb71fdf5b_1674x490.png 848w, https://substackcdn.com/image/fetch/$s_!2F0C!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec42ab43-1878-4a2d-86b5-19beb71fdf5b_1674x490.png 1272w, https://substackcdn.com/image/fetch/$s_!2F0C!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec42ab43-1878-4a2d-86b5-19beb71fdf5b_1674x490.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2F0C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec42ab43-1878-4a2d-86b5-19beb71fdf5b_1674x490.png" width="1456" height="426" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ec42ab43-1878-4a2d-86b5-19beb71fdf5b_1674x490.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:426,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:164203,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2F0C!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec42ab43-1878-4a2d-86b5-19beb71fdf5b_1674x490.png 424w, https://substackcdn.com/image/fetch/$s_!2F0C!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec42ab43-1878-4a2d-86b5-19beb71fdf5b_1674x490.png 848w, https://substackcdn.com/image/fetch/$s_!2F0C!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec42ab43-1878-4a2d-86b5-19beb71fdf5b_1674x490.png 1272w, https://substackcdn.com/image/fetch/$s_!2F0C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec42ab43-1878-4a2d-86b5-19beb71fdf5b_1674x490.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">Brew terminal installation command.</figcaption></figure></div><p>This command tells the bash shell to take the following command string in quotes and execute it, in this case, telling curl to go fetch the install script and run it. The reason for getting Homebrew is that it will make dealing with Python and other tools easier down the road.</p><p>You will be prompted for your password to allow sudo access for installation.  It will ask you to install the Xcode Command Line Tools, to which you will press ENTER to agree and continue. These are tools to help developers do things on the command line.</p><p>At the end, you will be given more details for next steps:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1EaZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F752a726b-f12a-410b-b1a8-c679a3b81e50_1674x966.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1EaZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F752a726b-f12a-410b-b1a8-c679a3b81e50_1674x966.png 424w, https://substackcdn.com/image/fetch/$s_!1EaZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F752a726b-f12a-410b-b1a8-c679a3b81e50_1674x966.png 848w, https://substackcdn.com/image/fetch/$s_!1EaZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F752a726b-f12a-410b-b1a8-c679a3b81e50_1674x966.png 1272w, https://substackcdn.com/image/fetch/$s_!1EaZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F752a726b-f12a-410b-b1a8-c679a3b81e50_1674x966.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1EaZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F752a726b-f12a-410b-b1a8-c679a3b81e50_1674x966.png" width="1456" height="840" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/752a726b-f12a-410b-b1a8-c679a3b81e50_1674x966.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:840,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:408888,&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_!1EaZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F752a726b-f12a-410b-b1a8-c679a3b81e50_1674x966.png 424w, https://substackcdn.com/image/fetch/$s_!1EaZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F752a726b-f12a-410b-b1a8-c679a3b81e50_1674x966.png 848w, https://substackcdn.com/image/fetch/$s_!1EaZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F752a726b-f12a-410b-b1a8-c679a3b81e50_1674x966.png 1272w, https://substackcdn.com/image/fetch/$s_!1EaZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F752a726b-f12a-410b-b1a8-c679a3b81e50_1674x966.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">Brew installation in terminal, final lines.</figcaption></figure></div><p>The critical item for now is ensuring your environment is set up correctly.  The default shell on modern Macs is zsh, so its advised to run the following as suggested (note, you will need to change the path to your local path, not mine):</p><pre><code>(echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') &gt;&gt; /Users/rob/.zprofile

eval "$(/opt/homebrew/bin/brew shellenv)"</code></pre><p>These commands will set up your zsh shell to work with Homebrew by adding it to your path. You can confirm this worked by running the following and seeing that homebrew tooling was added to your PATH shell variable:</p><pre><code>env | grep PATH</code></pre><p>To confirm Homebrew now works, check its version via:</p><pre><code>brew -v</code></pre><p><strong>NOTE: </strong>The command name is <code>brew</code>, NOT homebrew.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2AKq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65b9cf6-9f66-437f-aba0-9ce349d8ae46_564x60.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2AKq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65b9cf6-9f66-437f-aba0-9ce349d8ae46_564x60.png 424w, https://substackcdn.com/image/fetch/$s_!2AKq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65b9cf6-9f66-437f-aba0-9ce349d8ae46_564x60.png 848w, https://substackcdn.com/image/fetch/$s_!2AKq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65b9cf6-9f66-437f-aba0-9ce349d8ae46_564x60.png 1272w, https://substackcdn.com/image/fetch/$s_!2AKq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65b9cf6-9f66-437f-aba0-9ce349d8ae46_564x60.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2AKq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65b9cf6-9f66-437f-aba0-9ce349d8ae46_564x60.png" width="432" height="45.95744680851064" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d65b9cf6-9f66-437f-aba0-9ce349d8ae46_564x60.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:60,&quot;width&quot;:564,&quot;resizeWidth&quot;:432,&quot;bytes&quot;:11533,&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_!2AKq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65b9cf6-9f66-437f-aba0-9ce349d8ae46_564x60.png 424w, https://substackcdn.com/image/fetch/$s_!2AKq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65b9cf6-9f66-437f-aba0-9ce349d8ae46_564x60.png 848w, https://substackcdn.com/image/fetch/$s_!2AKq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65b9cf6-9f66-437f-aba0-9ce349d8ae46_564x60.png 1272w, https://substackcdn.com/image/fetch/$s_!2AKq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65b9cf6-9f66-437f-aba0-9ce349d8ae46_564x60.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Brew version in terminal.</figcaption></figure></div><h3>Analytics (Optional)</h3><p>If you do not want to report analytics data to the Homebrew project, you can disable a couple of different ways, either via a variable in your shell:</p><pre><code><code>export HOMEBREW_NO_ANALYTICS=1</code></code></pre><p>Or by running the command:</p><pre><code>brew analytics off</code></pre><p>More info can be found on the Homebrew <a href="https://docs.brew.sh/Analytics">analytics page</a>.</p><h3>Brew Update</h3><p>While we literally just installed Brew, it doesn&#8217;t hurt to be exposed how to update it before doing other package installations.  The following command will update and upgrade brew itself:</p><pre><code><code>brew update &amp;&amp; brew upgrade</code></code></pre><p>Barring bad timing (or a delay in running this command), you should see a message &#8220;Already up-to-date&#8221;.</p><h2>Python</h2><p>Now that our Homebrew package manager is in place, time to install Python. We will be using Python via Visual Studio Code later.  Thanks to brew this will be fairly simple. A few things to keep in mind however:</p><ul><li><p>Python itself can be vary version sensitive when developing with it.  This is purely just to get a basic setup going on the current version of Python.</p></li><li><p>Python itself has its own package manager named pip3.  pip3 is specifically used to manage libraries relevant to Python itself, not tooling on your Mac.</p></li></ul><p>The brew command to install Python3 is:</p><pre><code>brew install python3</code></pre><p>At this time, version 3.11 is installed.  Here is the trailing output from the installation if curious:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!R08H!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0e8b18d-2fc6-4e80-b0bb-ec7ab25f9b77_1870x1106.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!R08H!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0e8b18d-2fc6-4e80-b0bb-ec7ab25f9b77_1870x1106.png 424w, https://substackcdn.com/image/fetch/$s_!R08H!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0e8b18d-2fc6-4e80-b0bb-ec7ab25f9b77_1870x1106.png 848w, https://substackcdn.com/image/fetch/$s_!R08H!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0e8b18d-2fc6-4e80-b0bb-ec7ab25f9b77_1870x1106.png 1272w, https://substackcdn.com/image/fetch/$s_!R08H!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0e8b18d-2fc6-4e80-b0bb-ec7ab25f9b77_1870x1106.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!R08H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0e8b18d-2fc6-4e80-b0bb-ec7ab25f9b77_1870x1106.png" width="1456" height="861" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c0e8b18d-2fc6-4e80-b0bb-ec7ab25f9b77_1870x1106.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:861,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:477400,&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_!R08H!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0e8b18d-2fc6-4e80-b0bb-ec7ab25f9b77_1870x1106.png 424w, https://substackcdn.com/image/fetch/$s_!R08H!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0e8b18d-2fc6-4e80-b0bb-ec7ab25f9b77_1870x1106.png 848w, https://substackcdn.com/image/fetch/$s_!R08H!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0e8b18d-2fc6-4e80-b0bb-ec7ab25f9b77_1870x1106.png 1272w, https://substackcdn.com/image/fetch/$s_!R08H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0e8b18d-2fc6-4e80-b0bb-ec7ab25f9b77_1870x1106.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">Brew Python3 installation output, final lines.</figcaption></figure></div><p>You can also confirm your Python3 installation (and version) is working by running:</p><pre><code>python3 --version</code></pre><h2>Visual Studio Code</h2><p>There, like most applications, many ways to install Visual Studio Code. We will continue to use Homebrew in this post.</p><h3>Cask</h3><p>Cask is a project/feature, that is part of Homebrew, that allows the managing of larger precompiled binaries, graphical packages, etc. We will use the cask feature to download Visual Studio Code.</p><p>The command to run is as follows:</p><pre><code>brew install --cask visual-studio-code</code></pre><p>If everything is working as planned, you will see output similar to the image below:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!d2xB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3db95d96-1812-418a-8dfc-d6d5e23371f4_1870x658.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!d2xB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3db95d96-1812-418a-8dfc-d6d5e23371f4_1870x658.png 424w, https://substackcdn.com/image/fetch/$s_!d2xB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3db95d96-1812-418a-8dfc-d6d5e23371f4_1870x658.png 848w, https://substackcdn.com/image/fetch/$s_!d2xB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3db95d96-1812-418a-8dfc-d6d5e23371f4_1870x658.png 1272w, https://substackcdn.com/image/fetch/$s_!d2xB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3db95d96-1812-418a-8dfc-d6d5e23371f4_1870x658.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!d2xB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3db95d96-1812-418a-8dfc-d6d5e23371f4_1870x658.png" width="1456" height="512" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3db95d96-1812-418a-8dfc-d6d5e23371f4_1870x658.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:512,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:279529,&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_!d2xB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3db95d96-1812-418a-8dfc-d6d5e23371f4_1870x658.png 424w, https://substackcdn.com/image/fetch/$s_!d2xB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3db95d96-1812-418a-8dfc-d6d5e23371f4_1870x658.png 848w, https://substackcdn.com/image/fetch/$s_!d2xB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3db95d96-1812-418a-8dfc-d6d5e23371f4_1870x658.png 1272w, https://substackcdn.com/image/fetch/$s_!d2xB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3db95d96-1812-418a-8dfc-d6d5e23371f4_1870x658.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">Brew Visual Studio Code installation output.</figcaption></figure></div><p>From here, we need to do some simple setup in Visual Studio Code.</p><h3>Configuring Visual Studio Code</h3><p>The first thing we need to do is set up where we would like our source code to live.  In your terminal, navigate to your home directory and create a directory called &#8220;Repos&#8221; (short for repositories). You can call it whatever you like, but note &#8220;code&#8221; is actually the command for launching Visual Studio Code so I would advise against it for clarity.</p><pre><code>cd ~
mkdir Repos
cd Repos</code></pre><p>Now that you are in your Repos directory launch Visual Studio Code from this folder via:</p><pre><code>code .</code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!f9NW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7cc2cec-3906-422e-8839-d74493fb2e6a_1394x490.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!f9NW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7cc2cec-3906-422e-8839-d74493fb2e6a_1394x490.png 424w, https://substackcdn.com/image/fetch/$s_!f9NW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7cc2cec-3906-422e-8839-d74493fb2e6a_1394x490.png 848w, https://substackcdn.com/image/fetch/$s_!f9NW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7cc2cec-3906-422e-8839-d74493fb2e6a_1394x490.png 1272w, https://substackcdn.com/image/fetch/$s_!f9NW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7cc2cec-3906-422e-8839-d74493fb2e6a_1394x490.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!f9NW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7cc2cec-3906-422e-8839-d74493fb2e6a_1394x490.png" width="1394" height="490" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a7cc2cec-3906-422e-8839-d74493fb2e6a_1394x490.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:490,&quot;width&quot;:1394,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:144881,&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_!f9NW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7cc2cec-3906-422e-8839-d74493fb2e6a_1394x490.png 424w, https://substackcdn.com/image/fetch/$s_!f9NW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7cc2cec-3906-422e-8839-d74493fb2e6a_1394x490.png 848w, https://substackcdn.com/image/fetch/$s_!f9NW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7cc2cec-3906-422e-8839-d74493fb2e6a_1394x490.png 1272w, https://substackcdn.com/image/fetch/$s_!f9NW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7cc2cec-3906-422e-8839-d74493fb2e6a_1394x490.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">Launching Visual Studio Code from the command line relative to the current folder.</figcaption></figure></div><p>This tells Visual Studio Code to launch from inside the &#8220;Repos&#8221; directory.</p><p>From here you will have a choice to make regarding what files and directories you will trust as seen below:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!S4Mt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fe4f256-01e1-4ab4-b4ff-57793a0e0677_2272x1760.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!S4Mt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fe4f256-01e1-4ab4-b4ff-57793a0e0677_2272x1760.png 424w, https://substackcdn.com/image/fetch/$s_!S4Mt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fe4f256-01e1-4ab4-b4ff-57793a0e0677_2272x1760.png 848w, https://substackcdn.com/image/fetch/$s_!S4Mt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fe4f256-01e1-4ab4-b4ff-57793a0e0677_2272x1760.png 1272w, https://substackcdn.com/image/fetch/$s_!S4Mt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fe4f256-01e1-4ab4-b4ff-57793a0e0677_2272x1760.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!S4Mt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fe4f256-01e1-4ab4-b4ff-57793a0e0677_2272x1760.png" width="1456" height="1128" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3fe4f256-01e1-4ab4-b4ff-57793a0e0677_2272x1760.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1128,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:712420,&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_!S4Mt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fe4f256-01e1-4ab4-b4ff-57793a0e0677_2272x1760.png 424w, https://substackcdn.com/image/fetch/$s_!S4Mt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fe4f256-01e1-4ab4-b4ff-57793a0e0677_2272x1760.png 848w, https://substackcdn.com/image/fetch/$s_!S4Mt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fe4f256-01e1-4ab4-b4ff-57793a0e0677_2272x1760.png 1272w, https://substackcdn.com/image/fetch/$s_!S4Mt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fe4f256-01e1-4ab4-b4ff-57793a0e0677_2272x1760.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">File location trust settings.</figcaption></figure></div><p>For now we only want to work from ~/Repos and below, so just click &#8220;Yes, I trust the authors&#8221; because for now, that&#8217;s yourself.</p><p>You will be prompted for some basic configuration choices at this point.  It&#8217;s up to you what you prefer, or you can even ignore these for now by closing the Welcome tab. I chose to leave the Dark Modern color theme and closed the Welcome tab.</p><h3>Visual Studio Code Python Configuration</h3><p>The last configuration remaining is setting up Visual Studio Code to work with Python. Visual Studio Code inherently is just a powerful editor that is highly extensible.  We are now going to extend it to work with Python3.</p><h4>Extensions</h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VtPp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54ecf93f-12ea-43fd-b2ca-0cf0b33f486a_1212x846.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VtPp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54ecf93f-12ea-43fd-b2ca-0cf0b33f486a_1212x846.png 424w, https://substackcdn.com/image/fetch/$s_!VtPp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54ecf93f-12ea-43fd-b2ca-0cf0b33f486a_1212x846.png 848w, https://substackcdn.com/image/fetch/$s_!VtPp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54ecf93f-12ea-43fd-b2ca-0cf0b33f486a_1212x846.png 1272w, https://substackcdn.com/image/fetch/$s_!VtPp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54ecf93f-12ea-43fd-b2ca-0cf0b33f486a_1212x846.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VtPp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54ecf93f-12ea-43fd-b2ca-0cf0b33f486a_1212x846.png" width="1212" height="846" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/54ecf93f-12ea-43fd-b2ca-0cf0b33f486a_1212x846.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:846,&quot;width&quot;:1212,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:180694,&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_!VtPp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54ecf93f-12ea-43fd-b2ca-0cf0b33f486a_1212x846.png 424w, https://substackcdn.com/image/fetch/$s_!VtPp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54ecf93f-12ea-43fd-b2ca-0cf0b33f486a_1212x846.png 848w, https://substackcdn.com/image/fetch/$s_!VtPp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54ecf93f-12ea-43fd-b2ca-0cf0b33f486a_1212x846.png 1272w, https://substackcdn.com/image/fetch/$s_!VtPp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54ecf93f-12ea-43fd-b2ca-0cf0b33f486a_1212x846.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">Visual Studio Code Extensions marketplace.</figcaption></figure></div><p>Microsoft has provided an Extensions (the building block icons on the lower left) marketplace for all kinds of tools, languages, etc.  To extend the editor to work with Python, we will install the Python extension seen above. Clicking Install will install the current version, not a pre-release version which is available in the dropdown.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UFBe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F228f0ed5-f34d-485c-9507-d539d1d46ea7_2050x1172.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UFBe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F228f0ed5-f34d-485c-9507-d539d1d46ea7_2050x1172.png 424w, https://substackcdn.com/image/fetch/$s_!UFBe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F228f0ed5-f34d-485c-9507-d539d1d46ea7_2050x1172.png 848w, https://substackcdn.com/image/fetch/$s_!UFBe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F228f0ed5-f34d-485c-9507-d539d1d46ea7_2050x1172.png 1272w, https://substackcdn.com/image/fetch/$s_!UFBe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F228f0ed5-f34d-485c-9507-d539d1d46ea7_2050x1172.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UFBe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F228f0ed5-f34d-485c-9507-d539d1d46ea7_2050x1172.png" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/228f0ed5-f34d-485c-9507-d539d1d46ea7_2050x1172.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:384362,&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_!UFBe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F228f0ed5-f34d-485c-9507-d539d1d46ea7_2050x1172.png 424w, https://substackcdn.com/image/fetch/$s_!UFBe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F228f0ed5-f34d-485c-9507-d539d1d46ea7_2050x1172.png 848w, https://substackcdn.com/image/fetch/$s_!UFBe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F228f0ed5-f34d-485c-9507-d539d1d46ea7_2050x1172.png 1272w, https://substackcdn.com/image/fetch/$s_!UFBe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F228f0ed5-f34d-485c-9507-d539d1d46ea7_2050x1172.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">Python extension welcome screen.</figcaption></figure></div><p>Once clicked, as shown above, the extension will be installed and this Welcome tab will pop-up. Now we can move on to actually creating and running a Python script.</p><h2>Python</h2><p>We can create a new Python script a few different ways, but for this tutorial, simply click the &#8220;Create Python File&#8221;, or if you already closed the Welcome tab, go to File&#8594;New File and create a new file named &#8220;hello_python.py&#8221;.  If you chose the &#8220;Create Python File&#8221; option go ahead and hit command-s and save the file as &#8220;hello_python.py&#8221; to your Repos directory. The .py extension will be detected by Visual Studio Code and give you the appropriate options via a Python &#8220;language server&#8221; running behind the scenes.  </p><p>Additionally you can now see the the environment has been setup for Python, using the Python3 package you installed earlier via Homebrew by change down in the status bar:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9H8-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb216ee3d-10dc-4fbe-a08c-9567eb512935_2272x1760.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9H8-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb216ee3d-10dc-4fbe-a08c-9567eb512935_2272x1760.png 424w, https://substackcdn.com/image/fetch/$s_!9H8-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb216ee3d-10dc-4fbe-a08c-9567eb512935_2272x1760.png 848w, https://substackcdn.com/image/fetch/$s_!9H8-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb216ee3d-10dc-4fbe-a08c-9567eb512935_2272x1760.png 1272w, https://substackcdn.com/image/fetch/$s_!9H8-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb216ee3d-10dc-4fbe-a08c-9567eb512935_2272x1760.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9H8-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb216ee3d-10dc-4fbe-a08c-9567eb512935_2272x1760.png" width="1456" height="1128" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b216ee3d-10dc-4fbe-a08c-9567eb512935_2272x1760.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1128,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:844600,&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_!9H8-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb216ee3d-10dc-4fbe-a08c-9567eb512935_2272x1760.png 424w, https://substackcdn.com/image/fetch/$s_!9H8-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb216ee3d-10dc-4fbe-a08c-9567eb512935_2272x1760.png 848w, https://substackcdn.com/image/fetch/$s_!9H8-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb216ee3d-10dc-4fbe-a08c-9567eb512935_2272x1760.png 1272w, https://substackcdn.com/image/fetch/$s_!9H8-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb216ee3d-10dc-4fbe-a08c-9567eb512935_2272x1760.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">Viewing Visual Studio Code Python interpreter setup.</figcaption></figure></div><p>For now, let&#8217;s start with the classic printing of &#8220;Hello World&#8221;. Copy the following into your python script in the editor and save the file.</p><pre><code>print("Hello world!")</code></pre><h3>Running Python</h3><p>Now to run this script, while open, simply press the play button:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hWA_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F352d483f-075f-4b67-8bd5-2afc5da9de90_910x364.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hWA_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F352d483f-075f-4b67-8bd5-2afc5da9de90_910x364.png 424w, https://substackcdn.com/image/fetch/$s_!hWA_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F352d483f-075f-4b67-8bd5-2afc5da9de90_910x364.png 848w, https://substackcdn.com/image/fetch/$s_!hWA_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F352d483f-075f-4b67-8bd5-2afc5da9de90_910x364.png 1272w, https://substackcdn.com/image/fetch/$s_!hWA_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F352d483f-075f-4b67-8bd5-2afc5da9de90_910x364.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hWA_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F352d483f-075f-4b67-8bd5-2afc5da9de90_910x364.png" width="910" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/352d483f-075f-4b67-8bd5-2afc5da9de90_910x364.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:910,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:34645,&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_!hWA_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F352d483f-075f-4b67-8bd5-2afc5da9de90_910x364.png 424w, https://substackcdn.com/image/fetch/$s_!hWA_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F352d483f-075f-4b67-8bd5-2afc5da9de90_910x364.png 848w, https://substackcdn.com/image/fetch/$s_!hWA_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F352d483f-075f-4b67-8bd5-2afc5da9de90_910x364.png 1272w, https://substackcdn.com/image/fetch/$s_!hWA_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F352d483f-075f-4b67-8bd5-2afc5da9de90_910x364.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">Hello world Python script.</figcaption></figure></div><p>The output will appear down in the terminal below:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SFp-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe979093-8f08-47f6-be92-18361d60d7ec_1490x698.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SFp-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe979093-8f08-47f6-be92-18361d60d7ec_1490x698.png 424w, https://substackcdn.com/image/fetch/$s_!SFp-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe979093-8f08-47f6-be92-18361d60d7ec_1490x698.png 848w, https://substackcdn.com/image/fetch/$s_!SFp-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe979093-8f08-47f6-be92-18361d60d7ec_1490x698.png 1272w, https://substackcdn.com/image/fetch/$s_!SFp-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe979093-8f08-47f6-be92-18361d60d7ec_1490x698.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SFp-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe979093-8f08-47f6-be92-18361d60d7ec_1490x698.png" width="1456" height="682" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fe979093-8f08-47f6-be92-18361d60d7ec_1490x698.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:682,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:78986,&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_!SFp-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe979093-8f08-47f6-be92-18361d60d7ec_1490x698.png 424w, https://substackcdn.com/image/fetch/$s_!SFp-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe979093-8f08-47f6-be92-18361d60d7ec_1490x698.png 848w, https://substackcdn.com/image/fetch/$s_!SFp-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe979093-8f08-47f6-be92-18361d60d7ec_1490x698.png 1272w, https://substackcdn.com/image/fetch/$s_!SFp-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe979093-8f08-47f6-be92-18361d60d7ec_1490x698.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">Script output in the Terminal tab below.</figcaption></figure></div><p>This output confirms to us:</p><ul><li><p>Visual Studio Code is configured correctly to use Python.</p></li><li><p>The Python in use is what we installed via Homebrew (can see in the path of the python3 executable being in /opt/homebrew/bin).</p></li><li><p>That basic Python will execute in this environment.</p></li></ul><h3>Debugging</h3><p>One last thing.  In this example we have changed the code to print a variable, x, that has the value of 1.  By clicking in the far left of the editor, in the &#8220;gutter&#8221;, you can click to leave a breakpoint.  This in combination with the dropdown option to &#8220;Debug Python File&#8221;, will allow you to run your script in debug mode, and have its execution stop when that line (line 3 in this case) is reached.  When the breakpoint is hit, you can further debug your script and either step or continue its execution.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SVGA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1113cd4-5884-4697-a245-089350422ede_1498x308.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SVGA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1113cd4-5884-4697-a245-089350422ede_1498x308.png 424w, https://substackcdn.com/image/fetch/$s_!SVGA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1113cd4-5884-4697-a245-089350422ede_1498x308.png 848w, https://substackcdn.com/image/fetch/$s_!SVGA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1113cd4-5884-4697-a245-089350422ede_1498x308.png 1272w, https://substackcdn.com/image/fetch/$s_!SVGA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1113cd4-5884-4697-a245-089350422ede_1498x308.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SVGA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1113cd4-5884-4697-a245-089350422ede_1498x308.png" width="1456" height="299" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c1113cd4-5884-4697-a245-089350422ede_1498x308.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:299,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:68405,&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_!SVGA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1113cd4-5884-4697-a245-089350422ede_1498x308.png 424w, https://substackcdn.com/image/fetch/$s_!SVGA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1113cd4-5884-4697-a245-089350422ede_1498x308.png 848w, https://substackcdn.com/image/fetch/$s_!SVGA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1113cd4-5884-4697-a245-089350422ede_1498x308.png 1272w, https://substackcdn.com/image/fetch/$s_!SVGA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1113cd4-5884-4697-a245-089350422ede_1498x308.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Where to run (and debug) a Python script in Visual Studio Code.</figcaption></figure></div><p>Below is the Visual Studio Code IDE in debug mode, stopped at the breakpoint on line 3.  To the left you can see the current value of x before it is printed to the terminal (by pressing continue or step over in the mini toolbar above the code). </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5xzV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1c09eec-1db6-4076-a480-97b20070f4c0_2646x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5xzV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1c09eec-1db6-4076-a480-97b20070f4c0_2646x1260.png 424w, https://substackcdn.com/image/fetch/$s_!5xzV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1c09eec-1db6-4076-a480-97b20070f4c0_2646x1260.png 848w, https://substackcdn.com/image/fetch/$s_!5xzV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1c09eec-1db6-4076-a480-97b20070f4c0_2646x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!5xzV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1c09eec-1db6-4076-a480-97b20070f4c0_2646x1260.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5xzV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1c09eec-1db6-4076-a480-97b20070f4c0_2646x1260.png" width="1456" height="693" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d1c09eec-1db6-4076-a480-97b20070f4c0_2646x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:693,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:531463,&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_!5xzV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1c09eec-1db6-4076-a480-97b20070f4c0_2646x1260.png 424w, https://substackcdn.com/image/fetch/$s_!5xzV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1c09eec-1db6-4076-a480-97b20070f4c0_2646x1260.png 848w, https://substackcdn.com/image/fetch/$s_!5xzV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1c09eec-1db6-4076-a480-97b20070f4c0_2646x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!5xzV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1c09eec-1db6-4076-a480-97b20070f4c0_2646x1260.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">Visual Studio Code in Python debug mode.</figcaption></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://papayabytes.substack.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 PapayaBytes! 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[Chrome URLs]]></title><description><![CDATA[How to get more information out of Chrome.]]></description><link>https://papayabytes.substack.com/p/chrome-urls</link><guid isPermaLink="false">https://papayabytes.substack.com/p/chrome-urls</guid><dc:creator><![CDATA[Rob]]></dc:creator><pubDate>Sat, 15 Jul 2023 22:20:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!pJny!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ac1d69a-7770-4767-ae83-9bad1c198cc5_2170x1374.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Chrome URLs</h2><p>Chrome URLs represent internal endpoints to the Chrome (Chromium) runtime that are available to the end user via the browser itself.</p><p>There are multiple helpful Chrome URL endpoints that you might not be aware of outside of possibly chrome://welcome when you first install Chrome.</p><p><strong>chrome://welcome</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pJny!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ac1d69a-7770-4767-ae83-9bad1c198cc5_2170x1374.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pJny!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ac1d69a-7770-4767-ae83-9bad1c198cc5_2170x1374.png 424w, https://substackcdn.com/image/fetch/$s_!pJny!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ac1d69a-7770-4767-ae83-9bad1c198cc5_2170x1374.png 848w, https://substackcdn.com/image/fetch/$s_!pJny!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ac1d69a-7770-4767-ae83-9bad1c198cc5_2170x1374.png 1272w, https://substackcdn.com/image/fetch/$s_!pJny!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ac1d69a-7770-4767-ae83-9bad1c198cc5_2170x1374.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pJny!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ac1d69a-7770-4767-ae83-9bad1c198cc5_2170x1374.png" width="1456" height="922" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2ac1d69a-7770-4767-ae83-9bad1c198cc5_2170x1374.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:922,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:285712,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pJny!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ac1d69a-7770-4767-ae83-9bad1c198cc5_2170x1374.png 424w, https://substackcdn.com/image/fetch/$s_!pJny!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ac1d69a-7770-4767-ae83-9bad1c198cc5_2170x1374.png 848w, https://substackcdn.com/image/fetch/$s_!pJny!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ac1d69a-7770-4767-ae83-9bad1c198cc5_2170x1374.png 1272w, https://substackcdn.com/image/fetch/$s_!pJny!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ac1d69a-7770-4767-ae83-9bad1c198cc5_2170x1374.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">Default welcome page of a new Chrome installation.</figcaption></figure></div><p><strong>chrome://bookmarks</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wsYA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d363439-1642-41d3-98ff-51905ed2c438_2216x1384.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wsYA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d363439-1642-41d3-98ff-51905ed2c438_2216x1384.png 424w, https://substackcdn.com/image/fetch/$s_!wsYA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d363439-1642-41d3-98ff-51905ed2c438_2216x1384.png 848w, https://substackcdn.com/image/fetch/$s_!wsYA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d363439-1642-41d3-98ff-51905ed2c438_2216x1384.png 1272w, https://substackcdn.com/image/fetch/$s_!wsYA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d363439-1642-41d3-98ff-51905ed2c438_2216x1384.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wsYA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d363439-1642-41d3-98ff-51905ed2c438_2216x1384.png" width="1456" height="909" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9d363439-1642-41d3-98ff-51905ed2c438_2216x1384.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:909,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:197663,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wsYA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d363439-1642-41d3-98ff-51905ed2c438_2216x1384.png 424w, https://substackcdn.com/image/fetch/$s_!wsYA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d363439-1642-41d3-98ff-51905ed2c438_2216x1384.png 848w, https://substackcdn.com/image/fetch/$s_!wsYA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d363439-1642-41d3-98ff-51905ed2c438_2216x1384.png 1272w, https://substackcdn.com/image/fetch/$s_!wsYA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d363439-1642-41d3-98ff-51905ed2c438_2216x1384.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">View of default bookmarks file loaded by the bookmarks URL.</figcaption></figure></div><p><strong>NOTE:</strong> Your default bookmarks file on a Mac is located at:</p><pre><code>/Users/&lt;username&gt;/Library/Application Support/Google/Chrome/Default/Bookmarks</code></pre><h2>Additional Common Endpoints</h2><p><strong>chrome://extensions</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fMMR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c8a9afe-0b98-4e36-a6c3-1ed231da237d_2320x1398.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fMMR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c8a9afe-0b98-4e36-a6c3-1ed231da237d_2320x1398.png 424w, https://substackcdn.com/image/fetch/$s_!fMMR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c8a9afe-0b98-4e36-a6c3-1ed231da237d_2320x1398.png 848w, https://substackcdn.com/image/fetch/$s_!fMMR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c8a9afe-0b98-4e36-a6c3-1ed231da237d_2320x1398.png 1272w, https://substackcdn.com/image/fetch/$s_!fMMR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c8a9afe-0b98-4e36-a6c3-1ed231da237d_2320x1398.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fMMR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c8a9afe-0b98-4e36-a6c3-1ed231da237d_2320x1398.png" width="1456" height="877" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9c8a9afe-0b98-4e36-a6c3-1ed231da237d_2320x1398.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:877,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:556154,&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_!fMMR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c8a9afe-0b98-4e36-a6c3-1ed231da237d_2320x1398.png 424w, https://substackcdn.com/image/fetch/$s_!fMMR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c8a9afe-0b98-4e36-a6c3-1ed231da237d_2320x1398.png 848w, https://substackcdn.com/image/fetch/$s_!fMMR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c8a9afe-0b98-4e36-a6c3-1ed231da237d_2320x1398.png 1272w, https://substackcdn.com/image/fetch/$s_!fMMR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c8a9afe-0b98-4e36-a6c3-1ed231da237d_2320x1398.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">Manage your Chrome extensions from this endpoint.</figcaption></figure></div><p><strong>chrome://version</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qB1D!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d57ed1e-388c-43b3-ab89-ecb63ebfe59a_2506x1274.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qB1D!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d57ed1e-388c-43b3-ab89-ecb63ebfe59a_2506x1274.png 424w, https://substackcdn.com/image/fetch/$s_!qB1D!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d57ed1e-388c-43b3-ab89-ecb63ebfe59a_2506x1274.png 848w, https://substackcdn.com/image/fetch/$s_!qB1D!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d57ed1e-388c-43b3-ab89-ecb63ebfe59a_2506x1274.png 1272w, https://substackcdn.com/image/fetch/$s_!qB1D!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d57ed1e-388c-43b3-ab89-ecb63ebfe59a_2506x1274.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qB1D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d57ed1e-388c-43b3-ab89-ecb63ebfe59a_2506x1274.png" width="1456" height="740" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3d57ed1e-388c-43b3-ab89-ecb63ebfe59a_2506x1274.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:740,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:582944,&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_!qB1D!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d57ed1e-388c-43b3-ab89-ecb63ebfe59a_2506x1274.png 424w, https://substackcdn.com/image/fetch/$s_!qB1D!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d57ed1e-388c-43b3-ab89-ecb63ebfe59a_2506x1274.png 848w, https://substackcdn.com/image/fetch/$s_!qB1D!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d57ed1e-388c-43b3-ab89-ecb63ebfe59a_2506x1274.png 1272w, https://substackcdn.com/image/fetch/$s_!qB1D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d57ed1e-388c-43b3-ab89-ecb63ebfe59a_2506x1274.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">Details in relation to your Chrome version, user agent string, launch command, etc.</figcaption></figure></div><p><strong>chrome://dino</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SeoL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e754293-188e-4327-98cb-f0ea7fa62ed8_1718x1250.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SeoL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e754293-188e-4327-98cb-f0ea7fa62ed8_1718x1250.png 424w, https://substackcdn.com/image/fetch/$s_!SeoL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e754293-188e-4327-98cb-f0ea7fa62ed8_1718x1250.png 848w, https://substackcdn.com/image/fetch/$s_!SeoL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e754293-188e-4327-98cb-f0ea7fa62ed8_1718x1250.png 1272w, https://substackcdn.com/image/fetch/$s_!SeoL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e754293-188e-4327-98cb-f0ea7fa62ed8_1718x1250.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SeoL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e754293-188e-4327-98cb-f0ea7fa62ed8_1718x1250.png" width="1456" height="1059" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9e754293-188e-4327-98cb-f0ea7fa62ed8_1718x1250.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1059,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:364325,&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_!SeoL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e754293-188e-4327-98cb-f0ea7fa62ed8_1718x1250.png 424w, https://substackcdn.com/image/fetch/$s_!SeoL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e754293-188e-4327-98cb-f0ea7fa62ed8_1718x1250.png 848w, https://substackcdn.com/image/fetch/$s_!SeoL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e754293-188e-4327-98cb-f0ea7fa62ed8_1718x1250.png 1272w, https://substackcdn.com/image/fetch/$s_!SeoL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e754293-188e-4327-98cb-f0ea7fa62ed8_1718x1250.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">You can play the dino game, even without hitting network errors first!</figcaption></figure></div><p><strong>chrome://gpu</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!H_QL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b0e8894-04fd-42ac-a03b-842390d30482_2506x1274.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!H_QL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b0e8894-04fd-42ac-a03b-842390d30482_2506x1274.png 424w, https://substackcdn.com/image/fetch/$s_!H_QL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b0e8894-04fd-42ac-a03b-842390d30482_2506x1274.png 848w, https://substackcdn.com/image/fetch/$s_!H_QL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b0e8894-04fd-42ac-a03b-842390d30482_2506x1274.png 1272w, https://substackcdn.com/image/fetch/$s_!H_QL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b0e8894-04fd-42ac-a03b-842390d30482_2506x1274.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!H_QL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b0e8894-04fd-42ac-a03b-842390d30482_2506x1274.png" width="1456" height="740" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5b0e8894-04fd-42ac-a03b-842390d30482_2506x1274.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:740,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:620517,&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_!H_QL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b0e8894-04fd-42ac-a03b-842390d30482_2506x1274.png 424w, https://substackcdn.com/image/fetch/$s_!H_QL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b0e8894-04fd-42ac-a03b-842390d30482_2506x1274.png 848w, https://substackcdn.com/image/fetch/$s_!H_QL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b0e8894-04fd-42ac-a03b-842390d30482_2506x1274.png 1272w, https://substackcdn.com/image/fetch/$s_!H_QL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b0e8894-04fd-42ac-a03b-842390d30482_2506x1274.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">Useful info related to how Chrome is rendering content.  Helpful for debugging.</figcaption></figure></div><p><strong>chrome://device-log</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IfEG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe37257a3-29ac-43f5-bd11-4bcde08f7d27_2506x1274.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IfEG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe37257a3-29ac-43f5-bd11-4bcde08f7d27_2506x1274.png 424w, https://substackcdn.com/image/fetch/$s_!IfEG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe37257a3-29ac-43f5-bd11-4bcde08f7d27_2506x1274.png 848w, https://substackcdn.com/image/fetch/$s_!IfEG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe37257a3-29ac-43f5-bd11-4bcde08f7d27_2506x1274.png 1272w, https://substackcdn.com/image/fetch/$s_!IfEG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe37257a3-29ac-43f5-bd11-4bcde08f7d27_2506x1274.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IfEG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe37257a3-29ac-43f5-bd11-4bcde08f7d27_2506x1274.png" width="1456" height="740" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e37257a3-29ac-43f5-bd11-4bcde08f7d27_2506x1274.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:740,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:558607,&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_!IfEG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe37257a3-29ac-43f5-bd11-4bcde08f7d27_2506x1274.png 424w, https://substackcdn.com/image/fetch/$s_!IfEG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe37257a3-29ac-43f5-bd11-4bcde08f7d27_2506x1274.png 848w, https://substackcdn.com/image/fetch/$s_!IfEG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe37257a3-29ac-43f5-bd11-4bcde08f7d27_2506x1274.png 1272w, https://substackcdn.com/image/fetch/$s_!IfEG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe37257a3-29ac-43f5-bd11-4bcde08f7d27_2506x1274.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">A variety of details about your host computer viewable by Chrome.</figcaption></figure></div><h2>Master URL List</h2><p><strong>chrome://about</strong></p><p>Going to chrome://about will provide a list of Chrome URLs that your current version of Chrome supports.</p><h2>Chromium</h2><p>To find additional details on what URLs are available, the Chromium project itself is a good start. Two locations for showing these endpoints include:</p><p><a href="https://github.com/chromium/chromium/blob/02e65feb53029473f796c1bc2bbbf214ea627688/chrome/common/webui_url_constants.cc#L29">chromium / chrome / common / webui_url_constants.cc</a></p><p>and</p><p><a href="https://github.com/chromium/chromium/blob/02e65feb53029473f796c1bc2bbbf214ea627688/content/public/common/url_constants.cc#L27">chromium / content / public / common / url_constants.cc</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://papayabytes.substack.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 PapayaBytes! 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></channel></rss>