<?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:webfeeds="http://webfeeds.org/rss/1.0"><channel><title><![CDATA[Jack Harner's Web Dev Blog]]></title><description><![CDATA[Jack Harner is a Freelance Web Developer & E-Commerce Consultant based in Denver, Colorado. Shopify, BigCommerce, WordPress Dev & More.]]></description><link>https://jackharner.com</link><generator>GatsbyJS</generator><lastBuildDate>Tue, 23 Jun 2026 19:58:48 GMT</lastBuildDate><webfeeds:accentColor>#9C27B0</webfeeds:accentColor><webfeeds:logo>./src/images/jackharenr-logo-white.svg</webfeeds:logo><item><title><![CDATA[Starting A Freelance Developer Bluesky Feed]]></title><description><![CDATA[For my first dip into the AT Protocol, I decided I would try my hand at setting up a Feed. If you're unaware the AT Protocol is a decentralized framework for social media. In short, instead of the Tech Giants up on their flying mansions deciding what…]]></description><link>https://jackharner.com//blog/starting-a-freelance-developer-bluesky-feed/</link><guid isPermaLink="false">https://jackharner.com//blog/starting-a-freelance-developer-bluesky-feed/</guid><pubDate>Wed, 26 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;For my first dip into the &lt;a href=&quot;https://atproto.com&quot;&gt;AT Protocol&lt;/a&gt;, I decided I would try my hand at setting up a Feed. If you&apos;re unaware the AT Protocol is a decentralized framework for social media. In short, instead of the Tech Giants up on their flying mansions deciding what your social media feed should be, the ATProto gives that power back to the people.&lt;/p&gt;
&lt;p&gt;There are a ton of great feeds popping up, but my goal is to make one specific to Freelance Developers. I&apos;ve got the &lt;a href=&quot;https://bsky.app/profile/renrah.dev/feed/freelanceDevs&quot;&gt;feed up and running here&lt;/a&gt; if you want to check it out or shoot me a &lt;a href=&quot;https://bsky.app/profile/jackharner.com&quot;&gt;DM on Bluesky (@JackHarner.com)&lt;/a&gt; if you want to get added to it!&lt;/p&gt;
&lt;p&gt;Let&apos;s get into it.&lt;/p&gt;
&lt;h2 id=&quot;getting-started&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#getting-started&quot; aria-label=&quot;getting started permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;This isn&apos;t really a tutorial of how to set up a Bluesky feed (although I might have some stuff for that in the works) but you basically get started with their &lt;a href=&quot;https://github.com/bluesky-social/feed-generator&quot;&gt;Feed Generator template&lt;/a&gt;. It&apos;s a TypeScript based Node/Express application that handles the ingesting of the greater ATProto network (the firehose), storing posts you deem appropriate, and then outputting a &quot;Feed Skeleton&quot; (list of post URIs) that Bluesky (or whatever AppView) then populates with the post data.&lt;/p&gt;
&lt;h2 id=&quot;determining-if-a-post-is-related-to-the-feed-topic&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#determining-if-a-post-is-related-to-the-feed-topic&quot; aria-label=&quot;determining if a post is related to the feed topic permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Determining If A Post is Related to the Feed Topic&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Keep in mind, I don&apos;t rally know anything about writing algorithms. I know how to build website and program and a ton of other stuff but this is all new to me. If you have suggestions or constructive critisicm, hit me up &lt;a href=&quot;https://bsky.app/profile/jackharner.com&quot;&gt;@JackHarner.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A lot of the feeds you see popping up are really just keyword scrapers: &quot;If a post has X Y or Z in it, display it&quot;. Some even tell you: &quot;Include #StarSky to have your post included&quot;. For as specific as a niche as &quot;Freelance Developers&quot; is, a basic keyword filter isn&apos;t going to cut it.&lt;/p&gt;
&lt;p&gt;I decided to set up a score-based system to try to determine if a post is related to freelance development specifically. Let&apos;s walk through the evolution of that score system (it&apos;s still a work in progress).&lt;/p&gt;
&lt;p&gt;I started with a list of a bunch of freelance related and development related terms.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; terms &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;freelance dev&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;freelance devs&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;freelance developer&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;html&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// etc...&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then I went through and assigned point values to each term based on how likely I thought a post would make sense to be included in the feed based on having that term in there.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; terms &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;term&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;freelance dev&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;points&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;term&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;freelance devs&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;points&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;term&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;freelance developer&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;points&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;term&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;html&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;points&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;term&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;points&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// etc...&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I would then take each post coming down the firehose and score them based on how many terms (and their point values) it could find in the post text. I had a score threshold defined and if the post had a higher score than that, it got stored in the database and output in the feed.&lt;/p&gt;
&lt;p&gt;That worked for a little while but I noticed that some spammy type posts I didn&apos;t like were ending up in there. I don&apos;t know if you caught the bug for this already but if you had a post that said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;I&apos;m a freelance developer&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It would match for both &lt;code class=&quot;language-text&quot;&gt;freelance developer&lt;/code&gt; AND &lt;code class=&quot;language-text&quot;&gt;freelance dev&lt;/code&gt; giving that post a whopping 40 points.&lt;/p&gt;
&lt;p&gt;If you posted some spam like:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Best Freelancers in LA / Best Freelance Writers in OC / Best Freelance Freelancer Editors Freelances Free Devs.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You would get a shit load of points when you shouldn&apos;t have.&lt;/p&gt;
&lt;h2 id=&quot;refining-the-algorithm&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#refining-the-algorithm&quot; aria-label=&quot;refining the algorithm permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Refining the Algorithm&lt;/h2&gt;
&lt;p&gt;In order to find and present the most relevant Freelance Developer content on the network, I had to do better than that.&lt;/p&gt;
&lt;h3 id=&quot;negative-points&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#negative-points&quot; aria-label=&quot;negative points permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Negative Points&lt;/h3&gt;
&lt;p&gt;I included the ability to add negative point terms so I can set &quot;freelance editor&quot; or &quot;freelance writer&quot; to -30 points so it doesn&apos;t necesarily get blocked if that term exists, but there needs to be more content about development to make up for the negative score.&lt;/p&gt;
&lt;h3 id=&quot;no-more-stacking-points&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#no-more-stacking-points&quot; aria-label=&quot;no more stacking points permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;No More Stacking Points&lt;/h3&gt;
&lt;p&gt;I updated the Allow List terms to let the term be defined as an array of similar terms:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; terms &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;term&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;freelance dev&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;freelance devs&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;freelance developer&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;points&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;term&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;html&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;points&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;term&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;javascript&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;jsx&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; points&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// etc...&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This way if it finds both &quot;freelance devs&quot; and &quot;freelance developer&quot; in the same post, it only gets 20 points, regardless of how many times it appears in the post.&lt;/p&gt;
&lt;p&gt;I also updated the scoring to look for those terms specifically, either at the start of the text with a space after it, a space on both sides, or at the end of the string. Thanks to ChatGPT for the REGEX because that shit is UGLLYY:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; t &lt;span class=&quot;token keyword&quot;&gt;of&lt;/span&gt; termsToCheck&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; termRegex &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;RegExp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;\\b$&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toLowerCase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;[.*+?^${}()|[\\]\\\\]&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;\\$&amp;amp;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;\\b&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;termRegex&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;lowerPost&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    found &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This prevents false positives by preventing &quot;dev&quot; from triggering for &quot;devout&quot;, for example.&lt;/p&gt;
&lt;h3 id=&quot;allowlist-and-blocklist-authors&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#allowlist-and-blocklist-authors&quot; aria-label=&quot;allowlist and blocklist authors permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;AllowList and BlockList Authors&lt;/h3&gt;
&lt;p&gt;I also want to be able to display posts from people I know are freelance / indie developers without a post having to explicitly be about freelance development. I created an Allowlist and a Blocklist of author DIDs (&lt;a href=&quot;https://en.wikipedia.org/wiki/Decentralized_identifier&quot;&gt;Decentralized Identifiers&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;If I put a DID in the Allowlist, their post score threshold gets chopped in half. I might even need to lower that because I&apos;ve added some Devs and haven&apos;t really seen any extra posts get added.&lt;/p&gt;
&lt;p&gt;There were a couple people who were pretty routinely showing up in the feed during my initial testing even though they weren&apos;t talking about freelance development, or they just posted some spammy stuff. Their DID&apos;s got added to the Blocklist. If I add a DID to the Blocklist, it just doesn&apos;t even try to score their post when one comes out of the firehose.&lt;/p&gt;
&lt;h2 id=&quot;whats-next&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#whats-next&quot; aria-label=&quot;whats next permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What&apos;s Next?&lt;/h2&gt;
&lt;p&gt;I&apos;m going to continue to try to refine my point system as well as tracking down other Freelance / Indie Developers to add to the list.  If that&apos;s you, &lt;a href=&quot;https://bsky.app/profile/jackharner.com&quot;&gt;shoot me a DM on Bluesky&lt;/a&gt; and I&apos;ll add you!&lt;/p&gt;
&lt;p&gt;Give the feed a like, pin, or share if you feel so inclined! &lt;a href=&quot;https://bsky.app/profile/renrah.dev/feed/freelanceDevs&quot;&gt;Freelance Devs Bluesky Feed&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thanks for reading!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[How To Auto-Open Multiple Terminals In A VS Code Workspace]]></title><description><![CDATA[Here's how to get VS Code to automatically open a couple terminals in your different workspace folders when you first open VS Code. Open your workspace settings with  and then type Workspace Settings and select  It should look something like this…]]></description><link>https://jackharner.com//blog/auto-open-terminals-vs-code-workspace/</link><guid isPermaLink="false">https://jackharner.com//blog/auto-open-terminals-vs-code-workspace/</guid><pubDate>Tue, 18 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here&apos;s how to get VS Code to automatically open a couple terminals in your different workspace folders when you first open VS Code.&lt;/p&gt;
&lt;p&gt;Open your workspace settings with &lt;code class=&quot;language-text&quot;&gt;Ctrl + Shift + P&lt;/code&gt; and then type Workspace Settings and select &lt;code class=&quot;language-text&quot;&gt;Preferences: Open Workspace Settings (JSON)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;It should look something like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;folders&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token property&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;folder-1&quot;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token property&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;folder-2&quot;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;settings&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Add the following &lt;code class=&quot;language-text&quot;&gt;tasks&lt;/code&gt; object:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;folders&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
		&lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;settings&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// ADD THIS ⬇️⬇️⬇️⬇️&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;tasks&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;version&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2.0.0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;tasks&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
		  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Frontend&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Change this&lt;/span&gt;
			&lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;shell&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;token property&quot;&gt;&quot;icon&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;home&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;terminal.ansiBlue&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;token property&quot;&gt;&quot;isBackground&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;token property&quot;&gt;&quot;options&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			  &lt;span class=&quot;token property&quot;&gt;&quot;cwd&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;${workspaceFolder:folder-1}&quot;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// Change just the folder name&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;token property&quot;&gt;&quot;runOptions&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;runOn&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;folderOpen&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;token property&quot;&gt;&quot;command&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/bin/bash&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// &amp;lt;-- your shell here&lt;/span&gt;
			&lt;span class=&quot;token property&quot;&gt;&quot;presentation&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			  &lt;span class=&quot;token property&quot;&gt;&quot;echo&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// silence &quot;Executing task ...&quot;&lt;/span&gt;
			  &lt;span class=&quot;token property&quot;&gt;&quot;focus&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
			  &lt;span class=&quot;token property&quot;&gt;&quot;panel&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;dedicated&quot;&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
		  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	
			&lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Backend&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;shell&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;token property&quot;&gt;&quot;icon&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;flame&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;terminal.ansiRed&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;token property&quot;&gt;&quot;isBackground&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;token property&quot;&gt;&quot;options&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			  &lt;span class=&quot;token property&quot;&gt;&quot;cwd&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;${workspaceFolder:folder-2}&quot;&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;token property&quot;&gt;&quot;runOptions&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;runOn&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;folderOpen&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;token property&quot;&gt;&quot;command&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/bin/bash&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// &amp;lt;-- your shell here&lt;/span&gt;
			&lt;span class=&quot;token property&quot;&gt;&quot;presentation&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			  &lt;span class=&quot;token property&quot;&gt;&quot;echo&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// silence &quot;Executing task ...&quot;&lt;/span&gt;
			  &lt;span class=&quot;token property&quot;&gt;&quot;focus&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
			  &lt;span class=&quot;token property&quot;&gt;&quot;panel&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;dedicated&quot;&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;        
		  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
		  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Open&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;token property&quot;&gt;&quot;dependsOn&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Frontend&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Backend&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Make sure these match your above task labels&lt;/span&gt;
			&lt;span class=&quot;token property&quot;&gt;&quot;runOptions&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;runOn&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;folderOpen&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
		  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
	  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Add This ⬆️⬆️⬆️⬆️⬆️&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Save the settings, then reload your window with &lt;code class=&quot;language-text&quot;&gt;Ctrl + Shift + P&lt;/code&gt;, typing &lt;code class=&quot;language-text&quot;&gt;reload&lt;/code&gt;, and selecting &lt;code class=&quot;language-text&quot;&gt;Developer: Reload Window&lt;/code&gt;. Your window should re-open along with whatever terminals you outlined above.&lt;/p&gt;
&lt;p&gt;Happy Coding!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Photo by &lt;a href=&quot;https://unsplash.com/@clemhlrdt?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash&quot;&gt;Clément Hélardot&lt;/a&gt; on &lt;a href=&quot;https://unsplash.com/photos/black-and-silver-laptop-computer-on-table-95YRwf6CNw8?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Installing Git & Cloning Your First Repo]]></title><description><![CDATA[Getting Started with Git: Installing and Cloning Repositories from GitHub This guide will help you get Git installed on your computer, clone your first repo from GitHub, and switch branches. Whether you're brand new to Git or need a quick refresher…]]></description><link>https://jackharner.com//blog/installing-git-and-cloning-your-first-repo/</link><guid isPermaLink="false">https://jackharner.com//blog/installing-git-and-cloning-your-first-repo/</guid><pubDate>Fri, 07 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1 id=&quot;getting-started-with-git-installing-and-cloning-repositories-from-github&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#getting-started-with-git-installing-and-cloning-repositories-from-github&quot; aria-label=&quot;getting started with git installing and cloning repositories from github permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Getting Started with Git: Installing and Cloning Repositories from GitHub&lt;/h1&gt;
&lt;p&gt;This guide will help you get Git installed on your computer, clone your first repo from GitHub, and switch branches.&lt;/p&gt;
&lt;p&gt;Whether you&apos;re brand new to Git or need a quick refresher, this guide will get you up and running in no time. It does assume you have at least &lt;em&gt;some&lt;/em&gt; familiarity within a terminal or command-line environment. Linux &amp;#x26; Linux-based OSs (Mac) make it easy; You just open up the Terminal app and away you go. With Windows it&apos;s slightly more challenging, although I&apos;ve heard it&apos;s improved in recent years (but setting up a terminal environment on Windows is out of scope of this article).&lt;/p&gt;
&lt;p&gt;Either way, crack your terminal open and let&apos;s get git-ing!&lt;/p&gt;
&lt;div class=&quot;table-of-contents&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#git-newbie-glossary&quot;&gt;Git Newbie Glossary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#step-1-installing-git&quot;&gt;Step 1: Installing Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#step-2-configuring-git&quot;&gt;Step 2: Configuring Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#step-3-cloning-a-repository&quot;&gt;Step 3: Cloning a Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#step-4-switching-branches&quot;&gt;Step 4: Switching Branches&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id=&quot;git-newbie-glossary&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#git-newbie-glossary&quot; aria-label=&quot;git newbie glossary permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Git Newbie Glossary&lt;/h2&gt;
&lt;p&gt;Here are a few terms to keep on top of your mind as you read through this.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Definition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Terminal&lt;/td&gt;
&lt;td&gt;A command-line interface used to interact with the computer&apos;s operating system.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Git&lt;/td&gt;
&lt;td&gt;A piece of software used to track changes in source code during development.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;td&gt;A web-based platform that hosts Git repositories and provides tools for collaboration.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repository&lt;/td&gt;
&lt;td&gt;A folder of files with some special files to allow Git to track changes inside the folder.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Branch&lt;/td&gt;
&lt;td&gt;A parallel version of a repository, allowing for separate development work to be done.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Remote&lt;/td&gt;
&lt;td&gt;A version of a repository hosted on a server, used for collaboration.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clone&lt;/td&gt;
&lt;td&gt;A copy of a repository that is downloaded to your local computer from a remote server (mainly GitHub).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;step-1-installing-git&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#step-1-installing-git&quot; aria-label=&quot;step 1 installing git permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Step 1: Installing Git&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;If you already have Git installed on your computer, go ahead and skip to step 3 for cloning and branch information.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;windows&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#windows&quot; aria-label=&quot;windows permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Windows&lt;/h3&gt;
&lt;h4 id=&quot;download-git&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#download-git&quot; aria-label=&quot;download git permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Download Git&lt;/strong&gt;:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Go to the &lt;a href=&quot;https://git-scm.com/download/win&quot;&gt;Git for Windows&lt;/a&gt; download page.&lt;/li&gt;
&lt;li&gt;Click the &quot;Download&quot; button.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;install-git&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#install-git&quot; aria-label=&quot;install git permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Install Git&lt;/strong&gt;:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Run the downloaded &lt;code class=&quot;language-text&quot;&gt;.exe&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;Follow the installation wizard. Use the default options unless you have specific requirements.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;macos&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#macos&quot; aria-label=&quot;macos permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;macOS&lt;/h3&gt;
&lt;h4 id=&quot;using-homebrew-recommended&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#using-homebrew-recommended&quot; aria-label=&quot;using homebrew recommended permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Using Homebrew (recommended)&lt;/strong&gt;:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Open the Terminal.&lt;/li&gt;
&lt;li&gt;Install &lt;a href=&quot;https://brew.sh/&quot;&gt;Homebrew&lt;/a&gt; if you don&apos;t have it.&lt;/li&gt;
&lt;li&gt;Install Git with Homebrew:
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;brew &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;using-the-installer&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#using-the-installer&quot; aria-label=&quot;using the installer permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Using the installer&lt;/strong&gt;:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Go to the &lt;a href=&quot;https://git-scm.com/download/mac&quot;&gt;Git for macOS&lt;/a&gt; download page.&lt;/li&gt;
&lt;li&gt;Download and install the latest version.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;linux&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#linux&quot; aria-label=&quot;linux permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Linux&lt;/h3&gt;
&lt;h4 id=&quot;debianubuntu-based-distributions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#debianubuntu-based-distributions&quot; aria-label=&quot;debianubuntu based distributions permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Debian/Ubuntu-based distributions&lt;/strong&gt;:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Open the Terminal.&lt;/li&gt;
&lt;li&gt;Update your package list and install Git:
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; update
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;fedora-based-distributions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#fedora-based-distributions&quot; aria-label=&quot;fedora based distributions permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Fedora-based distributions&lt;/strong&gt;:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Open the Terminal.&lt;/li&gt;
&lt;li&gt;Install Git:
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; dnf &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;step-2-configuring-git&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#step-2-configuring-git&quot; aria-label=&quot;step 2 configuring git permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Step 2: Configuring Git&lt;/h2&gt;
&lt;p&gt;After installing Git, you&apos;ll need to configure your Github username and email. This is necessary for tracking changes and contributions.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Open your Terminal (or Git Bash on Windows).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add your GitHub account username to your git config:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; config &lt;span class=&quot;token parameter variable&quot;&gt;--global&lt;/span&gt; user.name &lt;span class=&quot;token string&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add your GitHub account email to your git config:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; config &lt;span class=&quot;token parameter variable&quot;&gt;--global&lt;/span&gt; user.email &lt;span class=&quot;token string&quot;&gt;&quot;your.email@example.com&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;step-3-cloning-a-repository&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#step-3-cloning-a-repository&quot; aria-label=&quot;step 3 cloning a repository permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Step 3: Cloning a Repository&lt;/h2&gt;
&lt;p&gt;To clone a repository, you&apos;ll need the repository URL. This can be found on the repository&apos;s GitHub page.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Copy the repository URL&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Navigate to the repository on GitHub.&lt;/li&gt;
&lt;li&gt;Click the &quot;Code&quot; button and copy the URL (use HTTPS for simplicity).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Clone the repository&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Open your Terminal.&lt;/li&gt;
&lt;li&gt;Navigate to the directory where you want to clone the repository:
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; /path/to/your/directory&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Clone the repository:
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone https://github.com/username/repository.git&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Replace &lt;code class=&quot;language-text&quot;&gt;https://github.com/username/repository.git&lt;/code&gt; with the actual URL you copied from GitHub.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;git clone&lt;/code&gt; creates a new directory, so with our example commands we would end up with &lt;code class=&quot;language-text&quot;&gt;/path/to/your/directory/repository/&lt;/code&gt; with all the code inside the &lt;code class=&quot;language-text&quot;&gt;repository/&lt;/code&gt; directory.
&lt;ul&gt;
&lt;li&gt;To stay organized, I&apos;d recommend setting up some sort of folder structure like &lt;code class=&quot;language-text&quot;&gt;~/code/&amp;lt;client_name&gt;/&amp;lt;repos&gt;/&lt;/code&gt;. So you would &lt;code class=&quot;language-text&quot;&gt;cd ~/code/&amp;lt;client_name&gt;&lt;/code&gt; and then run &lt;code class=&quot;language-text&quot;&gt;git clone &amp;lt;repo_url&gt;&lt;/code&gt; to end up with &lt;code class=&quot;language-text&quot;&gt;~/code/&amp;lt;client_name&gt;/&amp;lt;repo_name&gt;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;step-4-switching-branches&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#step-4-switching-branches&quot; aria-label=&quot;step 4 switching branches permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Step 4: Switching Branches&lt;/h2&gt;
&lt;p&gt;Once you have cloned the repository, you&apos;ll need to know how to switch to different branches.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;List available branches&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Navigate to the cloned repository:
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; ~/code/&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;client_name&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;/&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;repo_name&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Fetch everything from the repository on Github:
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; fetch &lt;span class=&quot;token parameter variable&quot;&gt;--all&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;List all the available branches:
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; branch &lt;span class=&quot;token parameter variable&quot;&gt;-a&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;If you&apos;re switching to a branch for the first time, it will show up in this list prefaced with something like &lt;code class=&quot;language-text&quot;&gt;remotes/origin/&lt;/code&gt;. The &lt;code class=&quot;language-text&quot;&gt;&amp;lt;branch_name&gt;&lt;/code&gt; in the next step is whatever is after the last &lt;code class=&quot;language-text&quot;&gt;/&lt;/code&gt;. i.e with &lt;code class=&quot;language-text&quot;&gt;remotes/origin/branch-xyz&lt;/code&gt; your &lt;code class=&quot;language-text&quot;&gt;&amp;lt;branch_name&gt;&lt;/code&gt; is just &lt;code class=&quot;language-text&quot;&gt;branch-xyz&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Switch to a branch&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use the branch name from the list to switch branches:
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; switch &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;branch_name&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pull the latest changes&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;After switching to the desired branch, make sure to pull the latest changes to ensure you have the most up-to-date code:
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; pull&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;While &lt;code class=&quot;language-text&quot;&gt;git fetch&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;git pull&lt;/code&gt; seem like similar commands, they are quite different. Think of &lt;code class=&quot;language-text&quot;&gt;git fetch&lt;/code&gt; as getting the notification that there &lt;em&gt;are&lt;/em&gt; changes, and &lt;code class=&quot;language-text&quot;&gt;git pull&lt;/code&gt; is getting the actual changes and applying them to your local copy of the repo. &lt;code class=&quot;language-text&quot;&gt;fetch&lt;/code&gt; is getting the email that your package has been delivered, &lt;code class=&quot;language-text&quot;&gt;pull&lt;/code&gt; is going to the mailbox to actually get the package.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;By following these steps, you can switch to any branch and ensure you are always previewing the latest code from that branch.&lt;/p&gt;
&lt;h1 id=&quot;in-conclusion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#in-conclusion&quot; aria-label=&quot;in conclusion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;In Conclusion&lt;/h1&gt;
&lt;p&gt;And that&apos;s it! You now have Git installed, can clone repositories from GitHub, and switch between branches. This will enable you to access and review code locally on your computer.&lt;/p&gt;
&lt;p&gt;Happy Git-ing!&lt;/p&gt;
&lt;h1 id=&quot;git-commands-cheat-sheet&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#git-commands-cheat-sheet&quot; aria-label=&quot;git commands cheat sheet permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Git Commands Cheat Sheet&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Clone a repository&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;git clone &amp;lt;repository_url&gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Clones the repository from the specified URL &lt;strong&gt;(You should only need to do this once per repo)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fetch Everything&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;git fetch --all&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fetches information about all the branches from the remote repo. &lt;strong&gt;Do this every time.&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List branches&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;git branch -a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Lists all local and remote branches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Change branch&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;git switch &amp;lt;branch_name&gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Switches to the specified branch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pull latest changes&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;git pull&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fetches and merges the latest changes from the remote branch. &lt;strong&gt;Do this every time.&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</content:encoded></item><item><title><![CDATA[Working On A BigCommerce Custom Checkout Locally]]></title><description><![CDATA[When building or modifying BigCommerce's Open Source checkout-js, the only way the docs claim you can access the locally running version of your custom checkout is by changing the Checkout Script URL setting directly on the site settings. This breaks…]]></description><link>https://jackharner.com//blog/working-on-a-bigcommerce-custom-checkout-locally/</link><guid isPermaLink="false">https://jackharner.com//blog/working-on-a-bigcommerce-custom-checkout-locally/</guid><pubDate>Sun, 21 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When building or modifying BigCommerce&apos;s Open Source checkout-js, the only way &lt;a href=&quot;https://developer.bigcommerce.com/docs/storefront/cart-checkout/open-checkouts/guide&quot;&gt;the docs claim&lt;/a&gt; you can access the locally running version of your custom checkout is by changing the Checkout Script URL setting directly on the site settings. This breaks that store&apos;s checkout for anyone except the developer. BigCommerce obviously recommends only working on a custom checkout on a staging store, but that doesn&apos;t always work. It&apos;s nice to be able to work with live data while testing and developing the checkout locally.&lt;/p&gt;
&lt;p&gt;Modifying the Open Source checkout for a BigCommerce store is no simple task (it&apos;s a highly sophisticated React application). Doing so for a production site without completely nuking the live site&apos;s actual checkout seemed impossible. Thanks to the BigCommerceDevs Slack (see credits section at the end), it turns out it is actually possible!&lt;/p&gt;
&lt;p&gt;Let&apos;s jump into how:&lt;/p&gt;
&lt;div class=&quot;table-of-contents&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#stencil-cli-meets-open-source-checkout&quot;&gt;Stencil-CLI Meets Open Source Checkout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#a-few-simple-modifications-to-the-checkouthtml&quot;&gt;A Few Simple Modifications To The Checkout.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#now-youre-working-on-the-bc-checkout-locally&quot;&gt;Now You&apos;re Working On The BC Checkout Locally&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#credits&quot;&gt;Credits&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id=&quot;stencil-cli-meets-open-source-checkout&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#stencil-cli-meets-open-source-checkout&quot; aria-label=&quot;stencil cli meets open source checkout permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Stencil-CLI Meets Open Source Checkout&lt;/h2&gt;
&lt;p&gt;If you&apos;re working with BigCommerce&apos;s open source &lt;a href=&quot;https://github.com/bigcommerce/checkout-js&quot;&gt;checkout-js&lt;/a&gt; (or the &lt;a href=&quot;https://github.com/bigcommerce/checkout-sdk-js&quot;&gt;checkout-sdk&lt;/a&gt;, though the steps may be slightly different, I&apos;m not sure), I probably don&apos;t need to tell you this, but to work on your custom checkout locally you need:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A Stencil theme set up to work locally with the stencil-cli&lt;/li&gt;
&lt;li&gt;BC&apos;s Open Source Checkout forked and cloned locally&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;stencil start&lt;/code&gt; running in the theme&apos;s terminal&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;npm run dev &amp;amp; npm run dev:server&lt;/code&gt; running separately in the checkout&apos;s terminal&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I&apos;m going to assume you&apos;re using these tool&apos;s default urls/ports (at the time of writing) but if you for some reason are using something else, just make sure to substitute my values with your own.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Theme Running on: http://localhost:3000
Checkout running on: http://127.0.0.1:8080&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;a-few-simple-modifications-to-the-checkouthtml&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#a-few-simple-modifications-to-the-checkouthtml&quot; aria-label=&quot;a few simple modifications to the checkouthtml permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A Few Simple Modifications To The Checkout.html&lt;/h2&gt;
&lt;p&gt;Inside your theme&apos;s checkout page template, &lt;code class=&quot;language-text&quot;&gt;/templates/pages/checkout.html&lt;/code&gt; we need to make a few changes: modifying the checkout content based on the environment we&apos;re running the theme and adding some configuration settings to the window to overwrite where it looks for checkout scripts.&lt;/p&gt;
&lt;p&gt;Find your theme&apos;s &lt;code class=&quot;language-text&quot;&gt;{{{ checkout.checkout_content }}}&lt;/code&gt; and wrap it in an if/else checking the &lt;code class=&quot;language-text&quot;&gt;in_production&lt;/code&gt; variable. The else gets an empty div with a &lt;code class=&quot;language-text&quot;&gt;checkout-app&lt;/code&gt; id:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;handlebars&quot;&gt;&lt;pre class=&quot;language-handlebars&quot;&gt;&lt;code class=&quot;language-handlebars&quot;&gt;&lt;span class=&quot;token handlebars language-handlebars&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token block keyword&quot;&gt;#if&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;in_production&lt;/span&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token handlebars language-handlebars&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;checkout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;checkout_content&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token handlebars language-handlebars&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;checkout-app&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token handlebars language-handlebars&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token block keyword&quot;&gt;/if&lt;/span&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Just above the &lt;code class=&quot;language-text&quot;&gt;{{{ footer.scripts }}}&lt;/code&gt; tag add the following if statement triggering only if you&apos;re using the stencil-cli to run the theme (the &lt;code class=&quot;language-text&quot;&gt;in_development&lt;/code&gt; variable):&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;handlebars&quot;&gt;&lt;pre class=&quot;language-handlebars&quot;&gt;&lt;code class=&quot;language-handlebars&quot;&gt;&lt;span class=&quot;token handlebars language-handlebars&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token block keyword&quot;&gt;#if&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;in_development&lt;/span&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
    window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;checkoutConfig &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; 
        &lt;span class=&quot;token literal-property property&quot;&gt;containerId&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;checkout-app&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;checkoutId&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token handlebars language-handlebars&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;cart_id&lt;/span&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;publicPath&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;http://127.0.0.1:8080/&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;http://127.0.0.1:8080/auto-loader-dev.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token handlebars language-handlebars&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token block keyword&quot;&gt;/if&lt;/span&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This tells the rest of the checkout to look for and fetch the locally hosted files output through the checkout&apos;s &lt;code class=&quot;language-text&quot;&gt;npm run dev:server&lt;/code&gt; command.&lt;/p&gt;
&lt;h2 id=&quot;now-youre-working-on-the-bc-checkout-locally&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#now-youre-working-on-the-bc-checkout-locally&quot; aria-label=&quot;now youre working on the bc checkout locally permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Now You&apos;re Working On The BC Checkout Locally&lt;/h2&gt;
&lt;p&gt;Now, whenever you&apos;re running your theme locally through Stencil CLI, your Stencil CLI theme will utilize the locally running version of your checkout as opposed to the live one.&lt;/p&gt;
&lt;p&gt;Wrapping everything in the &lt;code class=&quot;language-text&quot;&gt;is_development&lt;/code&gt; &amp;#x26; &lt;code class=&quot;language-text&quot;&gt;is_production&lt;/code&gt; variables allows for some peace of mind at the fact that you&apos;ll never leave the checkout completely dead in the water.&lt;/p&gt;
&lt;p&gt;This does mean that anytime you need to test anything in the checkout or order-confirmation locally, you &lt;em&gt;have&lt;/em&gt; to have the custom checkout repo cloned locally and running alongside stencil-cli. If you&apos;re working on a store that needs a custom checkout you can bundle both packages into the same repo to make that a little easier to manage.&lt;/p&gt;
&lt;p&gt;This little hiccup in the development process is vastly outweighed by the benefit of being able to take advantage of the stencil-cli connected to a live production site, working locally, &lt;em&gt;and&lt;/em&gt; working on a custom checkout without breaking production.&lt;/p&gt;
&lt;h2 id=&quot;credits&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#credits&quot; aria-label=&quot;credits permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Credits&lt;/h2&gt;
&lt;p&gt;Credit for the discovery goes to &lt;a href=&quot;https://www.linkedin.com/in/andrewabarber&quot;&gt;Andrew A. Barber&lt;/a&gt;, the Engineering Manager @ &lt;a href=&quot;https://www.space48.com/&quot;&gt;Space 48&lt;/a&gt;, whom I met on the &lt;a href=&quot;https://developer.bigcommerce.com/docs/start/about/support#developer-slack&quot;&gt;BigCommerce Devs Slack group&lt;/a&gt;. If you&apos;re a BigCommerce Developer, and &lt;em&gt;NOT&lt;/em&gt; in that slack group, I highly recommend you join. It&apos;s a great place to ask hyper-specific questions and get some answers from the top minds in the space.&lt;/p&gt;
&lt;p&gt;Also huge shoutout to my &lt;a href=&quot;/services/ghost-coding/&quot;&gt;ghost-coding-client-who-shall-not-be-named&lt;/a&gt; for trusting me to dig into the BigCommerce Open Source Checkout for the first time and paying me to learn on the clock.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Pausing CSS Animations on Hover]]></title><description><![CDATA[CSS Animations are an easy, lightweight way to add a little motion and excitement to a page. You definitely don't want to overdo it, though. One of the most frustrating things as a user is when you go to click on something, it moves, and you miss…]]></description><link>https://jackharner.com//blog/pausing-css-animations-on-hover/</link><guid isPermaLink="false">https://jackharner.com//blog/pausing-css-animations-on-hover/</guid><pubDate>Sat, 20 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;CSS Animations are an easy, lightweight way to add a little motion and excitement to a page. You definitely don&apos;t want to overdo it, though. One of the most frustrating things as a user is when you go to click on something, it moves, and you miss.&lt;/p&gt;
&lt;p&gt;Today, I&apos;m going to show you how to pause your CSS animations when someone goes to click on them, &lt;em&gt;without&lt;/em&gt; JavaScript.&lt;/p&gt;
&lt;div class=&quot;table-of-contents&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#it-all-starts-with-a-css-animation&quot;&gt;It All Starts With A CSS Animation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#treat-your-users-like-stormtroopers---avoid-moving-targets&quot;&gt;Treat Your Users Like Stormtroopers - Avoid Moving Targets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#stop-moving-things-that-dont-need-to-move&quot;&gt;Stop Moving Things That Don&apos;t Need To Move&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id=&quot;it-all-starts-with-a-css-animation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#it-all-starts-with-a-css-animation&quot; aria-label=&quot;it all starts with a css animation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;It All Starts With A CSS Animation&lt;/h2&gt;
&lt;p&gt;We&apos;ll start with one of my favorite simple animations, the Pulse. Add the following to your css:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@keyframes&lt;/span&gt; pulse&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;0%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token selector&quot;&gt;50%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;1.1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token selector&quot;&gt;100%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;and then apply the animation to your element with the &lt;code class=&quot;language-text&quot;&gt;animation&lt;/code&gt; property:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.box&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; pulse 3s infinite
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;All together that looks like: &lt;span class=&quot;box1&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I&apos;ve used that animation many times to emphasize a discount, bring focus to the best deal on a Pricing page, or even just to make a beating heart. As long as your animation is using css and the &lt;code class=&quot;language-text&quot;&gt;@keyframe&lt;/code&gt; property this method will work.&lt;/p&gt;
&lt;p&gt;{{{vert}}}&lt;/p&gt;
&lt;h2 id=&quot;treat-your-users-like-stormtroopers---avoid-moving-targets&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#treat-your-users-like-stormtroopers---avoid-moving-targets&quot; aria-label=&quot;treat your users like stormtroopers   avoid moving targets permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Treat Your Users Like Stormtroopers - Avoid Moving Targets&lt;/h2&gt;
&lt;p&gt;If there are clickable things inside the thing you&apos;re animating, you don&apos;t want your users to have to click on moving targets. It&apos;s so frustrating to click and miss, let alone click, miss, and click on something else. Luckily, there&apos;s a really simple way to pause CSS Animations in CSS without JavaScript.&lt;/p&gt;
&lt;p&gt;The key to it all is the &lt;code class=&quot;language-text&quot;&gt;animation-play-state&lt;/code&gt; property. Let&apos;s see it in (SCSS) action:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.box &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; pulse 3s infinite&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;:hover &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;animation-play-state&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; paused&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Which looks like: &lt;span class=&quot;box2&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;As you can see, it starts and stops the animation when you hover your mouse in and out of it.&lt;/p&gt;
&lt;p&gt;By setting the &lt;code class=&quot;language-text&quot;&gt;animation-play-state&lt;/code&gt; to &lt;code class=&quot;language-text&quot;&gt;paused&lt;/code&gt; on hover, the animation will pause, your click targets will stop moving, and your users will be happy. I had experimented with basically removing the animation on hover but that caused lots of jumps and skips. &lt;code class=&quot;language-text&quot;&gt;animation-play-state&lt;/code&gt; literally just pauses the animation and un-pauses when you stop hovering.&lt;/p&gt;
&lt;h2 id=&quot;stop-moving-things-that-dont-need-to-move&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#stop-moving-things-that-dont-need-to-move&quot; aria-label=&quot;stop moving things that dont need to move permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Stop Moving Things That Don&apos;t Need To Move&lt;/h2&gt;
&lt;p&gt;You don&apos;t want your users to have to try and click on moving targets. If they miss too many times, they&apos;ll get frustrated and no amount of fancy animation will prevent them from leaving for good.&lt;/p&gt;
&lt;p&gt;With great animation power, comes great responsibility. Don&apos;t animate things users are supposed to click on, but if you have to, stop moving the thing if it looks like the user is about to click on it.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Function get_page_by_title is deprecated since version 6.2.0! Use WP_Query instead.]]></title><description><![CDATA[If you want to retrieve a WordPress page by its title you used to be able to do that with a nifty function called . Well now WordPress has deprecated that specific function and you'll get a warning in your site's logs if you try to use it. I'm going…]]></description><link>https://jackharner.com//blog/get-page-by-title-is-deprecated/</link><guid isPermaLink="false">https://jackharner.com//blog/get-page-by-title-is-deprecated/</guid><pubDate>Sat, 20 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If you want to retrieve a WordPress page by its title you used to be able to do that with a nifty function called &lt;code class=&quot;language-text&quot;&gt;get_page_by_title&lt;/code&gt;. Well now WordPress has deprecated that specific function and you&apos;ll get a warning in your site&apos;s logs if you try to use it. I&apos;m going to show you how.&lt;/p&gt;
&lt;div class=&quot;table-of-contents&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#what-happened-to-get_page_by_title&quot;&gt;What happened to get_page_by_title()&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#how-to-get-a-page-by-title-with-wp_query&quot;&gt;How To Get a Page by Title with WP_Query&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#lets-go-over-the-code&quot;&gt;Let&apos;s Go Over The Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#make-your-own-get_page_by_title-function&quot;&gt;Make Your Own get_page_by_title() function&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id=&quot;what-happened-to-get_page_by_title&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-happened-to-get_page_by_title&quot; aria-label=&quot;what happened to get_page_by_title permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What happened to get_page_by_title()&lt;/h2&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;get_page_by_title()&lt;/code&gt; function was deprecated when WordPress released version 6.2 back in March 2023. The function was old and &lt;a href=&quot;https://make.wordpress.org/core/2023/03/06/get_page_by_title-deprecated/&quot;&gt;apparently caused problems&lt;/a&gt; where the function could be run before plugins and things finished initializing. This opened up the possibility that &lt;code class=&quot;language-text&quot;&gt;get_page_by_title()&lt;/code&gt; would return a page that the current user wasn&apos;t actually supposed to have access to.&lt;/p&gt;
&lt;p&gt;WP_Query is a much more advanced way of querying the database for post and post data and isn&apos;t susceptible to the same bugs.&lt;/p&gt;
&lt;h2 id=&quot;how-to-get-a-page-by-title-with-wp_query&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-to-get-a-page-by-title-with-wp_query&quot; aria-label=&quot;how to get a page by title with wp_query permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How To Get a Page by Title with WP_Query&lt;/h2&gt;
&lt;p&gt;Since you shouldn&apos;t use &lt;code class=&quot;language-text&quot;&gt;get_page_by_title()&lt;/code&gt; anymore, you can do it instead using &lt;code class=&quot;language-text&quot;&gt;WP_Query&lt;/code&gt; instead.&lt;/p&gt;
&lt;p&gt;You can achieve that by setting the &lt;code class=&quot;language-text&quot;&gt;post_title&lt;/code&gt; parameter within the &lt;code class=&quot;language-text&quot;&gt;WP_Query&lt;/code&gt; arguments.&lt;/p&gt;
&lt;p&gt;Here&apos;s an example WordPress Query to get a page by the title:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;
&lt;span class=&quot;token variable&quot;&gt;$args&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;post_type&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;page&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;post_status&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;publish&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;posts_per_page&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;post_title&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;Your Page Title&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token variable&quot;&gt;$query&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;WP_Query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$args&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$query&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;have_posts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$query&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;have_posts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token variable&quot;&gt;$query&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;the_post&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// Page found, you can access its properties here&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;the_title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Example of displaying the page title&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Page not found&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;wp_reset_postdata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Reset the query&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;lets-go-over-the-code&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#lets-go-over-the-code&quot; aria-label=&quot;lets go over the code permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Let&apos;s Go Over The Code&lt;/h2&gt;
&lt;p&gt;In the example above, we&apos;re setting the &lt;code class=&quot;language-text&quot;&gt;post_type&lt;/code&gt; parameter to &apos;page&apos; to specify that we&apos;re querying for pages. You can adjust the post type according to your needs. The &lt;code class=&quot;language-text&quot;&gt;post_status&lt;/code&gt; parameter is set to &apos;publish&apos; to retrieve only published pages. You can modify these parameters as required.&lt;/p&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;posts_per_page&lt;/code&gt; parameter is set to 1 to retrieve only one page matching the title. If you expect multiple pages with the same title, you can increase this value.&lt;/p&gt;
&lt;p&gt;Finally, the &lt;code class=&quot;language-text&quot;&gt;post_title&lt;/code&gt; parameter is set to &apos;Your Page Title&apos;, where you should replace it with the actual title you&apos;re searching for.&lt;/p&gt;
&lt;p&gt;Within the loop, you can access the properties of the retrieved page using functions like &lt;code class=&quot;language-text&quot;&gt;the_title()&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;the_content()&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;get_permalink()&lt;/code&gt;, etc.&lt;/p&gt;
&lt;p&gt;Don&apos;t forget to call &lt;code class=&quot;language-text&quot;&gt;wp_reset_postdata()&lt;/code&gt; after the loop to reset the query and restore the global post data.&lt;/p&gt;
&lt;h2 id=&quot;make-your-own-get_page_by_title-function&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#make-your-own-get_page_by_title-function&quot; aria-label=&quot;make your own get_page_by_title function permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Make Your Own get_page_by_title() function&lt;/h2&gt;
&lt;p&gt;If you&apos;ve developed a theme or plugin that relied on the &lt;code class=&quot;language-text&quot;&gt;get_page_by_title()&lt;/code&gt; function that&apos;s now deprecated, you can substitute it for your own instead.&lt;/p&gt;
&lt;p&gt;Just define the function somewhere near the top of your theme&apos;s &lt;code class=&quot;language-text&quot;&gt;functions.php&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;jacks_get_page_by_title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token variable&quot;&gt;$args&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;post_type&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;page&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;post_status&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;publish&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;posts_per_page&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;post_title&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$title&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token variable&quot;&gt;$query&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;WP_Query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$args&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$query&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;have_posts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$query&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;have_posts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token variable&quot;&gt;$query&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;the_post&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

            &lt;span class=&quot;token comment&quot;&gt;// Returns the Post Object if one is found&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_post&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token variable&quot;&gt;$homePagePost&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;jacks_get_page_by_title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Home Page&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then you just have to find and replace all of the old deprecated functions for your new shiny ones. Obviously you&apos;ll want to test thoroughly because this could potentially cause some bugs and behave slightly differently than the old function.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[How to Run GitHub Actions on a Schedule]]></title><description><![CDATA[If you use GitHub actions to build and deploy (CI/CD) a project, you can schedule those actions to automatically run on a specific time interval using cron. This is sweet if you're building a pseudo-static site with data that doesn't change all the…]]></description><link>https://jackharner.com//blog/github-actions-cron/</link><guid isPermaLink="false">https://jackharner.com//blog/github-actions-cron/</guid><pubDate>Fri, 19 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If you use GitHub actions to build and deploy (CI/CD) a project, you can schedule those actions to automatically run on a specific time interval using cron. This is sweet if you&apos;re building a pseudo-static site with data that doesn&apos;t change all the time, but does change often enough to want to automate the build process.&lt;/p&gt;
&lt;p&gt;I initially implemented cron into my GitHub Actions to build my side project &lt;a href=&quot;https://livemusicforecast.com&quot;&gt;Live Music Forecast&lt;/a&gt; every 6 hours, but have also used this to automate all kinds of different GitHub actions.&lt;/p&gt;
&lt;div class=&quot;table-of-contents&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#what-is-cron&quot;&gt;What is Cron?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#defining-the-cron-schedule&quot;&gt;Defining the Cron Schedule&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#scheduling-your-github-action&quot;&gt;Scheduling your GitHub Action&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#heads-up-the-timing-isnt-going-to-be-exact&quot;&gt;Heads Up, The Timing Isn&apos;t Going To Be Exact&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id=&quot;what-is-cron&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-is-cron&quot; aria-label=&quot;what is cron permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What is Cron?&lt;/h2&gt;
&lt;p&gt;Cron (aka Cron Jobs, Crontab) is a command line utility about as old as linux itself. Cron allows for the automatic running of code, scripts, &amp;#x26; commands on a time based interval.&lt;/p&gt;
&lt;h2 id=&quot;defining-the-cron-schedule&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#defining-the-cron-schedule&quot; aria-label=&quot;defining the cron schedule permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Defining the Cron Schedule&lt;/h2&gt;
&lt;p&gt;Cron takes in a string to determine which minutes, hours, days, &amp;#x26; months to run your script on.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;┌───────────── minute (0 - 59)
│ ┌───────────── hour (0 - 23)
│ │ ┌───────────── day of the month (1 - 31)
│ │ │ ┌───────────── month (1 - 12 or JAN-DEC)
│ │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT)
│ │ │ │ │
│ │ │ │ │
│ │ │ │ │
* * * * *&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For example, &lt;code class=&quot;language-text&quot;&gt;*/5 * * * *&lt;/code&gt; will run your GitHub Action every 5 minutes of every day. This is most likely over kill and will probably run you into GitHub&apos;s Action time limits very quickly. Every 5 minutes is the fastest interval GitHub allows actions to be ran.&lt;/p&gt;
&lt;p&gt;Some more example cron schedules:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;59 23 * * 6&lt;/code&gt; will run at 11:59 PM on Saturday&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;0 12 1 * *&lt;/code&gt; will run at 12 noon, on the 1st of every month&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;1 */6 * * *&lt;/code&gt; runs at the first minute of every 6th hour. (12:01a, 6:01a, 12:01p, and 6:01p)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I highly recommend using a tool like &lt;a href=&quot;https://crontab.guru&quot;&gt;crontab.guru&lt;/a&gt; to make sure your schedule is set up properly. Debugging cron schedules is basically just publishing it and waiting for the scheduled time to come and go, so it can be annoying if you mess it up.&lt;/p&gt;
&lt;h2 id=&quot;scheduling-your-github-action&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#scheduling-your-github-action&quot; aria-label=&quot;scheduling your github action permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Scheduling your GitHub Action&lt;/h2&gt;
&lt;p&gt;In your action&apos;s configuration file, your schedule is defined as one of the workflow triggers under the &lt;code class=&quot;language-text&quot;&gt;on:&lt;/code&gt; attribute:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yml&quot;&gt;&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; GH Actions Cron Schedule
&lt;span class=&quot;token key atrule&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;schedule&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * is a special character in YAML so you have to quote this string&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;cron&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token string&quot;&gt;&apos;1 */6 * * *&apos;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# rest of your action here...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you need to, you can configure your action to run on multiple different schedules:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yml&quot;&gt;&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; GH Actions Multi&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;Cron
&lt;span class=&quot;token key atrule&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;schedule&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;cron&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token string&quot;&gt;&apos;1 */6 * * 0-4&apos;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# Run every 6hrs Sun-Thur&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;cron&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token string&quot;&gt;&apos;1 */3 * * 5-6&apos;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# Run every 3hrs Fri-Sat&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# rest of your action here...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For the full list of things that can trigger your GitHub Workflows, check out the &lt;a href=&quot;https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule&quot;&gt;GitHub Docs&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;heads-up-the-timing-isnt-going-to-be-exact&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#heads-up-the-timing-isnt-going-to-be-exact&quot; aria-label=&quot;heads up the timing isnt going to be exact permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Heads Up, The Timing Isn&apos;t Going To Be Exact&lt;/h2&gt;
&lt;p&gt;GitHub Actions all run in UTC time, so you&apos;ll need to adjust your cron schedule based on your timezone if you want it to run at a specific time relative to where you live.&lt;/p&gt;
&lt;p&gt;The other thing GitHub calls out is that your cron-schedule&apos;d action time is ONLY when the action will be QUEUED to run. This doesn&apos;t mean your action will run at that exact time, depending on server availability. If that slight timing ambiguity is going to cause issues with your workflow, &lt;a href=&quot;/contact&quot;&gt;Contact Me&lt;/a&gt; for a free consultation call to look at more time-specific alternatives to solve&lt;/p&gt;
&lt;p&gt;--&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Banner image by &lt;a href=&quot;https://unsplash.com/@chuttersnap?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText&quot;&gt;CHUTTERSNAP&lt;/a&gt; on &lt;a href=&quot;https://unsplash.com/s/photos/schedule?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[What Is Ghost Coding?]]></title><description><![CDATA[What IS Ghost Coding? Ghost coding, at it's simplest, is when you do programming work for someone else, and they're paying you to get to pass that work off as their own. Similar to "ghost writing", the end customer should never know you've done work…]]></description><link>https://jackharner.com//blog/what-is-ghost-coding/</link><guid isPermaLink="false">https://jackharner.com//blog/what-is-ghost-coding/</guid><pubDate>Thu, 11 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;what-is-ghost-coding&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-is-ghost-coding&quot; aria-label=&quot;what is ghost coding permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What IS Ghost Coding?&lt;/h2&gt;
&lt;p&gt;Ghost coding, at it&apos;s simplest, is when you do programming work for someone else, and they&apos;re paying you to get to pass that work off as their own. Similar to &quot;ghost writing&quot;, the end customer should never know you&apos;ve done work for them.&lt;/p&gt;
&lt;p&gt;I&apos;m &lt;strong&gt;pretty sure&lt;/strong&gt; I&apos;m the first person to coin the term &quot;Ghost Coding&quot; in relation to white-label work for other agencies (willing to stand corrected on that, but I can&apos;t find any evidence otherwise).&lt;/p&gt;
&lt;p&gt;In a few more words, Ghost Coding refers to the practice of doing programming / web development work for someone else, and selling them the rights to pass your work off as their own. The term is based off the term &quot;ghostwriter&quot; which &lt;a href=&quot;https://en.wikipedia.org/wiki/Ghostwriter&quot;&gt;is defined as&lt;/a&gt; &quot;a person hired to write literary or journalistic works, speeches, or other texts that are putatively credited to another person as the author&quot;.&lt;/p&gt;
&lt;p&gt;Let&apos;s go over some of the Benefits of Ghost Coding as well as some of the downsides, and at the end I&apos;ll give you a few tips to help you get started!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href=&quot;/hire-me/&quot;&gt;If this sounds like something you need for your dev or marketing agency, let&apos;s chat!&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;benefits-of-ghost-coding&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#benefits-of-ghost-coding&quot; aria-label=&quot;benefits of ghost coding permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Benefits of Ghost Coding&lt;/h2&gt;
&lt;h3 id=&quot;no-pesky-sales-process&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#no-pesky-sales-process&quot; aria-label=&quot;no pesky sales process permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;No Pesky Sales Process&lt;/h3&gt;
&lt;p&gt;It&apos;s the agency&apos;s job to track down and land new clients (and they most likely already have a team dedicated to doing just that). I just end up with a list of tasks that keeps refilling week after week.&lt;/p&gt;
&lt;p&gt;I&apos;d much rather have to swoon a couple of clients than have to constantly chase down my next meal. By locking down 2-3 agencies that each have 10-15+ clients at least, and continuing to provide consistent value day in &amp;#x26; day out, you&apos;ll never run out of work to do.&lt;/p&gt;
&lt;h3 id=&quot;stabilize-the-workload--the-pay&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#stabilize-the-workload--the-pay&quot; aria-label=&quot;stabilize the workload  the pay permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Stabilize The Workload (+ The Pay)&lt;/h3&gt;
&lt;p&gt;There&apos;s a fairly good chance that your clients won&apos;t all have work at the same time (unless it&apos;s Oct/Nov and you work in E-commerce 😅). By multiplying your pool of potential work through Ghost Coding, you&apos;ll quickly end up with a full queue. If the work is slowing down with one agency, you can most likely reach out to one of the other two, and keep your plate as full as it can be.&lt;/p&gt;
&lt;h3 id=&quot;less-paperwork-for-the-same-amount-of-programming&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#less-paperwork-for-the-same-amount-of-programming&quot; aria-label=&quot;less paperwork for the same amount of programming permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Less Paperwork For The Same Amount Of Programming&lt;/h3&gt;
&lt;p&gt;By funneling a majority of your work through a couple of agencies, you vastly simplify the amount of admin and task management work you have to do.&lt;/p&gt;
&lt;p&gt;3 big invoices instead of 30+ small ones? I&apos;ll take it.&lt;/p&gt;
&lt;p&gt;3 meetings a week instead of 3 tiny free spaces on my calendar? Sign me up.&lt;/p&gt;
&lt;h2 id=&quot;downsides-to-ghost-coding&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#downsides-to-ghost-coding&quot; aria-label=&quot;downsides to ghost coding permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Downsides to Ghost Coding&lt;/h2&gt;
&lt;h3 id=&quot;the-final-product-aint-yours&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-final-product-aint-yours&quot; aria-label=&quot;the final product aint yours permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Final Product Ain&apos;t Yours&lt;/h3&gt;
&lt;p&gt;If you look at &lt;a href=&quot;https://jackharner.com/portfolio&quot;&gt;my portfolio&lt;/a&gt;, there&apos;s not a whole lot new on there recently, yet lately I&apos;ve been busier than ever. What gives?&lt;/p&gt;
&lt;p&gt;NDAs are what gives, and that&apos;s ok.&lt;/p&gt;
&lt;p&gt;The agency is giving me money for the privilege to claim my work as their own in the same way that a lot of your favorite Musicians claim other&apos;s work as their own.&lt;/p&gt;
&lt;h3 id=&quot;theyre-not-your-clients&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#theyre-not-your-clients&quot; aria-label=&quot;theyre not your clients permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;They&apos;re Not Your Clients&lt;/h3&gt;
&lt;p&gt;I&apos;ve spent the better part of the last two years doing a ton of different types of work for dozens of small and medium sized e-commerce businesses.&lt;/p&gt;
&lt;p&gt;But if something happens and just 1 or 2 key relationships get soured &lt;em&gt;(if any of my agency contacts are reading this, i love you, i&apos;m not going anywhere, please don&apos;t fire me)&lt;/em&gt; I&apos;d have a whole lot of nothing to show for it.&lt;/p&gt;
&lt;p&gt;The ease of finding the work is nice, but make sure you don&apos;t have all your eggs in just some other agency&apos;s basket.&lt;/p&gt;
&lt;h3 id=&quot;juggling-more-requires-more-concentration&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#juggling-more-requires-more-concentration&quot; aria-label=&quot;juggling more requires more concentration permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Juggling More Requires More Concentration&lt;/h3&gt;
&lt;h3 id=&quot;less-diversification&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#less-diversification&quot; aria-label=&quot;less diversification permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Less Diversification&lt;/h3&gt;
&lt;p&gt;By primarily relying on 2-3 agencies, you increase the likelihood and size of the emergency if you happen to lose just one of those clients. 2-3 agencies is better than just a single job, but having a couple other clients floating around alongside your Ghost Coding clients is probably a pretty good idea.&lt;/p&gt;
&lt;h2 id=&quot;how-to-get-started-ghost-coding&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-to-get-started-ghost-coding&quot; aria-label=&quot;how to get started ghost coding permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How To Get Started Ghost Coding&lt;/h2&gt;
&lt;p&gt;Ghost coding is a great way to take your freelance programming career to the next level. Here are a couple tips if you want to get started Ghost Coding.&lt;/p&gt;
&lt;h3 id=&quot;have-a-fleshed-out-portfolio&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#have-a-fleshed-out-portfolio&quot; aria-label=&quot;have a fleshed out portfolio permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Have A Fleshed Out Portfolio&lt;/h3&gt;
&lt;p&gt;Agencies are going to want to see that you can handle a variety of different types of work with varying levels of scope. If you can build out a portfolio over the course of a year&apos;s worth of part-time freelancing, that will be a &lt;em&gt;huge&lt;/em&gt; bonus in your corner.&lt;/p&gt;
&lt;h3 id=&quot;never-shut-up-about-the-fact-that-you-program-for-a-living&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#never-shut-up-about-the-fact-that-you-program-for-a-living&quot; aria-label=&quot;never shut up about the fact that you program for a living permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Never Shut Up About The Fact That You Program For A Living&lt;/h3&gt;
&lt;p&gt;Just because you can&apos;t talk about the specific work you&apos;ve done or the clients you&apos;ve worked with, that doesn&apos;t mean you can&apos;t shout from the roof tops that you do Ghost Coding. Someone in your circle or your circle&apos;s circle runs a development agency and has a whole backlog of work (aka 💸💸💸💸) waiting to be knocked out.&lt;/p&gt;
&lt;p&gt;Two of my current Ghost Coding clients came from social media, and content I created online. Who knew &lt;a href=&quot;https://bsky.app/profile/jackharner.com&quot;&gt;💩-posting on BlueSky&lt;/a&gt; would actually be part of my job?&lt;/p&gt;
&lt;h3 id=&quot;just-ask&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#just-ask&quot; aria-label=&quot;just ask permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Just Ask&lt;/h3&gt;
&lt;p&gt;Find an agency that specializes in the thing you specialize ( or have a decent enough grasp ) in. Find their main contact email, or their CEO on BlueSky, and Just Ask.&lt;/p&gt;
&lt;p&gt;&quot;Hey there! My name is Jack Harner and I&apos;m a freelance &lt;insert tech stack&gt; Developer. How&apos;s your backlog looking? If you need, I&apos;m more than happy to hop in on a part-time contract basis and help clear that out. How&apos;s that sound? My portfolio is available @ &lt;a href=&quot;https://jackharner.com&quot;&gt;JackHarner.com&lt;/a&gt;. Have a great day!&quot;&lt;/p&gt;
&lt;h2 id=&quot;start-ghost-coding-today&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#start-ghost-coding-today&quot; aria-label=&quot;start ghost coding today permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Start Ghost Coding Today!&lt;/h2&gt;
&lt;p&gt;By maintaining a few solid relationships you can multiply your pool of potential work and even bring some stability to the feast-or-famine freelance pay-cycle.&lt;/p&gt;
&lt;p&gt;You probably should be a little ways into your freelance career already. The real-life work experience is what agency owners are looking for. That&apos;s not to say don&apos;t ask if you&apos;re just starting out! The worst that&apos;s going to happen is they say no. They might just bring you on for a one off project to start, and if it doesn&apos;t work out more long term, at least you got a little more real-life work experience to help you land the next gig.&lt;/p&gt;
&lt;p&gt;Leave me a comment below or &lt;a href=&quot;https://bsky.app/profile/jackharner.com&quot;&gt;hit me up on BlueSky (@JackHarner)&lt;/a&gt; if you have any questions!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href=&quot;/hire-me/&quot;&gt;P.S. Let&apos;s chat if you want to hire me to Ghost Code for your agency&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Who Has The Best Transactional Emails Free Tier?]]></title><description><![CDATA[I have a client whose website needs to send a few emails every now and then. I was curious who had the best free tier for sending transactional emails since they most likely shouldn't be breaking any free tier limits. Here are the results of my…]]></description><link>https://jackharner.com//blog/best-free-transactional-emails/</link><guid isPermaLink="false">https://jackharner.com//blog/best-free-transactional-emails/</guid><pubDate>Fri, 07 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I have a client whose website needs to send a few emails every now and then. I was curious who had the best free tier for sending transactional emails since they most likely shouldn&apos;t be breaking any free tier limits.&lt;/p&gt;
&lt;p&gt;Here are the results of my research into who has the best free transactional email plan.&lt;/p&gt;
&lt;h2 id=&quot;first-what-are-transactional-emails&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#first-what-are-transactional-emails&quot; aria-label=&quot;first what are transactional emails permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;First, what are transactional emails?&lt;/h2&gt;
&lt;p&gt;Transactional emails are the emails you send that typically come from a &quot;&lt;a href=&quot;mailto:noreply@domain.com&quot;&gt;noreply@domain.com&lt;/a&gt;&quot; email. Think password resets, sign in links, that sort of thing. They&apos;re the emails that are generally sent to 1 person at a time, and often triggered by a user action.&lt;/p&gt;
&lt;p&gt;Alright, onwards to the different providers:&lt;/p&gt;
&lt;h2 id=&quot;sendgrid&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#sendgrid&quot; aria-label=&quot;sendgrid permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;SendGrid&lt;/h2&gt;
&lt;p&gt;SendGrid offers a daily email quota of 100. While it doesn&apos;t have any significant downsides or standout features, it remains a reliable option for basic email needs.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sendgrid.com/pricing/&quot;&gt;Check out SendGrid&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;brevo&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#brevo&quot; aria-label=&quot;brevo permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Brevo&lt;/h2&gt;
&lt;p&gt;With a daily email quota of 300, Brevo stands out with its robust features. It provides RESTful APIs, SMTP, and webhooks, allowing seamless integration with various applications. Additionally, Brevo offers email tracking and analysis, along with unlimited log retention. The main downside is that it includes a logo in the emails sent.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://landing.brevo.com/bulk-email/&quot;&gt;Check out Brevo&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;smtpcom&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#smtpcom&quot; aria-label=&quot;smtpcom permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;SMTP.com&lt;/h2&gt;
&lt;p&gt;SMTP.com doesn&apos;t offer a free tier, but it serves as a solid option for those who prioritize reliability. Although it lacks any distinctive upsides, its stability and performance make it a reliable choice for businesses.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://try.smtp.com/email-delivery-suite/#plans&quot;&gt;SMTP.com&apos;s Plans&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;mailchimp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#mailchimp&quot; aria-label=&quot;mailchimp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Mailchimp&lt;/h2&gt;
&lt;p&gt;Known primarily as a popular marketing platform, Mailchimp doesn&apos;t offer a free tier for email services. While it may not be the ideal choice for basic email needs, it remains a powerful tool for comprehensive marketing campaigns.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mailchimp.com/pricing/transactional-email/&quot;&gt;Mailchimp&apos;s Transactional Emails&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;sendlayer&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#sendlayer&quot; aria-label=&quot;sendlayer permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Sendlayer&lt;/h2&gt;
&lt;p&gt;Sendlayer provides an interesting pricing structure with no free tier. However, it offers 1000 emails from three different domains per month for just $5 per month. This makes it an attractive option for individuals or small businesses with specific domain requirements.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sendlayer.com/pricing/&quot;&gt;See What Else SendLayer has to offer&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-label=&quot;conclusion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Choosing the right email service provider depends on your specific needs and priorities. While SendGrid and SMTP.com offer reliable options, Brevo stands out with its extensive features such as RESTful APIs, SMTP, and webhooks, along with advanced email tracking and analysis capabilities. Mailchimp remains a strong choice for marketers, while Sendlayer offers an affordable solution for those needing multiple domain support.&lt;/p&gt;
&lt;p&gt;Before finalizing your decision, consider factors such as your email volume, integration requirements, and budget. By carefully evaluating these email services, you can make an informed choice that best suits your needs.&lt;/p&gt;
&lt;p&gt;It&apos;s a pain to switch down the line so make sure you spend a good chunk of time researching the different providers. Let me know down in the comments if there&apos;s any I missed!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Use It Or Lose It: Gratitude Edition]]></title><description><![CDATA[SmartBlocks in Roam Research I recently learned about SmartBlocks in Roam Research (my note/to-do tool of choice). SmartBlocks allow you to create dynamic templates and actions. I've only really begun to scratch the surface of what's possible but I…]]></description><link>https://jackharner.com//blog/practicing-graditude-smartblocks-roam-research/</link><guid isPermaLink="false">https://jackharner.com//blog/practicing-graditude-smartblocks-roam-research/</guid><pubDate>Thu, 29 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;smartblocks-in-roam-research&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#smartblocks-in-roam-research&quot; aria-label=&quot;smartblocks in roam research permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;SmartBlocks in Roam Research&lt;/h2&gt;
&lt;p&gt;I recently learned about SmartBlocks in Roam Research (my note/to-do tool of choice). SmartBlocks allow you to create dynamic templates and actions. I&apos;ve only really begun to scratch the surface of what&apos;s possible but I&apos;ll be sharing my findings here and on my blog.&lt;/p&gt;
&lt;p&gt;One of the first things I&apos;ve been setting up is their daily action. It allows you to automatically insert a specific SmartBlock, first thing every day.&lt;/p&gt;
&lt;p&gt;My &quot;Daily Check-In&quot; so far includes the following:&lt;/p&gt;
&lt;h3 id=&quot;a-random-block-from-my-damn-you-are-actually-good-at-what-you-do-page&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#a-random-block-from-my-damn-you-are-actually-good-at-what-you-do-page&quot; aria-label=&quot;a random block from my damn you are actually good at what you do page permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A random block from my &quot;Damn you ARE actually good at what you do&quot; page.&lt;/h3&gt;
&lt;p&gt;On this page, I include screenshots of compliments and other nice things people have said about me or my work. It&apos;s a nice reminder to combat the imposter syndrome.&lt;/p&gt;
&lt;h3 id=&quot;a-gratitude-check&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#a-gratitude-check&quot; aria-label=&quot;a gratitude check permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A Gratitude Check&lt;/h3&gt;
&lt;p&gt;More on that below 👇️&lt;/p&gt;
&lt;h3 id=&quot;todays-todos&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#todays-todos&quot; aria-label=&quot;todays todos permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Today&apos;s TODOs&lt;/h3&gt;
&lt;p&gt;This section pulls anything in the graph that&apos;s a TODO with today&apos;s date attached to it.&lt;/p&gt;
&lt;h3 id=&quot;overdue-todos&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#overdue-todos&quot; aria-label=&quot;overdue todos permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Overdue TODOs&lt;/h3&gt;
&lt;p&gt;Here it displays any TODOs with a date in the past. Tagging TODOs with a date means it will show up in my daily note every day until it&apos;s done.&lt;/p&gt;
&lt;h3 id=&quot;some-random-undated-todos&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#some-random-undated-todos&quot; aria-label=&quot;some random undated todos permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Some Random Undated TODOs&lt;/h3&gt;
&lt;p&gt;This one pulls in 6 TODOs from throughout the graph that don&apos;t have a date on them. I&apos;m most likely going to get rid of this section because I have a ton of TODOs floating around in my graph that aren&apos;t relevant. I don&apos;t know. We&apos;ll see. 🤷‍♂️&lt;/p&gt;
&lt;h2 id=&quot;intentionally-practicing-gratitude&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#intentionally-practicing-gratitude&quot; aria-label=&quot;intentionally practicing gratitude permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Intentionally Practicing Gratitude&lt;/h2&gt;
&lt;p&gt;I saw someone else share an example of their Daily SmartBlock and they included a space for a daily gratitude journal entry.&lt;/p&gt;
&lt;p&gt;I&apos;m pretty lazy and I wanted to do the same but have some questions as a prompt. SmartBlocks have a function that allows you to pull a random block from a specific page or section.&lt;/p&gt;
&lt;p&gt;To save time, I asked ChatGPT to generate a list of gratitude journaling prompts.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://embed.filekitcdn.com/e/xnbKQ1dcUPkUBPmkCVmhZx/bUmdqSsNzfHUEEvRUPa71f/email&quot; alt=&quot;Asking ChatGPT for Gratitude Prompts &quot;&gt;&lt;/p&gt;
&lt;p&gt;It came up with some pretty good ones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What made you feel excited or enthusiastic today?&lt;/li&gt;
&lt;li&gt;What delicious meal or food item are you thankful for?&lt;/li&gt;
&lt;li&gt;What recent experience or adventure brought you joy?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then I just dumped all those into their page in Roam, pointed a couple &lt;code class=&quot;language-text&quot;&gt;&amp;lt;%RANDOMBLOCKFROM:xxxx%&gt;&lt;/code&gt; at it in my Daily block, and now I get two daily gratitude prompts to remind me of all the things I have to be happy about.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://embed.filekitcdn.com/e/xnbKQ1dcUPkUBPmkCVmhZx/hp95jksiwudYUjPuF12sFT/email&quot; alt=&quot;Daily Gratitude Check&quot;&gt;&lt;/p&gt;
&lt;p&gt;Since the SmartBlock is just referencing the prompt block, when you go back to the page with all of them, you can see all of your responses accumulating over time:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://embed.filekitcdn.com/e/xnbKQ1dcUPkUBPmkCVmhZx/g7QP6KJzGe4caj8in6fAKb/email&quot; alt=&quot;References Over Time&quot;&gt;&lt;/p&gt;
&lt;p&gt;Yet another way to continue to be grateful and reflect on what makes you happy. Gratitude is a muscle and if you don&apos;t use it? You&apos;ll lose it.&lt;/p&gt;
&lt;p&gt;Photo by &lt;a href=&quot;https://unsplash.com/@estherrj?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText&quot;&gt;Esther Jiao&lt;/a&gt; on &lt;a href=&quot;https://unsplash.com/photos/3HqSeexXYpQ?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText&quot;&gt;Unsplash&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Freelancing & Traveling]]></title><description><![CDATA[I'm currently writing to you from a beautiful AirBnB in Bruges, Belgium, halfway through a birthday trip around Europe with my partner.  Freelancing never really stops and I know I couldn't afford to take two+ weeks off. Thankfully being a freelance…]]></description><link>https://jackharner.com//blog/freelancing-and-traveling/</link><guid isPermaLink="false">https://jackharner.com//blog/freelancing-and-traveling/</guid><pubDate>Sat, 15 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I&apos;m currently writing to you from a beautiful AirBnB in Bruges, Belgium, halfway through a birthday trip around Europe with my partner.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1200px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 157%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAfABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAMFBAL/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAQP/2gAMAwEAAhADEAAAAdveJ+OjRAT9U7laROF//8QAHBAAAgICAwAAAAAAAAAAAAAAAQIAEQMhECIj/9oACAEBAAEFArHL0ShaMhJOTYeDLpVavQTvP//EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQMBAT8BH//EABYRAAMAAAAAAAAAAAAAAAAAAAAQEf/aAAgBAgEBPwFw/8QAHRAAAgIBBQAAAAAAAAAAAAAAABEQIgECITEy4f/aAAgBAQAGPwJPDnrYsclY305HHp//xAAbEAADAQEBAQEAAAAAAAAAAAAAAREhMYFBYf/aAAgBAQABPyF0j8FEs11lRKdpOXjH1teIs1JOHbGNXWoOUUmAOC56S/o//9oADAMBAAIAAwAAABCk8IL/xAAYEQACAwAAAAAAAAAAAAAAAAAAARARIf/aAAgBAwEBPxC4SRh//8QAGBEAAgMAAAAAAAAAAAAAAAAAABEBEDH/2gAIAQIBAT8QUCNp/8QAHhABAQACAgIDAAAAAAAAAAAAAREAITFRQWFxsfD/2gAIAQEAAT8QfXArK44SAbZLiKi7PWSOgRrE7PrLBqmiExEw9DlgEyavpx4vAHDfjAUBzDWaQN7N8dYqINME5uJLZu/y5//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;AirBNB in Bruges&quot;
        title=&quot;Plant Themed AirBnB in Bruges, Belgium&quot;
        src=&quot;/static/3b6a60b2be13237d45b9cdf478f49f17/e5166/bruges-bnb.jpg&quot;
        srcset=&quot;/static/3b6a60b2be13237d45b9cdf478f49f17/f93b5/bruges-bnb.jpg 300w,
/static/3b6a60b2be13237d45b9cdf478f49f17/b4294/bruges-bnb.jpg 600w,
/static/3b6a60b2be13237d45b9cdf478f49f17/e5166/bruges-bnb.jpg 1200w,
/static/3b6a60b2be13237d45b9cdf478f49f17/644c5/bruges-bnb.jpg 1440w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Plant Themed AirBnB in Bruges, Belgium&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Freelancing never really stops and I know I couldn&apos;t afford to take two+ weeks off. Thankfully being a &lt;a href=&quot;/portfolio/&quot;&gt;freelance web developer&lt;/a&gt; means I can work from anywhere as long as I have my laptop and a WiFi connection.&lt;/p&gt;
&lt;p&gt;With that being said, I&apos;ve already encountered a few things I wish I&apos;d thought about before leaving home that I figured I&apos;d share with you today to add to your pre-travel checklist.&lt;/p&gt;
&lt;h2 id=&quot;1-make-sure-you-have-access-to-everything&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-make-sure-you-have-access-to-everything&quot; aria-label=&quot;1 make sure you have access to everything permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Make Sure You Have Access to EVERYTHING&lt;/h2&gt;
&lt;p&gt;I had previously set up VPN access with one of my clients so I could troubleshoot issues on their local network from anywhere. Once that was set up  I saved a copy of the OpenVPN connection to an encrypted flash drive I keep on my keys that goes everywhere with me.&lt;/p&gt;
&lt;p&gt;I hadn&apos;t paid close enough attention and some of the configuration options had changed since I set it all up and the VPN config I brought with me was no longer correct. Big problem. I was able to get back onto their VPN, but I had to have someone at my client&apos;s physical location dig up some info for me from their side. Not ideal, especially if you are trying to keep a low profile about your travels.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 980px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 209%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAqABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAIDBAUB/8QAFwEBAQEBAAAAAAAAAAAAAAAAAAMCAf/aAAwDAQACEAMQAAAB6/lcKYuBmows97DljdAlSbwf/8QAGxAAAgIDAQAAAAAAAAAAAAAAAAECEAMRIxL/2gAIAQEAAQUCvZB16MMmzZ2ZGM0+9JGqVf/EABYRAQEBAAAAAAAAAAAAAAAAABEAEP/aAAgBAwEBPwHCML//xAAXEQEBAQEAAAAAAAAAAAAAAAAAERAS/9oACAECAQE/Ac6VVf/EAB0QAAAFBQAAAAAAAAAAAAAAAAABAhAgESJBcZH/2gAIAQEABj8Cgrbq61BaMMcf/8QAHhAAAwABBAMAAAAAAAAAAAAAAAERIRBRYXFBgZH/2gAIAQEAAT8hLpQr6mBDKJlx0zoJ1ieiglOZLuF5FXkyNtPLvT//2gAMAwEAAgADAAAAEBQWwwQ//8QAFxEAAwEAAAAAAAAAAAAAAAAAAAEREP/aAAgBAwEBPxC4nKIiD//EABcRAQEBAQAAAAAAAAAAAAAAAAARARD/2gAIAQIBAT8QnNwlS3//xAAgEAEBAQACAgEFAAAAAAAAAAABEQAhMUFRYXGR0eHw/9oACAEBAAE/EFuhsbGOXBdmVATu+vG5bm54PbkIdfH+OtZ5bkyERWMMiIj1470vyGEfpirC1Yd7432y1LkrTjv/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Eiffel Tower In Paris&quot;
        title=&quot;Cloudy Morning Eiffel Tower in Paris, France&quot;
        src=&quot;/static/8568878c862556c16373caa716a3e511/4012a/eiffel-tower.jpg&quot;
        srcset=&quot;/static/8568878c862556c16373caa716a3e511/f93b5/eiffel-tower.jpg 300w,
/static/8568878c862556c16373caa716a3e511/b4294/eiffel-tower.jpg 600w,
/static/8568878c862556c16373caa716a3e511/4012a/eiffel-tower.jpg 980w&quot;
        sizes=&quot;(max-width: 980px) 100vw, 980px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Cloudy Morning Eiffel Tower in Paris, France&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;You definitely want to make sure you&apos;ll have access to everything you need and that everything is correct BEFORE you leave. My recommendation here would be to take your laptop to a nearby coffee shop and go through your entire client list, double checking you can get to everything with just your laptop.&lt;/p&gt;
&lt;p&gt;As a web developer, for me that involved checking Github access, SSH access, &lt;a href=&quot;/blog/bigcommerce-stencil-ci-cd-with-github-actions/&quot;&gt;BigCommerce Stencil CLI&lt;/a&gt;, Shopify&apos;s CLI, and more.&lt;/p&gt;
&lt;p&gt;Taking that time to do this ahead of time will save you tons of headache while abroad.&lt;/p&gt;
&lt;h2 id=&quot;2-set-up-a-vpn-in-your-house&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-set-up-a-vpn-in-your-house&quot; aria-label=&quot;2 set up a vpn in your house permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. Set Up A VPN In Your House&lt;/h2&gt;
&lt;p&gt;This one really only applies if you have a work computer at home and a laptop you&apos;re taking with you. If you solely work from your laptop you shouldn&apos;t run into any issues.&lt;/p&gt;
&lt;p&gt;Setting up a local VPN in your house would allow you to access everything on your home network from anywhere you have internet access. You don&apos;t want to get halfway across the world and find out you don&apos;t have a certain file or project that you forgot to move to your laptop. However if you do, and you have your local VPN set up (and your home computer is on) you can access everything you need (doubling down on #1).&lt;/p&gt;
&lt;p&gt;When setting up the VPN you want to make sure to do it safely and securely. Opening up a port on your home network to the entire Internet can have some serious security concerns if done willy-nilly (so make sure to do your own research when setting it up). You&apos;ll also need to set up some sort of Dynamic DNS since most home internet service providers rotate through IP addresses. Dynamic DNS (DDNS) publishes the current IP address for your home network somewhere which allows you to connect to the right spot even if your network&apos;s global IP changes. You then tell your VPN connection to fetch the IP to use from the DDNS service.&lt;/p&gt;
&lt;h2 id=&quot;3-prepare-your-clients-way-ahead-of-time&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3-prepare-your-clients-way-ahead-of-time&quot; aria-label=&quot;3 prepare your clients way ahead of time permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3. Prepare Your Clients Way Ahead Of Time&lt;/h2&gt;
&lt;p&gt;I made the mistake of not telling one of my biggest clients that I was going to be in Europe for 2.5 weeks until about a week before I left. Luckily there weren&apos;t any huge projects about to start during that time. However, more of a heads up would&apos;ve been better for their project management. I spent the whole week before I left cramming a ton of work and shuffling some things around to ensure things were going to run smoothly even with me being about 9 timezones away. Not ideal, but we made it work.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1200px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 133.33333333333331%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAbABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAIDBQEE/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgED/9oADAMBAAIQAxAAAAG9GjHX1JEIs7hWuyln/8QAHhAAAgICAgMAAAAAAAAAAAAAAQIAAxEhEBITIjH/2gAIAQEAAQUCrDZsr9l7KrZKhjMQbgXehPk8th4//8QAFhEBAQEAAAAAAAAAAAAAAAAAEgAQ/9oACAEDAQE/ATGWf//EABYRAQEBAAAAAAAAAAAAAAAAAAABEv/aAAgBAgEBPwGVussx/8QAHRAAAgEEAwAAAAAAAAAAAAAAAAERECExMhKBkf/aAAgBAQAGPwJcoSN/SIfRKMmTMql2i1jd0//EAB4QAQACAwACAwAAAAAAAAAAAAEAESExYUFRcaGx/9oACAEBAAE/IU1HczDXv+IRWuwqjmWIEYPpCgT0Em35jrA9Zbm1cZoNPzAxP//aAAwDAQACAAMAAAAQmDyO/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERIf/aAAgBAwEBPxCnrZBSwrP/xAAYEQADAQEAAAAAAAAAAAAAAAABESEAEP/aAAgBAgEBPxCUyIsBcPD/xAAgEAEAAwACAgIDAAAAAAAAAAABABEhMWFRkUFxgaGx/9oACAEBAAE/EDzxYv1+PzKyVDAZ0zIESltojLIHS7xGUs0gqO/cH4MeVhOyu+5UyK8wc9QUHxwY+ov7sY/kGXfheE2S15XVn//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Dutch Pancake&quot;
        title=&quot;Dutch Pancake I Ate in Amsterdam, Netherlands&quot;
        src=&quot;/static/ab64e4e1194ade6769093d916e0aa21f/e5166/dutch-pancake.jpg&quot;
        srcset=&quot;/static/ab64e4e1194ade6769093d916e0aa21f/f93b5/dutch-pancake.jpg 300w,
/static/ab64e4e1194ade6769093d916e0aa21f/b4294/dutch-pancake.jpg 600w,
/static/ab64e4e1194ade6769093d916e0aa21f/e5166/dutch-pancake.jpg 1200w,
/static/ab64e4e1194ade6769093d916e0aa21f/d9c39/dutch-pancake.jpg 1800w,
/static/ab64e4e1194ade6769093d916e0aa21f/82b8c/dutch-pancake.jpg 1960w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Dutch Pancake I Ate in Amsterdam, Netherlands&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;4-anticipate-not-having-good-or-any-wifi&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#4-anticipate-not-having-good-or-any-wifi&quot; aria-label=&quot;4 anticipate not having good or any wifi permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;4. Anticipate Not Having Good (or Any) WiFi&lt;/h2&gt;
&lt;p&gt;Multiple times this trip, I went to go do some work, and either just didn&apos;t have working WiFi or it was dog slow and unusable. Given that my job is entirely online, that was a problem. My clients were prepared that my work output was going to be down a bit while I was gone, but if that wasn&apos;t the case I would have been in even bigger trouble.&lt;/p&gt;
&lt;p&gt;One solution would be to get an international phone plan and use your phone as a mobile hotspot. This depends on being in a country with a solid phone network, and wouldn&apos;t provide blazing fast speeds, but would be more reliable than trusting your AirBnB or hotel to have consistent WiFi.&lt;/p&gt;
&lt;p&gt;An alternative solution would be to get one of those WiFi hotspots (like this &lt;a href=&quot;https://amzn.to/3L3niS3&quot;&gt;GlocalMe Hotspot on Amazon&lt;/a&gt;). Obviously a pricey solution, ($120 for the hotspot &amp;#x26; $12 - $500 / mo depending on how many gigs you need) but at least it would be a business expense that you can write off.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://media.tenor.com/5iY9XU26qbQAAAAC/schitts-creek-david-rose.gif&quot; alt=&quot;It&amp;#x27;s A Write Off&quot;&gt;&lt;/p&gt;
&lt;p&gt;If running your freelance business depends on you having internet, having a solution (if not more than one) to a spotty WiFi connection is an absolute necessity.&lt;/p&gt;
&lt;h2 id=&quot;where-to-next&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#where-to-next&quot; aria-label=&quot;where to next permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Where To Next?&lt;/h2&gt;
&lt;p&gt;I don&apos;t think I&apos;m quite ready to commit to the whole Digital Nomad lifestyle yet (I missed my cats a little too much), but I definitely want to get out and travel more since I have the location freedom to do so. My partner and I are thinking Costa Rica next. If you have any travel recommendations or other things to consider before my next adventure, let me know down in the comments or hit me up on twitter &lt;a href=&quot;https://bsky.app/profile/jackharner.com&quot;&gt;@JackHarner&lt;/a&gt;!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Fetch Customer Group & More in a BigCommerce Widget]]></title><description><![CDATA[Did you know you can fetch Customer data on the frontend in a custom BigCommerce Widget? If you didn't, well it's your lucky day because today I'm going to show you how. Schema Setup This tutorial is going to assume you are using Bigcommerce's Widget…]]></description><link>https://jackharner.com//blog/fetch-customer-group-bigcommerce-widget/</link><guid isPermaLink="false">https://jackharner.com//blog/fetch-customer-group-bigcommerce-widget/</guid><pubDate>Fri, 24 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Did you know you can fetch Customer data on the frontend in a custom BigCommerce Widget? If you didn&apos;t, well it&apos;s your lucky day because today I&apos;m going to show you how.&lt;/p&gt;
&lt;h2 id=&quot;schema-setup&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#schema-setup&quot; aria-label=&quot;schema setup permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Schema Setup&lt;/h2&gt;
&lt;p&gt;This tutorial is going to assume you are using &lt;a href=&quot;https://developer.bigcommerce.com/docs/ZG9jOjMwNzg1ODgz-widget-builder&quot;&gt;Bigcommerce&apos;s Widget Builder cli&lt;/a&gt; and already have it configured to work with your specific store.  (I&apos;ll probably write a post about this as well.)&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=jack data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;$ widget-builder create customer-widget&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That should pop open &lt;code class=&quot;language-text&quot;&gt;localhost:8080&lt;/code&gt; and generate the default folder file boilerplate with three files:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;customer-widget/
  - config.json
  - schema.json
  - widget.html&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In that same folder you&apos;re going to need to create a two new files:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;customer-widget/
  - config.json
  - schema.json
  - widget.html
+ - query.graphql
+ - queryParamsBuilder.json&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;setting-up-querygraphql-for-a-bc-widget&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#setting-up-querygraphql-for-a-bc-widget&quot; aria-label=&quot;setting up querygraphql for a bc widget permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Setting up query.graphql for a BC Widget&lt;/h3&gt;
&lt;p&gt;All this file does is hold the GraphQl query you want to run when the widget is placed. You can use this to fetch products, or customer data. Pretty much anything you can fetch with the Storefront GraphQL API you can bring in as data for a widget. For now we&apos;re just focusing on getting the Customer Group ID witch you can grab with this query:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;graphql&quot;&gt;&lt;pre class=&quot;language-graphql&quot;&gt;&lt;code class=&quot;language-graphql&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token object&quot;&gt;customer&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;customerGroupId&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I want to caveat this with the fact that there are many many many dumb things about BigCommerce Widgets ( they are getting better, and the widget-builder tool helps with a some of it ) so just make sure to test everything before comitting to doing something with widgets over baking it custom into the theme. (I&apos;ve got a post planned for the things you  &lt;strong&gt;can&apos;t&lt;/strong&gt; do with Widgets, so stay tuned for that)&lt;/p&gt;
&lt;h3 id=&quot;whats-up-with-the-queryparamsbuilderjson-file&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#whats-up-with-the-queryparamsbuilderjson-file&quot; aria-label=&quot;whats up with the queryparamsbuilderjson file permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What&apos;s up with the queryParamsBuilder.json file?&lt;/h3&gt;
&lt;p&gt;When you have more complex GraphQL queries like fetching products you&apos;ll probably need to take in a setting value and use it in the query. In the case of fetching the customer group you don&apos;t because there is only one customer object available and it&apos;s the user viewing the page.&lt;/p&gt;
&lt;p&gt;So for the sake of this article, the &lt;code class=&quot;language-text&quot;&gt;queryParamsBuilder.json&lt;/code&gt; is just an empty object:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For whatever reason the query doesn&apos;t run if you don&apos;t include the file so you need both, even if you&apos;re not using any query params. This might change in the future so it might not be necessary after an update to the widget-builder cli&lt;/p&gt;
&lt;h2 id=&quot;using-graphql-data-in-the-widget-template&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#using-graphql-data-in-the-widget-template&quot; aria-label=&quot;using graphql data in the widget template permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Using GraphQL Data in the Widget Template&lt;/h2&gt;
&lt;p&gt;To get the data you just fetched in the template? The fetched data is added on to the &lt;code class=&quot;language-text&quot;&gt;_&lt;/code&gt; object so you can use it in your &lt;code class=&quot;language-text&quot;&gt;widget.html&lt;/code&gt; file like so:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;{{#if _.data.customer.customerGroupId &quot;==&quot; 1}}
  // Do something when the customer is assigned
  // to a customer group with the ID of 1
{{/if}}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Obviously if you have a more complex query the logic will be much more complex. However, if you need to troubleshoot something, you can use the JSON handlebars helper: &lt;code class=&quot;language-text&quot;&gt;{{json _.data}}&lt;/code&gt; to see everything that&apos;s getting returned.&lt;/p&gt;
&lt;h2 id=&quot;why-isnt-my-customer-object-populated-locally-with-widget-builder&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#why-isnt-my-customer-object-populated-locally-with-widget-builder&quot; aria-label=&quot;why isnt my customer object populated locally with widget builder permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why isn&apos;t my customer object populated locally with widget-builder?&lt;/h2&gt;
&lt;p&gt;When using the widget-builder CLI and fetching customer data from GraphQL, unfortunately with &lt;code class=&quot;language-text&quot;&gt;widget-builder start&lt;/code&gt; there (currently) isn&apos;t a way to attach a customer to the local version of the widget.
Once you get the widget published to the store it will start populating properly, but for now there&apos;s no way to spoof a customer locally while building a widget.&lt;/p&gt;
&lt;h2 id=&quot;before-you-go&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#before-you-go&quot; aria-label=&quot;before you go permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Before you go..&lt;/h2&gt;
&lt;p&gt;If you&apos;ve made it this far, you&apos;re obviously someone who works on the more technical side of BigCommerce development. Given that, I think you might be interested in my post about setting up &lt;a href=&quot;https://jackharner.com/blog/bigcommerce-stencil-ci-cd-with-github-actions/&quot;&gt;Continuous Integration / Deployment with GH Actions for BigCommerce Themes&lt;/a&gt;.
Let me know if you have any questions or if you&apos;ve found something different tinkering with BigCommerce Widgets.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Setting The Artboard Background Color In Adobe Illustrator CC]]></title><description><![CDATA[Sometimes when you're working with graphic design you end up working on a piece that's meant to be displayed on a non-white background, like a logo or web icon. Unfortunately, there isn't really a way to set the background color of an artboard in…]]></description><link>https://jackharner.com//blog/setting-the-artboard-background-color-in-adobe-illustrator/</link><guid isPermaLink="false">https://jackharner.com//blog/setting-the-artboard-background-color-in-adobe-illustrator/</guid><pubDate>Fri, 13 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Sometimes when you&apos;re working with &lt;a href=&quot;/blog/tags/graphic-design&quot;&gt;graphic design&lt;/a&gt; you end up working on a piece that&apos;s meant to be displayed on a non-white background, like a logo or web icon. Unfortunately, there isn&apos;t really a way to set the background color of an artboard in Adobe Illustrator, but let&apos;s look at a few workarounds that achieve the same effect.&lt;/p&gt;
&lt;h2 id=&quot;the-simplest-way&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-simplest-way&quot; aria-label=&quot;the simplest way permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The simplest way&lt;/h2&gt;
&lt;p&gt;The simplest, but probably not the best way of accomplishing a colored background is to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Draw out a rectangle the size of your artboard&lt;/li&gt;
&lt;li&gt;Send it to the back of the layer &lt;code class=&quot;language-text&quot;&gt;Ctrl + Shift + [&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Lock it &lt;code class=&quot;language-text&quot;&gt;Ctrl + 2&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&apos;ve run into problems with this method however, where I&apos;ll go to export the file as an SVG but forget to delete the background and end up with an extra element in the code or a solid color where you wanted transparency in a PNG.&lt;/p&gt;
&lt;p&gt;Useful if you just need to check a quick background color, just don&apos;t forget to delete it when you&apos;re saving!&lt;/p&gt;
&lt;p&gt;{{{vert}}}&lt;/p&gt;
&lt;h2 id=&quot;the-better-way&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-better-way&quot; aria-label=&quot;the better way permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The better way&lt;/h2&gt;
&lt;p&gt;The better, not quite as simple way to get a colored artboard is to take advantage of the Transparency Grid. It&apos;s used to show which parts of a project are transparent and how much. To get it setup go to &lt;code class=&quot;language-text&quot;&gt;File &gt; Document Setup&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 484px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 106.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAVCAYAAABG1c6oAAAACXBIWXMAAAsTAAALEwEAmpwYAAADKklEQVR42o1Uu04bURD1XyVF0oSHMX6s1zbrfa+9D9vrtU0wEhVNKBAFBT9A5RRIICEoCDFd3CFAoaCm5iPQic7AWiaBJMV47t1758yZmeObWVtbw/HxMUajEUajrzg6PMLp6SlOTk7+2xg/Ho8xGAyQ2dvbw2Qywfm3c4y/jzH5McHNzQ2urq5wfX2Nm+srMe4vLy/F/278fnd3h93dXWSWlpawvLyMXC4HrrPZLBYXF5HNLmJubg7vP87j3YdPWMrlUKlU5Dy9s7CwgPn5efH8Rp8pFIvQdR26YcJuhDCdBqp1E5rhoKoZyKsGllUDWl1DEASoVqtimlaH57loNBpwXRf1eh35fB6ZQqEA0zBgOx6i5DO8oI2abkOzPGimh2pFhVarCLuyUhYwrkmi3W4hSbriNU2TSgWQ6LVaTS5Zlg2lpEAtq2j6PvwgQKlUkgDfD6CqKhRFgeO68DwPhXwexGASASRNHjSbzafSdV0u1FZqsG1bgNhfJk3PCMg1y2Z8sVgUQrwnDC3LQrvTQbfbRb/fRxhF4pOkhygKUXsuk5b2cHafemFIdEM3EHdj9Ps9AU56CTpxjMFqH4aho1wuvwo0uyfDaQ8Nw5RJ2bYF0zThOM7UXMeVslOQlZUV8QRI1y8YElA3DAFk6akRjD10XUcCGcThUH+sisHULb/9AchsBCCQ7TiIWi0oSkkanpZLkI2NDVxcXGBzcxP7+/s4ODjAcDiUMyadKdl4AjQtGUbTD6CUSigWiiITJkwBz87OsLOzg4eHBzw+PoJ/XTJ9oUOW1pEpJxiuDzEYrIqM1Ir6ApBsDg8PsfVlC7c/b3F/f4/t7W2Ry5QhWVBjvu8jiiIRcitqSQL2r67r00kyyfr6uhCgdvlXpB7TpFOGpMvpyhA8D2EUwvMaaHXaosnKcwCThmEgbNhbCpxgL4bCH2qv1+ujE3ekh7Hse8K4myQIw3AaOKtBJpldT4UtF2cC3rIUlH7WUiVMS55V/FtAbEur9dTbOI7F2FNWwTV1TE1mUg2R8t+MdzgIapTABOPL1Hzuq23ZooQMX1pS/ZdRGq9Z+srzDl/sX8srhUPllL1vAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Document Setup Menu&quot;
        title=&quot;Illustrator&amp;#39;s Document Setup Menu&quot;
        src=&quot;/static/ea40f8ad792e177ac7347ccbff5fdef9/ff42b/document-setup.png&quot;
        srcset=&quot;/static/ea40f8ad792e177ac7347ccbff5fdef9/5a46d/document-setup.png 300w,
/static/ea40f8ad792e177ac7347ccbff5fdef9/ff42b/document-setup.png 484w&quot;
        sizes=&quot;(max-width: 484px) 100vw, 484px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Illustrator&amp;#39;s Document Setup Menu&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Under the Transparency section you need to double click on both of two color squares and set them to whatever color you want your background to be.&lt;/p&gt;
&lt;p&gt;Click OK on the Document Settings panel and then go to &lt;code class=&quot;language-text&quot;&gt;View &gt; Show Transparency Grid&lt;/code&gt; You can also use the keyboard shortcut: &lt;code class=&quot;language-text&quot;&gt;Ctrl + Shift + D&lt;/code&gt; to toggle the Transparency Grid on and off.&lt;/p&gt;
&lt;h2 id=&quot;there-you-have-it-folks&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#there-you-have-it-folks&quot; aria-label=&quot;there you have it folks permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;There you have it, folks.&lt;/h2&gt;
&lt;p&gt;An &quot;Any Color You Can Think Of&quot; background on your artboards in Illustrator without having extra objects cluttering up your files. One thing to keep in mind though, is the document properties are set on a per-project basis, so you&apos;ll have to set it every time.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Photo by &lt;a href=&quot;https://unsplash.com/@rumpf?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText&quot;&gt;Christina Rumpf&lt;/a&gt; on &lt;a href=&quot;https://unsplash.com/photos/XWDMmk-yW7Q?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText&quot;&gt;Unsplash&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded></item><item><title><![CDATA[Anatomy of a WordPress Theme]]></title><description><![CDATA[WordPress Development relies on either Themes or Plugins for WordPress. Today, I'm going to walk you through the base files you need for any WordPress Theme. A few of these files you absolutely need for WordPress to even consider your collection of…]]></description><link>https://jackharner.com//blog/anatomy-of-a-wordpress-theme/</link><guid isPermaLink="false">https://jackharner.com//blog/anatomy-of-a-wordpress-theme/</guid><pubDate>Fri, 13 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;WordPress Development relies on either Themes or Plugins for WordPress. Today, I&apos;m going to walk you through the base files you need for any WordPress Theme.&lt;/p&gt;
&lt;p&gt;A few of these files you absolutely need for WordPress to even consider your collection of files a theme, a handful that you kind of need depending on the site requirements, and a lot that allow you to realize WordPress&apos; true potential.&lt;/p&gt;
&lt;h3 id=&quot;absolutely-required&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#absolutely-required&quot; aria-label=&quot;absolutely required permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Absolutely Required&lt;/h3&gt;
&lt;p&gt;There are only two files that &lt;strong&gt;absolutely required&lt;/strong&gt; for WordPress to even recognize your theme as a theme. &lt;code class=&quot;language-text&quot;&gt;index.php&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;style.css&lt;/code&gt;. Let&apos;s break down the difference and some necessary parts.&lt;/p&gt;
&lt;h3 id=&quot;indexphp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#indexphp&quot; aria-label=&quot;indexphp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;index.php&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;According to the WordPress &lt;a href=&quot;https://developer.wordpress.org/themes/basics/template-hierarchy/&quot;&gt;Template Heirarchy&lt;/a&gt;, &lt;code class=&quot;language-text&quot;&gt;index.php&lt;/code&gt; is the last fallback for every type of page. If it can&apos;t match to any other template file, this is the one that gets rendered.&lt;/p&gt;
&lt;h3 id=&quot;stylecss&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#stylecss&quot; aria-label=&quot;stylecss permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;style.css&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;This is the main stylesheet of your theme. It needs to live in the root of your theme&apos;s folder. &quot;&lt;code&gt;wp-content/themes/&amp;#x3C;theme-name/style.css&lt;/code&gt;&quot;. In order for WordPress to treat your theme right (buy it a nice dinner and some expensive wine), you need to include a comment header at the very top (otherwise it&apos;s leftovers and clearance wine). It contains information like the name of your theme, description, links to the developers and support, and more. For example, this is the header from WordPress&apos; default &lt;a href=&quot;https://github.com/WordPress/twentynineteen/blob/master/style.css&quot;&gt;TwentyNinteen Theme&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/*
Theme Name: Twenty Nineteen
Theme URI: https://github.com/WordPress/twentynineteen
Author: the WordPress team
Author URI: https://wordpress.org/
Description: Our 2019 default theme is designed to show off the power of the block editor. It features custom styles for all the default blocks and is built so that what you see in the editor looks like what you&apos;ll see on your website. Twenty Nineteen is designed to be adaptable to a wide range of websites, whether you’re running a photo blog, launching a new business, or supporting a non-profit. Featuring ample whitespace and modern sans-serif headlines paired with classic serif body text, it&apos;s built to be beautiful on all screen sizes.
Requires at least: WordPress 4.9.6
Version: 1.2
License: GNU General Public License v2 or later
License URI: LICENSE
Text Domain: twentynineteen
Tags: one-column, flexible-header, accessibility-ready, custom-colors, custom-menu, custom-logo, editor-style, featured-images, footer-widgets, rtl-language-support, sticky-post, threaded-comments, translation-ready
This theme, like WordPress, is licensed under the GPL.
Use it to make something cool, have fun, and share what you&apos;ve learned with others.
Twenty Nineteen is based on Underscores https://underscores.me/, (C) 2012-2018 Automattic, Inc.
Underscores is distributed under the terms of the GNU GPL v2 or later.
Normalizing styles have been helped along thanks to the fine work of
Nicolas Gallagher and Jonathan Neal https://necolas.github.io/normalize.css/
*/&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you use a task runner like Gulp you can set up your SCSS tasks to generate the header for you from your &lt;code class=&quot;language-text&quot;&gt;package.json&lt;/code&gt; file so you only have to update that information in one spot.&lt;/p&gt;
&lt;h2 id=&quot;optional-but-useful&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#optional-but-useful&quot; aria-label=&quot;optional but useful permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Optional But Useful&lt;/h2&gt;
&lt;h3 id=&quot;functionsphp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#functionsphp&quot; aria-label=&quot;functionsphp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;functions.php&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Your theme&apos;s Functions file is the file where all the magic that makes WordPress so great happen. It runs when WordPress is initialized and is where you can extend the platform to suit your needs.&lt;/p&gt;
&lt;blockquote&gt;
&lt;h2 id=&quot;be-careful-when-modifying-this-file&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#be-careful-when-modifying-this-file&quot; aria-label=&quot;be careful when modifying this file permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;BE CAREFUL WHEN MODIFYING THIS FILE!&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;functions.php&lt;/code&gt; runs on both the Admin side and the front-end, so if you leave a typo or something, it will break your whole site. Work on your theme locally and &lt;em&gt;Never&lt;/em&gt; update your &lt;code class=&quot;language-text&quot;&gt;functions.php&lt;/code&gt; in the admin area Theme Editor.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Typically you use the &lt;code class=&quot;language-text&quot;&gt;functions.php&lt;/code&gt; file to enqueue scripts and stylesheets to get loaded dynamically, define widget areas, modify how WordPress outputs pretty much anything, and a whole lot more.&lt;/p&gt;
&lt;p&gt;For Example:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;enqueue_my_scripts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;wp_enqueue_script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;theme&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_stylesheet_directory_uri&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;/theme.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;wp_enqueue_style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;style&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_stylesheet_uri&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;add_action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;wp_enqueue_scripts&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;enqueue_my_scripts&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;headerphp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#headerphp&quot; aria-label=&quot;headerphp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;header.php&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;This template file gets called with &lt;code&gt;get_header()&lt;/code&gt;. In here lives everything you want at the beginning of every page. Things like the opening &lt;code&gt;&lt;html&gt;&lt;/code&gt; tag, your &lt;code&gt;&lt;head&gt;&lt;/head&gt;&lt;/code&gt; block, your opening &lt;code&gt;&lt;body&gt;&lt;/code&gt; tag and then typically a &lt;code&gt;&lt;header&gt;&lt;/header&gt;&lt;/code&gt; block.&lt;/p&gt;
&lt;p&gt;Make sure to include &lt;code&gt;&lt;?php wp_head(); ?&gt;&lt;/code&gt; at the end of your &lt;code&gt;&lt;head&gt;&lt;/code&gt; block or else WordPress doesn&apos;t have a place to inject code into the header.&lt;/p&gt;
&lt;h3 id=&quot;footerphp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#footerphp&quot; aria-label=&quot;footerphp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;footer.php&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;footer.php&lt;/code&gt;, much like &lt;code class=&quot;language-text&quot;&gt;header.php&lt;/code&gt;, is called with &lt;code&gt;get_footer()&lt;/code&gt;. As you could expect, &lt;code class=&quot;language-text&quot;&gt;footer.php&lt;/code&gt; includes all the things you want at the &lt;em&gt;end&lt;/em&gt; of every page: your footer, probably a few widget or menu areas, and then the closing tags:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;wp_footer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;&lt;code&gt;wp_footer()&lt;/code&gt; is nessecary so that WordPress can add scripts to the end of the document.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;sidebarphp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#sidebarphp&quot; aria-label=&quot;sidebarphp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;sidebar.php&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;The last of the layout templates, &lt;code class=&quot;language-text&quot;&gt;sidebar.php&lt;/code&gt; get&apos;s called with, I&apos;m sure you can guess, &lt;code&gt;get_sidebar()&lt;/code&gt;. Depending on the needs of the design, the sidebar can be or display anything.&lt;/p&gt;
&lt;p&gt;First things first you need to register your sidebar. Place the following code in your &lt;code class=&quot;language-text&quot;&gt;functions.php&lt;/code&gt; file:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token function&quot;&gt;register_sidebar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;id&apos;&lt;/span&gt;          &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;top-menu&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;name&apos;&lt;/span&gt;        &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;Top Menu&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;description&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;This sidebar is located at the top.&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Remember what you set for the &lt;code class=&quot;language-text&quot;&gt;id&lt;/code&gt; because you need that to get the sidebar content. Add the following code to your &lt;code class=&quot;language-text&quot;&gt;sidebar.php&lt;/code&gt; file:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;sidebar-top-menu&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;sidebar&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;dynamic_sidebar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;top-menu&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Your &quot;Top Menu&quot; sidebar should now show up in the &lt;code&gt;Customize  Widgets&lt;/code&gt; area of the WordPress backend.&lt;/p&gt;
&lt;h3 id=&quot;searchphp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#searchphp&quot; aria-label=&quot;searchphp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;search.php&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;The depth and complexity of customizing a search page are out of the scope of this article, but you can do it. Typically this template just needs a loop, fetching posts and outputting as a grid or list. You can also replace this template with an entirely different search tool to handle more advanced searching.&lt;/p&gt;
&lt;h2 id=&quot;post-type-templates&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#post-type-templates&quot; aria-label=&quot;post type templates permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Post Type Templates&lt;/h2&gt;
&lt;h3 id=&quot;singlephp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#singlephp&quot; aria-label=&quot;singlephp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;single.php&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;The Single template is displayed when a single post is queried. It typically contains the full content of the post, your social share links, and potentially a comments section.&lt;/p&gt;
&lt;p&gt;You utilize the loop to get the content for the post:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;have_posts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;have_posts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token class-name return-type&quot;&gt;the_post&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;
    // Do Stuff
    &lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;endwhile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;endif&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;commentsphp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#commentsphp&quot; aria-label=&quot;commentsphp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;comments.php&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;The Comments template is called from &lt;code&gt;comments_template()&lt;/code&gt; from within &lt;code class=&quot;language-text&quot;&gt;single.php&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Inside &lt;code class=&quot;language-text&quot;&gt;single.php&lt;/code&gt; you would include:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;comments_open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;get_comments_number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token class-name return-type&quot;&gt;comments_template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;endif&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Which just checks if comments are open for that post, or if there are any comments and if so output the default comments form.&lt;/p&gt;
&lt;p&gt;See the &lt;a href=&quot;https://codex.wordpress.org/Comments_in_WordPress&quot;&gt;codex&lt;/a&gt; for more info about WordPress comments.&lt;/p&gt;
&lt;h3 id=&quot;pagephp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#pagephp&quot; aria-label=&quot;pagephp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;page.php&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;The Page template is the default template for Pages. The biggest difference between Posts and Pages in WordPress is that pages are for more timeless content. Examples being your site&apos;s &quot;About Us&quot; page or the &quot;Contact Us&quot; page. Unlike Posts, Pages cannot be categorized or tagged. They can, however, be arranged hierarchically with each page being able to have many children but only one parent page.&lt;/p&gt;
&lt;p&gt;With Pages you can develop custom templates. Either &lt;code class=&quot;language-text&quot;&gt;page-{templateName}.php&lt;/code&gt; or &lt;code&gt;page-templates/page-{templateName}.php&lt;/code&gt;. This specific template will match any pages with the slug &lt;code class=&quot;language-text&quot;&gt;{templateName}&lt;/code&gt; unless you add the following PHP comment to the beginning of the template:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* Template Name: Example Template */&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This allows WordPress to recognize the template as a custom Page Template and adds a drop down to the Edit Page screen where you can select a specific template for each page.&lt;/p&gt;
&lt;img src=&quot;https://harnerdesigns.com/wp-content/uploads/2019/05/PageTemplateSelector.png&quot; alt=&quot;&quot; class=&quot;alignnone size-full wp-image-1081&quot;&gt;
&lt;p&gt;Examples of different page templates you could create include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A centered wide template, with one column and a focus on the content.&lt;/li&gt;
&lt;li&gt;Different Templates for Right and Left Sidebar Positions&lt;/li&gt;
&lt;li&gt;A more complex grid&lt;/li&gt;
&lt;li&gt;Unique one-off landing pages&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The sky&apos;s the limit really. (One of the many beauties of WordPress)&lt;/p&gt;
&lt;h3 id=&quot;attachmentphp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#attachmentphp&quot; aria-label=&quot;attachmentphp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;attachment.php&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;The Attachment template file is very similar to &lt;code class=&quot;language-text&quot;&gt;single.php&lt;/code&gt; except it&apos;s for displaying images, videos, files and other things uploaded through the WordPress media upload system.&lt;/p&gt;
&lt;h3 id=&quot;imagephp-jpgphp-videophp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#imagephp-jpgphp-videophp&quot; aria-label=&quot;imagephp jpgphp videophp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;image.php&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;jpg.php&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;video.php&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;These are all just more specific versions of &lt;code class=&quot;language-text&quot;&gt;attachment.php&lt;/code&gt;. They allow you to specify custom templates for all images (&lt;code class=&quot;language-text&quot;&gt;image.php&lt;/code&gt;), only JPG images (&lt;code class=&quot;language-text&quot;&gt;jpg.php&lt;/code&gt;), and even videos (&lt;code class=&quot;language-text&quot;&gt;video.php&lt;/code&gt;). These are highly optional, and you should probably be ok with just an &lt;code class=&quot;language-text&quot;&gt;attachment.php&lt;/code&gt; file, but if your site needs the specificity, by all means, specify away.&lt;/p&gt;
&lt;h2 id=&quot;archival-templates&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#archival-templates&quot; aria-label=&quot;archival templates permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Archival Templates&lt;/h2&gt;
&lt;p&gt;The Archival templates are focused around grouping relevant content together in a useful way. When you run through The Loop on an archive template, it typically returns more than one post so your templates should account for that.&lt;/p&gt;
&lt;h3 id=&quot;archivephp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#archivephp&quot; aria-label=&quot;archivephp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;archive.php&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;The default Archive template. Used if none of the other templates are found. Run through The Loop and output posts. If you want to have different looking pages for your Category Archives vs Looking at a specific Date and so on, use the templates below.&lt;/p&gt;
&lt;h3 id=&quot;categoryphp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#categoryphp&quot; aria-label=&quot;categoryphp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;category.php&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;The Category Template is the default archive template for viewing posts of the same category. Displays a list of posts from a specific category if there is no &lt;code class=&quot;language-text&quot;&gt;category-{categorySlug}.php&lt;/code&gt; file for the category with a slug of &lt;code class=&quot;language-text&quot;&gt;{categorySlug}&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If &lt;code class=&quot;language-text&quot;&gt;category.php&lt;/code&gt; doesn&apos;t exist, WordPress reverts to &lt;code class=&quot;language-text&quot;&gt;archive.php&lt;/code&gt; and then &lt;code class=&quot;language-text&quot;&gt;index.php&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;tagphp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#tagphp&quot; aria-label=&quot;tagphp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;tag.php&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Exact same thing as &lt;code class=&quot;language-text&quot;&gt;category.php&lt;/code&gt; but for Tags.&lt;/p&gt;
&lt;p&gt;If &lt;code class=&quot;language-text&quot;&gt;tag.php&lt;/code&gt; doesn&apos;t exist, WordPress reverts to &lt;code class=&quot;language-text&quot;&gt;archive.php&lt;/code&gt; and then &lt;code class=&quot;language-text&quot;&gt;index.php&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;taxonomyphp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#taxonomyphp&quot; aria-label=&quot;taxonomyphp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;taxonomy.php&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;This is the default Taxonomy Template for Custom Taxonomies. If you don&apos;t have &lt;code class=&quot;language-text&quot;&gt;taxonomy-{taxonomyName}.php&lt;/code&gt; and a Custom Taxonomy page is queried, it defaults back to &lt;code class=&quot;language-text&quot;&gt;taxonomy.php&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If &lt;code class=&quot;language-text&quot;&gt;taxonomy.php&lt;/code&gt; doesn&apos;t exist, WordPress reverts to &lt;code class=&quot;language-text&quot;&gt;archive.php&lt;/code&gt; and then &lt;code class=&quot;language-text&quot;&gt;index.php&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;authorphp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#authorphp&quot; aria-label=&quot;authorphp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;author.php&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;The Author template is used to display posts by a specific author. In here you can include the author&apos;s Biography and social links, etc as well as a list of all the posts that individual has contributed to the site.&lt;/p&gt;
&lt;h3 id=&quot;datephp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#datephp&quot; aria-label=&quot;datephp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;date.php&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;date.php&lt;/code&gt; file is pretty similar to the other archival templates, it just allows you to specify a different archive page when looking at a specific date. You could also build a &lt;code class=&quot;language-text&quot;&gt;day.php&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;month.php&lt;/code&gt;, or &lt;code class=&quot;language-text&quot;&gt;year.php&lt;/code&gt; if you needed to be that specific in your date archives.&lt;/p&gt;
&lt;h2 id=&quot;other-templates&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#other-templates&quot; aria-label=&quot;other templates permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Other Templates&lt;/h2&gt;
&lt;h3 id=&quot;front-pagephp--homephp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#front-pagephp--homephp&quot; aria-label=&quot;front pagephp  homephp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;front-page.php&lt;/code&gt; &amp;#x26; &lt;code class=&quot;language-text&quot;&gt;home.php&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;The difference between &lt;code class=&quot;language-text&quot;&gt;front-page.php&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;home.php&lt;/code&gt; in WordPress lies in the type of homepage that is displayed on a website.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;front-page.php&lt;/code&gt; is used when a static page is set as the front page of a website. It serves as the template for the page (overriding &lt;code class=&quot;language-text&quot;&gt;page.php&lt;/code&gt;) that is set as the front page in the WordPress settings.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;home.php&lt;/code&gt;, on the other hand, is the template used for the blog posts index page. It is typically the default homepage for a WordPress site if no static page is set as the front page.&lt;/p&gt;
&lt;h3 id=&quot;404php&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#404php&quot; aria-label=&quot;404php permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;404.php&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;This template is called whenever a user ends up on a page that doesn&apos;t exist. Use the 404 template to redirect the users back to the right place or present them with a search bar to help them find what they were looking for.&lt;/p&gt;
&lt;p&gt;Be creative with it. Landing on a broken page is never fun for your user and there&apos;s a very high chance they&apos;ll just close the tab instead of actually trying to find what they were looking for.&lt;/p&gt;
&lt;h2 id=&quot;in-conclusion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#in-conclusion&quot; aria-label=&quot;in conclusion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;In Conclusion&lt;/h2&gt;
&lt;p&gt;You should now have at least a basic understanding of what all the different theme files do and when to use them.&lt;/p&gt;
&lt;p&gt;Developing for WordPress is pretty simple once you get the concepts down. It&apos;s &lt;em&gt;SO&lt;/em&gt; customizable though so you can truly create any kind of web application you want.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Ensure You Get Paid As A Freelancer]]></title><description><![CDATA[One of the toughest parts about being a freelancer is the possibility that you'll have to chase down every single paycheck you ever earn. However, there are some steps you can take ahead of time to prevent you from having to chase too hard. Keep in…]]></description><link>https://jackharner.com//blog/ensure-you-get-paid-as-a-freelancer/</link><guid isPermaLink="false">https://jackharner.com//blog/ensure-you-get-paid-as-a-freelancer/</guid><pubDate>Sat, 31 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;One of the toughest parts about being a freelancer is the possibility that you&apos;ll have to chase down every single paycheck you ever earn. However, there are some steps you can take ahead of time to prevent you from having to chase too hard.&lt;/p&gt;
&lt;p&gt;Keep in mind, I&apos;m a freelance web developer (and not a lawyer) so some of this advice may not apply to other freelance fields. These are all avenues to help you get paid promptly, but you&apos;ll need to make some personal tweaks according to your specific situation (and you should consult a lawyer).&lt;/p&gt;
&lt;h2 id=&quot;always-get-a-contract&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#always-get-a-contract&quot; aria-label=&quot;always get a contract permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;ALWAYS. GET. A. CONTRACT.&lt;/h2&gt;
&lt;p&gt;I repeat:&lt;/p&gt;
&lt;h3 id=&quot;always-get-a-contract-period&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#always-get-a-contract-period&quot; aria-label=&quot;always get a contract period permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;ALWAYS. GET. A. CONTRACT. PERIOD.&lt;/h3&gt;
&lt;p&gt;None of this other stuff matters if you don&apos;t have a written document signed and dated by both parties, agreeing to any of this. Verbal agreements and a handshake don&apos;t mean anything anymore.&lt;/p&gt;
&lt;p&gt;Not only does having a contract give you a leg to stand on in court (if you ever have to sue for non-payment), it outlines to your client expectations for BOTH parties. You have to do things a certain way, and your client has to do things in a certain way. Being detailed about the business relationship up front helps prevent issues down the line.&lt;/p&gt;
&lt;p&gt;Any time I have to tell a client &quot;Per the contract...&quot; I&apos;m reminded to be grateful for having one in the first place.&lt;/p&gt;
&lt;h2 id=&quot;deposit&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#deposit&quot; aria-label=&quot;deposit permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Deposit&lt;/h2&gt;
&lt;p&gt;Getting a &lt;strong&gt;non-refundable&lt;/strong&gt; deposit before you even begin working, ensures you get paid just for blocking out the time. Depending on the size of the project, you can do a different percentage. I usually do 50%. This one&apos;s a non-negotiable for me. No Deposit? No Work. (Or I&apos;m just going to charge by the hour and bill you weekly to minimize my risk of getting ghosted)&lt;/p&gt;
&lt;p&gt;Now if you get to the end of the project, and they won&apos;t pay up for whatever reason, at least you got some cash for your time.&lt;/p&gt;
&lt;h2 id=&quot;milestone-payments&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#milestone-payments&quot; aria-label=&quot;milestone payments permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Milestone Payments&lt;/h2&gt;
&lt;p&gt;If the scope of the project is large, another option is using Milestone Payments. Milestone payments are partial payments of the project total that are paid out throughout the duration of the project. The milestones you choose will depend on the size and type of work you&apos;re doing.&lt;/p&gt;
&lt;p&gt;For full website builds, I usually do a 3 part payment:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;33% Non-Refundable Deposit.&lt;/li&gt;
&lt;li&gt;33% Milestone Payment once the site&apos;s design is approved.&lt;/li&gt;
&lt;li&gt;33% due after the site gets final approval, but before it&apos;s deployed live on their servers (I&apos;ll go over this in a bit).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the project is massive, you can break things up even further or adjust the ratios to get a larger deposit up front (50%, 25%, 25%). Quick and easy projects typically get broken up into 50% deposit, 50% at the end.&lt;/p&gt;
&lt;p&gt;There are a couple advantages to using milestone payments.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If the client ghosts you halfway through the project, you at least got a chunk of the payment.&lt;/li&gt;
&lt;li&gt;Keeps the client engaged throughout the middle of the project with clearly defined phases.&lt;/li&gt;
&lt;li&gt;Makes the invoice a little easier to swallow for clients, giving them smaller payments over a period of time instead of one lump sum on either end of the project.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;{{{vert}}}&lt;/p&gt;
&lt;h2 id=&quot;no-final-payment-no-final-work&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#no-final-payment-no-final-work&quot; aria-label=&quot;no final payment no final work permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;No Final Payment, No Final Work.&lt;/h2&gt;
&lt;p&gt;You should withhold any final work, until the last invoice is paid in full. Make this part of your contract and spell out the handover process explicitly.&lt;/p&gt;
&lt;p&gt;This one definitely depends on what type of freelancer you are. As a freelance web developer, it&apos;s fairly simple to withhold the work. For preview during the development phase, I upload the code to my own server (for WordPress builds) or a throw-away development store (for Shopify / BigCommerce projects). The client can access the site to approve the work, but doesn&apos;t get access to any of the code until they&apos;ve finished paying me. After they approve the final project, I send the final invoice. Only once that&apos;s paid, then I get things pushed over to their live site, store, or whatever.&lt;/p&gt;
&lt;p&gt;If your an artist or a writer of some kind where work samples you send over for review could easily be used without actually paying you, you&apos;ll need to adapt this process for yourself.&lt;/p&gt;
&lt;blockquote&gt;
&lt;h3 id=&quot;no-final-payment-no-final-work-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#no-final-payment-no-final-work-1&quot; aria-label=&quot;no final payment no final work 1 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;No Final Payment, No Final Work.&lt;/h3&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;automate-payment-reminders&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#automate-payment-reminders&quot; aria-label=&quot;automate payment reminders permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Automate Payment Reminders&lt;/h2&gt;
&lt;p&gt;I use &lt;a href=&quot;https://bonsai.jackharner.com&quot;&gt;Bonsai&lt;/a&gt; to manage all of my invoicing and time tracking. It makes it insanely easy to charge late fees,send out email reminders. Bonsai helps manage pretty much every step of the freelance process from Proposals to Contracts to Getting Paid. &lt;a href=&quot;https://bonsai.jackharner.com&quot;&gt;Check &apos;em out&lt;/a&gt; if you need help automating your freelance business.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Use some of these steps, use em all, but if nothing else:&lt;/p&gt;
&lt;h3 id=&quot;always-get-a-contract-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#always-get-a-contract-1&quot; aria-label=&quot;always get a contract 1 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;AlWAYS. GET. A. CONTRACT.&lt;/h3&gt;</content:encoded></item><item><title><![CDATA[No CS Degree]]></title><description><![CDATA[Becoming a Full Time Freelancer without a Computer Science Degree 😉 I was asked to interview on the No CS Degree blog. The blog focuses on people working in tech and web development that never received a computer science degree. It's a testament to…]]></description><link>https://jackharner.com//blog/no-cs-degree/</link><guid isPermaLink="false">https://jackharner.com//blog/no-cs-degree/</guid><pubDate>Fri, 16 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;becoming-a-full-time-freelancer-without-a-computer-science-degree-&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#becoming-a-full-time-freelancer-without-a-computer-science-degree-&quot; aria-label=&quot;becoming a full time freelancer without a computer science degree  permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Becoming a Full Time Freelancer without a Computer Science Degree 😉&lt;/h2&gt;
&lt;p&gt;I was asked to interview on the &lt;a href=&quot;https://www.nocsdegree.com/self-taught-shopify-developer/&quot;&gt;No CS Degree&lt;/a&gt; blog. The blog focuses on people working in tech and web development that never received a computer science degree. It&apos;s a testament to all the self / community taught developers out there, as well as the people who transitioned into tech later in their life.&lt;/p&gt;
&lt;h4 id=&quot;thanks-pete-for-inviting-me-on&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#thanks-pete-for-inviting-me-on&quot; aria-label=&quot;thanks pete for inviting me on permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Thanks Pete for inviting me on!&lt;/h4&gt;</content:encoded></item><item><title><![CDATA[Displaying Content Between Specific Dates On BigCommerce]]></title><description><![CDATA[Have you ever had to stay up till midnight to flip over to a new BigCommerce theme with banners and content for a big sale (Black Friday, for example)? It's super annoying having to time the theme launch and there's no way to really automate that…]]></description><link>https://jackharner.com//blog/date-specific-content-bigcommerce/</link><guid isPermaLink="false">https://jackharner.com//blog/date-specific-content-bigcommerce/</guid><pubDate>Tue, 22 Nov 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Have you ever had to stay up till midnight to flip over to a new BigCommerce theme with banners and content for a big sale (Black Friday, for example)? It&apos;s super annoying having to time the theme launch and there&apos;s no way to really automate that. Thankfully we can take advantage of the Moment.js Handlebars Helper provided by BigCommerce to their Stencil Themes.&lt;/p&gt;
&lt;h2 id=&quot;moment-helper-and-how-it-works&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#moment-helper-and-how-it-works&quot; aria-label=&quot;moment helper and how it works permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;{{moment}} Helper and How It Works&lt;/h2&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;{{moment}}&lt;/code&gt; Handlebars Helper provides access to some aspects of the Moment.js library for handling and calculating dates and times.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;{{moment &quot;January 1, 2022&quot; &quot;YYYY-MM-DD&quot;}}
\\ outputs 2022-01-01&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can also use it to calculate dates with relative date &amp;#x26; time phrases:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;{{moment &quot;5 hours ago&quot; &quot;MM/DD/YYYY HH:mm&quot;}}
// outputs the Date and Time from 5 hours in the past.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Although we&apos;re going to be taking advantage of the &quot;now&quot; datetime keyword to display banners and other content between specific dates.&lt;/p&gt;
&lt;h2 id=&quot;comparing-now-to-a-specific-date&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#comparing-now-to-a-specific-date&quot; aria-label=&quot;comparing now to a specific date permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Comparing &quot;Now&quot; To A Specific Date&lt;/h2&gt;
&lt;p&gt;The magic code snippet for this goes like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;{{#and (if (moment &quot;now&quot; &quot;MM/DD/YYYY&quot;) &quot;&gt;=&quot; &quot;11/23/2022&quot;) (if (moment &quot;now&quot; &quot;MM/DD/YYYY&quot;) &quot;&amp;lt;=&quot; &quot;11/28/2022&quot;)}}
   // Content to show during Black Friday Weekend 2022
{{else}}
    // Content to show before and after Black Friday Weekend 2022
{{/and}}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We&apos;re using nested Handlebars helpers to compare and see if the current date is after or equal to 11/23/2022 AND if the current date is before or equal to 11/28/2022.&lt;/p&gt;
&lt;p&gt;If you&apos;re going to use this logic in multiple places across the site, you can set your start and end dates as Theme Settings in the &lt;code class=&quot;language-text&quot;&gt;config.json&lt;/code&gt; file and then call them like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;{{#and (if (moment &quot;now&quot; &quot;MM/DD/YYYY&quot;) &quot;&gt;=&quot; theme_settings.black_friday_start_date) (if (moment &quot;now&quot; &quot;MM/DD/YYYY&quot;) &quot;&amp;lt;=&quot; theme_settings.black_friday_end_date)}}
   // Content to show during Black Friday Weekend 2022
{{else}}
    // Content to show before and after Black Friday Weekend 2022
{{/and}}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Make sure to match the formatting of the date and the moment helper format, (11/01/2022 vs 11/1/2022) or Moment won&apos;t be able to compare the dates properly.&lt;/p&gt;
&lt;h2 id=&quot;go-forth--automate&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#go-forth--automate&quot; aria-label=&quot;go forth  automate permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Go Forth &amp;#x26; Automate!&lt;/h2&gt;
&lt;p&gt;Now you no longer need to try and publish your &lt;a href=&quot;/blog/bigcommerce-stencil-ci-cd-with-github-actions/&quot;&gt;BigCommerce Stencil&lt;/a&gt; theme right at midnight when you start a sale. You can schedule the banners and sale content early, publish the site, and then the content will only display during your specified dates. Hit me up on &lt;a href=&quot;https://bsky.app/profile/jackharner.com&quot;&gt;BlueSky&lt;/a&gt; if you have any questions!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Photo by &lt;a href=&quot;https://unsplash.com/@lucian_alexe?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText&quot;&gt;Lucian Alexe&lt;/a&gt; on &lt;a href=&quot;https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText&quot;&gt;Unsplash&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Changing the WordPress Login Page Logo]]></title><description><![CDATA[Customizing the WordPress Login Page The default WordPress Login page is so boring. A simple yet effective change you can do when building a client site on WordPress is update the login page with the company logo and brand colors. It's a nice touch…]]></description><link>https://jackharner.com//blog/changing-the-wordpress-login-page-logo/</link><guid isPermaLink="false">https://jackharner.com//blog/changing-the-wordpress-login-page-logo/</guid><pubDate>Tue, 25 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;customizing-the-wordpress-login-page&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#customizing-the-wordpress-login-page&quot; aria-label=&quot;customizing the wordpress login page permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Customizing the WordPress Login Page&lt;/h2&gt;
&lt;p&gt;The default WordPress Login page is so boring. A simple yet effective change you can do when building a client site on WordPress is update the login page with the company logo and brand colors. It&apos;s a nice touch that adds an extra &quot;custom-built&quot; feel to the site that your clients will see every time the access the site.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 396px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 130.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAaCAYAAAC3g3x9AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACOUlEQVR42qVVy27TQBTNt/AFLPgGNvwIm8IngNiwYolUqVtWQJC6CYJdpVIWFCQoakEIUcjCju049oyTOI+Zg84440ySiZuqIx3N+N47Z86983Arz3OsI8uylX5cSIwK4fWto+UzuhMGWYazvwHOu6EZN5FtJeQETh5Jgc6337j97BB399/hohtCLPzXUsjgQgpchjGevv+C+y+Psff6Ax51PiFIUkjRkLLPQRuVhEmKx51TPGyf4EH7BE/enjbWkLZW7qTggikXIsefIMbzozMcHH83C8hFXX1ztip0UQiBcigNpBCNsUahSU8IzOdzQKNuWmtjI2YLcKyUqmG/Z7PZJiG0xnA4hJQSQkqUZYldG0k3CLVSprcOknPl6XTaCMZ4CedK1QGWaDKZNJLRT3gJbU3quu2gzsKfslYmzdFoVKd74xpy3O/3kaapIbZKm2B32puyG+jWaFmzZe3GpUW5ndDdFJd4dSOm0HOWQ1XQlULhS5kEPH8uzIFfHHSlq5Pfzcd487OHw18Rjv6lgN6ikKmsv4dUZAlnqiJ89aOHWwcfcefFZ9xrf6UX2eYu6627SJ8FWz6e4jzKcREJXA6GJrvNq3eDxoXIUROS3Z7BXVDwzhcVOObcjfdwMBggjuMaPI9JkqzA2m28hf89zDIEQWDQ6/WQxDGiKDLgdxiGxtfvp1e/h5aUq1cqlorYk5S3x32NfC99rTDLuEJmJlNJvFBHZexpo+8a/2VLmtcq2Lu46n9sCf8Ddd7GruiP8dcAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Default WordPress Login page&quot;
        title=&quot;Default WordPress Login page&quot;
        src=&quot;/static/2f57aa4bd63f4c9f493ffb67353e055b/db910/wp_login_form.png&quot;
        srcset=&quot;/static/2f57aa4bd63f4c9f493ffb67353e055b/5a46d/wp_login_form.png 300w,
/static/2f57aa4bd63f4c9f493ffb67353e055b/db910/wp_login_form.png 396w&quot;
        sizes=&quot;(max-width: 396px) 100vw, 396px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;first-ensure-you-have-custom-logos-enabled-in-the-theme&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#first-ensure-you-have-custom-logos-enabled-in-the-theme&quot; aria-label=&quot;first ensure you have custom logos enabled in the theme permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;First Ensure You Have Custom Logo&apos;s Enabled In The Theme&lt;/h2&gt;
&lt;p&gt;Add this to your &lt;code class=&quot;language-text&quot;&gt;functions.php&lt;/code&gt; file:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token function&quot;&gt;add_action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;init&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;jh_custom_logo_support&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;jh_custom_logo_support&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;add_theme_support&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;custom-logo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;changing-the-wp-loginphp-logo&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#changing-the-wp-loginphp-logo&quot; aria-label=&quot;changing the wp loginphp logo permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Changing The wp-login.php Logo&lt;/h2&gt;
&lt;p&gt;The next step is to replace the WordPress logo with whatever&apos;s set as the Custom Logo in the WordPress settings. Add this to your &lt;code class=&quot;language-text&quot;&gt;functions.php&lt;/code&gt; file:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Changes the /wp-login.php logo to the site&apos;s custom logo.&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;add_action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;login_head&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;login_page_custom_logo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;login_page_custom_logo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;token variable&quot;&gt;$custom_logo_id&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_theme_mod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;custom_logo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token variable&quot;&gt;$image&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;wp_get_attachment_image_src&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$custom_logo_id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;full&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token style&quot;&gt;&lt;span class=&quot;token language-css&quot;&gt;
            &lt;span class=&quot;token selector&quot;&gt;body.login div#login h1 a&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token property&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;&lt;span class=&quot;token function&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string url&quot;&gt;&quot;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; center center / contain no-repeat&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 25vh&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Adding the following changes the text that&apos;s hidden visually, but readable by screen readers and search engine crawlers. By default, I just set this to the blog&apos;s name with the following:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Changes the SEO Text for the logo:&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;add_action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;login_headertext&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_bloginfo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;name&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot; Login&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;change-the-logos-link-on-the-wp-login-page&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#change-the-logos-link-on-the-wp-login-page&quot; aria-label=&quot;change the logos link on the wp login page permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Change The Logo&apos;s Link on the WP Login Page&lt;/h2&gt;
&lt;p&gt;By default, the WordPress logo links to WordPress.org. Thankfully, there&apos;s a hook available to easily change the link.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Changes the Logo Link to the Site&apos;s Home URL:&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;add_action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;login_headerurl&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_home_url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;add-text-to-the-login-page&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#add-text-to-the-login-page&quot; aria-label=&quot;add text to the login page permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Add Text to the Login Page.&lt;/h2&gt;
&lt;p&gt;If you also want to include some additional text between the logo and the form, you can do so with the &lt;code class=&quot;language-text&quot;&gt;login_message&lt;/code&gt; hook.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;
&lt;span class=&quot;token comment&quot;&gt;// Adds an &amp;lt;h1&gt; under the logo:&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;add_action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;login_message&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;&amp;lt;h1&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_bloginfo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;name&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot; Login&amp;lt;/h1&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;{{{vert}}}&lt;/p&gt;
&lt;h2 id=&quot;all-together-now&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#all-together-now&quot; aria-label=&quot;all together now permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;All Together Now&lt;/h2&gt;
&lt;p&gt;Here&apos;s the whole script in one piece if you want to just copy-paste it into your &lt;code class=&quot;language-text&quot;&gt;functions.php&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;add_action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;init&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;jh_custom_logo_support&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;jh_custom_logo_support&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;add_theme_support&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;custom-logo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Changes the /wp-login.php logo to the site&apos;s custom logo.&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;add_action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;login_head&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;login_page_custom_logo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;login_page_custom_logo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;token variable&quot;&gt;$custom_logo_id&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_theme_mod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;custom_logo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token variable&quot;&gt;$image&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;wp_get_attachment_image_src&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$custom_logo_id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;full&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;

    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token style&quot;&gt;&lt;span class=&quot;token language-css&quot;&gt;
        &lt;span class=&quot;token selector&quot;&gt;body.login div#login h1 a&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;&lt;span class=&quot;token function&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string url&quot;&gt;&quot;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; center center / contain no-repeat&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 25vh&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Changes the SEO Text for the logo:&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;add_action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;login_headertext&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_bloginfo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;name&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot; Login&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Changes the Logo Link to the Site&apos;s Home URL:&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;add_action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;login_headerurl&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_home_url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Adds an &amp;lt;h1&gt; under the logo:&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;add_action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;login_message&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;&amp;lt;h1&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_bloginfo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;name&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot; Login&amp;lt;/h1&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;p&gt;Cover Image By &lt;a href=&quot;https://unsplash.com/@muratodr?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText&quot;&gt;Murat Onder&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Custom Menu Order in the WordPress Admin]]></title><description><![CDATA[Turn On The Custom Admin Menu Hook The  hook is a simple hook that just tells WordPress you want to display the Admin menu in a custom order. You filter it with  and can just use the built-in function  to (you can probably guess) return true to the…]]></description><link>https://jackharner.com//blog/custom-menu-order-wordpress-admin/</link><guid isPermaLink="false">https://jackharner.com//blog/custom-menu-order-wordpress-admin/</guid><pubDate>Wed, 20 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;turn-on-the-custom-admin-menu-hook&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#turn-on-the-custom-admin-menu-hook&quot; aria-label=&quot;turn on the custom admin menu hook permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Turn On The Custom Admin Menu Hook&lt;/h2&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;custom_menu_order&lt;/code&gt; hook is a simple hook that just tells WordPress you want to display the Admin menu in a custom order. You filter it with &lt;code class=&quot;language-text&quot;&gt;add_filter()&lt;/code&gt; and can just use the built-in function &lt;code class=&quot;language-text&quot;&gt;__return_true&lt;/code&gt; to (you can probably guess) return true to the hook.&lt;/p&gt;
&lt;p&gt;Add this to your &lt;code class=&quot;language-text&quot;&gt;functions.php&lt;/code&gt; file:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt; &lt;span class=&quot;token function&quot;&gt;add_filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;custom_menu_order&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;__return_true&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://developer.wordpress.org/reference/hooks/custom_menu_order/&quot;&gt;Docs&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;order-in-the-wordpress-admin&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#order-in-the-wordpress-admin&quot; aria-label=&quot;order in the wordpress admin permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;ORDER IN THE... WordPress Admin!&lt;/h2&gt;
&lt;p&gt;Now that Custom Menu Order is turned on, it&apos;s time to actually set the order. This is controlled through the &lt;code class=&quot;language-text&quot;&gt;menu_order&lt;/code&gt; hook.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token function&quot;&gt;add_filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;menu_order&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;&amp;lt;custom_menu_order_fn_name&gt;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The hook sends an array of the current menu item&apos;s URLs as the only parameter. Keep in mind it is only the part of the url AFTER  &lt;code class=&quot;language-text&quot;&gt;/wp-admin/&lt;/code&gt;, but including all of the url parameters:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For example the Pages menu links to &lt;code class=&quot;language-text&quot;&gt;https://example.wp/wp-admin/edit.php?post_type=page&lt;/code&gt; and you just turn it into: &lt;code class=&quot;language-text&quot;&gt;edit.php?post_type=page&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You can either add and remove things individually from the Menu, or return a completely new array with only the items you want in the order you want.&lt;/p&gt;
&lt;h3 id=&quot;removing-posts-menu-all-posts-add-new-etc-from-wp-admin&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#removing-posts-menu-all-posts-add-new-etc-from-wp-admin&quot; aria-label=&quot;removing posts menu all posts add new etc from wp admin permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Removing Posts Menu (All Posts, Add New, etc.) from WP Admin&lt;/h3&gt;
&lt;p&gt;Using the PHP function &lt;code class=&quot;language-text&quot;&gt;array_search()&lt;/code&gt; returns the array index for a specific value. If you wanted to remove a specific menu/submenu completely, you just search for the top level pages URL, and use PHP&apos;s &lt;code class=&quot;language-text&quot;&gt;unset()&lt;/code&gt; to remove the item from the array.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;jh_remove_posts_menu&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$menu_ord&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$key&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;array_search&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;edit.php&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$menu_ord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token constant boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;unset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$menu_ord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$key&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$menu_ord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;add_filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;menu_order&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;jh_remove_posts_menu&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;totally-custom-wp-admin-menu-order&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#totally-custom-wp-admin-menu-order&quot; aria-label=&quot;totally custom wp admin menu order permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Totally Custom WP Admin Menu Order&lt;/h3&gt;
&lt;p&gt;Here&apos;s an example of throwing out the default menu order and returning an entirely new one.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is probably the way to go if you&apos;re going to be moving or removing more than one item from the menu. It&apos;s easier to just set the order explicitly, instead of fighting with the array the hook provides.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;jh_custom_menu_order&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$menu_ord&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
 
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;index.php&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Dashboard&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;separtor1&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// First separator&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;edit.php&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Posts&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;edit.php?post_type=page&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Pages&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;edit.php?post_type=&amp;lt;custom post type&gt;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Custom Post Type &lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;separator2&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Second separator&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;upload.php&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Media&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;edit-comments.php&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Comments&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;separator3&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Third separator&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;users.php&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Users&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;themes.php&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Appearance&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;plugins.php&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Plugins&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;tools.php&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Tools&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;options-general.php&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Settings&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;separator-last&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Last separator&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
 &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
 &lt;span class=&quot;token function&quot;&gt;add_filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;menu_order&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;jh_custom_menu_order&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The order of the items in the array determines the order of the menu. You can add and leave out any pages that are accessible from the WordPress Admin.&lt;/p&gt;
&lt;p&gt;Don&apos;t worry though, the menu still respects User Role Capabilities, so if you add the Settings menu, it still only shows up for the Administrator role.&lt;/p&gt;
&lt;h2 id=&quot;order-array-of-core-wordpress-pages&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#order-array-of-core-wordpress-pages&quot; aria-label=&quot;order array of core wordpress pages permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Order Array of Core WordPress Pages&lt;/h2&gt;
&lt;p&gt;As of WordPress v6.0.1, this is the default menu order that gets passed to your &lt;code class=&quot;language-text&quot;&gt;menu_order&lt;/code&gt; filter function:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;index.php&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;separator1&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;edit.php&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;upload.php&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;edit.php?post_type=page&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;edit-comments.php&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;separator2&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;themes.php&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;plugins.php&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;users.php&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;tools.php&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;options-general.php&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;separator-last&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
 &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[How To Tell If A Color Setting Is Set In Shopify Liquid]]></title><description><![CDATA[Shopify sections make it super easy to add customizable settings that your clients can control with a wonderful user-friendly UI. One of the many settings types available to Shopify Sections is the Color Picker:  One slightly annoying part about the…]]></description><link>https://jackharner.com//blog/how-to-tell-if-a-color-setting-is-set-in-shopify-liquid/</link><guid isPermaLink="false">https://jackharner.com//blog/how-to-tell-if-a-color-setting-is-set-in-shopify-liquid/</guid><pubDate>Tue, 05 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Shopify sections make it super easy to add customizable settings that your clients can control with a wonderful user-friendly UI.&lt;/p&gt;
&lt;p&gt;One of the many settings types available to Shopify Sections is the Color Picker:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 301px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 202.66666666666669%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAApCAIAAAC6D54pAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFyklEQVR42pWWeUwUZxTApxqVwB82RayaVtLWSFCDlgRbYFmvYopWVI6UxlCDURTT6B8e9YiYNBJT28YqEahtY0xTizariYpgoVqXIp67VljFhUV3F3bZZY9h5/rOmWZmdDmsSl++P2Yy+b33vncOgxCSNVH+p0AIGUqpz+draLh8vbXVYrVaLJbGpiZzc/P1660IIUVRXqQXAMBgjBFCTqfT7Xb7fH6v1+t2ux3d3Xa7nRDyEssqrLqtKLpyURQxIZRS/bNuU5ZlhBClVDejPcuDcFSZ6/GTDtuDzo5HUV6HnS63x+t1uXtcPb2O7seiKD5zGyHXQNDm7+0IeDvDfnvIZw/5OgLeB/0eJxtQtFhSTYaqG7Qckngvx/bxA16OjR5PJBwQOPkF8hQmhIRD4ceOx52POn19vpeENyoY44FIRE2VlmeFUkoIGWW29Ys8zbPT6bre2nrn7l2bzfby9PxHnnme93g8fX19gWBw9BU2mCrdYYSQJEkIQYyxJEmjKhKMsZ4Jj8fzR2Nj3aX6a2bz7du3BUF4RXnqMMaYUBpi2c6urq7ubndPr6IoNHpkmeoZGqJIhSFChBAAAAQAI0QJkQmhGCMAsH4kCUOIIcCSSDCOOqLCKgUh19/P2WzctWucycRVV3MHDnBbt3Jr1nDLlnFJSXxxMTh3ERw6ijCmQ2EIoShJ3TZbV1OTo7bWUVnp2LfPsWmTIz/fYTQ6Zs/umjDetWgJPLYHfpENBUGrUjkKI0EQbpnNf58+3VJT01JR0bJtW0tJSUtubovB0DJnTnNc7D/ZueKTfLE9DgJJi6w8eGeO5+vOnv29stJUUWHascO0YYOpsNCUnW1KSzublFQbM6Fl8YpKOW+THAugJA+FEUKRSOTk8eOV5eXV27dXbdhQVVRUlZNTlZlZlZJS/d67h8ePu7woZzU9FEs/AxCooR8CY5Zlvz14cG9Z2f6SkvLCwvKcnHKjsTw1tTwpaf/06TvHjj21eFGej49zshKAyrPepJQyCONwOPzltm3rCgo2rlpVunRpqcFQmppampxcmpi4cerUYua1YzkL8/bQ2CVUheXBxmYwJsFgcN3atTkLFqzMyspNS8tNScmdOTM3MTF3ypRV8fHZDLNv+cLf8uSvYmUgQVkZDgcCgdUrV86fO9cwb17mrFmZM2ZkJiZmTpuWmZCQFR+fyjBlKz4iRQ7yhhVKgA6FCVFH79yUlIlxcZMnTkyIi0uIiZk0btykMWMmMcybY8bEMswnOR/T/LU09i0oSXRIeat3DoVCBQUF89PSjAaDISMjKyPDmJFhTM8wpqcvSE9PTU7esn27fPQwKS6C2hgYhAGA+tJQFEXtQbX4ZQCRfvRilCmFlEKtZ4fDEAIAtNaVIYSSKAYCoUcdD++3tdntdhxtaVkhGEMIR1qGEOoDTG9sdb4TojaqtgCiQgiBcIRlABBCPM+LoshzHMsO8BwncJwgiJoaTFUlRNX6bHWMhFmW5SIRjuc4XghGuD5eiGhjZIQ8D6tu6ypO/XryyLEjoYZ6euJEuKvTE46w7TdBzRbPjfoz3sgtf5hqA2cYDADQ9aW+/wETG+8sK1MMBlfdRYvL6z1zVPmQuX9k68I7PV+3ORQyHIZI7efa2lqT6VzjpW/qzu/984eqXzZutt+962cH7l2p/371/CtnTtwIiw8DYYKHu00I9fv9kycnvD39HbZ/s6KsL17/KRPz+oW6OlmWa2pqGIbZvXuX+isgSSNTpYe6urr6x59+5oMNsnjhcsOFw98dcXQ5EMb3rJZdO3f8dfWqoigShCMDBrXZq09WAGUJyPqtEEIAAIyxvtmAFlj9dZhlRVGcbKSfE9QJrQxWhSzLWmE8LaHnpz+jEGINDpTc6Njb9sTl77daLO02m9V6D0L4ynXFKJTU9/QvN7d/ftNu6/Xet1rvt7Wbzc0cx71yV6tbEhBy3uW/2c9SggVBFEVREITR7Np/AYceI8k+GxWqAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Shopify Color Picker&quot;
        title=&quot;Shopify Color Picker&quot;
        src=&quot;/static/ffa3df23125c76de44ee52a101a91813/fb933/shopify-color-picker.png&quot;
        srcset=&quot;/static/ffa3df23125c76de44ee52a101a91813/5a46d/shopify-color-picker.png 300w,
/static/ffa3df23125c76de44ee52a101a91813/fb933/shopify-color-picker.png 301w&quot;
        sizes=&quot;(max-width: 301px) 100vw, 301px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;One slightly annoying part about the Color Picker is that if you set the field to blank in the customizer:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 299px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 43.812709030100336%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA1ElEQVR42o2QTW6DMBCFcwBOwQU4DxfiWnEtgRIpXSF2DThIYH5SGzNJTDF4umiTVRvn7Ub6Ps3T2xgzCyEAQEppjMEXYq1FRCnlRim1JWS33xFCpJSIuCzLuq4/hEP+vf5Hn8nWWjWCGMab1nmeF0XBGCvLsmkatzzPc/85nIUahvFweI+T5I3SOE5Op/LBPfm8wuU2wnWavvr+zDmv6opzrrV2y4gIAG3b/kk4agNAGIZBEFBKq7r+OB7tPW45TVPf9z3Pi6KIMZZlWdd1eppeWfsb7Lv+qJZDmTkAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Color Picker with Transparent Setting&quot;
        title=&quot;Color Picker with Transparent Setting&quot;
        src=&quot;/static/426e10a21d618042bcaf7c710c21768d/aeb78/transparent-color.png&quot;
        srcset=&quot;/static/426e10a21d618042bcaf7c710c21768d/aeb78/transparent-color.png 299w&quot;
        sizes=&quot;(max-width: 299px) 100vw, 299px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The specific setting won&apos;t actually be null or a falsey value, it returns as &lt;code class=&quot;language-text&quot;&gt;rgba(0,0,0,0)&lt;/code&gt;. Which means:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;liquid&quot;&gt;&lt;pre class=&quot;language-liquid&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; settings&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token object&quot;&gt;color&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;comment&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt; 
        This will always be true. 
    &lt;/span&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;endcomment&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;comment&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt; 
        This will never render. 
    &lt;/span&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;endcomment&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;endif&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;the-solution&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-solution&quot; aria-label=&quot;the solution permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Solution&lt;/h2&gt;
&lt;p&gt;The color picker stores the setting and returns a Shopify &lt;a href=&quot;https://shopify.dev/api/liquid/objects/color&quot;&gt;Color Object&lt;/a&gt; which allows us to check whether or not a color is visible at all.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;liquid&quot;&gt;&lt;pre class=&quot;language-liquid&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token object&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;settings&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token object&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;alpha &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;comment&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;
        Color Setting is set
    &lt;/span&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;endcomment&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;comment&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;
        Color Setting is blank / transparent.
    &lt;/span&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;endcomment&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;endif&lt;/span&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This treats &lt;code class=&quot;language-text&quot;&gt;rgba(255,255,255,0)&lt;/code&gt; the same as &lt;code class=&quot;language-text&quot;&gt;rgba(0,0,0,0)&lt;/code&gt;. If a color has a 0% alpha, no matter the Red Green or Blue values, the color won&apos;t be visible.&lt;/p&gt;
&lt;p&gt;--&lt;/p&gt;
&lt;p&gt;Photo by &lt;a href=&quot;https://unsplash.com/@steve_j?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText&quot;&gt;Steve Johnson&lt;/a&gt; on &lt;a href=&quot;https://unsplash.com/s/photos/rainbow?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText&quot;&gt;Unsplash&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[SelectControl Not Saving Attributes]]></title><description><![CDATA[SetAttributes() Doesn't Automatically Convert Types I was using a SelectControl to set a Category ID for a specific Gutenberg block I was building. Turns out the  function doesn't automatically convert types. The SelectControl returns the value as a…]]></description><link>https://jackharner.com//blog/gutenberg-selectcontrol-not-saving-attributes/</link><guid isPermaLink="false">https://jackharner.com//blog/gutenberg-selectcontrol-not-saving-attributes/</guid><pubDate>Tue, 15 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;setattributes-doesnt-automatically-convert-types&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#setattributes-doesnt-automatically-convert-types&quot; aria-label=&quot;setattributes doesnt automatically convert types permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;SetAttributes() Doesn&apos;t Automatically Convert Types&lt;/h2&gt;
&lt;p&gt;I was using a SelectControl to set a Category ID for a specific Gutenberg block I was building. Turns out the &lt;code class=&quot;language-text&quot;&gt;setAttribute()&lt;/code&gt; function doesn&apos;t automatically convert types. The SelectControl returns the value as a string, &amp;#x26; since the attribute was expecting a Number:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;attributes&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;cat1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;number&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The attribute wasn&apos;t getting saved as anything.&lt;/p&gt;
&lt;h2 id=&quot;a-few-solutions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#a-few-solutions&quot; aria-label=&quot;a few solutions permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A Few Solutions&lt;/h2&gt;
&lt;p&gt;The easiest way to solve this is just convert the String value to a Number with &lt;code class=&quot;language-text&quot;&gt;parseInt()&lt;/code&gt; when setting the Attribute:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;onChangeCat1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;setAttributes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;cat1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Other than that you can adjust your attribute type to just accept a string, however given that WordPress expects Post IDs to be Numbers this probably isn&apos;t the best solution:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;attributes&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;cat1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;conclusion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-label=&quot;conclusion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Make sure you&apos;re saving your attributes as the appropriate type, (Number, String, Boolean, etc.) and WordPress Gutenberg should stop giving you issues. Hit me up on BlueSky &lt;a href=&quot;https://bsky.app/profile/jackharner.com&quot;&gt;@JackHarner&lt;/a&gt; if you have any other WordPress related questions.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Organize Your Shopify Theme & Section Settings]]></title><description><![CDATA[Shopify is the most customizable e-commerce platform, while still being super user friendly out of the box. Like yes, hypothetically you can build literally anything you wanted if you built it from scratch, but who's got the time for that?! (Let…]]></description><link>https://jackharner.com//blog/organize-your-shopify-settings/</link><guid isPermaLink="false">https://jackharner.com//blog/organize-your-shopify-settings/</guid><pubDate>Sat, 08 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Shopify is the most customizable e-commerce platform, while still being super user friendly out of the box. Like yes, hypothetically you can build literally anything you wanted if you built it from scratch, but who&apos;s got the time for that?! (Let alone maintaining it??) Shopify gets you about as close as you can get to the &quot;build it from scratch&quot; level of flexibility, while still letting you hand the store off to the less technically inclined users that will be running it on the day to day.&lt;/p&gt;
&lt;p&gt;The theme editor, &amp;#x26; sections (+ specifically the introduction of &lt;a href=&quot;https://twitter.com/shopify/status/1409922304738484229?lang=en&quot;&gt;Sections Everywhere&lt;/a&gt; ) really opens the doors for hyper customizable Shopify themes, and dynamic e-commerce experiences across the site.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1200px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 74.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAAsTAAALEwEAmpwYAAADe0lEQVR42o2T208cdRTH59/ogz6YqKmJPlg1McYXmjRtSEQxViNEirDAwsLuMrAsl22FtiCWVm0prSRCEzVegIW23LSXpJg0bYpGQq0JKSy3XWb2ymVndvYCH/Mb2dr65HmZ3+93zvnOOd/zPZKu6xiGweJmiK1kAnZgZ2eH/2MiT9N083zT9xeNNwaRNE0jHA6TzmTY3gVSg0G6+/vp6O7ms54eOnvOc/piD2f7vqb70iXO9fdxpreXzl3fqYsXaP3ic7yTE0ix2DqRSIRYLGb+UVg0GmNufp75pSUWlpbNr295mYXlZe7cm2bm/n18Kys89PmYX1zi4eIiD+bmWPAtIkVjMaLRKOl0mkwmYwIGQyFGJq4wcHUI79gIw+OXzbv5dmUI7+gwEzcn+fnWNcauTzB6bRzv+Ai/z/6BFI2EUBSFeDz+iLtVvx9bs5NCWzEfO8opra3AUldJeb2NSncNdo9M7nt55BzMwSJbzXupbOWHkQEkwd2qP4DgMmv+QAB3uweru4aaZhmHp47aYy7kYy7cJ1qwuOzs37eXmtee5aPSIjyn2rC3yGY3km6kUKMacT1ptp0FdB1vosxVRVWjA1uTE3uTE6tcgaOhhP1v53Ku8BBTZblY3srDdbIZW6ODwateJJEcCKyxpigkEoldQD9yq4sSuZxydzWVrioaPHbOnG/h7JdV1BXl4Hzued5/ag9vvP4qrrYmrA3VJr+SmKyqqmi6/ljLfpxH6yl2llHmtNDWLvPLjT6mbv/I9ZEL9B8/wotP7+GZF/ZSYD2C/InL5Peny0NI29vbhMMRtjOZR0NZ8a9SWV9FQelhCi0f0NJ5gsmpMYZ72+kuK6D2zX1Y3j1Ift4B3inIx9Zkp6imhG+HvkdKJpOm7uKa9q9sgioNHhmrbKWyoZrWjqPcujfLwDffcbqiiF8/PETbKy9hPfAyxSX5uE+2UN3sYHDUiyRWLxgMPTHlVCplUqAnEgh/KmmQNAw29ATr6+tshkOogQCJxBaGIeJ0k38RL2XSaVRFQVT6OOB/9zkSjeD3rxKOhFFDIRRVIZ3OPBEjOpRS6QxKeBMhnyyGAMxK6Pb0NI2fdtDV+xWeri6m7t413ze2tohtbJhViTkIEzlSXNMJqBG2tH8kIyoTjmyVoprfZmeZ+fMB0zMz+NcU0yeAEoZhdpZdW3H+Gyygz2ob/4n5AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Theme Editor&quot;
        title=&quot;Theme Editor&quot;
        src=&quot;/static/858475dd05b33b0168f6234fdeea5db8/c1b63/theme_editor.png&quot;
        srcset=&quot;/static/858475dd05b33b0168f6234fdeea5db8/5a46d/theme_editor.png 300w,
/static/858475dd05b33b0168f6234fdeea5db8/0a47e/theme_editor.png 600w,
/static/858475dd05b33b0168f6234fdeea5db8/c1b63/theme_editor.png 1200w,
/static/858475dd05b33b0168f6234fdeea5db8/d61c2/theme_editor.png 1800w,
/static/858475dd05b33b0168f6234fdeea5db8/f238d/theme_editor.png 2078w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;with-great-customization-comes-great-responsibility&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#with-great-customization-comes-great-responsibility&quot; aria-label=&quot;with great customization comes great responsibility permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;With Great Customization, Comes Great Responsibility&lt;/h2&gt;
&lt;p&gt;Just because you &lt;em&gt;can&lt;/em&gt; turn everything into a Block, Section, or Theme setting doesn&apos;t mean you &lt;em&gt;should&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;But if you&apos;re going to anyway, you better keep things organized and descriptive. I&apos;m going to show you how to use the &lt;code class=&quot;language-text&quot;&gt;header&lt;/code&gt;, and &lt;code class=&quot;language-text&quot;&gt;paragraph&lt;/code&gt; settings, as well as the &lt;code class=&quot;language-text&quot;&gt;info&lt;/code&gt; setting property to make it perfectly clear what each setting changes.&lt;/p&gt;
&lt;h2 id=&quot;section-settings-background&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#section-settings-background&quot; aria-label=&quot;section settings background permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Section Settings Background&lt;/h2&gt;
&lt;p&gt;If you&apos;re unfamiliar, Shopify Sections are reusable blocks of code that can be modified, updated, &amp;#x26; reordered by anybody with access to the Shopify backend.&lt;/p&gt;
&lt;p&gt;You define the settings and blocks available to each section with a JSON object inside of the &lt;code class=&quot;language-text&quot;&gt;{% schema %} ... {% endschema %}&lt;/code&gt; tags.&lt;/p&gt;
&lt;p&gt;For example, you&apos;ll see something like this at the end of most files in the &lt;code class=&quot;language-text&quot;&gt;/sections/&lt;/code&gt; directory:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;liquid&quot;&gt;&lt;pre class=&quot;language-liquid&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; schema &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;
{
    &quot;name&quot;: &quot;Coolest Section Ever&quot;,
    &quot;settings&quot;: [ 
        ...
     ],
    &quot;blocks&quot;: [ 
        ...
     ],
}
&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; endschema &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The settings inside the &lt;code class=&quot;language-text&quot;&gt;settings&lt;/code&gt; array are displayed in the order you write them, from top to bottom down the file.&lt;/p&gt;
&lt;h2 id=&quot;the-header-setting&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-header-setting&quot; aria-label=&quot;the header setting permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Header Setting&lt;/h2&gt;
&lt;p&gt;Use the header setting when you want to group or separate a collection of settings. As is probably obvious based on the name, it creates a Header with the text from the &lt;code class=&quot;language-text&quot;&gt;content&lt;/code&gt; property and creates a bit of separation between the settings above and below it.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 412px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 115.66666666666667%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAXCAIAAACEf/j0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAADYUlEQVR42n2U32/bVBTH+59MSHvo8zYKqCRxlrRbaJfEbjae2qKxISTWZmtiJxOakGjXgbS13aTCA/DGAAEPFS9IRYKXbXRNU8LcsbZJaOtsZnbiyInj+Of1QddGI1ubnQc/3Hs//p7zvefcHl80FSDpAEkfCX8wM38bAJqG1rKNqtLgpWpdVWRNtWzbQajdbhuGoWmaaZoAIElSD4bjNEHSRwcnrs7dBnA2+Uq+tFUUeL4lVxoSJ9d0ywQHnoVt26Zl/Qf7Y+kAyfRFkrOf/QgANVHcLZUbsgwAjtMBdcC6rtfr9Z7+WHpwODk68G6MOLs4dgnW1/7m+aeCCAAIIeSg/by34imnfaemQiTdd3Ly0+wc/MM3m01FeOqdgoPif9gfT/uiKYJijg5e+HjhW7x6fVocjfGP/soVCizLFksllt0QRfEZ1qmc8jw7NjgxO/c1AKhfLbbp9yVur7izy3F7lmXZto0QOkC5/1TKF00TJPPqicmr898AwGOef/CAdQCQbTtudE37zWjKF8MwTvsGVn5nbPyVQ4fu3rl7797va/k1wzC6wgTFEBQTHMlg5QWs/POvv9384suWqsqy3Gw2X6bsj9OBOH18JIPv2YVRfgV++l5rKVK9Xpcky7K6wgGSDlJ0iGJeiySvuYY9mTy713d4Z+3+ndXcH+vrXjMeDAcpxj+SId7+8Ejk4sziD7iBnlTsjYKNHFVt67r+0iahmKGhidET75Hh859f+Ah+Wd7iKmyxJAiCd26/4c/VfDw6NRyf8kcmrl+5BeVSo6WKgqDvM/ngmgMUQySyxyLJ6VvfAcDC/PzY+Pj2dvHR5ubW9vbGw4ccx3WB43SQYkIJ7LZ3VdMzM7FYrFQqlcvlYrHYarVe8Ox5ZZIOJy5jt2/i3jZNU9M0x3GQG6Zpdq3ZvapMKJHtO5m85qZtGAZCiKtUVlbuF9zZkN3ZxgPaYR6GQ4ksEafDp7Ovv3XxExdGCG9rmiaKYqPR6GYYfgyCbm8OnLn8xtClWTftfD6/tLTUbrcVRZFluVqrCaKIv9WqIIi6rnu/qNVqPQROmxk4g2v2HsBz58739vbmcrlC4c/V1dzO7g7HcRU39jhOVVUP1jTNVaYy4dPZ/uEpr2aWZZeXlw3DUBRFVdXOSX4h/gWKeUnFfTlCpwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Header Setting&quot;
        title=&quot;Header Setting&quot;
        src=&quot;/static/dbdddebe420ad88088ada19b633b67e4/9e32a/header-setting.png&quot;
        srcset=&quot;/static/dbdddebe420ad88088ada19b633b67e4/5a46d/header-setting.png 300w,
/static/dbdddebe420ad88088ada19b633b67e4/9e32a/header-setting.png 412w&quot;
        sizes=&quot;(max-width: 412px) 100vw, 412px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Just add the following block in between the settings you want to add:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;header&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Header Text Content&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This works inside of Section, Theme &amp;#x26; Block settings arrays.&lt;/p&gt;
&lt;h2 id=&quot;the-paragraph-setting&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-paragraph-setting&quot; aria-label=&quot;the paragraph setting permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Paragraph Setting&lt;/h2&gt;
&lt;p&gt;Use the paragraph setting when you want to add some additional context to a group of settings. (If you&apos;re trying to expand on a single specific setting use the Info property below.)&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 396px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 61.33333333333334%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACMElEQVR42n2SW2sTURDH9yMJ4oNp0ype0DRtWkEfVLyAvohI26SFPlSpoJ/EPpU+aB9tCzb60NzaVNptIcnmttmzey57ds9uyF7OOZIURC34488MA/NnBmYU+QdRFHHOf5dCypjHYgQfMQiD3frx55Pyllohvqesb+6sb+582tje+PLNcb0gDC2CEaWIUsoYHkXiuJwLeQHl8u3XV+68uXTj1c0HKxBA1m6Vd3er+Xx1b69WLh//+H6Uz+9/3Q4gkoxJx+E2iTGKHSqEUK7fW751fyU5nZ158QEWyvJUHWhNrmlxsxnV6mG9HtZqcaMxODvrq2pfVXmjIXVdVirSdZXJ2aXJuaWrqfm7T9dQsRJS0sXYwMSiDiCkC1EPYdOmpk17EHYhsj0vlFI2m5KQoXkik0uk5qeevUfFg4BgrWeYFsLUBQjpwDQh6pkWgNDC2PV9TGwnCGS7PTRPZHITs7mx9MLsy49wvySBQQGgXd01DNcAjt5jAFBdp92hBGPS82QQyNNTadtKMpO7NrecSC9knq9ZLT06U2Gx4Bz9RKWiWSjYBwf24SEqlWi1Klst0WgMVa/LTkdyroxPZyfnlhLphdSjVYQpG4QnLcOiNsAYEBs7LmEMUopd9+KxhpNHa2dTD1dtTDoozB9Tx0ZRFP/bK8RfOjcnM7mx6cWpx29NSKIopJS22x1N0/SeIUZN4jxdfJLxmWwyk0ukF2eevDMh4YL7/b7neYy5vu/L//ILRxhXZ0+rPWAAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Paragraph Setting&quot;
        title=&quot;Paragraph Setting&quot;
        src=&quot;/static/6e380d7ef81ad3234c51715a993417d4/db910/paragraph-setting.png&quot;
        srcset=&quot;/static/6e380d7ef81ad3234c51715a993417d4/5a46d/paragraph-setting.png 300w,
/static/6e380d7ef81ad3234c51715a993417d4/db910/paragraph-setting.png 396w&quot;
        sizes=&quot;(max-width: 396px) 100vw, 396px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;paragraph&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Lorem ipsum dolor sit amet.&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can include links in Markdown style if you need to provide additional context and resources:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;paragraph&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Lorem ipsum dolor sit amet. [Here&apos;s a link](https://jackharner.com)&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you really want extra separation between sets of settings, create a paragraph setting and set the text to either &lt;code class=&quot;language-text&quot;&gt;-&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;=&lt;/code&gt;, or my personal favorite: &lt;code class=&quot;language-text&quot;&gt;~&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;paragraph&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;~~~~~~~~~~~~~~~~~~~~~~~~~~&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 372px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 39.333333333333336%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABGklEQVR42n2QTU7DMBCFcypQNuVHLIB0UYpY0fYApKBUokWcADWchauwoYtIpDgSLChNI4TjjJN4JshOK1VV4ZNlP3v0NH5jNVrD3ROv6/pCZADwMpkwFuV5gUhK4V8LEauqshqtW/vUu7wac54SUZIk8WJR/QsA5HmuzXtnw53jm4475lwg4jyOZ7Mv03Y7iJQKAVJq8+H5ne143b7PU0FEpozlNoqVUEoRkTbvt0d2c6DNXFSEEiADkFKCNIfMl1fzrjF6mVl3bg56149pKgpFP5kiwhoyqv4OrVgPbx1d3NuO13F9KuF5yh+e3uefH6/h9E3DGGNhGDLGgiCIomjTfNAe2c6g1zedS/oWJeL6eHT+eldKbYz9F6AqpbHC88yqAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Tilde Separator&quot;
        title=&quot;Tilde Separator&quot;
        src=&quot;/static/bd1b403d3f5b91a493e54d339218c2d8/98b6e/tilde-separator.png&quot;
        srcset=&quot;/static/bd1b403d3f5b91a493e54d339218c2d8/5a46d/tilde-separator.png 300w,
/static/bd1b403d3f5b91a493e54d339218c2d8/98b6e/tilde-separator.png 372w&quot;
        sizes=&quot;(max-width: 372px) 100vw, 372px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-info-property&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-info-property&quot; aria-label=&quot;the info property permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Info Property&lt;/h2&gt;
&lt;p&gt;Another way to provide even more specific clarity is through the info property.&lt;/p&gt;
&lt;p&gt;Every &lt;a href=&quot;https://shopify.dev/themes/architecture/settings/input-settings&quot;&gt;Input Setting&lt;/a&gt; type, can accept the info property which adds a little bit of text directly under the input.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 308px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 54%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABnElEQVR42oWS246bMBRF8/8fVbW/MEMC2E6w8QWbgCEm+MLFVITMVKoqdT0cP60t+exzcs5v27bGuO3EdSe+2JZl3f6F1p33Ydu2UwjTaEcEQZrlECLKWIFxejkXmCCEiqK4FcX5nJyTT4Buy7rH/fj5i3G+y96HaZqkVEJUStXGmPp+x5hQxqWUnAspFSGkqmQllbXuhbfWHbKfl6V/9AhdMSaC0ZIyQkgOACaYMYYxKSlljFecfiZJDsBobQghxrjLy7I8+u56u0GEEMwpE4SUIM9ISRnf05JLijFWqp7neZqmNUbv/Ut2flnWrm3OlzQHIPn4ICWFEGVpmuUgy7Kqkqq+N03zfD73lb5W696yf8m6hRBeC0JKeoUgh4iQEkIE8lzWzeHEeMy9DGvtIYcQQtu21nnnnBkGY0zf9c/RjuM4PEdjhr7rte607ppW970ZhiFM03vb8zwLwev6rlTNuDAPo5SqVK21rqRknGvdPczQtC0XQne9McNR+LsqxgVlrKTUOvf9sf9yOi5s+WJdv64qfj9/gv7K/A1oTWrzJQB9+QAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Info Property&quot;
        title=&quot;Info Property&quot;
        src=&quot;/static/fb3b1b094ca9fd1b6d2dfb80b8dafb03/2ece4/info-setting.png&quot;
        srcset=&quot;/static/fb3b1b094ca9fd1b6d2dfb80b8dafb03/5a46d/info-setting.png 300w,
/static/fb3b1b094ca9fd1b6d2dfb80b8dafb03/2ece4/info-setting.png 308w&quot;
        sizes=&quot;(max-width: 308px) 100vw, 308px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;checkbox&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;predictive_search_enabled&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Enable product suggestions&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;info&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;This will also affect the search bar on the search results page.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;default&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;organize-organize-organize&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#organize-organize-organize&quot; aria-label=&quot;organize organize organize permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;ORGANIZE ORGANIZE ORGANIZE&lt;/h2&gt;
&lt;p&gt;Putting these three puzzle pieces together will give more context to and help your clients understand the different settings throughout the theme. The more they understand, the less they&apos;re going to take up your time with content changing questions.&lt;/p&gt;
&lt;h1 id=&quot;stay-tuned-for-more-shopify-tutorials-tips--tricks&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#stay-tuned-for-more-shopify-tutorials-tips--tricks&quot; aria-label=&quot;stay tuned for more shopify tutorials tips  tricks permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Stay tuned for more Shopify Tutorials, Tips &amp;#x26; Tricks!&lt;/h1&gt;
&lt;h2 id=&quot;further-reading&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#further-reading&quot; aria-label=&quot;further reading permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://shopify.dev/themes/architecture/settings/sidebar-settings&quot;&gt;Shopify Docs on Sidebar Settings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://shopify.dev/themes/architecture/settings/input-settings&quot;&gt;Shopify Docs on Input Settings&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[How To Get Freelance Clients In 2021]]></title><description><![CDATA[As of writing, I've been freelancing fulltime for just over 200 days now (Woo 🎉) and I wanted to share with y'all what I've been doing to get new clients in 2021 and how I plan to adjust going into 2022. I'm making no guarantee that these tactics…]]></description><link>https://jackharner.com//blog/how-to-get-freelance-clients-2021/</link><guid isPermaLink="false">https://jackharner.com//blog/how-to-get-freelance-clients-2021/</guid><pubDate>Sun, 12 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;As of writing, I&apos;ve been freelancing fulltime for just over 200 days now (Woo 🎉) and I wanted to share with y&apos;all what I&apos;ve been doing to get new clients in 2021 and how I plan to adjust going into 2022.&lt;/p&gt;
&lt;p&gt;I&apos;m making no guarantee that these tactics will work for you. I&apos;m just relaying what&apos;s worked for me in hopes that you can take something from it, apply it to your own freelance business, and grow as well.&lt;/p&gt;
&lt;h1 id=&quot;learninpublic&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#learninpublic&quot; aria-label=&quot;learninpublic permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;#LearnInPublic&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;Have a &lt;a href=&quot;https://jackharner.com/blog&quot;&gt;blog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Write down the things you do.&lt;/li&gt;
&lt;li&gt;Get people to read how to do the things you do, but decide to hire you to just do it instead.&lt;/li&gt;
&lt;li&gt;...?&lt;/li&gt;
&lt;li&gt;Profit&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Just had this happen for the first time ever and I was so shocked. A BigCommerce Development agency owner was looking to setup &lt;a href=&quot;https://jackharner.com/blog/bigcommerce-stencil-ci-cd-with-github-actions/&quot;&gt;Continuous Integration through GitHub Actions and the Stencil CLI&lt;/a&gt; for his agency. He came across my &lt;a href=&quot;https://jackharner.com/blog/bigcommerce-stencil-ci-cd-with-github-actions/&quot;&gt;blog post&lt;/a&gt; on the topic that I&apos;d written a little over a year ago. From there, he saw I was still freelancing and reached out to see if I&apos;d be interested in doing some BigCommerce work for him. We had a nice long chat about my experience with BigCommerce and other aspects of programming and e-commerce management. He liked the words coming out of my mouth, got a contract signed, and bada-bing bada-boom, I&apos;ve got another client.&lt;/p&gt;
&lt;p&gt;WRITE ABOUT THE TECHNICAL THINGS YOU DO. People might find out about you because they&apos;re trying to solve a problem you already solved, find your post about it, and just hire you to do it instead.&lt;/p&gt;
&lt;p&gt;I will caveat this technique with the fact that it is not an efficient client gathering method AT ALL. I&apos;ve been freelancing full time for 6 months now, and blogging for several years at least and this is the first time it&apos;s ever happened. There are a ton of reasons to have a blog as a freelancer which I&apos;ll go over in a post soon, but the fact that work that I did a year ago (and haven&apos;t thought about since then) is bringing me money today? That makes it all worth it.&lt;/p&gt;
&lt;h1 id=&quot;tweeting---posting&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#tweeting---posting&quot; aria-label=&quot;tweeting   posting permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Tweeting &amp;#x26; 💩 Posting&lt;/h1&gt;
&lt;p&gt;Being active on BlueSky has brought me so many opportunities, and is partially responsible for my ability to do this full time.&lt;/p&gt;
&lt;p&gt;I&apos;m constantly searching around for people wishing something existed. I picked up one of my first steady clients by responding to this tweet:&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;going to develop an online voting tool called “is my rep a dipshit?” to easily identify dipshits and prevent them from accruing political power because this is getting out of hand. anyone interested in helping?&lt;/p&gt;&amp;mdash; collin duddy (@LoboExplosivo) &lt;a href=&quot;https://twitter.com/LoboExplosivo/status/1187057265146318849?ref_src=twsrc%5Etfw&quot;&gt;October 23, 2019&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;Collin had an idea, I said &quot;that wouldn&apos;t be that hard to actually build&quot;, and that&apos;s all it took to get me connected with the people over at IDK Inc. From there I&apos;ve been able to build out my freelance business into what it is today.&lt;/p&gt;
&lt;p&gt;Connecting with other web developers and freelancers has also brought in a significant amount of clients. Several times I&apos;ve had internet friends reach out about work that they got hit up about. They didn&apos;t have the availability to take the work on, but I did. They passed the HOT lead on to me, and I got a client out of it.&lt;/p&gt;
&lt;p&gt;Networking is KEY. Having that pile of friends that do what you do (or even tangentially do what you do), can payout immensely. Whether it&apos;s them bringing you work, or you having someone to pass off (or subcontract) work to, having enough colleagues in your corner means you will never run out of work.&lt;/p&gt;
&lt;h1 id=&quot;be-that-guy-at-parties&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#be-that-guy-at-parties&quot; aria-label=&quot;be that guy at parties permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Be THAT Guy At Parties&lt;/h1&gt;
&lt;p&gt;I&apos;m able to do this full time because I never shut up about the fact that I make websites for a living. 9 out of 10 people usually don&apos;t care, but there&apos;s always that 1 person that needs a website, knows someone that needs a website, or can connect you to the people at their job that you need to convince to get a new website.&lt;/p&gt;
&lt;p&gt;Now I&apos;m not saying kill the vibes by shouting boring technical talk at anybody within listening distance, just find an easy way to work it into the small talk. My goto is to subtly mention the fact that I have clients somehow: &quot;One of my clients recommended this place to me&quot;, &quot;I had a fantastic meeting with a new client today&quot;, etc. That usually sparks the &quot;What do you do?&quot; question, and then I get to brag about myself for a good five minutes.&lt;/p&gt;
&lt;p&gt;The more people that know about what you do as a freelancer, the better the chances are that someone knows someone who needs your work.&lt;/p&gt;
&lt;h1 id=&quot;how-im-prepping-for-2022&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-im-prepping-for-2022&quot; aria-label=&quot;how im prepping for 2022 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How I&apos;m Prepping for 2022&lt;/h1&gt;
&lt;p&gt;In short? More of everything.&lt;/p&gt;
&lt;p&gt;More tweeting. More blog posts. More, more, more.&lt;/p&gt;
&lt;p&gt;At this point things are snowballing for me. Clients are coming in on their own. I&apos;ve done hardly anything that really counts as &quot;client outreach&quot;, and yet I&apos;m able to sustain myself off just the freelancing. (HOW COOL IS THAT?!?) My existing clients keep getting happier with my work, and we&apos;re already planning out new work for the start of the new year.&lt;/p&gt;
&lt;p&gt;A big thing for me, going into 2022, is to grow my &lt;a href=&quot;https://bsky.app/profile/jackharner.com&quot;&gt;BlueSky&lt;/a&gt; &amp;#x26; &lt;a href=&quot;../../newsletter&quot;&gt;Newsletter&lt;/a&gt; audiences (&lt;a href=&quot;https://bsky.app/profile/jackharner.com&quot;&gt;follow&lt;/a&gt; and &lt;a href=&quot;../../newsletter&quot;&gt;subscribe&lt;/a&gt; if you&apos;re not 🙏🏽). Both platforms have the ability to generate massive amounts of upside, and I need to actively dedicate the time &amp;#x26; energy to growing both.&lt;/p&gt;
&lt;p&gt;For now, I&apos;m going to keep this freelance thing going as long as I can, keep working for clients, keep getting new ones dropped in my lap, and keep working on my side projects to develop passive income. The ultimate goal is to stop trading time for money. I may be self-employed, but my income is still tied to how long my butt is in my computer chair. I&apos;m trying to get on that &quot;Make Money While You Sleep&quot; level. I know I can, I just need to put in the time upfront.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Reset WordPress File Permissions]]></title><description><![CDATA[Somehow I continuously run into File Permissions Issues while working with WordPress, so this is primarily just a reference for myself. For whatever reason, things can get pretty hectic, and you've probably ran into a similar issue if you've ever…]]></description><link>https://jackharner.com//blog/reset-wordpress-file-permissions/</link><guid isPermaLink="false">https://jackharner.com//blog/reset-wordpress-file-permissions/</guid><pubDate>Mon, 19 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Somehow I continuously run into File Permissions Issues while working with WordPress, so this is primarily just a reference for myself. For whatever reason, things can get pretty hectic, and you&apos;ve probably ran into a similar issue if you&apos;ve ever seen a &quot;Permission Denied&quot; error, or if WordPress asks you for your FTP Connection Information to update a plugin.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 492px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 112.99999999999999%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAXCAYAAAALHW+jAAAACXBIWXMAAAsTAAALEwEAmpwYAAADY0lEQVR42o1Vy27bVhDloi0Qp0WBAv0II/2ABPAmRYPKNqxmbXhjKx9WBOg/pLC99cKwHpYti9RbtJ4UxfeblE4xQ1FSUzvNAAczunPvuTNzZyjhr49/QpQakCQJnU4H7XabUavVIEki6vUH3N/f4fb2FuVSCaUV6vU6RFFkTec+ffobb399B6FcKsLzfUiNJjrdHnp9eY1mq836a6RWe8CrV79AoNuSxQKqqkLXDRiGAcM0oRsGNE3j31EUIQxD1nEcr3Vmp4Q17O3tQSiXy7x5NBpBURQmJj0cDqFMp5jNFMxmMwwGA8ZkMkl9isJnaD9Jo9FEPp9PI3QcB/1+nw/0ej10u12uiyzLvE42HSZ/q9ViP/myfYvFgtePjo4gVCoV2LbNRJSi73l8AWlvBfLTWhAE8DwXnuuufa7jcITNZjMlpJSXyyXmmg7HdbH8QuEXS7B/G3GyWBMeHh5CKJXL6I1V3FQfUGt0oBgOpprNejw3oeg2ZqaLmeHA9CIYn0F3AjgxUKtLyOePIBSLJahugvZAwWhuYaw5aD1O0R2paMoTdIYK+hMNvfEcuhtBc8J/YW4HMCOgcnePN69fQ7jlGjroyY94HAwhD4YIoxiLVYqEZLFkRHHyH/hh2jb0uDsvXqQ1JLEdhxvc83wufhCGCIIVwhThE/B9n8/f3Nzgh5cvIVxfX/OCruswLYtfNIpixEmCOH4GyQZEmkX4PRFeXFzw7bL8iOFohMl0ijCKeHqSJEGSZHpjR6spIQQrwmKxiJ2dnZSQxLJtTpdANWU4DizL3tjcj+66BMFWynfVCn7+6ccNIaWcNTAhs03TXNuWZcGlXl0u16CIScrlEr779hsI5+fnvEBdz48RBOuB/xqhsUsjrGJ3dxfC5eUlNMuF1GjwvNKHIBv47UieQ0bYkCS8f/9HGiEFTXNML5ZtyA5k9nMXJKvRE0UJBwcHmxoSIUVGn6esLk+RPpeyWK9jf39/04efkzwFmiDbC+AGIU+I7YdwvICnqi5KeJfbh0D/FV+KYFssP4I4VNGaaNBsH42xhrv+FKoT8f/Sb7/nIFxdXTEZtUTWMk+B2sW0bMw0g2FYNlTdxETV4PoBqtUqDqmGx8fHKBQKOD09/V+cnZ2hUEixbX/4UMDJyQlyuRz+AcighaqWAWxOAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;WordPress asking for Connection Information&quot;
        title=&quot;WordPress asking for Connection Information&quot;
        src=&quot;/static/bed1aeac20e55f178ab525719878f31c/5c6e9/connection.png&quot;
        srcset=&quot;/static/bed1aeac20e55f178ab525719878f31c/5a46d/connection.png 300w,
/static/bed1aeac20e55f178ab525719878f31c/5c6e9/connection.png 492w&quot;
        sizes=&quot;(max-width: 492px) 100vw, 492px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Sometimes it&apos;s just best to reset everything back to the way Apache needs it to be to run smoothly: &lt;code class=&quot;language-text&quot;&gt;775&lt;/code&gt; on folders, and &lt;code class=&quot;language-text&quot;&gt;664&lt;/code&gt; on files.&lt;/p&gt;
&lt;p&gt;Run the following 3 terminal commands from the root of your WordPress install (the folder containing your &lt;code class=&quot;language-text&quot;&gt;wp-config.php&lt;/code&gt; file):&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=jack data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=jack data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=jack data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;chown&lt;/span&gt; www-data:www-data &lt;span class=&quot;token parameter variable&quot;&gt;-R&lt;/span&gt; * &lt;span class=&quot;token comment&quot;&gt;# Set Apache&apos;s www-data user as the owner&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-type&lt;/span&gt; d &lt;span class=&quot;token parameter variable&quot;&gt;-exec&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;775&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# Change folder permissions to rwxrwxr-x&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-type&lt;/span&gt; f &lt;span class=&quot;token parameter variable&quot;&gt;-exec&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;664&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# Change file permissions to rw-rw--r--&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I&apos;m sure future me is thanking &quot;now&quot; me for writing this down so I can stop googling it. You&apos;re welcome future me!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Focus On What's Paying You]]></title><description><![CDATA[Now that June is in the books and things have pretty much settled, I'm getting into my new routine and I'm LOVING it. I basically just wake up whenever, take my time enjoying my coffee, and then settle into work when it feels right. Not having to…]]></description><link>https://jackharner.com//blog/freelance-month-2/</link><guid isPermaLink="false">https://jackharner.com//blog/freelance-month-2/</guid><pubDate>Sat, 03 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Now that June is in the books and things have pretty much settled, I&apos;m getting into my new routine and I&apos;m LOVING it.&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;My &lt;a href=&quot;https://twitter.com/hashtag/Freelance?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#Freelance&lt;/a&gt; Morning Routine has evolved into: &lt;br /&gt;&lt;br /&gt;* Wake Up&lt;br /&gt;* Make Coffee&lt;br /&gt;* Admire my plants for an hour&lt;br /&gt;* Get to work&lt;br /&gt;&lt;br /&gt;I love it so much. No more rushing around in the morning before work.&lt;/p&gt;&amp;mdash; Jack Harner 🚀 Freelance Web Dev (@JackHarner) &lt;a href=&quot;https://twitter.com/JackHarner/status/1409582871757479939?ref_src=twsrc%5Etfw&quot;&gt;June 28, 2021&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;I basically just wake up whenever, take my time enjoying my coffee, and then settle into work when it feels right. Not having to rush around in the morning has to be my favorite thing about living the Freelance Life so far.&lt;/p&gt;
&lt;h2 id=&quot;multiple-part-time-jobs&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#multiple-part-time-jobs&quot; aria-label=&quot;multiple part time jobs permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Multiple Part Time Jobs&lt;/h2&gt;
&lt;p&gt;Now that I&apos;m freelancing full time, instead of living Paycheck to Paycheck, I&apos;m living Invoice to Invoice. It&apos;s an interesting difference because instead of 2 &quot;big&quot; paychecks a month, I&apos;m getting a dozen or so small to medium sized payments. Spreading myself out across these multiple part time jobs has allowed me to stay busy even when there&apos;s nothing from one job, because there&apos;s plenty to do from the rest.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Managing all of that sounds complicated, right? It doesn&apos;t have to be. I&apos;m working on writing up an in-depth review of &lt;a href=&quot;https://bonsai.jackharner.com&quot;&gt;Bonsai&lt;/a&gt;, the freelance accounting tool I&apos;ve been using to manage my time tracking and invoices. It&apos;s definitely making payday easier, so stay tuned for that!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Working with multiple clients at once is great because if I&apos;m running into a productivity brick wall on one client, I can get up, take a little walk, and sit down fresh on a different project. Switching it up multiple times a day keeps my mind fresh and it never feels monotonous.&lt;/p&gt;
&lt;h2 id=&quot;on-the-road-to-passive-income&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#on-the-road-to-passive-income&quot; aria-label=&quot;on the road to passive income permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;On The Road to Passive Income&lt;/h2&gt;
&lt;p&gt;Freelancing has provided me with multiple income streams, however they&apos;re not passive income by any means. I&apos;m still technically trading my time for money. Now that the side (nights and weekends) work that I was doing, pre-freelance, has become my main work, the side-side-hustles can become the side job. I&apos;ve made some significant progress on Simple Tweets, and am hammering out the details for a few different e-commerce opportunities.&lt;/p&gt;
&lt;p&gt;{{{vert}}}&lt;/p&gt;
&lt;h2 id=&quot;started-with-electric-eye&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#started-with-electric-eye&quot; aria-label=&quot;started with electric eye permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Started with Electric Eye&lt;/h2&gt;
&lt;p&gt;I started my first project with a new client, &lt;a href=&quot;https://electriceye.io/&quot;&gt;Electric Eye&lt;/a&gt;, this month! Electric Eye is this fully remote Ecommerce Agency specializing in building and optimizing DTC Brands with Shopify.&lt;/p&gt;
&lt;p&gt;They had me do a (paid) take home test to see if I knew my way around a Shopify theme. I knocked it out in less than the allotted time and they said I did &quot;the best out of any of [their] applicants to date&quot;.&lt;/p&gt;
&lt;p&gt;I spent a little time getting onboarded with the team and then got tasked my first project. It was just some simple layout changes to the cart for one of their clients, and building out a &quot;Free Shipping Progress&quot; Bar:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 563px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 24.333333333333332%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAIAAADKYVtkAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAp0lEQVR42pXLPQ6CMBiA4V6aCbD0EpwALwBRgtGBSHdOQKQD5ScClUX782E06WKiic/8vmj9DgCMBQArwEeAyrLM85xSWhTFIct2+/SUJudjmsQxpbRpGsbq+lJXVcUYu1nLsgAACsPQdV1CSEAIDrDneb7vbzB2HGcbRfMsOOdt27VvndX3vdYaPV7uSikppVJy/QcSQozjdZqmYRiEENoYbRljfs9PV7kOwaNiG1AAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Free Shipping Progress Bar&quot;
        title=&quot;Free Shipping Progress Bar&quot;
        src=&quot;/static/d4d667102bf6a28621b8c457806e043a/7cb89/ee-shipping-bar.png&quot;
        srcset=&quot;/static/d4d667102bf6a28621b8c457806e043a/5a46d/ee-shipping-bar.png 300w,
/static/d4d667102bf6a28621b8c457806e043a/7cb89/ee-shipping-bar.png 563w&quot;
        sizes=&quot;(max-width: 563px) 100vw, 563px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I&apos;m super stoked to have the opportunity to work with them and I can&apos;t wait to see what else I get to build!&lt;/p&gt;
&lt;h2 id=&quot;its-paying-the-bills&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#its-paying-the-bills&quot; aria-label=&quot;its paying the bills permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;It&apos;s Paying The Bills!&lt;/h2&gt;
&lt;p&gt;2nd month in a row I was able to get everything paid for with just my Freelance income. I have a few months of savings leftover after the move, but luckily I haven&apos;t needed it!&lt;/p&gt;
&lt;p&gt;Just gotta keep working, keep finding new clients, and spend less than I make. Easy.&lt;/p&gt;
&lt;h2 id=&quot;create-more-consume-less&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#create-more-consume-less&quot; aria-label=&quot;create more consume less permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Create More. Consume Less.&lt;/h2&gt;
&lt;p&gt;I spend hours scrolling through BlueSky, how come I struggle writing tweets? It&apos;s because I&apos;m consuming more than I create. The only way to get better at anything is to JUST DO IT. I need to blog more, I need to tweet more. The more you create, the more you can share, and the more you feed the algorithm, the more it regurgitates your stuff to other people. Feed the beast, but be the bait, not the meal.&lt;/p&gt;
&lt;blockquote&gt;
&lt;h3 id=&quot;creation--consumption&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#creation--consumption&quot; aria-label=&quot;creation  consumption permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Creation &gt; Consumption.&lt;/h3&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;-see-you-next-month&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-see-you-next-month&quot; aria-label=&quot; see you next month permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;👋 See you Next Month&lt;/h3&gt;
&lt;h4 id=&quot;but-in-the-meantime-follow-me-on-bluesky&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#but-in-the-meantime-follow-me-on-bluesky&quot; aria-label=&quot;but in the meantime follow me on bluesky permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;But in the meantime, &lt;a href=&quot;https://www.twitter.com/jackharner&quot;&gt;Follow me on BlueSky&lt;/a&gt;!&lt;/h4&gt;</content:encoded></item><item><title><![CDATA[Quitting, Moving, & Getting Bit By A Dog]]></title><description><![CDATA[It Finally Happened:  The End Of An Era My last official day at my 9-5 was April 30th. After working there for almost 5 years, it was definitely a bittersweet ending. My bosses had known about my exit for the better part of 6 weeks, and that time…]]></description><link>https://jackharner.com//blog/my-first-month-as-a-freelancer/</link><guid isPermaLink="false">https://jackharner.com//blog/my-first-month-as-a-freelancer/</guid><pubDate>Thu, 03 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;it-finally-happened&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#it-finally-happened&quot; aria-label=&quot;it finally happened permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;It Finally Happened:&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1057px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 39.333333333333336%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABRElEQVR42mNgoBBoaWmZmJg4OTk5OjrqGxvpGOpbWFl6BwW4e3sZmZiY21pbWFlZO9pbOtiampqam5vb2NioqalBNUtLS2toaOjo6lqYm0ca2AWpmpgpa+VaeAUa23oZWsVqWNppGcaZOqeauRrrGWhoaqooq8jKyiIsZwRDfgbmazYFDz1rCvj0/2XOXmga1Sfj/D9jQQmf4VmP0hdhHfIMXAwMDEwMjEg6GRmZGJnAmlnPGKdfs8zL4NX54tc+U92vU9bpf3BvnqDBEZus++5VsozcDAwMzIxMjIyMKD5nY2fj4+FV5xDS4hSW5BYw4BBV4RGR4xYy4ZKQ4hbQ5BIx4JEQ4udnYWXBEmwCAgJKysoiEuKCYqJScrKC4qKSstKiEuLiCrKS0lJi0lLSivLqGhoCAvw4Q56RAeohRlQRRmyqAeMgOfAQBFo+AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Freelancing For A Month&quot;
        title=&quot;Freelancing For A Month&quot;
        src=&quot;/static/d8ceb8270b051ec4a7020bee6328119b/4ef40/freelance-countdown.png&quot;
        srcset=&quot;/static/d8ceb8270b051ec4a7020bee6328119b/5a46d/freelance-countdown.png 300w,
/static/d8ceb8270b051ec4a7020bee6328119b/0a47e/freelance-countdown.png 600w,
/static/d8ceb8270b051ec4a7020bee6328119b/4ef40/freelance-countdown.png 1057w&quot;
        sizes=&quot;(max-width: 1057px) 100vw, 1057px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-end-of-an-era&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-end-of-an-era&quot; aria-label=&quot;the end of an era permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The End Of An Era&lt;/h2&gt;
&lt;p&gt;My last official day at my 9-5 was April 30th. After working there for almost 5 years, it was definitely a bittersweet ending.&lt;/p&gt;
&lt;p&gt;My bosses had known about my exit for the better part of 6 weeks, and that time &lt;em&gt;FLEW&lt;/em&gt; by.&lt;/p&gt;
&lt;p&gt;I don&apos;t really know why, but telling them was the most nerve wracking thing I feel like I&apos;ve ever done. Right before telling our GM, I had the closest thing to a panic attack I&apos;ve ever experienced. I was just standing in our office&apos;s kitchen, my heart beating at 150 BPM (Thanks Galaxy Watch for telling me to &quot;Calm Down&quot;) and my whole body shaking.&lt;/p&gt;
&lt;p&gt;I knew I just had to rip the Band-Aid off. The clock was ticking down and it wasn&apos;t going to get easier.&lt;/p&gt;
&lt;h2 id=&quot;im-moving-but&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#im-moving-but&quot; aria-label=&quot;im moving but permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;I&apos;m Moving, But...&lt;/h2&gt;
&lt;p&gt;Obviously, I was way overthinking the whole &quot;telling my boss&quot; situation. Hindsight being what it is, I know I was worked up over how important my work was to that business. There was some significant downsizing at the start of COVID, and a lot of essential day-to-day warehouse tasks fell to me. I was fortunate to still have a job, but boy was it stressful.&lt;/p&gt;
&lt;p&gt;The conversation with my boss went better than I could&apos;ve hoped. I let her know that I was burnt out, both with the job and with New Mexico. I&apos;d been living there for 26-ish years and it was absolutely time for a change. I was ready to dive full time into freelancing and tying that into my move to Denver sounded perfect to me.&lt;/p&gt;
&lt;p&gt;I reasoned that a lot of the work they had actually hired me for didn&apos;t &lt;em&gt;have&lt;/em&gt; to be done in the warehouse. Graphic Design, Web Dev, Software Dev, and Marketing are prime task categories for Remote work. All we had to do was shuffle some of the warehouse tasks to the few people we did bring back, and anything that I couldn&apos;t pawn off that I could do remote I would continue to do. Easy.&lt;/p&gt;
&lt;p&gt;She was onboard with my plan and even offered to discuss it with the owners for me. A HUGE relief because I probably would&apos;ve had the same pre-convo panic attack at least once, if not twice more. Overall she was happy for me, and excited for the next chapter in my life.&lt;/p&gt;
&lt;p&gt;They agreed to let me switch over to being a contractor, and to continue doing what I could from Denver. That was a huge weight of my shoulders knowing I had yet another client to rely on to get my bills paid.&lt;/p&gt;
&lt;p&gt;I spent basically the last month preparing them and the warehouse so that I could update software remotely, debug issues on some of the computers remotely, and making sure I had access to everything I needed from anywhere.&lt;/p&gt;
&lt;p&gt;My last day finally rolled around, and with some weird cosmic timing, someone had broken into the warehouse that morning. 2 Guys literally just walked up, kicked our glass front door in, and ran off with only like $100 worth of shoes and some clothes. Spent the first half of my last day scrubbing through our security cameras to see if they caught anything the cops could use.&lt;/p&gt;
&lt;p&gt;I was only working a half day since I had plenty of moving stuff to deal with, so my boss brought in lunch for everyone. We ate, had a last &quot;mobile happy hour&quot;, I said some tearful goodbyes, and then I left.&lt;/p&gt;
&lt;h2 id=&quot;moving-to-colorado&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#moving-to-colorado&quot; aria-label=&quot;moving to colorado permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Moving To Colorado&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;If there&apos;s one thing I learned about moving from moving to Colorado, it&apos;s this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;h3 style=&quot;text-align: center;&quot;&gt;FIGURE OUT THE NEW HOUSING SITUATION BEFORE YOU TELL YOUR CURRENT PLACE YOU&apos;RE LEAVING&lt;/h3&gt;
&lt;/blockquote&gt;
&lt;p&gt;My roommate and I got approved for the apartment &lt;strong&gt;16 hours&lt;/strong&gt; before I had planned to leave Albuquerque with a truck full of all my stuff. SIXTEEN HOURS!&lt;/p&gt;
&lt;p&gt;Let me tell you, that is not the way to go about moving states. Our housing plans changed about 5 times in the last few months we were planning this whole thing. What was initially going to be a 4 Bed, 3+ Bath house with 4 roommates, rapidly became a 2 bed 2.5 bath apartment between me and my best friend &lt;a href=&quot;https://www.youtube.com/channel/UCivxFHGyZy66hA3DV95rL9w&quot;&gt;Clinton &quot;I&apos;m Not A Chef&quot; Day&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Going from one stressful situation to the next, we got the apartment, had a brief moment of untapped joy, and then the panic that I had too much shit that wasn&apos;t all going to fit set in. Apparently, my dad has played nothing but Tetris since he was a kid because he got way more in the truck than I expected. The too small truck ended up being a blessing, though, because it forced me to leave behind some stuff I was having trouble letting go of.&lt;/p&gt;
&lt;p&gt;Just a quick 6.5 hour drive later, and we made it to the new place.&lt;/p&gt;
&lt;h2 id=&quot;dog-bite&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#dog-bite&quot; aria-label=&quot;dog bite permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;DOG BITE&lt;/h2&gt;
&lt;p&gt;On my 5th full day in Denver, I was bit by a dog and had to get 12 stitches in my nose.&lt;/p&gt;
&lt;p&gt;Some &quot;Welcome to Denver&quot;, right?&lt;/p&gt;
&lt;p&gt;Given what happened, I&apos;m still very fortunate. It was millimeters away from my septum piercing, inches away from my eyes, and could&apos;ve been a whole lot worse.&lt;/p&gt;
&lt;p&gt;It&apos;s already healing up really well. I got the stitches out about a week ago, and the scab has totally fallen off. I&apos;m not too worried about the scar. If anything, it&apos;s a nice segway into a wild ass story to share at parties.&lt;/p&gt;
&lt;p&gt;{{{vert}}}&lt;/p&gt;
&lt;h2 id=&quot;fixing-bugs-in-production-from-my-phone-at-a-brewery&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#fixing-bugs-in-production-from-my-phone-at-a-brewery&quot; aria-label=&quot;fixing bugs in production from my phone at a brewery permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Fixing Bugs In Production From My Phone At A Brewery&lt;/h2&gt;
&lt;p&gt;Colorado has an absolutely insane craft beer scene. As an avid consumer of craft beer, any time my roommate suggests a new spot, I&apos;m pretty much always down to go. The spot this time was called Bruz Beers, a traditional Belgian-style specializing brewery in Midtown.&lt;/p&gt;
&lt;p&gt;I&apos;m still not exactly sure what happened, but I managed to publish the only just-started update to &lt;a href=&quot;https://bottlerocketsauce.com&quot;&gt;Bottle Rocket Hot Sauce&apos;s site&lt;/a&gt;, overwriting V1 on the Live Site.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Completely and totally breaking the site.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 598px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 84.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAAAsTAAALEwEAmpwYAAACuElEQVR42n1U227TQBD1B4BomzppE18Sx7HXju9r5+Jcaie9Aq1U1JcKCQkJ8cQbjzzxS/zgQbOx3bQqPIxm1rs7e2bOGUvh7Ap3918RzDZIV1dIlheIFxdIFjvv8hUG3gLywEd74L1qcn+MjuHjZBhA+nj7GT9//IbFz+BmBVi6Ft5KllDsBJoVQjXGaCkWjlV7Z5qDY32MY91tjJKSSaNwDic7g8NXGIU5vEkBw5+KmNAp4zmOWA7ZW0EeLyG7OeRhtEvUf56UTBoGM1jRQpTM+EqUzZKlsGx9hSEv0PLO0A5LyH6BdlBCHnHIApXXIGsQKqaPaV4inG/AohW6LIPqpNCcDCdmBN1NoZgB2pqNjs7Q1hg6A+oZ9e95MuqnpFgRZsUN8u0tputLQUSUbxHl5whnG4TzrTBvWsKvqnDTEtvrc0zyFO96DtpV6SIhMXM6itAmFo0AJ2Yo2OoMA+HFvhk2bMrVZbk6XyOr9yVKQCUSoyrjUGyO7igSse7uyidPspD32JT77ot11UPVTqCIRAl6VgLFjpsEL2Wxj7JBNajjmhQrhsY4elZcJY0EKkK+f/F/ot5/TDrUHLxVbVEm6epAsXGkkjH0bI6W5uBQZcLThZ6dNKjpG/WYwDQ61I0AgRGLxhveFMY4g8ZSDL0JRv4EQy+DGUxFT+lRag+dpViQV40cIaRY+l58wp9vvzBPCvDNB0yLG7DJJZzlLYLiDtH2HvH6BlaUQ3Mz0V9CSTrtjuIn1msduv4C5eYBLMwR5hfgyxIPj5d4/PIeZ9cl3vQ5jvo+Wiprytz3+1ISJR9qDG+7piCExs2Kc6T5Cj6fQGeh+BnIr1z811oSgT6G5nCYwQyak4JFM9AEHfTY7tdU9aiehjqu188Q1h9qmQg2B141PbtXiYDTap/86Z6kuuLck4z+AjDE8XGAh7RXAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Breaking Bottle Rocket Tweet&quot;
        title=&quot;Breaking Bottle Rocket Tweet&quot;
        src=&quot;/static/dca3643364f506bcd06cd4abf8ba244f/0c69d/breaking-bottle-rocket.png&quot;
        srcset=&quot;/static/dca3643364f506bcd06cd4abf8ba244f/5a46d/breaking-bottle-rocket.png 300w,
/static/dca3643364f506bcd06cd4abf8ba244f/0c69d/breaking-bottle-rocket.png 598w&quot;
        sizes=&quot;(max-width: 598px) 100vw, 598px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;My dilemma was that I was at least 30 minutes away from my computer, and we were already had plans to go get some delicious pizza.&lt;/p&gt;
&lt;h3 id=&quot;the-pizza&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-pizza&quot; aria-label=&quot;the pizza permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Pizza:&lt;/h3&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1200px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAIEBQED/8QAFwEBAQEBAAAAAAAAAAAAAAAAAQACA//aAAwDAQACEAMQAAABq81PDlvGbqYVwYBv/8QAGxAAAgIDAQAAAAAAAAAAAAAAAQIDEgAUIiH/2gAIAQEAAQUC1UzVrjRyWalfQEbmThQ5YGRkb//EABkRAAIDAQAAAAAAAAAAAAAAAAABEBESMf/aAAgBAwEBPwGjKHyP/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAEQERL/2gAIAQIBAT8Btm2KP//EAB4QAAICAgIDAAAAAAAAAAAAAAABAiERMSJRI0Fi/9oACAEBAAY/An5dfJlzWC4srb6Ky32y7OLHGXpjSZ//xAAbEAACAgMBAAAAAAAAAAAAAAABEQAhMUFRcf/aAAgBAQABPyHQKAoOa1k8jq/5GPbyQloGMDQhMD9jXgBOITZgSKuVzHsT/9oADAMBAAIAAwAAABB8D0L/xAAYEQEAAwEAAAAAAAAAAAAAAAABABARIf/aAAgBAwEBPxAEdOt3/8QAGREBAAIDAAAAAAAAAAAAAAAAAAERMUFh/9oACAECAQE/EOynUMFQ/8QAHhABAQACAgIDAAAAAAAAAAAAAREAITFxQVGBkcH/2gAIAQEAAT8QG2Ebah84KnS7B8G2OSrzKD6x0lgzVKbmSTqnRXrJS6KpOcu0AVsOsN5dwilylMuQfzP/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;The Pizza In Question&quot;
        title=&quot;The Pizza In Question&quot;
        src=&quot;/static/c06198a0a4125fe8ff60c205484916df/e5166/pizza.jpg&quot;
        srcset=&quot;/static/c06198a0a4125fe8ff60c205484916df/f93b5/pizza.jpg 300w,
/static/c06198a0a4125fe8ff60c205484916df/b4294/pizza.jpg 600w,
/static/c06198a0a4125fe8ff60c205484916df/e5166/pizza.jpg 1200w,
/static/c06198a0a4125fe8ff60c205484916df/491c4/pizza.jpg 1514w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;em&gt;Don&apos;t ask me what was on it, but it was SO good.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Luckily I had an SSH Client already setup on my phone (Let&apos;s see your iPhone do that) so I was able to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;SSH into one of my web servers&lt;/li&gt;
&lt;li&gt;Clone the Bottle Rocket theme repo to that server from the &lt;code class=&quot;language-text&quot;&gt;main&lt;/code&gt; branch&lt;/li&gt;
&lt;li&gt;Setup Shopify&apos;s ThemeKit&lt;/li&gt;
&lt;li&gt;Re-deployed the V1 version of the theme.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;All of that on this tiny little terminal on Bruz&apos;s patio while the sun set:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 500px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 205.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAApABQDASIAAhEBAxEB/8QAGQAAAwEBAQAAAAAAAAAAAAAAAAEFBAID/8QAFwEBAQEBAAAAAAAAAAAAAAAAAAIBA//aAAwDAQACEAMQAAABlJq+LEHRqLvMaQ83MeXTJgf/xAAcEAABBAMBAAAAAAAAAAAAAAAAAhESIAEQISL/2gAIAQEAAQUCswxHOmOEkkknin//xAAWEQEBAQAAAAAAAAAAAAAAAAAQEgD/2gAIAQMBAT8BJ0v/xAAYEQEAAwEAAAAAAAAAAAAAAAAAARITEP/aAAgBAgEBPwHlFJaNZf/EABoQAAICAwAAAAAAAAAAAAAAAAExABAgMDL/2gAIAQEABj8C1KmIxOxh/8QAHxAAAgIBBAMAAAAAAAAAAAAAAREAEDFBUZHhYaHx/9oACAEBAAE/IWaZ3hybeP45oQWPUT4jDK4MHdQ93GQBMdJtX//aAAwDAQACAAMAAAAQzDfPZ9//xAAXEQADAQAAAAAAAAAAAAAAAAAAEBFx/9oACAEDAQE/EFtaU//EABgRAAMBAQAAAAAAAAAAAAAAAAAQEVFh/9oACAECAQE/EFWqvDgf/8QAHxABAAEEAwADAAAAAAAAAAAAAQARITFhQXGREIHR/9oACAEBAAE/EHE0tqCmFJsey/uflPg9l+kNB7BggRK5zA0e42bDv9IazRpmqDLN9pTgqVRW2pz7jnoQwT//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;JuiceSSH Terminal&quot;
        title=&quot;JuiceSSH Terminal&quot;
        src=&quot;/static/4364cf056b2041b2b999ae1576141cba/41099/juice-ssh-scaled.jpg&quot;
        srcset=&quot;/static/4364cf056b2041b2b999ae1576141cba/f93b5/juice-ssh-scaled.jpg 300w,
/static/4364cf056b2041b2b999ae1576141cba/41099/juice-ssh-scaled.jpg 500w&quot;
        sizes=&quot;(max-width: 500px) 100vw, 500px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;So far, that&apos;s been the most &quot;freelance&quot; thing I&apos;ve experienced, and it just shows that I&apos;m prepared to fix anything at any time. Maybe I am cutout for this whole freelance thing after all!&lt;/p&gt;
&lt;h2 id=&quot;biggest-challenges-so-far&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#biggest-challenges-so-far&quot; aria-label=&quot;biggest challenges so far permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Biggest Challenges So Far&lt;/h2&gt;
&lt;blockquote&gt;
&lt;h3 id=&quot;i-am-my-own-boss-theres-no-one-telling-me-what-to-do-&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#i-am-my-own-boss-theres-no-one-telling-me-what-to-do-&quot; aria-label=&quot;i am my own boss theres no one telling me what to do  permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;I am my own boss, there&apos;s no one telling me what to do!! 😀😀&lt;/h3&gt;
&lt;h3 id=&quot;i-am-my-own-boss-theres-no-one-telling-me-what-to-do--1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#i-am-my-own-boss-theres-no-one-telling-me-what-to-do--1&quot; aria-label=&quot;i am my own boss theres no one telling me what to do  1 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;I am my own boss, there&apos;s no one telling me what to do.. 😱😱&lt;/h3&gt;
&lt;/blockquote&gt;
&lt;p&gt;This one is both a blessing and a curse. When I first moved up here I made it a big deal to delete all of my alarms.&lt;/p&gt;
&lt;p&gt;&quot;I&apos;ll wake up when I WANT to wake up&quot; I told anyone who would listen.&lt;/p&gt;
&lt;p&gt;I still woke up at 7 the next morning.&lt;/p&gt;
&lt;p&gt;After about a month I pretty much get my day started around 8:30. Take my time getting coffee or whatever else for the morning and typically sit down to work around 10. Love that for me.&lt;/p&gt;
&lt;p&gt;However...&lt;/p&gt;
&lt;p&gt;The only thing forcing my ass into the chair is the dwindling of my bank account and the loom of impending homelessness (or worse, moving back to Albuquerque). Which you&apos;d think would be the best motivator, right?&lt;/p&gt;
&lt;p&gt;I&apos;m getting the hang of it, but it&apos;s definitely something to get used to.&lt;/p&gt;
&lt;blockquote&gt;
&lt;h3 id=&quot;my-income-is-now-like-an-arcade-high-score&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#my-income-is-now-like-an-arcade-high-score&quot; aria-label=&quot;my income is now like an arcade high score permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;My Income Is Now Like An Arcade High Score&lt;/h3&gt;
&lt;/blockquote&gt;
&lt;p&gt;Since going fulltime freelance I switched my invoicing and time tracking software over to &lt;a href=&quot;https://bonsai.jackharner.com&quot;&gt;Bonsai&lt;/a&gt;. I wanted something that could handle both time tracking as well as invoicing and payments. I&apos;m going to write up a full review here soon, but so far I love it.&lt;/p&gt;
&lt;p&gt;One thing it does, is it puts both your unbilled hours and the money expected from those unbilled hours right on the dashboard. I&apos;m working with a couple of clients in a &quot;do work. invoice twice a month&quot; capacity, so I&apos;m directly incentivized to get that unbilled hours number as high as possible.&lt;/p&gt;
&lt;p&gt;I can already tell that&apos;s going to turn me into a workaholic.&lt;/p&gt;
&lt;h2 id=&quot;key-takeaways-from-month-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#key-takeaways-from-month-1&quot; aria-label=&quot;key takeaways from month 1 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Key Takeaways from Month 1&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;My nose is not dog proof.&lt;/li&gt;
&lt;li&gt;I am the only one in charge of making sure I get my work.&lt;/li&gt;
&lt;li&gt;BlueSky continues to be my most profitable network, as far as getting clients.&lt;/li&gt;
&lt;li&gt;Prioritize creating content over consuming content.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;h3 id=&quot;i-might-turn-this-into-a-monthly-series-following-my-freelance-career-hit-me-up-on-bluesky-jackharner-if-you-want-to-see-more-like-this&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#i-might-turn-this-into-a-monthly-series-following-my-freelance-career-hit-me-up-on-bluesky-jackharner-if-you-want-to-see-more-like-this&quot; aria-label=&quot;i might turn this into a monthly series following my freelance career hit me up on bluesky jackharner if you want to see more like this permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;I might turn this into a monthly series following my Freelance career. Hit me up on &lt;a href=&quot;https://bsky.app/profile/jackharner.com&quot;&gt;BlueSky @JackHarner&lt;/a&gt; if you want to see more like this!&lt;/h3&gt;
&lt;/blockquote&gt;</content:encoded></item><item><title><![CDATA[Be A T H I C C Developer]]></title><description><![CDATA[Don't be a T-Shaped Developer Be a T H I C C Developer Instead!  What's A T-Shaped Developer? The idea of a T-Shaped Dev has been around since the early 2010s, and it evolved from the concept of an I-Shaped Dev. The Letters Jack, WHAT DO THEY MEAN…]]></description><link>https://jackharner.com//blog/be-a-thicc-developer/</link><guid isPermaLink="false">https://jackharner.com//blog/be-a-thicc-developer/</guid><pubDate>Sat, 10 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h1 id=&quot;dont-be-a-t-shaped-developer&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#dont-be-a-t-shaped-developer&quot; aria-label=&quot;dont be a t shaped developer permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Don&apos;t be a T-Shaped Developer&lt;/h1&gt;
&lt;h1 id=&quot;be-a-thicc-developer-instead&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#be-a-thicc-developer-instead&quot; aria-label=&quot;be a thicc developer instead permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Be a T H I C C Developer Instead!&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://media.giphy.com/media/kcOVt7d7hcUVkADVS1/giphy.gif&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;whats-a-t-shaped-developer&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#whats-a-t-shaped-developer&quot; aria-label=&quot;whats a t shaped developer permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What&apos;s A T-Shaped Developer?&lt;/h2&gt;
&lt;p&gt;The idea of a T-Shaped Dev has been around &lt;a href=&quot;https://en.wikipedia.org/wiki/T-shaped_skills&quot;&gt;since the early 2010s&lt;/a&gt;, and it evolved from the concept of an I-Shaped Dev. The Letters Jack, &lt;strong&gt;WHAT DO THEY MEAN?!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Picture a skill tree where each column is a different specialty in Programming and the rows signify more complex topics the further you go down:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1200px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 82.66666666666667%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAAAsTAAALEwEAmpwYAAACwklEQVR42oVTX0hTYRS/m5q6hZYwNzAykG2XzaktjcmdbURRGIsm+tCjIMEoIcwsE/FF5oNQY7UH3UsIwgYSDKEHl64hKIIPirCB4IMPCtqCtqHmrP3iO7W55VUPXC6/3/c73/nzncNxHAcJx4H9NRcuw6Wz4UN9G55dNUHGSeDk7+N9vR3D6ruQcwV4qmqE50Y73PqHqCkoQ67/v++YYILhmjtwXbejU1EPOSfFm+pbeNvwCK+uCLjIFaDzkh7vjG1wVt/GNU4ufmHu9+Tlc3z85Aff2ED4XocdgdAMHjxuJ8w3NcD3OQDH6xf43zd7oVQqJWAWBPw++oXEjzi+zARRXFyM799iOPp5iGQ8QZmEQ19xdJgCs5tNTcj1Py5ZIiFQWVmJpaUlxONx9Pf3Ezc5OYlkMgmfz0d4YGCAzplOoVAg1z+v5EwUrVaLvr6+rKCoqAhDQ0OQy+VZrqenBxqNRiy7/AwrKiowPT2NjY0NOBwO4jweD/b29jA2Nka4u7sbBwcHCIfDKC8vF88wE6WlpQWpVIpKCoVCKCkpwe7uLra3t7Gzs4PCwkLMz89jf3+femgymcR7mFv2yMgIFhcXYbFYiOvq6sL6+no2Y6vVipWVFYyOjoqVe7KHZrM5T8weyuVyoaqqijDL0ul0QhCE83vI8zw2Nzep7PHxceKWl5epvNXVVcJer5fOt7a2oFarz+5hXV0d9SqdTmNiYoKE0WiULmRlM43f7yfMRkmv15/ew0yU1tZWetmysr97ysaDZaXT6Qizl3W73aQTye7k6vX29mJubg61tbWEbTYbFhYWYLfbCRsMBszOzpLu3NVjY5CxYDBIQx2LxQgnEgnSsHHKmNFoPHv1lEol1tbWSDw4OEjc1NQU4UAgQJhtDbNIJEITcOrqZUiVSoXm5uasoLS0lAZeJpNlOXbOgov18A+0wF45Jr2dcAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Dev Skill Tree&quot;
        title=&quot;Dev Skill Tree&quot;
        src=&quot;/static/5ff4e5a90e705f7afa1636eba241b7e0/c1b63/dev-skill-tree.png&quot;
        srcset=&quot;/static/5ff4e5a90e705f7afa1636eba241b7e0/5a46d/dev-skill-tree.png 300w,
/static/5ff4e5a90e705f7afa1636eba241b7e0/0a47e/dev-skill-tree.png 600w,
/static/5ff4e5a90e705f7afa1636eba241b7e0/c1b63/dev-skill-tree.png 1200w,
/static/5ff4e5a90e705f7afa1636eba241b7e0/7c656/dev-skill-tree.png 1787w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In the early days of the software industry, the preferred type of Dev was the I-Shaped dev, where they have very deep knowledge about a single aspect of software development. Someone who works with Databases and knows everything there is to know about Database Administration, but has never touched a single line of HTML in their life. A &quot;Master of One Trade&quot; type of dev. You had your role and that&apos;s all you did.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1200px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 60%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAADB0lEQVR42j2S3U/TVxyHfxQo0tcfBdJKraGVYl8CVlCBQjUDZDBCUIcNtBUxKC++EF0WY6F2QjpwyUbHULpoVKIMDM5dwwQDuxtrgEq43/3+gF0+pqfGc/Wcz8XJ8/mer2TL0fEw5zg3cx2czTvEz9nVXFRa6VHaBDcpzXyj9/BAPsUXB8xMZnu4keugNc9CXFHFBWUpIeURfsk+wYmcYqQDUjYTl64T8LVgVsk8vjVGtcVO/RE3s9fvYdLIhFTlfKs/jqzII3b5Jn5vE4c1BuZGIhwrsXKm/Bgzw3cxqvRIR50O0uefD7v0Dw4I/uGnH0k8fSL4UiDIX6o2/jNe5quqepH9vZ3k6tCg4PHvY7xYeCW441wnUlZWFo8fPaK3t5eCggJ+X36Dx+Oh3uvl9eISWoPMFZ2L8RIfCoWCXxMJQoEgxcXF/PH2LW6XizOnT/PbwgIGgwFJo9GwsrJCJBLB4XCws7NDW1sbXV1dJJNJyux2xrRVPD/YglFv4M+1d4yGw7jdblKpFI2NjQQCAba2trDZbEh2u13obm5uCsv0mZiYID4dF9x9oYsVdQv/GoN8WXlKZO/X1+nr6xM8OjpKIpEQnBaRJEliZGQEn8+XvhCLxSgqKsJisfAg+p3ImvRWrpirBN+5fQev1yt4amoKnU5HaWmpaJjOPhtubGwQCoUygx4fZ3p6WrD//NefDEOcrTiZMVxb/9wmHA4zNzcnuLW1FUmr1bK6uko0GsXlcrG7u0t7ezt+v5/t7W3Kj5ZzX1vNC1MLB+VC1t6vExkbo6Kigr29PZqbmwkGg5l5l5VlKs/MzIhQlmWWlpaorKyktraWVy9foinQ06tzEi1pIL0Rs7OzdHd3U1hYyPLysvjIhoYG5ufnxZZITqdT6O7v7zM4mNmteDzO82fPBPcFQiTVHfxvukrHpz38kEoxPDwseHJyksXFRcGdnZ0Zw56eHurq6sjPz2doaAiz2YzVamXg2gB56ny8uUY6VFakLEk0qampQa1Wi0dNJpOo2t/fj0ql4iNUbAnD8FazJAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Dev Skill Tree of an I-Shape Dev&quot;
        title=&quot;Dev Skill Tree of an I-Shape Dev&quot;
        src=&quot;/static/e27f5f6857f6b394eaa9a6c9f7dd2ad0/c1b63/skill-tree--i-dev.png&quot;
        srcset=&quot;/static/e27f5f6857f6b394eaa9a6c9f7dd2ad0/5a46d/skill-tree--i-dev.png 300w,
/static/e27f5f6857f6b394eaa9a6c9f7dd2ad0/0a47e/skill-tree--i-dev.png 600w,
/static/e27f5f6857f6b394eaa9a6c9f7dd2ad0/c1b63/skill-tree--i-dev.png 1200w,
/static/e27f5f6857f6b394eaa9a6c9f7dd2ad0/d61c2/skill-tree--i-dev.png 1800w,
/static/e27f5f6857f6b394eaa9a6c9f7dd2ad0/97a96/skill-tree--i-dev.png 2400w,
/static/e27f5f6857f6b394eaa9a6c9f7dd2ad0/0e149/skill-tree--i-dev.png 2466w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;As the software development landscape evolves, the lines are getting blurred between the specialties. This has led to the natural selection of T-Shaped devs over I-Shaped devs. Someone who has dabbled in a little bit of everything but still has deep knowledge in a particular area. Having a little bit of knowledge across the stack will help you make better decisions in your own lane that, while it might not seem like it, ultimately can effect the whole rest of the team. Often referred to as a &quot;Jack of All Trades, Master of One&quot; type of dev.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1200px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 60%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAADDElEQVR42j2P20/bZRjH31I5tL8efj24FroOCi1tCa2C41Q6jOEwGGHoJg3QrkjQAR7INPOitiBVBJkOUoksMRmSmUDCP6DN2IZxF140hI0QT4nx3j/AG83H8DbZe/V5v8+TJ5+vqH3OxKolwnumML0VbnLWC4woXsaVer6ydtFdcZYPTC+yqLbySoWLFUsH7xpDDOiq5e5VfR0Jxc+GrYvzZWcQFRotafW8PFKlVfjSFqWp7Hnay53csnbiKNGRMPi5aW5C1ZQxr7ZwRV+HW2vgti1KqNRGZ3kln1sjcld4S1X+rX6bvHOYcaMfam+SsbSwau2UPGLw8ZPzCn+fnaJPf47/qt/he8dlEsaAnH+oNpOzdUk+nQshBKvOLmK6OsxCsOUeoFFjplVr55uqPhQhmLSGyLq6KBGCLxwv87quFpsoYfvcJeqFgQ7tGe5U9aIKLcJgMpF/fMD8Z58SDDdy9MevXHr1MiPxMQ5/O8HbECBtaGarsg+H1c79nx+T/mSRxqYXePrn73QPXGR8coLCL8fU+X0In8/H6fvx0SOS165Jzi5mWb+9Jnn0tav8oPTxlyPOxXCrzB7e32ciOSH5o1SKO19vSh7o7y9Wnpub40I0evphaWkJu92O2+1mceFjmXWbPUy6miW/f+MGkUhE8srKCiaTiZqaGjKZjMyeGR4cHJBIJIqG2Sxra0XD2DPDBL2hlqLh/gOSyaTkVCrF5mbRsP/U0Gg0ks/nWVhYoKGhgaOjIwYHB4nFYhweHlLvr2fe+BLfOvuoVG3sP3xAJp0mFApxfHxMT08P8XicQqGA1+stVs7lcjJUVZXd3V3C4TDt7e18d+8eBouZpCnIQlUUjUbDxsYGo6Oj2Gw29vb2CAQCRKNRtre3sVgsiGAwKHVPTk6Ynp6WvL6+ztbdu5LfGE9QUIb4x/kmQ82dMnv65Amzs7OSl5eX2dnZkTw8PFw0HBsbo6OjA51Ox8zMDC6XC4/Hw/W3rlOu6IiUOhjSexAaIZu0tbWhKIo86nQ6ZdWpqSn0ej3/AxZz6/Sculc6AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Dev Skill Tree of an T-Shape Dev&quot;
        title=&quot;Dev Skill Tree of an T-Shape Dev&quot;
        src=&quot;/static/a91f23d352b0ba51debf6a158a17954d/c1b63/skill-tree--t-dev.png&quot;
        srcset=&quot;/static/a91f23d352b0ba51debf6a158a17954d/5a46d/skill-tree--t-dev.png 300w,
/static/a91f23d352b0ba51debf6a158a17954d/0a47e/skill-tree--t-dev.png 600w,
/static/a91f23d352b0ba51debf6a158a17954d/c1b63/skill-tree--t-dev.png 1200w,
/static/a91f23d352b0ba51debf6a158a17954d/d61c2/skill-tree--t-dev.png 1800w,
/static/a91f23d352b0ba51debf6a158a17954d/97a96/skill-tree--t-dev.png 2400w,
/static/a91f23d352b0ba51debf6a158a17954d/0e149/skill-tree--t-dev.png 2466w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;{{{vert}}}&lt;/p&gt;
&lt;h2 id=&quot;whats-different-about-being-t-h-i-c-c&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#whats-different-about-being-t-h-i-c-c&quot; aria-label=&quot;whats different about being t h i c c permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What&apos;s Different About Being T H I C C?&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://media.giphy.com/media/PN5d7H16UzSrS/giphy.gif&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;I propose we take the T-Shaped Dev a step or two further and call it a T H I C C Dev. Take your average T-Shaped dev and get them to deep dive into some other areas as well. The stem of your T might not end up as tall but it will be wide and stable. It takes all the benefits of a T-Shaped Dev vs an I-Shaped Dev to the extreme.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1200px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 60%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAADFklEQVR42j2RXUybVRzGj23px/v2420LtLSlpaWlQKSuC4N1tBWBTTaHZVi3QEsACZ9OljjUGBDdTHAojtTFbYmOEGNAifHWdEuUzCsTFicJ9+zaq91rfqaHxHNzfuefJ895nnNExGBnzXmGd+wJzprrKbkyvKlGGVGb+MqVpdcc4F37CT7ROnjF7OczZ4qrtjbOW0JS+4bSSFGNc8edpd1YizC/oGdJa5cmPr3KuquLpLGG0yYvn7u68OgsFK1xFh1JNJ2Rj7RTDCkR6vVWvnSlaaty02Wq45brjNSKaJXGP6F5yt4cI9YmCC+y7GiXqQlflxf97h3i78Ak5yxB/g3N80vtAAVrXGrfcyQpubMQWeScEkQIIVjzZrlsbkQTBjYbXuNFUzUdSh3fBPtRhZ4JZxs3fBl0QrAe6CHvaMItTGyFLxKvcpLS13DPdxZN6BFWu53y499YuX2LqLDya+QKvUo9A2qER6E8DTory+5ONv2vUiNM7NYPcM2ZpNmgsRcbIS3cFOan2D88oDEeQ8RiMSrr8ZM/uKxEwTPL+7YknzpPQ8MCl5QIDz2vcxQYkx/0PDjFz7UXuFLR+t5mQcS4/92m9Djf339ceWFhgUwmUznw8eA4boeG32Dlg2BaznodYSZ8JyXP+Ts4pdZJvjn0FjaDiYbGCMtLS3L2f8K9vT2Ko6OSb258wQ3jCYhfJ6dGeOgb5Flogh5LgOexeX5SexibmpTaD5eWuPv1Xcn9lYQ2m41yuczKygqtra083X/CxfwlBoSHR44LRITCsuklNq1ZPMLIrqOPayJKov0kB38+pa+3j0KxyP7+PtFo9LhyqVSiUCigaRo7OzskEglSL2f4/ocdrC6NmavzrN1eR2c2cuf+PYbHRnFXV7P74y7Nzc2k02m2trZwOp2IlpYWGffw8JCZmRnJGxsbPPj2geTxsXGeHR1JHszl5H7w1wFzc3OSV1dX2d7elpzL5Y4TDg8Pk0qlsFgszM7O4vf7CYfDTE9PYzQa6e7uJp/Py0evNOns7ERVVWnq9Xpl1cnJSRRF4T9za9HadxbOxAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Dev Skill Tree of an T-Shape Dev&quot;
        title=&quot;Dev Skill Tree of an T-Shape Dev&quot;
        src=&quot;/static/0af2715d6c6c02c1b395dc326900d33c/c1b63/skill-tree--thicc-dev.png&quot;
        srcset=&quot;/static/0af2715d6c6c02c1b395dc326900d33c/5a46d/skill-tree--thicc-dev.png 300w,
/static/0af2715d6c6c02c1b395dc326900d33c/0a47e/skill-tree--thicc-dev.png 600w,
/static/0af2715d6c6c02c1b395dc326900d33c/c1b63/skill-tree--thicc-dev.png 1200w,
/static/0af2715d6c6c02c1b395dc326900d33c/d61c2/skill-tree--thicc-dev.png 1800w,
/static/0af2715d6c6c02c1b395dc326900d33c/97a96/skill-tree--thicc-dev.png 2400w,
/static/0af2715d6c6c02c1b395dc326900d33c/0e149/skill-tree--thicc-dev.png 2466w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The more you know across the stack puts you in a much better position to be flexible throughout the organization, and from my experience, those types of people are VALUABLE. Be a &quot;Jack of All Trades, Master of Some&quot; type dev. The earliest reference I can find to that phrase comes from one of my favorite designers/entrepreneurs, &lt;a href=&quot;https://vanschneider.com/blog/a-jack-of-all-trades/&quot;&gt;Tobias van Schneider&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you&apos;re the go-to guy in your company for one thing, that does come with it a certain level of job security, but if you&apos;re the go-to guy for three &lt;em&gt;or more&lt;/em&gt; things, you&apos;re not going to get fired. If they would have to hire more than 1 person to replace you, that gives you a TON of leverage. Nobody&apos;s invincible, obviously, but you can get away with a lot more than your average employee. &lt;strong&gt;Be Irreplaceable.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;but-jack-how-do-i-get-t-h-i-c-c&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#but-jack-how-do-i-get-t-h-i-c-c&quot; aria-label=&quot;but jack how do i get t h i c c permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;But Jack, How Do I Get T H I C C?&lt;/h2&gt;
&lt;p&gt;The absolute KEY to getting nice and T H I C C as a developer is the ability to absorb information quickly. If you can get to a place where you can take something in once, drop that info into your Mental Rolodex, and flip back to it in a couple weeks when you need it again, you&apos;ll be set.&lt;/p&gt;
&lt;p&gt;Now, I&apos;m not saying you have to memorize everything you come across. Far from it, actually. All you have to remember is how to find that information again. Maybe that&apos;s with a Second Brain tool like Roam Research, or a massive folder of Bookmarks you search through, how you store the data doesn&apos;t matter.&lt;/p&gt;
&lt;p&gt;Think of your Mental Rolodex like a cookbook. You want to make a cake but you don&apos;t remember exactly how. You look through a cookbook, usually alphabetically (or at least with a table of contents), and find the recipe for a cake. You still have to go make the cake, but now you have step by step instructions to get there. Plus, it took you almost no time to find that info because you already knew it was in the cookbook.&lt;/p&gt;
&lt;p&gt;If you can find it again quickly, you don&apos;t need to remember it. You just need to remember that you &lt;em&gt;can&lt;/em&gt; do something, not &lt;em&gt;how&lt;/em&gt; to do something. The stuff you use all the time, you won&apos;t need to look up as much, and with a system in place to quickly find the rest, you&apos;ll go far.&lt;/p&gt;
&lt;p&gt;Outside of that all you have to do is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Find something that piques your curiosity.&lt;/li&gt;
&lt;li&gt;Google it.&lt;/li&gt;
&lt;li&gt;Retain the relevant info.&lt;/li&gt;
&lt;li&gt;Leave a breadcrumb trail to the rest.&lt;/li&gt;
&lt;li&gt;Repeat. Forever.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;the-moral-of-the-story-is&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-moral-of-the-story-is&quot; aria-label=&quot;the moral of the story is permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Moral Of The Story Is:&lt;/h2&gt;
&lt;h1 id=&quot;never-stop-learning&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#never-stop-learning&quot; aria-label=&quot;never stop learning permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Never Stop Learning&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://media.giphy.com/media/xUe3hdl4MY59NcMyjy/giphy.gif&quot; alt=&quot;&quot;&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Destructuring and Nested Destructuring in ES6]]></title><description><![CDATA[Have you ever had a JavaScript object that you needed to extract a bunch of different values out of? Today I'd like to introduce you to your new best friend: ES6 Destructuring. ES6 brings with it a bunch of nifty new ways to do things with JavaScript…]]></description><link>https://jackharner.com//blog/destructuring-and-nested-destructuring-in-es6/</link><guid isPermaLink="false">https://jackharner.com//blog/destructuring-and-nested-destructuring-in-es6/</guid><pubDate>Sun, 18 Oct 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Have you ever had a JavaScript object that you needed to extract a bunch of different values out of? Today I&apos;d like to introduce you to your new best friend: ES6 Destructuring.&lt;/p&gt;
&lt;p&gt;ES6 brings with it a bunch of nifty new ways to do things with JavaScript. One of the things I use ALL THE TIME is Destructuring. It allows you to pick and choose properties out of an object and automatically assign them to a variable.&lt;/p&gt;
&lt;p&gt;Take the following JavaScript Object for example:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; person &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Bob&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;married&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Previously, if you needed to use and manipulate the different properties of that object you would have to assign each variable manually:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; person &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Bob&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;married&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; person&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  age &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; person&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;age&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  married &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; person&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;married

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;married&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// false&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now let&apos;s do that again with ES6. You&apos;ll find it&apos;s a whole lot cleaner.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; person &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Bob&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;married&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; age&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; married &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; person

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;age&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 26&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;not-just-objects-either&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#not-just-objects-either&quot; aria-label=&quot;not just objects either permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Not Just Objects Either!&lt;/h2&gt;
&lt;p&gt;Destructuring is not just for Objects, you can even use it on an Array!&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; people &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Jon&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Bon&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Jovi&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;first&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; second&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; third&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; people

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;second&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// &quot;Bon&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It assigns the items in your array, in order, to the corresponding variable in the destructuring array.&lt;/p&gt;
&lt;p&gt;If, for whatever reason, you need to skip the first two items in the array you can do so with just a comma:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; people &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Jon&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Bon&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Jovi&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; only&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; people
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;only&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// &quot;Jovi&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;{{{vert}}}&lt;/p&gt;
&lt;h2 id=&quot;nested-destructuring&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#nested-destructuring&quot; aria-label=&quot;nested destructuring permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Nested Destructuring&lt;/h2&gt;
&lt;p&gt;In the real world, you&apos;re probably going to have more complex objects than just that, so let&apos;s take a look at a more complex object example.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; person &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Robert&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;married&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;spouse&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Roberta&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;62&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;anniversary&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;01-01-1970&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;kids&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Given this more in depth Object, how would you go about getting &lt;em&gt;just&lt;/em&gt; Robert&apos;s spouse&apos;s name? Any Ideas? With a little magical thing called &quot;Nested Destructuring&quot;.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;married&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;spouse&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; name &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; person

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// &quot;Roberta&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;With Nested Destructuring, you can cherry pick properties to get from as many levels down in your object as you need. Obviously this can get pretty messy pretty quickly so feel free to destructure more than once if order to keep your code clean.&lt;/p&gt;
&lt;p&gt;Keep in mind, when you destructure down into a property, like the example above, it does not set the variable of the property you went down in to. So in this case both &lt;code class=&quot;language-text&quot;&gt;spouse&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;married&lt;/code&gt; are undefined.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight has-highlighted-lines&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;married&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;gatsby-highlight-code-line&quot;&gt;    &lt;span class=&quot;token literal-property property&quot;&gt;spouse&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; name &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; person

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;spouse&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// undefined&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you need &lt;code class=&quot;language-text&quot;&gt;spouse&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;name&lt;/code&gt; as separate variables you will have to destructure more than once:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;married&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; spouse &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; person
&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; name &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; spouse

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;spouse&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// {name: &quot;Roberta&quot;, age: 62}&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// &quot;Roberta&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;what-if-i-need-to-destructure-to-a-different-variable-name&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-if-i-need-to-destructure-to-a-different-variable-name&quot; aria-label=&quot;what if i need to destructure to a different variable name permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What If I Need To Destructure To A Different Variable Name?&lt;/h2&gt;
&lt;p&gt;Sometimes in the real world, data comes in with weird property names, or you need to extract different nested properties that happen to have the same name. Don&apos;t worry though, ES6 has you covered.&lt;/p&gt;
&lt;p&gt;Let&apos;s keep using our more complex person Object and extract BOTH his and his wife&apos;s name at the same time.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; person &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Robert&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;married&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;spouse&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Roberta&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;62&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;anniversary&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;01-01-1970&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;kids&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Based on what we&apos;ve gone over so far, your first thought might be to do something like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;married&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;spouse&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; name &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; person&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;However if you were to try this you&apos;d be met with a nice fat &quot;Duplicate Assignment&quot; error because you&apos;re trying to set the &lt;code class=&quot;language-text&quot;&gt;name&lt;/code&gt; variable twice. Babel or whatever ES6 Compiler you&apos;re using won&apos;t like that at all, so you need to define custom variable names.&lt;/p&gt;
&lt;p&gt;Check it out:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; hisName&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;married&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;spouse&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; herName &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; person

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hisName &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; Is Married To &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; herName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; 
&lt;span class=&quot;token comment&quot;&gt;// Robert Is Married To Roberta&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;All you&apos;re doing is saying &quot;Take this property and extract as this specific variable&quot;. Which when compiled to regular JavaScript for your browser it looks like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; hisName &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; person&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; herName &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; person&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;married&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;spouse&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;keep-it-clean-and-keep-it-simple&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#keep-it-clean-and-keep-it-simple&quot; aria-label=&quot;keep it clean and keep it simple permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Keep It Clean, and Keep It Simple&lt;/h2&gt;
&lt;p&gt;Using Destructuring allows you to cleanly and simply extract properties from objects in ES6 JavaScript into variables to be manipulated and modified. Keep It Simple Stupid and hit me up on BlueSky &lt;a href=&quot;https://bsky.app/profile/jackharner.com&quot;&gt;@JackHarner&lt;/a&gt; if you learned something!&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;spanfeatured-image-by-a-hrefhttpsunsplashcomripatoutm_sourceunsplashamputm_mediumreferralamputm_contentcreditcopytextricardo-gomez-angela-on-a-hrefhttpsunsplashcomsphotosstructureutm_sourceunsplashamputm_mediumreferralamputm_contentcreditcopytextunsplashaspan&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#spanfeatured-image-by-a-hrefhttpsunsplashcomripatoutm_sourceunsplashamputm_mediumreferralamputm_contentcreditcopytextricardo-gomez-angela-on-a-hrefhttpsunsplashcomsphotosstructureutm_sourceunsplashamputm_mediumreferralamputm_contentcreditcopytextunsplashaspan&quot; aria-label=&quot;spanfeatured image by a hrefhttpsunsplashcomripatoutm_sourceunsplashamputm_mediumreferralamputm_contentcreditcopytextricardo gomez angela on a hrefhttpsunsplashcomsphotosstructureutm_sourceunsplashamputm_mediumreferralamputm_contentcreditcopytextunsplashaspan permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;span&gt;Featured Image by &lt;a href=&quot;https://unsplash.com/@ripato?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;Ricardo Gomez Angel&lt;/a&gt; on &lt;a href=&quot;https://unsplash.com/s/photos/structure?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;Unsplash&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;</content:encoded></item><item><title><![CDATA[Display ConvertKit Subscriber Count On Your Gatsby Site]]></title><description><![CDATA[Do you want to include the Subscriber Count from your ConvertKit Newsletter on your Gatsby.js Site? If that oddly specific scenario applies to you then read on, and I'll show you just how to do it. If not, consider checking out ConvertKit anyway…]]></description><link>https://jackharner.com//blog/convertkit-subscriber-count-on-gatsby-site/</link><guid isPermaLink="false">https://jackharner.com//blog/convertkit-subscriber-count-on-gatsby-site/</guid><pubDate>Sun, 18 Oct 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h1 id=&quot;do-you-want-to-include-the-subscriber-count-from-your-convertkit-newsletter-on-your-gatsbyjs-site&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#do-you-want-to-include-the-subscriber-count-from-your-convertkit-newsletter-on-your-gatsbyjs-site&quot; aria-label=&quot;do you want to include the subscriber count from your convertkit newsletter on your gatsbyjs site permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Do you want to include the Subscriber Count from your &lt;a href=&quot;https://convertkit.com?lmref=HnoQfg&quot;&gt;ConvertKit&lt;/a&gt; Newsletter on your Gatsby.js Site?&lt;/h1&gt;
&lt;p&gt;If that oddly specific scenario applies to you then read on, and I&apos;ll show you just how to do it.&lt;/p&gt;
&lt;p&gt;If not, consider checking out &lt;a href=&quot;https://convertkit.com?lmref=HnoQfg&quot;&gt;ConvertKit&lt;/a&gt; anyway. They make it super simple to spin up your own Newsletter and start building out a mailing list today!&lt;/p&gt;
&lt;p&gt;Displaying your subscriber count will allow you to take advantage of a psychological phenomenon called &quot;Social Proof&quot;. Social Proof is the idea that if something is perceived as &quot;popular&quot;, then that thing is worth paying attention to or checking out. By letting prospective sign ups know that you&apos;ve got the attention of a bunch of other people, they&apos;re more likely to also sign up.&lt;/p&gt;
&lt;p&gt;It&apos;s why things like those &quot;John Smith in Bumfuck, Nowhere just Purchased our Product&quot; popups, and &quot;15 Other People are Looking at this item right now&quot; messages are so popular and prevalent among e-commerce stores. They create a sense of urgency and stokes that &quot;I want to be one of the cool kids&quot; feeling we all seem to have.&lt;/p&gt;
&lt;p&gt;I&apos;ll leave the psychology to the psychologists, let&apos;s dive in.&lt;/p&gt;
&lt;h2 id=&quot;get-api-keys-from-convertkit&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#get-api-keys-from-convertkit&quot; aria-label=&quot;get api keys from convertkit permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Get API Keys from &lt;a href=&quot;https://convertkit.com?lmref=HnoQfg&quot;&gt;ConvertKit&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The first thing you need to do is get your account&apos;s API keys from &lt;a href=&quot;https://convertkit.com?lmref=HnoQfg&quot;&gt;ConvertKit&lt;/a&gt;. They&apos;re located under &lt;code class=&quot;language-text&quot;&gt;Account Settings &gt; General&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1200px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 47%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA8UlEQVR42nWQ227EIAxE9/9/tGkCm4DvTsAV2SqNttrRiAfEsYd5sFgFFrGI7r6XWpklInofvut1c7m1/tgqpmepKMhqvotoa62fXL+pnbrPGvBzg+8lz2kFUlUjQjeLCPfd1K9FvbX+H14LTnPeKpK4qG0VWDUi1HdRi88acEUpwCM2qcwLfU06L1FK1DrOu1O61zBgZCNxFMdKsiREZEQTOcz6cbwcxzHermvckg8YSJHtF05Z96P1fpyd/bX1KrCUDzDbiL0knCZNyXK2dDpnTWkMTbnn/P7nCyZxZoVSCUZyBGBEAiQAAoSK7v4G/wAtMw24Zj3YkgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;ConvertKit Keys Location&quot;
        title=&quot;ConvertKit Keys Location&quot;
        src=&quot;/static/8f8ad566916ef9f0f9cb6ceb73f410ea/c1b63/ConvertKit-Keys.png&quot;
        srcset=&quot;/static/8f8ad566916ef9f0f9cb6ceb73f410ea/5a46d/ConvertKit-Keys.png 300w,
/static/8f8ad566916ef9f0f9cb6ceb73f410ea/0a47e/ConvertKit-Keys.png 600w,
/static/8f8ad566916ef9f0f9cb6ceb73f410ea/c1b63/ConvertKit-Keys.png 1200w,
/static/8f8ad566916ef9f0f9cb6ceb73f410ea/add4c/ConvertKit-Keys.png 1452w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;To store your keys securely and away from prying eyes, we&apos;re going to take advantage of Environment Variables. If you don&apos;t already use them, create a &lt;code class=&quot;language-text&quot;&gt;.env&lt;/code&gt; file in the root of your Gatsby project, and paste this block of code in there:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;CONVERTKIT_KEY=xxxxxxxxxxxxxx
CONVERTKIT_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxx&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Replace the &lt;code class=&quot;language-text&quot;&gt;xxxx&lt;/code&gt;&apos;s with your corresponding API Key and API Secret.&lt;/p&gt;
&lt;h2 id=&quot;security&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#security&quot; aria-label=&quot;security permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Security&lt;/h2&gt;
&lt;p&gt;Make sure to include &lt;code class=&quot;language-text&quot;&gt;.env&lt;/code&gt; in your &lt;code class=&quot;language-text&quot;&gt;.gitignore&lt;/code&gt; file so you don&apos;t check in your keys to your Git Repo. If someone were to get access to your API keys it would be the same as them having your username and password. They can control any part of your account and send a bunch of spam emails to your list. If you&apos;re using some sort of Continuous Deployment (CD) setup, you&apos;ll also need to include your Keys as Environment Variables according to your specific CD tool.&lt;/p&gt;
&lt;p&gt;{{{vert}}}&lt;/p&gt;
&lt;h2 id=&quot;make-the-call&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#make-the-call&quot; aria-label=&quot;make the call permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Make The Call&lt;/h2&gt;
&lt;p&gt;In accordance with the bit above about security, we don&apos;t want to expose our API Keys to the public. The beauty of Gatsby and other Static Site Generators is that you can do things at build time instead of at run time or &quot;in the browser&quot;. This keeps the Keys locked away behind your CD tools &quot;Secrets&quot; and away from the snooping eyes of the public.&lt;/p&gt;
&lt;p&gt;For this purpose we&apos;re going to take advantage of the &lt;code class=&quot;language-text&quot;&gt;gatsby-node.js&lt;/code&gt; file in the root of our site. If you are unfamiliar with how Gatsby Builds, a part of the process includes running the &lt;code class=&quot;language-text&quot;&gt;gatsby-node.js&lt;/code&gt; file once. You can use this to create pages dynamically, add/modify nodes on your GraphQL tree, and more. This is where we&apos;re going to hit the &lt;a href=&quot;https://convertkit.com?lmref=HnoQfg&quot;&gt;ConvertKit&lt;/a&gt; API.&lt;/p&gt;
&lt;p&gt;First things first, you&apos;ll need to install &lt;code class=&quot;language-text&quot;&gt;node-fetch&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=jack data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; node-fetch&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then require it at the top of &lt;code class=&quot;language-text&quot;&gt;gatsby-node.js&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; fetch &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;node-fetch&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;After everything else in that file (if there is anything) create a new asynchronous function called &lt;code class=&quot;language-text&quot;&gt;getSubscriberCount&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getSubscriberCount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;ck_secret&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ck_key&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Where the magic happens...&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;now-this-is-where-the-fun-begins&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#now-this-is-where-the-fun-begins&quot; aria-label=&quot;now this is where the fun begins permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Now This Is Where The Fun Begins&lt;/h2&gt;
&lt;p&gt;Here&apos;s the meat of the &lt;code class=&quot;language-text&quot;&gt;getSubscriberCount&lt;/code&gt; function. We&apos;re using &lt;code class=&quot;language-text&quot;&gt;node-fetch&lt;/code&gt; to &quot;fetch&quot; the subscriber count from the &lt;a href=&quot;https://convertkit.com?lmref=HnoQfg&quot;&gt;ConvertKit&lt;/a&gt; API. We include the &lt;a href=&quot;https://convertkit.com?lmref=HnoQfg&quot;&gt;ConvertKit&lt;/a&gt; keys as Parameters to the function and then pass them as URL Parameters to the &lt;code class=&quot;language-text&quot;&gt;/subscribers&lt;/code&gt; endpoint.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getSubscriberCount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;ck_secret&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ck_key&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;https://api.convertkit.com/v3/subscribers?api_key=&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;
      ck_key &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;&amp;amp;api_secret=&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;
      ck_secret
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;response&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;convertkitRes&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; data &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;total_subscribers
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Once we get a response from ConvertKit, we convert that response to a useable JSON Object, write the value to the Log for debugging purposes and then return the specific data we needed.&lt;/p&gt;
&lt;p&gt;Now anytime you call the &lt;code class=&quot;language-text&quot;&gt;getSubscriberCount()&lt;/code&gt; function it will return your current subscriber count. You can then call this around your &lt;code class=&quot;language-text&quot;&gt;gatsby-node.js&lt;/code&gt; file as needed.&lt;/p&gt;
&lt;h2 id=&quot;pass-the-subscriber-count-to-your-pages&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#pass-the-subscriber-count-to-your-pages&quot; aria-label=&quot;pass the subscriber count to your pages permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Pass The Subscriber Count To Your Pages&lt;/h2&gt;
&lt;p&gt;When you generate pages in &lt;code class=&quot;language-text&quot;&gt;gatsby-node.js&lt;/code&gt; you&apos;re able to pass data down to the page template in the form of Page Context. First we pull in our &lt;a href=&quot;https://convertkit.com?lmref=HnoQfg&quot;&gt;ConvertKit&lt;/a&gt; Keys with &lt;code class=&quot;language-text&quot;&gt;dotenv&lt;/code&gt; and pass them into our fancy new &lt;code class=&quot;language-text&quot;&gt;getSubscriberCount()&lt;/code&gt; function.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;CONVERTKIT_SECRET&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;CONVERTKIT_KEY&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; subscriberCount &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getSubscriberCount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;token constant&quot;&gt;CONVERTKIT_SECRET&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token constant&quot;&gt;CONVERTKIT_KEY&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then, when you call Gatsby&apos;s &lt;code class=&quot;language-text&quot;&gt;createPage&lt;/code&gt; to actually generate your pages you just pass in your subscriber count through the &lt;code class=&quot;language-text&quot;&gt;context&lt;/code&gt; object:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight has-highlighted-lines&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;createPage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/newsletter/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;component&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;src/templates/newsletter.js&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;gatsby-highlight-code-line&quot;&gt;        &lt;span class=&quot;token literal-property property&quot;&gt;subscriberCount&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; subscriberCount&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;using-page-context-to-display-your-subscriber-count&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#using-page-context-to-display-your-subscriber-count&quot; aria-label=&quot;using page context to display your subscriber count permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Using Page Context to Display Your Subscriber Count&lt;/h2&gt;
&lt;p&gt;Now that our Newsletter page gets generated with access to our Subscriber count let&apos;s modify the page template to include it. In my case the template file is &lt;code class=&quot;language-text&quot;&gt;src/templates/newsletter.js&lt;/code&gt; but pick whichever page your trying to modify.&lt;/p&gt;
&lt;p&gt;Page templates in Gatsby are just React Components that receive some data through Props and output JSX to be compiled to HTML at build time.&lt;/p&gt;
&lt;p&gt;Check out this example Functional Component:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; React &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;react&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;Newsletter&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; pageContext &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; subscriberCount &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pageContext

    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;subscriberCount&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; Newsletter&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;All this is doing is destructuring the &lt;code class=&quot;language-text&quot;&gt;pageContext&lt;/code&gt; variable out of the Props, and then further destructuring &lt;code class=&quot;language-text&quot;&gt;pageContext&lt;/code&gt; to get the &lt;code class=&quot;language-text&quot;&gt;subscriberCount&lt;/code&gt; variable we passed in earlier.&lt;/p&gt;
&lt;p&gt;You can further simplify this with a process called &lt;a href=&quot;/blog/destructuring-and-nested-destructuring-in-es6/&quot;&gt;nested destructuring&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight has-highlighted-lines&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; React &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;react&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;Newsletter&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; 
&lt;span class=&quot;gatsby-highlight-code-line&quot;&gt;    &lt;span class=&quot;token literal-property property&quot;&gt;pageContext&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; subscriberCount &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;subscriberCount&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; Newsletter&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In this case the &lt;code class=&quot;language-text&quot;&gt;pageContext&lt;/code&gt; variable is never assigned since all we need from it is the &lt;code class=&quot;language-text&quot;&gt;subscriberCount&lt;/code&gt;. Keep in mind that if you use nested destructuring to extract a variable out of an object the original variable is never assigned. If you need more than one thing out of the &lt;code class=&quot;language-text&quot;&gt;pageContext&lt;/code&gt; variable you need to destructure both variables at the same time:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight has-highlighted-lines&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;Newsletter&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  data&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;gatsby-highlight-code-line&quot;&gt;  &lt;span class=&quot;token literal-property property&quot;&gt;pageContext&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; recentEmails&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; subscriberCount &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;show-off&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#show-off&quot; aria-label=&quot;show off permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Show OFF!&lt;/h2&gt;
&lt;p&gt;Now that we have our &lt;code class=&quot;language-text&quot;&gt;subscriberCount&lt;/code&gt; assigned to a variable in our page template, all that&apos;s left to do is put it somewhere in our JSX. You can either output it directly in the template:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight has-highlighted-lines&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;Newsletter&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; pageContext &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; subscriberCount &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pageContext

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
&lt;span class=&quot;gatsby-highlight-code-line&quot;&gt;        &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;h2&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;Join &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;subscriberCount&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; Other Subscribers &lt;span class=&quot;token constant&quot;&gt;TODAY&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;h2&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;or pass it down as a Prop into a different Component:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight has-highlighted-lines&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;Newsletter&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; pageContext &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; subscriberCount &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pageContext

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
&lt;span class=&quot;gatsby-highlight-code-line&quot;&gt;        &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Counter count&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;subscriberCount&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;thats-all-folks&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#thats-all-folks&quot; aria-label=&quot;thats all folks permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;That&apos;s All Folks&lt;/h2&gt;
&lt;p&gt;Now you&apos;re able to access your &lt;a href=&quot;https://convertkit.com?lmref=HnoQfg&quot;&gt;ConvertKit&lt;/a&gt; Subscriber count from anywhere on your Gatsby site, safely and securely!&lt;/p&gt;
&lt;p&gt;The one downside to this method is that your published subscriber count will only update when you build the site, but maybe you can use that as motivation to post more content.&lt;/p&gt;
&lt;h2 id=&quot;take-it-even-further&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#take-it-even-further&quot; aria-label=&quot;take it even further permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Take It Even Further&lt;/h2&gt;
&lt;p&gt;Some suggestions for taking this tutorial further:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An alternative option to explore if you need that number &lt;em&gt;all over&lt;/em&gt; would be adding it as a node on your GraphQL tree instead of using Page Context. Then you could request it in any GraphQl Query you make.&lt;/li&gt;
&lt;li&gt;Automate your CI/CD process to either rebuild the site daily or listen for a ConverKit Webhook to rebuild the site on every new subscriber.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;let-me-know-on-bluesky-jackharner-if-you-have-any-questions-or-implemented-any-part-of-this-yourself-id-love-to-see-it&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#let-me-know-on-bluesky-jackharner-if-you-have-any-questions-or-implemented-any-part-of-this-yourself-id-love-to-see-it&quot; aria-label=&quot;let me know on bluesky jackharner if you have any questions or implemented any part of this yourself id love to see it permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Let me know on BlueSky &lt;a href=&quot;https://bsky.app/profile/jackharner.com&quot;&gt;@JackHarner&lt;/a&gt; if you have any questions or implemented any part of this yourself! I&apos;d love to see it!&lt;/h2&gt;
&lt;h4 id=&quot;featured-image-by-a-hrefhttpsunsplashcomnhillierutm_sourceunsplashamputm_mediumreferralamputm_contentcreditcopytextnick-hilliera-on-a-hrefhttpsunsplashcomsphotosnumberutm_sourceunsplashamputm_mediumreferralamputm_contentcreditcopytextunsplasha&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#featured-image-by-a-hrefhttpsunsplashcomnhillierutm_sourceunsplashamputm_mediumreferralamputm_contentcreditcopytextnick-hilliera-on-a-hrefhttpsunsplashcomsphotosnumberutm_sourceunsplashamputm_mediumreferralamputm_contentcreditcopytextunsplasha&quot; aria-label=&quot;featured image by a hrefhttpsunsplashcomnhillierutm_sourceunsplashamputm_mediumreferralamputm_contentcreditcopytextnick hilliera on a hrefhttpsunsplashcomsphotosnumberutm_sourceunsplashamputm_mediumreferralamputm_contentcreditcopytextunsplasha permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Featured Image by &lt;a href=&quot;https://unsplash.com/@nhillier?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;Nick Hillier&lt;/a&gt; on &lt;a href=&quot;https://unsplash.com/s/photos/number?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;Unsplash&lt;/a&gt;&lt;/h4&gt;</content:encoded></item><item><title><![CDATA[Generate Documentation From Markdown AUTOMATICALLY]]></title><description><![CDATA[MkDocs is a "fast, simple and downright gorgeous" static site generator for turning a collection of Markdown files into a documentation site. Today, I'm going to walk you through how to get MkDocs setup (which isn't hard). What's The Need? I stumbled…]]></description><link>https://jackharner.com//blog/generate-a-docs-site-instantly/</link><guid isPermaLink="false">https://jackharner.com//blog/generate-a-docs-site-instantly/</guid><pubDate>Sun, 09 Aug 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.mkdocs.org/&quot;&gt;MkDocs&lt;/a&gt; is a &quot;fast, simple and downright gorgeous&quot; static site generator for turning a collection of Markdown files into a documentation site. Today, I&apos;m going to walk you through how to get MkDocs setup (which isn&apos;t hard).&lt;/p&gt;
&lt;h2 id=&quot;whats-the-need&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#whats-the-need&quot; aria-label=&quot;whats the need permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What&apos;s The Need?&lt;/h2&gt;
&lt;p&gt;I stumbled across MkDocs because we had some major staffing changes at work, and I wanted a way to keep track of various processes and SOPs for running the day to day. I initially started just with a folder of markdown files on my computer that I would add to as I came across things that needed documenting.&lt;/p&gt;
&lt;p&gt;This worked for a little while but then I needed to be able to share things in the docs with other people at work. I didn&apos;t want to have to a lot of time building something. I&apos;m pretty sure I just googled &quot;simple Markdown to HTML&quot; and MkDocs was the first thing that popped up. It was everything I wanted: Simple. Clean. Automatic. Input Markdown Directory. Output HTML Directory. Perfect.&lt;/p&gt;
&lt;h2 id=&quot;setting-it-up&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#setting-it-up&quot; aria-label=&quot;setting it up permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Setting It Up.&lt;/h2&gt;
&lt;p&gt;Enough rambling on the &lt;strong&gt;why&lt;/strong&gt;, let&apos;s talk about the &lt;strong&gt;how&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Installation is super easy. They have tons of packages in most of the package managers (apt-get, dnf, homebrew, yum, chocolatey). If you don&apos;t use one of those package managers the manual install is also pretty easy.&lt;/p&gt;
&lt;p&gt;MkDocs is built with Python and it supports Python versions 3.5, 3.6, 3.7, 3.8, and pypy3. So make sure you have one of those versions installed along with the appropriate version of pip (python&apos;s package manager), and then run:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=jack data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; mkdocs&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Verify it installed correctly with:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber 0&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=jack data-host=localhost&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;mkdocs &lt;span class=&quot;token parameter variable&quot;&gt;--version&lt;/span&gt;
mkdocs, version &lt;span class=&quot;token number&quot;&gt;0.15&lt;/span&gt;.3&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;directory-setup&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#directory-setup&quot; aria-label=&quot;directory setup permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Directory Setup&lt;/h2&gt;
&lt;p&gt;If you&apos;re starting fresh, you can just run:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=jack data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=jack data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;mkdocs new &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;procject-name&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;project-name&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you already have a directory of Markdown files you want to use MkDocs on, you have 2 options. You can either:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Run the &lt;code class=&quot;language-text&quot;&gt;mkdocs new &amp;lt;project-name&gt;&lt;/code&gt; command above and just copy your markdown into the &lt;code class=&quot;language-text&quot;&gt;&amp;lt;project-name&gt;/docs&lt;/code&gt; folder it created&lt;/li&gt;
&lt;li&gt;Create your own &lt;code class=&quot;language-text&quot;&gt;docs&lt;/code&gt; folder in your existing directory and move everything into it that way. Then at the root of your project folder create a &lt;code class=&quot;language-text&quot;&gt;mkdocs.yml&lt;/code&gt; file, and configure it yourself.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;fire-this-bad-boy-up&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#fire-this-bad-boy-up&quot; aria-label=&quot;fire this bad boy up permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Fire This Bad Boy Up&lt;/h2&gt;
&lt;p&gt;MkDocs installs with a dev server you can use while updating everything. Make sure your shell is in the &lt;code class=&quot;language-text&quot;&gt;&amp;lt;project-name&gt;&lt;/code&gt; folder and run:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=jack data-host=localhost&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;mkdocs serve
INFO    -  Building documentation&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
INFO    -  Cleaning site directory
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;I &lt;span class=&quot;token number&quot;&gt;160402&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;:50:43 server:271&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Serving on http://127.0.0.1:8000
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;I &lt;span class=&quot;token number&quot;&gt;160402&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;:50:43 handlers:58&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Start watching changes
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;I &lt;span class=&quot;token number&quot;&gt;160402&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;:50:43 handlers:60&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Start detecting changes&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;MkDocs is now watching your directory for changes and building those changes to &lt;code class=&quot;language-text&quot;&gt;http://127.0.0.1:8000&lt;/code&gt;. Visit that url in your browser and you&apos;re greeted with this:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1200px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 53%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAA6UlEQVR42q2Q64rCMBSE8+RdYV3wvdaC+hD+FYoxN3Ntk1kSWgxq+kN24GtIOmdyTsj2wPF94NgeOXZHhm5P0fUUm57ia3/Fpr+i+x3Kmj2L/yf7T3PtfJYhKErlOzCJ84WCcwEtGCQdoKXAXXJEZ/DwtgDIFBMyMSYYH6Cth/MBxjrQ2w1C3SGUhjYWi3cNklLCQi3vPTjnUEpBKlX2pb/K/w5Sh9TBxhgwxqCUhHMOIfgSWjOOI55FWjdN04QQQgmz1sLNATXZ89JhK3BRjLEU5vd5p9WRW+O3ip//r478Kc0OP9W/B/4BjihX35ohy9AAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;MkDocs Landing Page&quot;
        title=&quot;MkDocs Landing Page&quot;
        src=&quot;/static/49888bda40049aa01d25c355a5033402/c1b63/Welcome-to-mkdocs.png&quot;
        srcset=&quot;/static/49888bda40049aa01d25c355a5033402/5a46d/Welcome-to-mkdocs.png 300w,
/static/49888bda40049aa01d25c355a5033402/0a47e/Welcome-to-mkdocs.png 600w,
/static/49888bda40049aa01d25c355a5033402/c1b63/Welcome-to-mkdocs.png 1200w,
/static/49888bda40049aa01d25c355a5033402/d61c2/Welcome-to-mkdocs.png 1800w,
/static/49888bda40049aa01d25c355a5033402/a95f7/Welcome-to-mkdocs.png 1853w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;configure-your-site&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#configure-your-site&quot; aria-label=&quot;configure your site permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Configure Your Site&lt;/h2&gt;
&lt;p&gt;Everything you can configure for your Docs Site goes into the &lt;code class=&quot;language-text&quot;&gt;mkdocs.yml&lt;/code&gt; file in the root of the project.&lt;/p&gt;
&lt;p&gt;There are about a billion different configuration options for MkDocs, so rather than go through them all I&apos;m going to just link you to the &lt;a href=&quot;https://www.mkdocs.org/user-guide/configuration/&quot;&gt;docs site for MkDocs (conveniently built with MkDocs)&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;fill-it&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#fill-it&quot; aria-label=&quot;fill it permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Fill it&lt;/h2&gt;
&lt;p&gt;Inside your projects &lt;code class=&quot;language-text&quot;&gt;docs&lt;/code&gt; folder is where all your Markdown files go. &lt;code class=&quot;language-text&quot;&gt;mkdocs new&lt;/code&gt; creates an &lt;code class=&quot;language-text&quot;&gt;index.md&lt;/code&gt; file that&apos;s converted into the landing page. Include instructions about the docs site here. Telling users what kind of information they&apos;ll find here.&lt;/p&gt;
&lt;p&gt;Depending on the complexity of your documentation you can add more Markdown files into the &lt;code class=&quot;language-text&quot;&gt;docs&lt;/code&gt; folder, or if you need you can create sub-folders, for example &lt;code class=&quot;language-text&quot;&gt;docs/test/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;{{{vert}}}&lt;/p&gt;
&lt;h2 id=&quot;custom-navigation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#custom-navigation&quot; aria-label=&quot;custom navigation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Custom Navigation&lt;/h2&gt;
&lt;p&gt;As you flush out your &lt;code class=&quot;language-text&quot;&gt;docs&lt;/code&gt; folder, you&apos;ll notice the navigation bar at the header is automatically generated:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 385px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 16%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAm0lEQVR42lWLQQrCMBBFeyJdCgqCiq1NWhVcuvByCpK0SVoE8Tpddab1DF/SZlEXj5nP/y/KdIOBYrxCNRC6QR6yDPg+n2zktAt770WbgnH7fHF59bi+e8SGMX+0ONUdEstD3pWMvWFkVYfUMhbPFmtN2JaMlSIcqw5LRZjdW0QHQzjXjMwRcseQjpAYgrD/pIHp7/G+tITYjN4PC4OrmgzRWZ8AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;MkDocs Generated Navigation&quot;
        title=&quot;MkDocs Generated Navigation&quot;
        src=&quot;/static/52e3efbd36c2e0a0d36c007e8ae95aed/409e6/Nav.png&quot;
        srcset=&quot;/static/52e3efbd36c2e0a0d36c007e8ae95aed/5a46d/Nav.png 300w,
/static/52e3efbd36c2e0a0d36c007e8ae95aed/409e6/Nav.png 385w&quot;
        sizes=&quot;(max-width: 385px) 100vw, 385px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;MkDocs automatically turns Folders into dropdowns, and top level files into links. If you want specific selections in your nav you can configure that in your &lt;code class=&quot;language-text&quot;&gt;mkdocs.yml&lt;/code&gt; file by adding the nav option:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yml&quot;&gt;&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;site_name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; MkDocs Test Site
&lt;span class=&quot;token key atrule&quot;&gt;nav&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;Home&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;../&apos;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;&apos;User Guide&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;user-guide.md&apos;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;&apos;Test Folder&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;/test/&apos;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;&apos;External Link&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;https://jackharner.com&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can link to specific files, folders, or even external links. However, configuring the &lt;code class=&quot;language-text&quot;&gt;nav&lt;/code&gt; option will stop MkDocs from automatically generating the nav, so you will have to add any new pages to the menu that you create.&lt;/p&gt;
&lt;h2 id=&quot;build-it&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#build-it&quot; aria-label=&quot;build it permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Build It&lt;/h2&gt;
&lt;p&gt;When you&apos;re done updating the content and you&apos;re ready to deploy, you just run &lt;code class=&quot;language-text&quot;&gt;mkdocs build&lt;/code&gt; in the root of your project. Mkdocs generates the files in the &lt;code class=&quot;language-text&quot;&gt;&amp;lt;project-name&gt;/site&lt;/code&gt; folder. Copy the entire &lt;code class=&quot;language-text&quot;&gt;site&lt;/code&gt; folder somewhere online and you will have a fully featured docs site up and running! Wasn&apos;t that easy?!&lt;/p&gt;
&lt;p&gt;Since all it uses is Python, it&apos;s probably super simple to combine MkDocs with GitHub Actions &amp;#x26; GitHub Pages to automatically publish any new changes to the docs site as they get pushed to the repo. (That&apos;s a post for another day.)&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;let-me-know-what-you-think-about-mkdocs&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#let-me-know-what-you-think-about-mkdocs&quot; aria-label=&quot;let me know what you think about mkdocs permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Let me know what you think about MkDocs&lt;/h3&gt;
&lt;p&gt;Send me the Docs sites you setup over on BlueSky: &lt;a href=&quot;https://bsky.app/profile/jackharner.com&quot;&gt;@JackHarner&lt;/a&gt;. I&apos;d love to see them!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[BigCommerce Stencil CI/CD with GitHub Actions]]></title><description><![CDATA[Post Updated November 21st, 2022 to work with Stencil-CLI >5.x Back in November 2019, GitHub released GitHub Actions. An "API for cause and effect" they called it. Basically, GitHub Actions allow you to program things to happen when other things…]]></description><link>https://jackharner.com//blog/bigcommerce-stencil-ci-cd-with-github-actions/</link><guid isPermaLink="false">https://jackharner.com//blog/bigcommerce-stencil-ci-cd-with-github-actions/</guid><pubDate>Sat, 01 Aug 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Post Updated November 21st, 2022 to work with Stencil-CLI &gt;5.x&lt;/p&gt;
&lt;p&gt;Back in November 2019, GitHub released GitHub Actions. An &lt;a href=&quot;https://github.blog/2019-08-08-github-actions-now-supports-ci-cd/&quot;&gt;&quot;API for cause and effect&quot;&lt;/a&gt; they called it.&lt;/p&gt;
&lt;p&gt;Basically, GitHub Actions allow you to program things to happen when other things happen to your repo. For example, running tests on Pull Requests as they come in, or &lt;a href=&quot;https://dev.to/gautamkrishnar/show-your-latest-dev-to-posts-automatically-in-your-github-profile-readme-3nk8&quot;&gt;updating your GitHub Profile Readme with your latest DEV posts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Today I&apos;m going to walk you through using GitHub Actions to publish your BigCommerce Stencil Theme automatically.&lt;/p&gt;
&lt;div class=&quot;table-of-contents&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#what-is-cicd&quot;&gt;What is CI/CD?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#bye-bye-bitbucket-pipelines&quot;&gt;Bye Bye Bitbucket Pipelines.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#folder-structure&quot;&gt;Folder Structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#configuration&quot;&gt;Configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#thats-all-folks&quot;&gt;That&apos;s All Folks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#the-full-code&quot;&gt;The Full Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#taking-the-bigcommerce-cicd-flow-a-step-further&quot;&gt;Taking The BigCommerce CI/CD Flow A Step Further&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id=&quot;what-is-cicd&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-is-cicd&quot; aria-label=&quot;what is cicd permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What is CI/CD?&lt;/h2&gt;
&lt;p&gt;CI/CD stands for Continuous Integration / Continuous Delivery. CI/CD is a coding philosophy that allows teams to publish changes often, without the daunting task of pushing to production manually.  Setting up a solid CI/CD Pipeline will save you and your team plenty of hours over the course of the project to make up for the initial time setting it up.&lt;/p&gt;
&lt;h2 id=&quot;bye-bye-bitbucket-pipelines&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#bye-bye-bitbucket-pipelines&quot; aria-label=&quot;bye bye bitbucket pipelines permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Bye Bye Bitbucket Pipelines.&lt;/h2&gt;
&lt;p&gt;The first iteration I tried for CI/CD on my Stencil Theme came from &lt;a href=&quot;https://medium.com/bigcommerce-developer-blog/how-to-level-up-your-development-workflow-with-continuous-delivery-3a6493cc1d13&quot;&gt;this article&lt;/a&gt; from BigCommerce. It talks about how to utilize BitBucket Pipelines to Auto-deploy your theme. I was storing our theme on BitBucket anyway because this was before GitHub offered free private repos, so it ended up working perfectly.&lt;/p&gt;
&lt;p&gt;Once GitHub allowed Free Private Repos for individuals (and eventually teams), I decided to move all of our repos back. I still wanted the CI/CD benefits of BitBucket Pipelines so I dove into GitHub Actions to see if I could make it work.&lt;/p&gt;
&lt;h2 id=&quot;folder-structure&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#folder-structure&quot; aria-label=&quot;folder structure permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Folder Structure&lt;/h2&gt;
&lt;p&gt;The first thing you need to do to setup GitHub Actions is create a hidden folder called &lt;code class=&quot;language-text&quot;&gt;.github&lt;/code&gt; (note the period at the beginning) in the root of your theme. Inside that folder create one more folder called &lt;code class=&quot;language-text&quot;&gt;workflows&lt;/code&gt;. Now create a file in &lt;code class=&quot;language-text&quot;&gt;/.github/workflows/&lt;/code&gt; called &lt;code class=&quot;language-text&quot;&gt;main.yml&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This YAML (a recursive acronym that stands for YAML Ain&apos;t Markup Language) file is what tells GitHub what to do, when to do it, &amp;#x26; what to do it with.&lt;/p&gt;
&lt;p&gt;{{{vert}}}&lt;/p&gt;
&lt;h2 id=&quot;configuration&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#configuration&quot; aria-label=&quot;configuration permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Configuration&lt;/h2&gt;
&lt;p&gt;I&apos;ve included the full code down below, but I&apos;m going to walk through each piece so you understand what&apos;s happening and how to adjust it for your specific use case.&lt;/p&gt;
&lt;h3 id=&quot;name-it&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#name-it&quot; aria-label=&quot;name it permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Name It&lt;/h3&gt;
&lt;p&gt;First things first, we&apos;ve got to name this bad boi. Start your &lt;code class=&quot;language-text&quot;&gt;main.yml&lt;/code&gt; file off with the following:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yml&quot;&gt;&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Push Stencil Theme To BigCommerce.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This defines the name of the Workflow that you are creating and shows up on GitHub each time the workflow runs.&lt;/p&gt;
&lt;h3 id=&quot;main-branch-only&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#main-branch-only&quot; aria-label=&quot;main branch only permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Main Branch Only&lt;/h3&gt;
&lt;p&gt;In order to save build minutes, we only want to run the workflow when something is pushed to the &lt;code class=&quot;language-text&quot;&gt;main&lt;/code&gt; branch. For that, add the following:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yml&quot;&gt;&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;branches&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; main&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;on&lt;/code&gt; option allows you to specify when to run the workflow. There are about 25 different events that you can configure workflows for, &lt;a href=&quot;https://docs.github.com/en/actions/reference/events-that-trigger-workflows&quot;&gt;check out the full list here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;get-a-job-you-bum&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#get-a-job-you-bum&quot; aria-label=&quot;get a job you bum permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Get A JOB You BUM!&lt;/h3&gt;
&lt;p&gt;The next thing we need to do is create the Job. This is where all the magic happens inside the Workflow.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yml&quot;&gt;&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Stencil Push
    &lt;span class=&quot;token key atrule&quot;&gt;runs-on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ubuntu&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;latest
    &lt;span class=&quot;token key atrule&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let&apos;s break that block down even further.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;jobs:&lt;/code&gt; - This line defines an array so you can run multiple different jobs at a time.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;build:&lt;/code&gt; - This is the ID for the job we are setting up. You can use the ID to reference jobs from other jobs, for example, to check if the first job exited a specific way.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;name: Stencil Push&lt;/code&gt; - Pretty self-explanatory. Defines the name of the job.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;runs-on: ubuntu-latest&lt;/code&gt; - This allows you to configure the OS of the computer that will be processing your Job. You can choose between Linux, Windows, And Mac Operating Systems, depending on your needs.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;steps:&lt;/code&gt;  This starts the Steps array where you configure everything that happens inside the job.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;step-it-up&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#step-it-up&quot; aria-label=&quot;step it up permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;STEP It Up&lt;/h3&gt;
&lt;p&gt;Jobs have multiple steps, just like workflows can have multiple jobs. The big difference is that steps run sequentially, waiting for one to finish before the next step starts.&lt;/p&gt;
&lt;h4 id=&quot;check-it-out&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#check-it-out&quot; aria-label=&quot;check it out permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Check It Out.&lt;/h4&gt;
&lt;p&gt;First things first we have to checkout the repository. If you&apos;re unfamiliar with Docker, basically you&apos;re spinning up a new blank virtual machine every time your job runs. In order to manipulate the files you need to get them first. Luckily, GitHub Actions comes with a pre-configured set of tools to do simple things like that:&lt;/p&gt;
&lt;p&gt;Start off your &lt;code class=&quot;language-text&quot;&gt;steps&lt;/code&gt; array with &lt;strong&gt;Step 1&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yml&quot;&gt;&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Checkout Repository
        &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; actions/checkout@v1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;uses&lt;/code&gt; attribute in this step allows you to run other GitHub Actions inside your Action. This allows things to be modular and reusable. Check out &lt;a href=&quot;https://github.com/actions&quot;&gt;GitHub.com/actions&lt;/a&gt; for more info.&lt;/p&gt;
&lt;h4 id=&quot;node-v14-only&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#node-v14-only&quot; aria-label=&quot;node v14 only permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Node v14 Only&lt;/h4&gt;
&lt;p&gt;Since BigCommerce Stencil requires Node 14, &lt;strong&gt;Step 2&lt;/strong&gt; involves installing the specific version of node we need:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yml&quot;&gt;&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  
  &lt;span class=&quot;token punctuation&quot;&gt;...&lt;/span&gt;

  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Set Node version to 14
    &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; actions/setup&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;node@v1
    &lt;span class=&quot;token key atrule&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;node-version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On this step we now have the &lt;code class=&quot;language-text&quot;&gt;with&lt;/code&gt; attribute. This allows you to pass configuration options to your &quot;Uses&quot; actions. In this case we define &lt;code class=&quot;language-text&quot;&gt;node-version&lt;/code&gt; as &lt;code class=&quot;language-text&quot;&gt;14&lt;/code&gt; since that&apos;s what we need for the Stencil CLI to work.&lt;/p&gt;
&lt;h4 id=&quot;install-dependencies&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#install-dependencies&quot; aria-label=&quot;install dependencies permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Install Dependencies&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt; is kind of a 2 for 1 deal. With the &lt;code class=&quot;language-text&quot;&gt;run&lt;/code&gt; attribute on the step you can run console commands. The pipe &lt;code class=&quot;language-text&quot;&gt;|&lt;/code&gt; is used to start off a multi line command. Install the Stencil Cli first, and then run whichever package manager you use. In my case it&apos;s Yarn.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yml&quot;&gt;&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  
  &lt;span class=&quot;token punctuation&quot;&gt;...&lt;/span&gt;
  
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Install Dependencies
    &lt;span class=&quot;token key atrule&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token scalar string&quot;&gt;
      npm install -g @bigcommerce/stencil-cli
      yarn&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;{{{vert}}}&lt;/p&gt;
&lt;h4 id=&quot;configure-stencil-cli&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#configure-stencil-cli&quot; aria-label=&quot;configure stencil cli permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Configure Stencil CLI&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Update as of 2022: &lt;code class=&quot;language-text&quot;&gt;stencil init&lt;/code&gt; now has all of the flags available to run through CI. The original setup involved storing the entire contents of the .stencil file as a secret in the repo.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We need to add a couple secrets to the repo to keep our Stencil CLI Access Token secure. Open up your Repo and click &lt;code class=&quot;language-text&quot;&gt;Settings &gt; Secrets &amp;amp; Variables &gt; Actions &gt; New Repository Secret&lt;/code&gt;. Name the first one &lt;code class=&quot;language-text&quot;&gt;STENCIL_STORE_URL&lt;/code&gt; and paste in your store&apos;s mybigcommerce.com url (i.e. &lt;code class=&quot;language-text&quot;&gt;https://store-xxxxxxxxxx.mybigcommerce.com&lt;/code&gt; ). Save that secret and add a second one called &lt;code class=&quot;language-text&quot;&gt;STENCIL_ACCESS_TOKEN&lt;/code&gt; with your Stencil CLI Access Token as the value. GitHub Secrets allow you to use sensitive data in your Actions without exposing it to the world.&lt;/p&gt;
&lt;p&gt;Once again we&apos;ll use Step Environment Variables to send our secrets to the &lt;code class=&quot;language-text&quot;&gt;stencil init&lt;/code&gt; command to generate the &lt;code class=&quot;language-text&quot;&gt;secrets.stencil.json&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;config.stencil.json&lt;/code&gt; files used connect the CI runner to our specific BigCommerce store:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yml&quot;&gt;&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;

  &lt;span class=&quot;token punctuation&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Connect to store
      &lt;span class=&quot;token key atrule&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;URL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; secrets.STENCIL_STORE_URL &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;TOKEN&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; secrets.STENCIL_ACCESS_TOKEN &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; stencil init &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;u $URL &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;t $TOKEN &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;p 3000 &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;h https&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;//api.bigcommerce.com&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;push-it-gurl&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#push-it-gurl&quot; aria-label=&quot;push it gurl permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Push It Gurl&lt;/h4&gt;
&lt;p&gt;The last thing to do is push the theme with the Stencil CLI. We use the aforementioned &lt;code class=&quot;language-text&quot;&gt;-a&lt;/code&gt; &amp;#x26; &lt;code class=&quot;language-text&quot;&gt;-d&lt;/code&gt; flags to &lt;strong&gt;A&lt;/strong&gt;ctivate a specific variation (in our case the variant called &quot;Light&quot;) of the theme and to &lt;strong&gt;D&lt;/strong&gt;elete the oldest unused theme (there is a limit to how many themes you can have uploaded to BigCommerce at one time).&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yml&quot;&gt;&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;

  &lt;span class=&quot;token punctuation&quot;&gt;...&lt;/span&gt;

  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Push Theme
    &lt;span class=&quot;token key atrule&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token scalar string&quot;&gt;
      stencil push -a Light -d&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;thats-all-folks&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#thats-all-folks&quot; aria-label=&quot;thats all folks permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;That&apos;s All Folks&lt;/h2&gt;
&lt;p&gt;After that all you have to do is commit the workflow file to your repo and push it up to Github. As soon as it&apos;s in there, github will take that commit and run your Workflow against it.&lt;/p&gt;
&lt;p&gt;Be Careful Though, because at this point anything you push to your &lt;code class=&quot;language-text&quot;&gt;main&lt;/code&gt; branch will get automatically pushed to your live site. Make sure to follow good Git practices and only commit to the &lt;code class=&quot;language-text&quot;&gt;main&lt;/code&gt; branch PRODUCTION READY CODE. That is the beauty of using Git in your CI/CD Workflow because if you break something it&apos;s super simple to roll back the &lt;code class=&quot;language-text&quot;&gt;main&lt;/code&gt; branch to the previous commit, make your fixes and try again.&lt;/p&gt;
&lt;h2 id=&quot;the-full-code&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-full-code&quot; aria-label=&quot;the full code permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Full Code&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yml&quot;&gt;&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Push Stencil Theme To BigCommerce
&lt;span class=&quot;token comment&quot;&gt;# This workflow is triggered on pushes to the Main Branch only.&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;branches&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; main

&lt;span class=&quot;token key atrule&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Stencil Push
    &lt;span class=&quot;token key atrule&quot;&gt;runs-on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ubuntu&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;latest
    &lt;span class=&quot;token key atrule&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Checkout Repository
        &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; actions/checkout@v1

      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Set Node version to 14
        &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; actions/setup&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;node@v1
        &lt;span class=&quot;token key atrule&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;node-version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt;

      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Install Dependencies
        &lt;span class=&quot;token key atrule&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token scalar string&quot;&gt;
          npm install -g @bigcommerce/stencil-cli
          yarn&lt;/span&gt;

      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Connect to store
            &lt;span class=&quot;token key atrule&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
              &lt;span class=&quot;token key atrule&quot;&gt;URL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; secrets.STENCIL_STORE_URL &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
              &lt;span class=&quot;token key atrule&quot;&gt;TOKEN&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; secrets.STENCIL_ACCESS_TOKEN &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;token key atrule&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; stencil init &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;u $URL &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;t $TOKEN &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;p 3000 &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;h https&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;//api.bigcommerce.com

      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Push Theme
        &lt;span class=&quot;token key atrule&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token scalar string&quot;&gt;
          stencil push -a Light -d&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;taking-the-bigcommerce-cicd-flow-a-step-further&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#taking-the-bigcommerce-cicd-flow-a-step-further&quot; aria-label=&quot;taking the bigcommerce cicd flow a step further permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Taking The BigCommerce CI/CD Flow A Step Further&lt;/h2&gt;
&lt;p&gt;Once you get settled into a CI/CD flow that works for you and your clients, here are a handful of ideas to extend it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Connect the workflow to send work to both a staging and production site.&lt;/li&gt;
&lt;li&gt;Setup an NPM / Yarn Cache to save time installing all the different dependencies.&lt;/li&gt;
&lt;li&gt;Modify the theme name with things like the date and the Pull Request info to connect the theme names back to the repo.&lt;/li&gt;
&lt;li&gt;Create a separate &lt;a href=&quot;/blog/github-actions-cron/&quot;&gt;GitHub action that uses CRON&lt;/a&gt; to regularly pull in the live theme on the store, capturing any changes your client made directly through the theme editor.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;And pretty much anything else you can think of that you can accomplish with GitHub Actions. Automating the deploy process makes it so much easier to focus on fixing bugs and building new features, instead of wasting time manually deploying new changes.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span&gt;Featured Image by &lt;a href=&quot;https://unsplash.com/@martinadams?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;Martin Adams&lt;/a&gt; on &lt;a href=&quot;https://unsplash.com/s/photos/piping?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;Unsplash&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded></item><item><title><![CDATA[Let's Make A Newsletter]]></title><description><![CDATA[I read this great article from @swizec about how he made almost $400k over 5 years on the side through books, courses and other digital media sales. His path to success sparked my curiosity to see if I could do it to. I've got several ideas for…]]></description><link>https://jackharner.com//blog/lets-make-a-newsletter/</link><guid isPermaLink="false">https://jackharner.com//blog/lets-make-a-newsletter/</guid><pubDate>Sat, 25 Jul 2020 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;&amp;quot;Lots of noise, nothing to sell. Not even a mailing list to subscribe.&amp;quot; &lt;br&gt;&lt;br&gt;👇🏽 Great read 👇🏽 &lt;a href=&quot;https://t.co/61my4iobiy&quot;&gt;https://t.co/61my4iobiy&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jack Harner 🚀 (@JackHarner) &lt;a href=&quot;https://twitter.com/JackHarner/status/1285622502602027009?ref_src=twsrc%5Etfw&quot;&gt;July 21, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;I read this great article from &lt;a href=&quot;https://twitter.com/Swizec&quot;&gt;@swizec&lt;/a&gt; about how he made almost &lt;a href=&quot;https://swizec.com/blog/5-years-of-books-courses-or-how-i-made-369000-on-the-side/swizec/9453&quot;&gt;$400k over 5 years on the side&lt;/a&gt; through books, courses and other digital media sales. His path to success sparked my curiosity to see if I could do it to. I&apos;ve got several ideas for digital learning materials to sell because of his article. I&apos;ll definitely keep you all updated along the way.&lt;/p&gt;
&lt;p&gt;This quote stood out from that article:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;That was my biggest mistake back when I first started blogging successfully. Lots of noise, nothing to sell. &lt;strong&gt;Not even a mailing list to subscribe.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I don&apos;t even have a mailing list either. I decided to fix that &amp;#x26; signed up for &lt;a href=&quot;https://app.convertkit.com/referrals/l/42366c0e-990d-4f0e-8893-4f55cecf18f6&quot;&gt;ConvertKit&lt;/a&gt; almost immediately.&lt;/p&gt;
&lt;p&gt;Let&apos;s talk about why, if you make anything, you should also start a mailing list.&lt;/p&gt;
&lt;h2 id=&quot;a-passionate-audience-is-the-best-investment-in-2020&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#a-passionate-audience-is-the-best-investment-in-2020&quot; aria-label=&quot;a passionate audience is the best investment in 2020 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A Passionate Audience Is The Best Investment in 2020.&lt;/h2&gt;
&lt;p&gt;Look at practically any celebrity these days. They can sell literally ANYTHING and their rabid fan base will eat it up and break the internet. For example, Tesla selling booty shorts; basically any YouTube Star&apos;s makeup line; countless books, cereals, beverages, or any kind of endorsement deal.&lt;/p&gt;
&lt;p&gt;All of these products launch and sell out instantly not because they&apos;re superior products or a better deal, but purely because the customers love whoever is on the packaging.&lt;/p&gt;
&lt;p&gt;My goal as a creator is to create a small but passionate audience by supporting and encouraging other creators through their journey as well as teaching others about Web Development, Productivity, Automation &amp;#x26; More.&lt;/p&gt;
&lt;h2 id=&quot;only-true-way-to-own-your-customer-list&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#only-true-way-to-own-your-customer-list&quot; aria-label=&quot;only true way to own your customer list permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Only True Way To Own Your Customer List&lt;/h2&gt;
&lt;p&gt;Having tons followers on social media is great and can be a massive driver of success, but what happens when the platform you&apos;re popular on just up and dies? (Looking at you VINE). Suddenly those thousands of followers cease to exist. What happens if your account gets deleted? Now you&apos;ve lost all access to your customers.&lt;/p&gt;
&lt;p&gt;&amp;#x3C; Email List Has Entered The Chat &gt;&lt;/p&gt;
&lt;p&gt;Email is not going away any time soon, and unless your target audience is like 12 year olds, they probably check it every day. Getting that kind of access to your customers is priceless.&lt;/p&gt;
&lt;p&gt;As long as you back up your list outside of any platform regularly, nobody can block you from sending to it. Social networks come and go, but email is forever.&lt;/p&gt;
&lt;h2 id=&quot;learn-in-public-together&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#learn-in-public-together&quot; aria-label=&quot;learn in public together permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Learn In Public, Together&lt;/h2&gt;
&lt;p&gt;I&apos;ve always been a fan of learning in public, or in other words, sharing the things I learn as I learn them. It helps solidify the knowledge for me, gives me a reference to look back to, and possibly helps other people down the line as they&apos;re going through the same thing.&lt;/p&gt;
&lt;p&gt;I hope to use this platform to spread my knowledge and use my experience to help other people level up as web developers and creatives.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;thanks-for-reading&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#thanks-for-reading&quot; aria-label=&quot;thanks for reading permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Thanks for reading!&lt;/h2&gt;
&lt;p&gt;I really appreciate it.&lt;/p&gt;
&lt;p&gt;I plan on re-posting every email I send on JackHarner.com 7 days after it gets sent to the list. Make sure to sign up to get my posts as soon as possible.&lt;/p&gt;
&lt;p&gt;If you have any questions feel free to respond to this email or hit me up on BlueSky: &lt;a href=&quot;https://bsky.app/profile/jackharner.com&quot;&gt;@JackHarner&lt;/a&gt;. Happy Coding!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Productivity = Automation]]></title><description><![CDATA[I'm Lazy. BUT I'm the good kind of lazy that works really hard to do as little actual work as possible. If I have to do anything more than twice, I'm going to think about automating it. From scripts to download & process product photos, to hours…]]></description><link>https://jackharner.com//blog/productivity-equals-automation/</link><guid isPermaLink="false">https://jackharner.com//blog/productivity-equals-automation/</guid><pubDate>Wed, 01 Jul 2020 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Time for &lt;a href=&quot;https://twitter.com/hashtag/DevDiscuss?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#DevDiscuss&lt;/a&gt;&lt;br&gt;&lt;br&gt;Tonight&amp;#39;s topic is... Productivity tools 🛠&lt;br&gt;&lt;br&gt;Let&amp;#39;s start with some questions&lt;br&gt;&lt;br&gt;- What does it mean to be productive?&lt;br&gt;- How does your view on tools evolve over time?&lt;br&gt;- Recommend some tools! &lt;a href=&quot;https://t.co/Wyc84CYx6A&quot;&gt;pic.twitter.com/Wyc84CYx6A&lt;/a&gt;&lt;/p&gt;&amp;mdash; DEV Community 👩‍💻👨‍💻 (@ThePracticalDev) &lt;a href=&quot;https://twitter.com/ThePracticalDev/status/1278131605878562818?ref_src=twsrc%5Etfw&quot;&gt;July 1, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;h2 id=&quot;im-lazy&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#im-lazy&quot; aria-label=&quot;im lazy permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;I&apos;m Lazy.&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;BUT&lt;/strong&gt; I&apos;m the good kind of lazy that works really hard to do as little actual work as possible. If I have to do anything more than twice, I&apos;m going to think about automating it. From scripts to download &amp;#x26; process product photos, to hours-saving spreadsheet combiners, there&apos;s not much in my job and life that isn&apos;t at least partially fueled by automation.&lt;/p&gt;
&lt;h2 id=&quot;my-automation-toolkit&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#my-automation-toolkit&quot; aria-label=&quot;my automation toolkit permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;My Automation Toolkit&lt;/h2&gt;
&lt;p&gt;Smarter minds than me can probably go into the depths of Pros and Cons between all of these methods, but I&apos;m not going to. This is just a list of some of the things I&apos;ve used over the years to speed up mundane tasks. Everything here was used to solve a super specific problem, so think about things in your work day that can be sped up with the help of our friendly &lt;del&gt;overlords&lt;/del&gt; computers.&lt;/p&gt;
&lt;blockquote&gt;
&lt;h3 id=&quot;if-its-repetitive-you-can-probably-get-a-computer-to-do-it-for-you&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#if-its-repetitive-you-can-probably-get-a-computer-to-do-it-for-you&quot; aria-label=&quot;if its repetitive you can probably get a computer to do it for you permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;If It&apos;s Repetitive, You Can Probably Get a Computer to Do It For You.&lt;/h3&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;python&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#python&quot; aria-label=&quot;python permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Python&lt;/h3&gt;
&lt;p&gt;Python is often reached for when starting to learn programming. It&apos;s simple, it&apos;s easy to read, and you don&apos;t get lost in a sea of brackets and semi-colons. At the same time it&apos;s insanely powerful and I&apos;m sure a very large chunk of the online world is run with python.&lt;/p&gt;
&lt;p&gt;Need to process or combine large spreadsheets on a recurring basis? Check out Pandas.&lt;/p&gt;
&lt;p&gt;Want to automate certain mundane tasks online? Check out Selenium (more on that later 👇).&lt;/p&gt;
&lt;p&gt;Want to make Generative Art or play with fractals? &lt;a href=&quot;https://simpleprogrammer.com/python-generative-art-math/&quot;&gt;Python can do that too&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;{{{vert}}}&lt;/p&gt;
&lt;h3 id=&quot;selenium&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#selenium&quot; aria-label=&quot;selenium permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Selenium&lt;/h3&gt;
&lt;p&gt;Need to submit the same form on a webpage over and over again? Time to bust out Selenium. Selenium is a tool you can use with Python (or Java) to write code to make a browser do things to itself 😉. Python is super verbose and easy to read so you&apos;re just telling the browser:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Go Here, type XYZ into that Form, click on this checkbox and then click on that submit button&quot;&lt;/p&gt;
&lt;h3 id=&quot;now-do-it-999-more-times&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#now-do-it-999-more-times&quot; aria-label=&quot;now do it 999 more times permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&quot;Now do it 999 more times&quot;&lt;/h3&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;With Great Scripting Power Comes Great Responsibility&lt;/strong&gt;. Don&apos;t accidentally (or &lt;strong&gt;intentionally&lt;/strong&gt;) DoS anybody by bombarding their site with requests. Build in exits and control the timing of requests. All That Fun Stuff.&lt;/p&gt;
&lt;h3 id=&quot;powershell--bash-scripts&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#powershell--bash-scripts&quot; aria-label=&quot;powershell  bash scripts permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;PowerShell / Bash Scripts&lt;/h3&gt;
&lt;p&gt;PowerShell was  my first introduction to scripting. I started with simple &quot;move files around&quot; type scripts and built more stuff from there as the need came up. I wrote a PowerShell script that could fetch product images by SKU from specific sources, crop/resize and rename the files, then upload them over FTP to our web server. What used to be a manual hour long process is now 5-10 minutes tops.&lt;/p&gt;
&lt;p&gt;Bash Scripts are basically the Linux version of PowerShell (or the other way around, I don&apos;t know). Super useful for processing things server side. Mixed with Cron, you can automate reports and file fetching fairly simply, back up and maintain your servers automatically, and more. Definitely spend some time learning Bash scripting if you do anything on Linux Servers.&lt;/p&gt;
&lt;h3 id=&quot;autohotkey&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#autohotkey&quot; aria-label=&quot;autohotkey permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;AutoHotkey&lt;/h3&gt;
&lt;p&gt;If your on Windows I highly recommend &lt;a href=&quot;https://www.autohotkey.com/&quot;&gt;AutoHotkey&lt;/a&gt;. It allows you to configure almost anything as a keyboard shortcut.&lt;/p&gt;
&lt;p&gt;Some of my most used shortcuts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;]j&lt;/code&gt; will output &lt;code class=&quot;language-text&quot;&gt;- Jack &amp;lt;mm/dd/yyyy&gt;&lt;/code&gt; with the current date.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Ctrl + Pause&lt;/code&gt; starts and stops Spotify, while &lt;code class=&quot;language-text&quot;&gt;Ctrl + &amp;lt;Scoll Lock / Print&gt;&lt;/code&gt; will switch tracks.&lt;/li&gt;
&lt;li&gt;Tapping &lt;code class=&quot;language-text&quot;&gt;Caps Lock&lt;/code&gt; doesn&apos;t do anything. Double Tapping &lt;code class=&quot;language-text&quot;&gt;Caps Lock&lt;/code&gt; toggles Caps Lock. I&apos;ve wasted way too much time backing up when I accidentally hit it AND eVERYTHING sTARTS tYPING lIKE tHIS.&lt;/li&gt;
&lt;li&gt;I use an older mechanical keyboard that doesn&apos;t have a Windows key, that I got for $2. I also religiously use Windows Virtual Desktops and the keyboard shortcuts for those are controlled with the Windows Key (Specifically &lt;code class=&quot;language-text&quot;&gt;Windows + Tab&lt;/code&gt; brings up the overview). Google was my friend and I was able to rebind &lt;code class=&quot;language-text&quot;&gt;Caps + Tab&lt;/code&gt; to open up the overview, and &lt;code class=&quot;language-text&quot;&gt;Caps + &amp;lt;A/S&gt;&lt;/code&gt; to switch between desktops.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;keyboard-shortcuts----learn-em-love-em-live-em&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#keyboard-shortcuts----learn-em-love-em-live-em&quot; aria-label=&quot;keyboard shortcuts    learn em love em live em permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Keyboard Shortcuts -- Learn &apos;Em. Love &apos;em. Live &apos;em.&lt;/h2&gt;
&lt;p&gt;On top of everything I&apos;ve configured for AutoHotkey, I swear by keyboard shortcuts. Why waste time reaching for the mouse and then moving it all the way across the screen to dig through 3 levels of menus to click on something, when you can just memorize the keyboard shortcut and be done with it.&lt;/p&gt;
&lt;p&gt;This is doubly true for Photoshop and Illustrator. All of the tools you&apos;re using have keyboard shortcuts to flip through them.&lt;/p&gt;
&lt;p&gt;You&apos;ll save so much time in the long run and you don&apos;t have to move your hand back and forth to the mouse as much. It&apos;s a win-win.&lt;/p&gt;
&lt;h1 id=&quot;go-forth-and-automate&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#go-forth-and-automate&quot; aria-label=&quot;go forth and automate permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Go Forth And Automate!&lt;/h1&gt;
&lt;center&gt;&lt;span&gt;Banner Image by &lt;a href=&quot;https://unsplash.com/@franckinjapan?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;Franck V.&lt;/a&gt; on &lt;a href=&quot;https://unsplash.com/s/photos/automation?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;Unsplash&lt;/a&gt;&lt;/span&gt;&lt;/center&gt;</content:encoded></item><item><title><![CDATA[Custom Fields By Name]]></title><description><![CDATA[At Shoolu, we take advantage of Custom Fields on products in BigCommerce all the time. Our inventory software runs some rules against the product data and sets various fields as various values we use to enhance the product pages across the site. The…]]></description><link>https://jackharner.com//blog/get-custom-field-by-name-bigcommerce-stencil/</link><guid isPermaLink="false">https://jackharner.com//blog/get-custom-field-by-name-bigcommerce-stencil/</guid><pubDate>Tue, 09 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;At &lt;a href=&quot;/portfolio/shoolu&quot;&gt;Shoolu&lt;/a&gt;, we take advantage of Custom Fields on products in BigCommerce all the time. Our inventory software runs some rules against the product data and sets various fields as various values we use to enhance the product pages across the site.&lt;/p&gt;
&lt;h2 id=&quot;the-problem&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-problem&quot; aria-label=&quot;the problem permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Problem&lt;/h2&gt;
&lt;p&gt;When the theme templates are processed, the custom fields are passed to the frontend as an array of objects:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &apos;product&apos;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

        &apos;custom_fields&apos;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&apos;name&apos;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &apos;Property&apos;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &apos;value&apos;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &apos;Property Value&apos;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&apos;name&apos;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &apos;Property2&apos;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &apos;value&apos;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &apos;Property2 Value&apos;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            
            &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Unfortunately, due to whatever technical limitations or &quot;for security purposes&quot; this doesn&apos;t work:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;{{#if product.custom_fields.Property2}}

... do something

{{/if}}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Why can&apos;t they just build &lt;code class=&quot;language-text&quot;&gt;custom_fields&lt;/code&gt; as an object with the custom field names as keys? Require the name to be something that works as a JSON key with a max length and build it that way.&lt;/p&gt;
&lt;p&gt;{{{vert}}}&lt;/p&gt;
&lt;h2 id=&quot;the-solution-workaround&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-solution-workaround&quot; aria-label=&quot;the solution workaround permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The &lt;del&gt;Solution&lt;/del&gt; Workaround&lt;/h2&gt;
&lt;p&gt;There&apos;s a Handlebars block tag available called &lt;code class=&quot;language-text&quot;&gt;filter&lt;/code&gt; which allows you to filter an array of objects down by a specific property of the object.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;{{#filter product.custom_fields &apos;&amp;lt;FieldName&gt;&apos; property=&apos;name&apos; }}
    {{#if value &apos;==&apos; &apos;True&apos;}}
        Just Do It.
    {{/if}}
{{/filter}}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Biggest downside is trying to do things around your theme based on that value, you have to wrap your &lt;code class=&quot;language-text&quot;&gt;{{#if}}&lt;/code&gt; blocks in the &lt;code class=&quot;language-text&quot;&gt;{{#filter}}&lt;/code&gt; block. It doesn&apos;t look very intuitive and feels very hacky, but it works so it&apos;s what we get.&lt;/p&gt;
&lt;p&gt;If you have a better way of doing this, please please please let me know on &lt;a href=&quot;https://bsky.app/profile/jackharner.com&quot;&gt;BlueSky&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[I Just Got A Raspberry Pi]]></title><description><![CDATA[After wanting one for some time, I finally caved and bought a Raspberry Pi. I got the Pi 4 Model B, the latest and greatest. It boasts the ability to replace your desktop computer, with two micro-HDMI outs as well as on-board wi-fi and 4 USBs. Seeing…]]></description><link>https://jackharner.com//blog/i-just-got-a-raspberry-pi/</link><guid isPermaLink="false">https://jackharner.com//blog/i-just-got-a-raspberry-pi/</guid><pubDate>Sat, 30 May 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;After wanting one for some time, I finally caved and bought a &lt;a href=&quot;https://www.raspberrypi.org/&quot;&gt;Raspberry Pi&lt;/a&gt;. I got the Pi 4 Model B, the latest and greatest. It boasts the ability to replace your desktop computer, with two micro-HDMI outs as well as on-board wi-fi and 4 USBs. Seeing as a lot of stuff I do needs a lot of processing power, I doubt it will be replacing mine, but I&apos;m excited to see what I can do with it!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/769a478461bbe84d9a9ac61cf6cece3d/raspberry-pi.webp&quot; alt=&quot;Raspberry Pi 4B&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;pihole---block-all-the-ads-sort-of&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#pihole---block-all-the-ads-sort-of&quot; aria-label=&quot;pihole   block all the ads sort of permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;PiHole - Block ALL THE ADS.. Sort of..&lt;/h2&gt;
&lt;p&gt;If you&apos;re not familiar, &lt;a href=&quot;https://pi-hole.net/&quot;&gt;PiHole&lt;/a&gt; is a lovely piece of software that can act as a network-wide ad-block for your entire house. Hypothetically super simple to set up: Install Raspberry Pi, Run a Bash Script, Set your router to use your Pi as the DNS server, and you&apos;re done.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1200px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 51%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAACUklEQVR42p2R20tUYRTFzz8hCj01mWNoKkQmpD7VSy+9+NDloQtBERZEBEHR5aGLUYJCMV5yVBx0xNEgvAQlNRgpFGQ66ozWaHPpOPcZz5lzztx+MWeM7LUFi73Wx7e/j722UH/qHLVNlzn6uJVGWw81/e2Uv3zC8WEbxybcVI86qbQ5qRtxYLZ1MWi+hqW7mZ6uq/R0m+i618bwnYdYbtzG/MyEUFNRhsFQxtmnN2le7OWEvZWm6Ue0zE9xdyPL6WWJk0sSl+aDKIvdYL9AbvoM0tvzSO86ib9oJdJyC/H+dbz9HQhVDUcoMhjpHRgij4yS1iu5vMnrLOSyek1lQQNS2/yD/K0MEFVUhKq6Bor3lGMZGik8mM6wE/5kFC3771nhN3jj/4rt55yuPVKQOZ8TofJQPbtKK2jrMzPt+8bA8nts7lnG3HO8cs8x4rDzwbPAl8AanzdXmRWd2P0O3Ztmxnhgt+CXI1i/zzC68hGhovYwxQYjpt5+QskEDs8PXJte1gI+nd5QgI2gyHpIZCMksh4s0B0SiYZjOl0RP+thkUgsjrC/rpGS0n30WQoZprUU/4N8CJKWLoxctNuIZdBKJB9s6m9eWg7Wkhm0THa7JbtjSTkGRZUOr6Jrl5zmU1hB2FtzkBKDkfZeC+O/JKwLbsZdXiZdXiZWfTx3hbH6ZKaCCpNBldcBBZuYZDKgcGUlwcWlBEtxlU6PjMUrIZRWH9Az7OwbIJuDSCxBdEsmts24rBCSVQKyii+2hS+a0H1QVpEUDUXViMgq8aRGQlb4DctbmzYff0aZAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;PiHole Dashboard&quot;
        title=&quot;PiHole Dashboard&quot;
        src=&quot;/static/c1ab75e9b134942067ffa3dbc7283707/c1b63/pihole-dashboard.png&quot;
        srcset=&quot;/static/c1ab75e9b134942067ffa3dbc7283707/5a46d/pihole-dashboard.png 300w,
/static/c1ab75e9b134942067ffa3dbc7283707/0a47e/pihole-dashboard.png 600w,
/static/c1ab75e9b134942067ffa3dbc7283707/c1b63/pihole-dashboard.png 1200w,
/static/c1ab75e9b134942067ffa3dbc7283707/d61c2/pihole-dashboard.png 1800w,
/static/c1ab75e9b134942067ffa3dbc7283707/29114/pihole-dashboard.png 1920w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;For me, it turned out not as simple. I use the stock Router/Modem Combo provided to me by Comcast. Turns out, they don&apos;t allow you to set custom DNS servers for the network. Great. So now I have to go around and configure each device manually to use the Pi as it&apos;s DNS server to get it to work.&lt;/p&gt;
&lt;p&gt;{{{vert}}}&lt;/p&gt;
&lt;blockquote&gt;
&lt;h2 id=&quot;its-always-dns&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#its-always-dns&quot; aria-label=&quot;its always dns permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;It&apos;s Always DNS.&lt;/h2&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&apos;ve been meaning to buy my own router/modem for a while now, and this might be what finally pushes me over the edge.&lt;/p&gt;
&lt;h2 id=&quot;whats-next&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#whats-next&quot; aria-label=&quot;whats next permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What&apos;s Next&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;I&apos;ve got a couple different &lt;a href=&quot;https://twitter.com/git_shit&quot;&gt;BlueSky bots&lt;/a&gt; and such running on different servers that I might try to consolidate to the Pi. I got the 2Gb Memory version so it&apos;s not SUPER powerful, but for simple cron tasks and things it could save me some money.&lt;/li&gt;
&lt;li&gt;Buy a new Modem/Router combo.&lt;/li&gt;
&lt;li&gt;Buy a set of &lt;a href=&quot;https://www.amazon.com/Raspberry-iUniker-30x30x7mm-Brushless-RetroFlag/dp/B076H3TKBP/ref=as_li_ss_tl?crid=1UZQNS98RC9CW&amp;#x26;dchild=1&amp;#x26;keywords=raspberry+pi+4+fan&amp;#x26;qid=1590980965&amp;#x26;sprefix=raspberr,aps,211&amp;#x26;sr=8-3&amp;#x26;linkCode=ll1&amp;#x26;tag=harner-20&amp;#x26;linkId=88de087ae5089f3b764b5d3775643efc&amp;#x26;language=en_US&quot;&gt;Raspberry Pi Fans&lt;/a&gt; to help deal with the heat. It hovers right around 66°C. with just PiHole running, but I&apos;m sure that will jump up once I start using it for other things.&lt;/li&gt;
&lt;li&gt;I also had an idea for a lightweight web app that I could host on the Pi and use QR codes to track how often I water my plants. This one&apos;s probably way down the line, but could be a cool open source project to work on.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Schedule Tweets Without Thinking About It]]></title><description><![CDATA[Day 331 : Sunday, March 14th 2021 Wow. It's been a while. Just recently got my like 5th wind on this project and got a lot done in the last couple weeks. Lots has happened. Actually "Lots has happened" is an understatement. I fixed whatever login…]]></description><link>https://jackharner.com//blog/simple-tweets-build-log/</link><guid isPermaLink="false">https://jackharner.com//blog/simple-tweets-build-log/</guid><pubDate>Thu, 30 Apr 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h1 id=&quot;day-331--sunday-march-14th-2021&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#day-331--sunday-march-14th-2021&quot; aria-label=&quot;day 331  sunday march 14th 2021 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Day 331 : Sunday, March 14th 2021&lt;/h1&gt;
&lt;p&gt;Wow. It&apos;s been a &lt;em&gt;while&lt;/em&gt;. Just recently got my like 5th wind on this project and got a lot done in the last couple weeks.&lt;/p&gt;
&lt;h2 id=&quot;lots-has-happened&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#lots-has-happened&quot; aria-label=&quot;lots has happened permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Lots has happened.&lt;/h2&gt;
&lt;h3 id=&quot;actually-lots-has-happened-is-an-understatement&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#actually-lots-has-happened-is-an-understatement&quot; aria-label=&quot;actually lots has happened is an understatement permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Actually &quot;Lots has happened&quot; is an understatement.&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;I fixed whatever login issues I was having back on Day 99 (Don&apos;t ask me what I did, I don&apos;t remember).&lt;/li&gt;
&lt;li&gt;I split the project into two seperate repos, one for the React Client, and the other for the Express Node server.&lt;/li&gt;
&lt;li&gt;Got Continuous Integration / Continuous Deployment set up for both halves of the project.&lt;/li&gt;
&lt;li&gt;Cleaned up a TON of the CSS to make things look better across devices.&lt;/li&gt;
&lt;li&gt;Totally revamped how I was handling &quot;Sending Tweets&quot;. Which allowed for:&lt;/li&gt;
&lt;li&gt;You can schedule threads!&lt;/li&gt;
&lt;li&gt;Started integrating the BlueSky API V2 to take advantage of &lt;a href=&quot;https://developer.twitter.com/en/docs/twitter-api/conversation-id&quot;&gt;Conversations&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Laid out the ground work to do a Closed Beta of the project &lt;em&gt;soon&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;scheduling-threads&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#scheduling-threads&quot; aria-label=&quot;scheduling threads permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Scheduling Threads&lt;/h2&gt;
&lt;p&gt;I&apos;m not entirely sure why, but getting this too work took a whole lot longer then I expected. I had to pretty much completely redo how I was managing the storage and processing of scheduled tweets. Initially I had stored the tweet text as just a string in the database. When it came time for that user to tweet, it would pull up the latest tweet in the queue, and POST the text to BlueSky. Simple. One DB Record per One Tweet.&lt;/p&gt;
&lt;p&gt;With threads it&apos;s a little different. I wanted Users to be able to schedule threads where the entire thread would go out at once. The solution I ended up going with was storing the whole text thread as an Array instead of a String. Unfortunately, at least that I found, there isn&apos;t a &quot;POST THREAD&quot; endpoint in the BlueSky API (I think it&apos;s getting easier with V2 which I&apos;m going to dive into later).&lt;/p&gt;
&lt;p&gt;That leaves you to run through this loop:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Pull the ParentTweet out of the DB&lt;/li&gt;
&lt;li&gt;Loop through the &lt;code class=&quot;language-text&quot;&gt;full_text&lt;/code&gt; array.
&lt;ol&gt;
&lt;li&gt;Create a new Tweet in the DB&lt;/li&gt;
&lt;li&gt;Send that Tweet to BlueSky&lt;/li&gt;
&lt;li&gt;Receive the ID of the Successful Tweet from BlueSky&lt;/li&gt;
&lt;li&gt;Store all that on the individual Tweet record in the DB&lt;/li&gt;
&lt;li&gt;Pass that ID to the next item in the array&lt;/li&gt;
&lt;li&gt;Repeat.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Wait for all that to be done and mark the ParentTweet as either &lt;code class=&quot;language-text&quot;&gt;error&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;tweeted&lt;/code&gt; depending on the response.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;From my understanding of V2 of the BlueSky API is that instead of passing the Tweeted ID on to the next one in the loop, I would just pass in the Conversation ID from the first Tweet, and any subsequent tweets to that Conversation ID will show up as a thread, at the end of the thread. (I haven&apos;t fully dove into it yet so this might be totally wrong).&lt;/p&gt;
&lt;h2 id=&quot;from-mono-repo-to-multi-repo&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#from-mono-repo-to-multi-repo&quot; aria-label=&quot;from mono repo to multi repo permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;From Mono-Repo to Multi-Repo&lt;/h2&gt;
&lt;p&gt;I was having issues getting a Continuous Deployment workflow running for the project. I was using a self hosted version of Jenkins to do some code running stuff till one day I pushed some changes and nothing happened. I logged in to Jenkins and it wasn&apos;t even recognizing the Repo existed. Strange.&lt;/p&gt;
&lt;p&gt;I fought with it for a while but eventually gave up.&lt;/p&gt;
&lt;p&gt;I decided to switch things over to GitHub Actions so I wouldn&apos;t have to mess with Jenkins anymore. I started busting out a rather complex workflow to deploy both halves of the App at the same time. I wasn&apos;t able to get it to work and I figured now was the time to separate the backend and the frontend into their own repos.&lt;/p&gt;
&lt;p&gt;Since a React app has different CI/CD requirements than a Node Express Server, it was something I probably should&apos;ve just done from the beginning. Hey, at least I learned something.&lt;/p&gt;
&lt;p&gt;To split them up I renamed the project folder to &lt;code class=&quot;language-text&quot;&gt;simple-tweets-&lt;/code&gt; and created a brand new &lt;code class=&quot;language-text&quot;&gt;simple-tweets&lt;/code&gt; folder. I then created individual &lt;code class=&quot;language-text&quot;&gt;api&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;client&lt;/code&gt; folders and moved the files from the original folder to their new home. Connecting each directory to their respective new GitHub repos and sent up the changes.&lt;/p&gt;
&lt;p&gt;Biggest Downside I had with this is that I lost the file history from before the move. I&apos;m sure there are ways to manage that migration while maintaining the history but I decided it wasn&apos;t worth looking into for me (and also another reason to split them from the beginning).&lt;/p&gt;
&lt;h2 id=&quot;ci--cd-setup&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ci--cd-setup&quot; aria-label=&quot;ci  cd setup permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;CI / CD Setup&lt;/h2&gt;
&lt;h3 id=&quot;express-api&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#express-api&quot; aria-label=&quot;express api permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Express API&lt;/h3&gt;
&lt;p&gt;For the API it&apos;s super simple. On my Ubuntu server I made sure I had git installed and cloned the API Repo using a Deployment Key. Then setup a brand new locked down SSH User that GitHub could use to run commands within specific folders on my server.&lt;/p&gt;
&lt;p&gt;Since I haven&apos;t setup any sort of testing on the project yet, there&apos;s not a whole lot that the GitHub Workflow is actually doing. Runs through a &quot;Testing&quot; step that does nothing, and once that&apos;s done SSHs into my server, pulls the latest commit from GitHub and Restarts PM2 ( The Node Process Manager ) which starts the API back up with the latest code.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yml&quot;&gt;&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;branches&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; main

&lt;span class=&quot;token key atrule&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;runs-on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ubuntu&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;latest
    &lt;span class=&quot;token key atrule&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; actions/checkout@v2

      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; actions/setup&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;node@v1
        &lt;span class=&quot;token key atrule&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;node-version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt;

  &lt;span class=&quot;token key atrule&quot;&gt;deploy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;needs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;test&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;runs-on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ubuntu&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;latest

    &lt;span class=&quot;token key atrule&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; SSH and deploy node app
      &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; appleboy/ssh&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;action@master
      &lt;span class=&quot;token key atrule&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; secrets.SSH_HOST &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; secrets.SSH_USERNAME &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; secrets.SSH_KEY &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; 
        &lt;span class=&quot;token key atrule&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; secrets.SSH_PORT &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token scalar string&quot;&gt;
          cd ${{ secrets.API_DIR }}
          git pull origin main
          yarn --production
          pm2 restart server&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;react-app&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#react-app&quot; aria-label=&quot;react app permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;React App&lt;/h3&gt;
&lt;p&gt;Since there&apos;s actually a Build step when using Create-React-App, the React CI/CD workflow has a few more steps. It&apos;s not as complicated, but I was ripping my hair out trying to get it to work.&lt;/p&gt;
&lt;p&gt;No matter what, running &lt;code class=&quot;language-text&quot;&gt;yarn build&lt;/code&gt; locally would work, but just wouldn&apos;t complete in the GitHub Action. Well it turns out GitHub Actions (and most CI platforms) sets the CI environment variable to True. This causes the Create React App Build Scripts to treat every warning like an error in the build.&lt;/p&gt;
&lt;p&gt;On one hand it makes sense, you shouldn&apos;t be pushing projects with ESLint Errors but as a solo dev, I ain&apos;t got time for that. The solution I figured out was you have to explicitly set &lt;code class=&quot;language-text&quot;&gt;CI=false&lt;/code&gt; in your Workflow file when running &lt;code class=&quot;language-text&quot;&gt;yarn build&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yml&quot;&gt;&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;  &lt;span class=&quot;token key atrule&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# ...&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Install Dependencies
      &lt;span class=&quot;token key atrule&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; yarn
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Build
      &lt;span class=&quot;token key atrule&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; CI=&quot;false&quot; yarn build&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;From there the &lt;code class=&quot;language-text&quot;&gt;./build&lt;/code&gt; directory contains the static files that get SFTP&apos;d with the same SSH user as the API to the site directory on the server.&lt;/p&gt;
&lt;h2 id=&quot;mobile-version-css-cleanup&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#mobile-version-css-cleanup&quot; aria-label=&quot;mobile version css cleanup permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Mobile Version CSS Cleanup&lt;/h2&gt;
&lt;p&gt;I spend a lot of time on my phone and having Simple Tweets work on all devices is absolutely necessary. It wasn&apos;t that hard to get things looking fresh and clean on the phones, but it was something I&apos;d been putting off in favor of more fuctionality based fixes.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1200px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 49.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA1UlEQVR42pXQMUsDUQwH8H7/71Dbwc12bBc3RVzE5WqhxTqctWqrBe/+eS8vl7yIDiLlhjv4EwjkB0kGROF/gKAcrku62cmelMRM9WTmL4OTvkZwCeMFhkteHaWsNZuBqAceLTDbkCd8IcTIAHrgswKXpbhnaczM+q09KjDdCCS/wLa1VcTUtnkbTuF8iclj2qN5RyPmITKhM56uaf5Eu8PxsyL3/Ht2ZzxZ0e2bek5EpKrMffDFQ3X1LO7Oln9qRwyQCN8X27v14SPaa8UppRgj0PLtb0v6OPPe6hR3AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Simple Tweets Mobile Version&quot;
        title=&quot;Simple Tweets Mobile Version&quot;
        src=&quot;/static/d59a55cd6200d822ad2c4139c8d5b4cb/c1b63/simple-tweets-mobile.png&quot;
        srcset=&quot;/static/d59a55cd6200d822ad2c4139c8d5b4cb/5a46d/simple-tweets-mobile.png 300w,
/static/d59a55cd6200d822ad2c4139c8d5b4cb/0a47e/simple-tweets-mobile.png 600w,
/static/d59a55cd6200d822ad2c4139c8d5b4cb/c1b63/simple-tweets-mobile.png 1200w,
/static/d59a55cd6200d822ad2c4139c8d5b4cb/24bcc/simple-tweets-mobile.png 1781w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Now I can use it on the go, and dump some tweets out of my mind, wherever I am!&lt;/p&gt;
&lt;h2 id=&quot;closed-beta-coming-soon&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#closed-beta-coming-soon&quot; aria-label=&quot;closed beta coming soon permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Closed Beta Coming Soon!&lt;/h2&gt;
&lt;p&gt;Up until know, someone could&apos;ve found the url for the beta version, log in with their BlueSky and use the App. I got that locked down so only select accounts can log in to the Beta. I&apos;m going to be reaching out to a handful of BlueSky friends in the coming days to see if they&apos;d be willing to help me test some stuff.  &lt;a href=&quot;https://twitter.com/messages/compose?recipient_id=246555108&amp;#x26;text=Simple%20Tweets%20is%20AWESOME&quot;&gt;Shoot me a DM on BlueSky&lt;/a&gt; if you want to help out.&lt;/p&gt;
&lt;h2 id=&quot;whats-next&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#whats-next&quot; aria-label=&quot;whats next permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What&apos;s Next&lt;/h2&gt;
&lt;p&gt;The last piece that I need to figure out is how to upload and schedule pictures with tweets. I&apos;m hoping to figure out how to make that work without having to store any user files, since that can get huge. I think I&apos;ll be able to just send the file directly from the users browser to BlueSky and then store the Media ID for posting eventually. That really depends on BlueSky&apos;s media deletion strategy ( do they delete media that didn&apos;t get attached to a tweet within 2 hours? Weeks? never? ) Just more I&apos;ll have to research.&lt;/p&gt;
&lt;p&gt;{{{vert}}}&lt;/p&gt;
&lt;h1 id=&quot;day-99--saturday-july-26th-2020&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#day-99--saturday-july-26th-2020&quot; aria-label=&quot;day 99  saturday july 26th 2020 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Day 99 : Saturday, July 26th 2020&lt;/h1&gt;
&lt;h2 id=&quot;long-time-no-talk&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#long-time-no-talk&quot; aria-label=&quot;long time no talk permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Long Time No Talk.&lt;/h2&gt;
&lt;p&gt;It&apos;s been a while. I&apos;ve, thankfully, been working the whole time through the pandemic, both on some client work and my 9-5. I opened the project back up because I&apos;m making a point to be more active on BlueSky and that was the whole reason I started building Simple Tweets in the first place.&lt;/p&gt;
&lt;p&gt;Boot it up with:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=jack data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; run startBoth&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;which runs both the Frontend React code as well as the backend Node server. Everything loads fine, but I try to sign in with BlueSky and it doesn&apos;t work. It just sits spinning on the BlueSky oAuth page, waiting for my server to respond then after a minute, it kicks back an Error 500: Service Unavailable.&lt;/p&gt;
&lt;p&gt;I thought maybe it was a lingering Cookie issue, so I cleared all those out, but still no response on the login.&lt;/p&gt;
&lt;p&gt;I check the server logs and it comes back with &quot;Login Successful&quot; but never redirects the user to be logged in.&lt;/p&gt;
&lt;p&gt;I&apos;m perplexed but tired, it&apos;s late so I just shut it down and go to bed. I&apos;ll revisit in a few days probably.&lt;/p&gt;
&lt;p&gt;{{{vert}}}&lt;/p&gt;
&lt;h1 id=&quot;day-12--wednesday-april-29th-2020&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#day-12--wednesday-april-29th-2020&quot; aria-label=&quot;day 12  wednesday april 29th 2020 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Day 12 : Wednesday, April 29th, 2020&lt;/h1&gt;
&lt;h2 id=&quot;better-late-than-never-right&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#better-late-than-never-right&quot; aria-label=&quot;better late than never right permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Better Late Than Never, Right?&lt;/h2&gt;
&lt;p&gt;I&apos;m starting this build log off a little bit after I started the project (currently titled Simple Tweets, but probably going to change). I didn&apos;t really have the idea to write down the whole process till I was well into an MVP. Either way, better late than never, right? According to GitHub the very first commit was on April 17, 2020, so that makes this Day 12.&lt;/p&gt;
&lt;p&gt;My vision for Simple Tweets is a tool you can use to schedule tweets without thinking about it. You decide the max times it will tweet for you per day, whether you want it random or on a schedule, and then scheduling tweets is as simple as typing it out and hitting schedule.&lt;/p&gt;
&lt;p&gt;I&apos;m not really sure if this is something BlueSky users really &lt;em&gt;need&lt;/em&gt; per se, but it&apos;s been a massive learning opportunity for me so far. For now, that&apos;s all I really care about.&lt;/p&gt;
&lt;h2 id=&quot;design-to-prototype&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#design-to-prototype&quot; aria-label=&quot;design to prototype permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Design To Prototype&lt;/h2&gt;
&lt;p&gt;The idea had initially popped into my head a while back (way back in February, now that I looked it up) for a &quot;minimalist tweeter&quot;. I wanted something where I could just spam the tweet box without actually spamming BlueSky. I threw together this mockup in Illustrator shortly after having the idea.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1200px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 80%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC40lEQVR42mOQm/dWL7FRPyzfIqHSIa3OPbvJOaPBPrXWNqXGKb3eILIYD2KAa7ZMqPTJb/MtbPfKa/XOb/XMbXHJbNSPKEZDWDQbRhToRRTZpdQ4ZTTYp9U6pdc7pNYZRpWYxJSBUCyUNI0tM4ouRddsEF5gEFlik1ztktnonNnoktHonNHgnAkmYcgxo9Eps8kmuUY/ogjV5vACsKtAovowg42iS42iS+3T6rxzmyxy+4xbt1l27dEvngexCcXP5vEVDml1dim1Dml1Dml19qm1RtGl+mAjTGLKDGPKjeJrjBNqDWIrsQVYYpVfQbtfYYdHTrNHbotvQZt+ZLF2aIF2aIFOaIFeWKE+yHWFBjA3ozo7slgnrEAnrMA6qQrkhNRar7xWr7wW/6IO16wmt6wm66Qq7FFlGF6gF1GsF1GkH1FkFF1qGltul1ITVNLlV9geXNrtmFZnGlduEgMKZ31km+XnvdEHO9smqdotu8kupdYpo143vFDFP1vJL0vJL0vRN1M1IFs1IEc3vNAsrtwsrtw4BhpbDFLzP4KjKt8ktjy1aWrlpEU1U5fmdc3OaJ2e1T4zq21GdvvMzNbpGa3TM9tmFPbMja+bjLDZauoFo6QG/bB8g9iKzr4ZV44dvvfo8a1bt+7eu/vw4cN79+/fu3f/7t27t2/fuX37zr/fP/eeuqQVkm8YBY4qy/wpRrEVIM+E5XtXzUiZcyBy8vbwSdvjpu0Mm7w9YcauqMnbQydui52xO6J1YXLDJL/CDj14ItELy4OGfnRpdkP/vBXr1+0/uXrXkbV7jq7adWTN7qObDp7afOjM5sNnNh48tePYubZ5a3XDCg0hmg3ADoBobpq48MTZa5eevj97/+WFh29O331+4eHrex9+Pf7y79HX/w/efH7/8dOq3Ue1Qwugzob5vgSU6FJbzUrnmhZOMyyYZlI43SB/mmXJTIO8KXo5k4wLpmsnNBpGFOpHlsADDACm75mmNcNdSQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Simple Tweets First Mockup&quot;
        title=&quot;Simple Tweets First Mockup&quot;
        src=&quot;/static/e16682f5cd5c32de32c7c25b52135e35/c1b63/Tweet-Scheduler-mockup.png&quot;
        srcset=&quot;/static/e16682f5cd5c32de32c7c25b52135e35/5a46d/Tweet-Scheduler-mockup.png 300w,
/static/e16682f5cd5c32de32c7c25b52135e35/0a47e/Tweet-Scheduler-mockup.png 600w,
/static/e16682f5cd5c32de32c7c25b52135e35/c1b63/Tweet-Scheduler-mockup.png 1200w,
/static/e16682f5cd5c32de32c7c25b52135e35/21b4d/Tweet-Scheduler-mockup.png 1280w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Two months go by, and I finally decide to build the thing. I knew I wanted to build the thing with React, and I had dabbled with a project using a MongoDB, Express, React &amp;#x26; Node (MERN) stack earlier so that&apos;s what I chose for this project.&lt;/p&gt;
&lt;h2 id=&quot;time-to-react&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#time-to-react&quot; aria-label=&quot;time to react permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Time To React&lt;/h2&gt;
&lt;p&gt;The first thing I threw together was the React frontend. Had a lot of fun just recreating the mockup but with code (honestly my favorite part of any project). I started off with the fixed sidebar, and the tweet box. Used state to set the Tweet character limit, track the tweet as you&apos;re typing and validate the current entry.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;validateTweet&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;tweet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; tweetCharCount &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; tweet&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;CURRENT&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;IMAGE&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;OF&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;SIMPLE&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;TWEETS&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;tweetCharCount &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;tweetCharCount &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; tweetCharLimit&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Very simple for now, but essentially checks if the tweet length is greater than 0 and less than 280. After a few days of back and forth, I eventually settled on going with a minimal light theme instead of dark. I&apos;ll probably add a toggle for that down the line, but for now I don&apos;t really care.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1200px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 50%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAKABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIDBf/EABQBAQAAAAAAAAAAAAAAAAAAAAH/2gAMAwEAAhADEAAAAdx5qlgB/8QAGRAAAQUAAAAAAAAAAAAAAAAAAgAQMTJD/9oACAEBAAEFAhq2Yyv/xAAVEQEBAAAAAAAAAAAAAAAAAAABEP/aAAgBAwEBPwEn/8QAFREBAQAAAAAAAAAAAAAAAAAAARD/2gAIAQIBAT8BZ//EABYQAQEBAAAAAAAAAAAAAAAAABABgf/aAAgBAQAGPwKOP//EABoQAQABBQAAAAAAAAAAAAAAAAEQABEhMaH/2gAIAQEAAT8h5yTSibMx/9oADAMBAAIAAwAAABCDz//EABYRAAMAAAAAAAAAAAAAAAAAAAEQMf/aAAgBAwEBPxCAv//EABURAQEAAAAAAAAAAAAAAAAAABAx/9oACAECAQE/EKP/xAAeEAEAAQIHAAAAAAAAAAAAAAABEQAQITFBUXGx8f/aAAgBAQABPxATj+VQ8Wz+oeqeSk2m3//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Simple Tweets Now&quot;
        title=&quot;Simple Tweets Now&quot;
        src=&quot;/static/283464ec872683937c1feb9b6d40de05/e5166/simple-tweets-now.jpg&quot;
        srcset=&quot;/static/283464ec872683937c1feb9b6d40de05/f93b5/simple-tweets-now.jpg 300w,
/static/283464ec872683937c1feb9b6d40de05/b4294/simple-tweets-now.jpg 600w,
/static/283464ec872683937c1feb9b6d40de05/e5166/simple-tweets-now.jpg 1200w,
/static/283464ec872683937c1feb9b6d40de05/d9c39/simple-tweets-now.jpg 1800w,
/static/283464ec872683937c1feb9b6d40de05/0a188/simple-tweets-now.jpg 1908w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;oauth-is-pretty-cool-now-that-i-have-a-better-grasp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#oauth-is-pretty-cool-now-that-i-have-a-better-grasp&quot; aria-label=&quot;oauth is pretty cool now that i have a better grasp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;oAuth Is Pretty Cool, Now That I Have A Better Grasp&lt;/h2&gt;
&lt;p&gt;Since the tool is entirely focused on BlueSky, the only way my users can login is with BlueSky. Makes Sense. That just meant I had to figure out oAuth. It&apos;s been a pretty big beast for me that I&apos;ve yet to attempt to tackle, but now is the time.&lt;/p&gt;
&lt;p&gt;The backend is based around Express, and MongoDB. I&apos;m using &lt;a href=&quot;http://www.passportjs.org/&quot;&gt;Passport.js&lt;/a&gt; for Authentication and the beautifully put together &lt;a href=&quot;https://github.com/jaredhanson/passport-twitter&quot;&gt;passport-twitter&lt;/a&gt; package to handle the Authentication.&lt;/p&gt;
&lt;p&gt;One of the first big roadblocks I ran into was the fact that I had set up a virtual host so that &lt;code class=&quot;language-text&quot;&gt;simple-tweets.local&lt;/code&gt; would resolve to my &lt;code class=&quot;language-text&quot;&gt;localhost:3000&lt;/code&gt;, but I was having weird issues with the cookies being set to the wrong domain somewhere in the oAuth loop. Lots of googling and hair ripping later, I reset every path in the project to use &lt;a href=&quot;http://127.0.0.1&quot;&gt;http://127.0.0.1&lt;/a&gt; as well as in the BlueSky Developer tools. Once we have it live on a server with a domain pointing to it, we shouldn&apos;t have this problem, but now I&apos;ll know what to look for.&lt;/p&gt;
&lt;p&gt;I&apos;ll continue to update this post as the project progresses.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Why I Post On Unsplash]]></title><description><![CDATA[My first Unsplash photo was posted on August 18, 2016. In that time I've accumulated almost 3 Million Views, and over 12,000 downloads across 30+ photos.  This Is Why I Post On Unsplash For someone with such a small following where most of my…]]></description><link>https://jackharner.com//blog/why-i-post-on-unsplash/</link><guid isPermaLink="false">https://jackharner.com//blog/why-i-post-on-unsplash/</guid><pubDate>Fri, 14 Feb 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;My &lt;a href=&quot;https://unsplash.com/photos/UB1PLnqNAyY&quot;&gt;first Unsplash photo&lt;/a&gt; was posted on August 18, 2016. In that time I&apos;ve accumulated almost 3 Million Views, and over 12,000 downloads across 30+ photos.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1200px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 22.333333333333336%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAEABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAEF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAAB3qAH/8QAFBABAAAAAAAAAAAAAAAAAAAAEP/aAAgBAQABBQJ//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAFBABAAAAAAAAAAAAAAAAAAAAEP/aAAgBAQAGPwJ//8QAFhABAQEAAAAAAAAAAAAAAAAAARAR/9oACAEBAAE/IQy//9oADAMBAAIAAwAAABCDz//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8QP//EABkQAQACAwAAAAAAAAAAAAAAAAERQQAQUf/aAAgBAQABPxAJRb3AJW3X/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;~3 Million Views, and 12,000+ downloads across 30+ photos&quot;
        title=&quot;~3 Million Views, and 12,000+ downloads across 30+ photos&quot;
        src=&quot;/static/de09b957acb088501c93fa845e1202ab/e5166/unsplash-stats.jpg&quot;
        srcset=&quot;/static/de09b957acb088501c93fa845e1202ab/f93b5/unsplash-stats.jpg 300w,
/static/de09b957acb088501c93fa845e1202ab/b4294/unsplash-stats.jpg 600w,
/static/de09b957acb088501c93fa845e1202ab/e5166/unsplash-stats.jpg 1200w,
/static/de09b957acb088501c93fa845e1202ab/12406/unsplash-stats.jpg 1348w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;h1 id=&quot;this-is-why-i-post-on-unsplash&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#this-is-why-i-post-on-unsplash&quot; aria-label=&quot;this is why i post on unsplash permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;This Is Why I Post On Unsplash&lt;/h1&gt;
&lt;/blockquote&gt;
&lt;p&gt;For someone with such a small following where most of my interactions across social media are confined to people I know in real life, getting 3 Million Views on &lt;em&gt;anything&lt;/em&gt; is &lt;strong&gt;AMAZING&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A lot of people complain about Unsplash &quot;ruining the professional photography market&quot;, but I say F*ck &apos;em. If your business is being &quot;ruined&quot; by people offering up photos for free, then you&apos;re probably in the wrong line of work.&lt;/p&gt;
&lt;h2 id=&quot;free-does-not-mean-bad&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#free-does-not-mean-bad&quot; aria-label=&quot;free does not mean bad permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;FREE Does Not Mean BAD&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1200px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAEEAgUG/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAHn5tkprA3smpiLn//EABwQAAEDBQAAAAAAAAAAAAAAAAABAxEEEBMUQf/aAAgBAQABBQK+q4LTumBw7BB//8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFREBAQAAAAAAAAAAAAAAAAAAESD/2gAIAQIBAT8BI//EABsQAAEEAwAAAAAAAAAAAAAAAAAQIDEyQZGh/9oACAEBAAY/AlxsjpVn/8QAGhABAQADAQEAAAAAAAAAAAAAAQARMWEQQf/aAAgBAQABPyGRNmPOMfUGdculg2N//9oADAMBAAIAAwAAABAsML//xAAXEQADAQAAAAAAAAAAAAAAAAAAAREQ/9oACAEDAQE/EKirIj//xAAXEQADAQAAAAAAAAAAAAAAAAAAAREQ/9oACAECAQE/EKI8p//EAB8QAAICAQQDAAAAAAAAAAAAAAERACFBEDFRgZGhwf/aAAgBAQABPxCJWMGGNxzpQ/WlI0CFDUICvGQfsUCBGZAhbkdz/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Freely Available NASA Photos on Unsplash&quot;
        title=&quot;Freely Available NASA Photos on Unsplash&quot;
        src=&quot;/static/5555421cf590f29885c06a903e2d73f5/e5166/nasa-Yj1M5riCKk4-unsplash.jpg&quot;
        srcset=&quot;/static/5555421cf590f29885c06a903e2d73f5/f93b5/nasa-Yj1M5riCKk4-unsplash.jpg 300w,
/static/5555421cf590f29885c06a903e2d73f5/b4294/nasa-Yj1M5riCKk4-unsplash.jpg 600w,
/static/5555421cf590f29885c06a903e2d73f5/e5166/nasa-Yj1M5riCKk4-unsplash.jpg 1200w,
/static/5555421cf590f29885c06a903e2d73f5/d9c39/nasa-Yj1M5riCKk4-unsplash.jpg 1800w,
/static/5555421cf590f29885c06a903e2d73f5/df51d/nasa-Yj1M5riCKk4-unsplash.jpg 2400w,
/static/5555421cf590f29885c06a903e2d73f5/314c6/nasa-Yj1M5riCKk4-unsplash.jpg 5735w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Some of my favorite photos on the internet are freely available on Unsplash. Even &lt;a href=&quot;https://unsplash.com/@nasa&quot;&gt;NASA&lt;/a&gt; is on Unsplash. Hubble Space Telescope photos are freely available for anyone to use for any reason. That is INSANE. Unfortunately they did strip out the EXIF data on the Hubble photos (Camera Type: $4.7 billion Space Telescope, Aperature: f3.4 Meters).&lt;/p&gt;
&lt;p&gt;There are some &lt;em&gt;really&lt;/em&gt; high quality photos available and the fact that you don&apos;t have to pay a dime for them is pretty amazing.&lt;/p&gt;
&lt;p&gt;{{{vert}}}&lt;/p&gt;
&lt;h2 id=&quot;all-ships-rise-with-the-tide&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#all-ships-rise-with-the-tide&quot; aria-label=&quot;all ships rise with the tide permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;All Ships Rise With The Tide&lt;/h2&gt;
&lt;p&gt;Unsplash has been doing a lot to push forward the photography industry as a whole. They recently launched &lt;a href=&quot;https://unsplash.com/brands&quot;&gt;Unsplash for Brands&lt;/a&gt; which was there way of bringing Branded stock photos to the site. For example, one of the first Brands brought on was Square. The partnership looks like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;They hire photographers from the Unsplash community to make branded stock photos of their cash register and payment processing products.&lt;/li&gt;
&lt;li&gt;These photos then show up on Unsplash for searches like &quot;Cash Register&quot;&lt;/li&gt;
&lt;li&gt;Then eventually proliferate out to the greater internet through blog posts and other mediums.&lt;/li&gt;
&lt;li&gt;Creating exposure for the brands, revenue for Unsplash, and nice little payday for some Unsplash contributors.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1200px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIFAwT/xAAWAQEBAQAAAAAAAAAAAAAAAAABAAL/2gAMAwEAAhADEAAAAdOtHyzSmT//xAAaEAADAQADAAAAAAAAAAAAAAABAhEDABIh/9oACAEBAAEFAstLxl7BrUUBtDAvq//EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAEDAQE/AVf/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAaEAEAAgMBAAAAAAAAAAAAAAABABECECEx/9oACAEBAAY/AqPSddJiVUIM/8QAGxABAAICAwAAAAAAAAAAAAAAAQARITFRofH/2gAIAQEAAT8hcoZKyzYVnEPhA4jtNMG2pV82XP/aAAwDAQACAAMAAAAQv8//xAAXEQADAQAAAAAAAAAAAAAAAAAAAREx/9oACAEDAQE/EGphB//EABYRAQEBAAAAAAAAAAAAAAAAAAEAEf/aAAgBAgEBPxAdsb//xAAdEAEAAgMBAAMAAAAAAAAAAAABACERMUFRcYHB/9oACAEBAAE/EGjYD6jm9brUAMQOqz7iddPt78QKihVqertZTSV3lL+TFgJoJ//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Square Sponsored Photo From Unsplash&quot;
        title=&quot;Square Sponsored Photo From Unsplash&quot;
        src=&quot;/static/fef525c5e04489b5790a35ecb0b02bdc/e5166/clay-banks-XvS-uKUoUao-unsplash.jpg&quot;
        srcset=&quot;/static/fef525c5e04489b5790a35ecb0b02bdc/f93b5/clay-banks-XvS-uKUoUao-unsplash.jpg 300w,
/static/fef525c5e04489b5790a35ecb0b02bdc/b4294/clay-banks-XvS-uKUoUao-unsplash.jpg 600w,
/static/fef525c5e04489b5790a35ecb0b02bdc/e5166/clay-banks-XvS-uKUoUao-unsplash.jpg 1200w,
/static/fef525c5e04489b5790a35ecb0b02bdc/d9c39/clay-banks-XvS-uKUoUao-unsplash.jpg 1800w,
/static/fef525c5e04489b5790a35ecb0b02bdc/df51d/clay-banks-XvS-uKUoUao-unsplash.jpg 2400w,
/static/fef525c5e04489b5790a35ecb0b02bdc/12609/clay-banks-XvS-uKUoUao-unsplash.jpg 3000w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Unsplash gets paid so it can remain free, Brands get their products in front of a massive audience, and they &lt;em&gt;have&lt;/em&gt; to hire photographers from the Unsplash community to take the photos. It&apos;s a win-win-win for everybody!&lt;/p&gt;
&lt;h2 id=&quot;take-a-penny-leave-a-penny&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#take-a-penny-leave-a-penny&quot; aria-label=&quot;take a penny leave a penny permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Take A Penny, Leave A Penny&lt;/h2&gt;
&lt;p&gt;I contribute to Unsplash because without it, I wouldn&apos;t have been able to use and download 100s of fantastic quality photos for use in both personal and professional projects.&lt;/p&gt;
&lt;p&gt;I contribute to Unsplash because without it, there&apos;s no way 12,000+ people would have used my photos.&lt;/p&gt;
&lt;p&gt;I contribute to Unsplash because without it, my sites and campaigns would be way uglier or I would&apos;ve spent a fortune on Stock Photos.&lt;/p&gt;
&lt;p&gt;I contribute to Unsplash because I use the site almost daily, and it&apos;s my way of giving back to the people who gave first.&lt;/p&gt;
&lt;p&gt;Check me out on &lt;a href=&quot;https://unsplash.com/@jackharner&quot;&gt;Unsplash&lt;/a&gt;, or give me a follow on &lt;a href=&quot;https://bsky.app/profile/jackharner.com&quot;&gt;BlueSky&lt;/a&gt; and let me know if you&apos;ve used on of my photos or hit me with your Unsplash username and I&apos;ll give you a follow!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Yarn vs. NPM]]></title><description><![CDATA[NPM (Node Package Manager) and Yarn are both JavaScript based package managers for ease of installing 3rd Party Tools & Libraries into your modern web development workflow. They revolutionized the way people shared code. Instead of having to…]]></description><link>https://jackharner.com//blog/yarn-vs-npm/</link><guid isPermaLink="false">https://jackharner.com//blog/yarn-vs-npm/</guid><pubDate>Sun, 19 Jan 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;NPM (Node Package Manager) and Yarn are both JavaScript based package managers for ease of installing 3rd Party Tools &amp;#x26; Libraries into your modern web development workflow. They revolutionized the way people shared code. Instead of having to tediously copy and paste, or even worse, link to a hosted version of the library, now you fetch a library or module and store it locally in your project. Yarn and NPM work fairly similarly, but have a few key differences in how they operate.&lt;/p&gt;
&lt;h2 id=&quot;major-differences-between-yarn--npm&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#major-differences-between-yarn--npm&quot; aria-label=&quot;major differences between yarn  npm permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Major Differences Between Yarn &amp;#x26; NPM&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;NPM was developed as an open source project in 2009. Yarn was released by Facebook in 2016 as an improvement upon the foundation that NPM laid.&lt;/li&gt;
&lt;li&gt;Yarn uses &lt;code class=&quot;language-text&quot;&gt;yarn add&lt;/code&gt; while NPM uses &lt;code class=&quot;language-text&quot;&gt;npm install&lt;/code&gt; (Can be confusing when switching between the two.)&lt;/li&gt;
&lt;li&gt;Yarn keeps a copy of packages you download stored locally. I&apos;ll explain why in a little bit.&lt;/li&gt;
&lt;li&gt;Both Yarn and NPM use the &lt;code class=&quot;language-text&quot;&gt;package.json&lt;/code&gt; file to get the packages to install. However, Yarn uses &lt;code class=&quot;language-text&quot;&gt;yarn.lock&lt;/code&gt; and NPM uses &lt;code class=&quot;language-text&quot;&gt;package-lock.json&lt;/code&gt; to more explicitly state which package version to get.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;a-breif-history-of-npm&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#a-breif-history-of-npm&quot; aria-label=&quot;a breif history of npm permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A Breif History of NPM&lt;/h2&gt;
&lt;p&gt;NPM was originally released back in January 2010 by Isaac Z. Schlueter and took the JavaScript world by storm. It was the inspiration for Yarn, developed by Facebook in 2016, PHP&apos;s package manager Composer, and more. Due to the popularity of the project they eventually incorporated as npm, inc in order to manage enterprise level relationships to ensure the success of the project and the JavaScript community as a whole.&lt;/p&gt;
&lt;h2 id=&quot;yarn-module-cache&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#yarn-module-cache&quot; aria-label=&quot;yarn module cache permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Yarn Module Cache&lt;/h2&gt;
&lt;p&gt;Every time you install a new package with Yarn, it stores a copy of it locally on your computer. This way when multiple projects require the same package, Yarn doesn&apos;t have to go download the required package again, it just grabs it off your hard drive and puts it in the project you&apos;re installing, saving you time and bandwidth.&lt;/p&gt;
&lt;h2 id=&quot;blazing-saddles-package-manager-boogalo&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#blazing-saddles-package-manager-boogalo&quot; aria-label=&quot;blazing saddles package manager boogalo permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Blazing Saddles: Package Manager Boogalo&lt;/h2&gt;
&lt;p&gt;According to a test done by &lt;a href=&quot;https://github.com/appleboy/npm-vs-yarn&quot;&gt;GitHub user appleboy&lt;/a&gt; that you can reproduce yourself, Yarn both with and without it&apos;s cache is significantly faster at installing modules, and even installs without internet! (assuming you&apos;ve cached the package you&apos;re installing).&lt;/p&gt;
&lt;p&gt;Here are the results of their test comparing NPM to Yarn:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test&lt;/th&gt;
&lt;th&gt;npm install&lt;/th&gt;
&lt;th&gt;npm ci&lt;/th&gt;
&lt;th&gt;yarn&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;install without cache (without node_modules)&lt;/td&gt;
&lt;td&gt;3m&lt;/td&gt;
&lt;td&gt;3m&lt;/td&gt;
&lt;td&gt;1m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;install with cache (without node_modules)&lt;/td&gt;
&lt;td&gt;1m&lt;/td&gt;
&lt;td&gt;18s&lt;/td&gt;
&lt;td&gt;30s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;install with cache (with node_modules)&lt;/td&gt;
&lt;td&gt;54s&lt;/td&gt;
&lt;td&gt;21s&lt;/td&gt;
&lt;td&gt;2s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;install without internet (with node_modules)&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;2s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Blazing Fast! Even without using a cache, Yarn is 200% faster than NPM.&lt;/p&gt;
&lt;p&gt;{{{vert}}}&lt;/p&gt;
&lt;h2 id=&quot;how-to-install-yarn&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-to-install-yarn&quot; aria-label=&quot;how to install yarn permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How To Install Yarn&lt;/h2&gt;
&lt;p&gt;After doing the research for this post I&apos;m definitely sticking to Yarn for projects moving forward. Here&apos;s how you can install Yarn and see for yourself just how fast it is and get started integrating it into your workflow.&lt;/p&gt;
&lt;h3 id=&quot;windows&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#windows&quot; aria-label=&quot;windows permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Windows&lt;/h3&gt;
&lt;p&gt;Go to the &lt;a href=&quot;https://classic.yarnpkg.com/en/docs/install&quot;&gt;Yarn Installation Page&lt;/a&gt;, make your you have Node.js installed, download the version you want and run the installer. Yarn goes through and installs for you.&lt;/p&gt;
&lt;h3 id=&quot;macos&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#macos&quot; aria-label=&quot;macos permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;macOS&lt;/h3&gt;
&lt;p&gt;You can install Yarn with HomeBrew:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=jack data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;brew &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;ubuntu--linux&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ubuntu--linux&quot; aria-label=&quot;ubuntu  linux permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Ubuntu / Linux&lt;/h3&gt;
&lt;p&gt;Go to the &lt;a href=&quot;https://classic.yarnpkg.com/en/docs/install&quot;&gt;Yarn Installation Page&lt;/a&gt; and follow the steps. You&apos;ll have to add Yarn&apos;s repo to APT and then install through there.&lt;/p&gt;
&lt;h3 id=&quot;npm---dont-do-this&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#npm---dont-do-this&quot; aria-label=&quot;npm   dont do this permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;NPM - Don&apos;t Do This&lt;/h3&gt;
&lt;p&gt;You can even install Yarn with NPM:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=jack data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--global&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Although, for security reasons that I don&apos;t fully understand they recommend NOT installing Yarn through NPM and instead installing Yarn based on your specific operating system (&lt;a href=&quot;https://classic.yarnpkg.com/en/docs/install#debian-stable&quot;&gt;Ubuntu/Debian&lt;/a&gt;, &lt;a href=&quot;https://classic.yarnpkg.com/en/docs/install#mac-stable&quot;&gt;Mac&lt;/a&gt;, &lt;a href=&quot;https://classic.yarnpkg.com/en/docs/install#windows-stable&quot;&gt;Windows&lt;/a&gt;).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;are-you-going-to-make-the-switch&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#are-you-going-to-make-the-switch&quot; aria-label=&quot;are you going to make the switch permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Are you going to make the switch?&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Let me know on twitter &lt;a href=&quot;https://bsky.app/profile/jackharner.com&quot;&gt;@JackHarner&lt;/a&gt; if you do and which package manager you prefer! Thanks for reading!!&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded></item><item><title><![CDATA[Take High-DPI Screenshots In Firefox]]></title><description><![CDATA[There are several ways to take a screenshot in Firefox. Right Click Context Menu First up you want to Right Click anywhere on the page and select "Take a Screenshot".  This will pop up Firefox's built in screenshot tool. It allows you to select…]]></description><link>https://jackharner.com//blog/high-dpi-firefox-screenshots/</link><guid isPermaLink="false">https://jackharner.com//blog/high-dpi-firefox-screenshots/</guid><pubDate>Tue, 07 Jan 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;There are several ways to take a screenshot in Firefox.&lt;/p&gt;
&lt;h2 id=&quot;right-click-context-menu&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#right-click-context-menu&quot; aria-label=&quot;right click context menu permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Right Click Context Menu&lt;/h2&gt;
&lt;p&gt;First up you want to Right Click anywhere on the page and select &quot;Take a Screenshot&quot;.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1200px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 35.66666666666667%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAA7DAAAOwwHHb6hkAAAA/UlEQVR42pWRvWrDMBRGJVtRndaWDYkq6h9RiodOBo8enCE0Q4d69+bNL+A1EJrgJ+jasc/gx/uK1BZaaJtE8CFduPdwOSJ932MYBnRdh6IoQAg5Ka7rIooiBEEAIQTCMIRcLEF834dSClJK2/DbMKX0R75DHcexMW8TcupGZ4R8kdG2LaZpQtM0oI6DNE2htUZZlqiqCqt6hbquIUTwP5AxZovDYQ9zxnGE53mI4xtcK4VEa8Q6w21+hyzLrCKj6ihwu3u2wO1ub2sjO0li5ELifr5EfrXAhcsw4xyc87+BRqq5H9YbvLy+YfP49PkZH7LnbAafcVwyDnrE4Tvcs61Jm7RgOgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Right Click Anywhere and select &amp;quot;Take A Screenshot&amp;quot;&quot;
        title=&quot;Right Click Anywhere and select &amp;quot;Take A Screenshot&amp;quot;&quot;
        src=&quot;/static/abf870b0b6bf850accecc41e605cd133/c1b63/screenshot.png&quot;
        srcset=&quot;/static/abf870b0b6bf850accecc41e605cd133/5a46d/screenshot.png 300w,
/static/abf870b0b6bf850accecc41e605cd133/0a47e/screenshot.png 600w,
/static/abf870b0b6bf850accecc41e605cd133/c1b63/screenshot.png 1200w,
/static/abf870b0b6bf850accecc41e605cd133/d61c2/screenshot.png 1800w,
/static/abf870b0b6bf850accecc41e605cd133/111fd/screenshot.png 1831w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This will pop up Firefox&apos;s built in screenshot tool. It allows you to select specific elements, just what&apos;s visible on the page, or the full page. Highly useful for taking screenshots of specific components or if you just need a quick capture.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1200px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 53.333333333333336%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABLUlEQVR42q2QwW6CQBRFByoRKpoAOxkGEOmiewSMQUzBlbSLrv2j/oG/0l9pf+U2bxCxiTY2cXHybt67c9/MsNlsBs45LMsCY+xmVFXFUNelft/v8fn1jY/DAcw0TUwmE1AlExkURfmTzkN+qpqmYTwawWgXMNyZVtCT6enT6VTiBz6EEPD9APQtURRJSHce8tu2fTmQjHmeY7FYIMsyrFYrFEWBzWaDpmlQVRVeqgplWcp5kiTSH8fx9UAyUuByuUSapvIwhb3uGrztGpTr9WneLb4aSFcXngfuuj2cIwxDPMdPmIvg2Odwj3P6EsdxLgfeDV15AGEogxb1iNJjDoZ4VLVfvXO6DILVhkCte6iHXl+lFpCzf8IqChmH2Npz1FaErRO3ult0Xm8I/AGBNxLt73rugwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Firefox&amp;#39;s In Browser Screenshot Tool In Action&quot;
        title=&quot;Firefox&amp;#39;s In Browser Screenshot Tool In Action&quot;
        src=&quot;/static/6d55df3ccfbd18c0d8363ae0680701e9/c1b63/right-click__screenshot.png&quot;
        srcset=&quot;/static/6d55df3ccfbd18c0d8363ae0680701e9/5a46d/right-click__screenshot.png 300w,
/static/6d55df3ccfbd18c0d8363ae0680701e9/0a47e/right-click__screenshot.png 600w,
/static/6d55df3ccfbd18c0d8363ae0680701e9/c1b63/right-click__screenshot.png 1200w,
/static/6d55df3ccfbd18c0d8363ae0680701e9/d61c2/right-click__screenshot.png 1800w,
/static/6d55df3ccfbd18c0d8363ae0680701e9/84a78/right-click__screenshot.png 1832w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;developer-tools&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#developer-tools&quot; aria-label=&quot;developer tools permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Developer Tools&lt;/h2&gt;
&lt;p&gt;The second way you can take Screenshots in Firefox is through the Developer Tools. The first thing you&apos;ll need to do for this one is turn the Screenshot button on in the Settings.&lt;/p&gt;
&lt;p&gt;Open the Developer Tools with &lt;code class=&quot;language-text&quot;&gt;F12&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;Ctrl + Shift + I&lt;/code&gt; and click on the three dots in the upper right hand corner.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 941px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 64%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACKklEQVR42q2Rz04TQQCHewFM0aMeS0zqWxg9Ign0KbQKCVgIxhBCCQelj+ATCIqJXIye4GQIoIB0WwouBAttgYZ2/9LZ3e5+ZreRBUmMJv6SL7Mzk9+XnZlIJBLhPxOhra2NRE83Dx8lGR4ZoX9ggLGxMQb6+xkaesqz0VHSk5NkMtNkMhnSExOk02nGx8cZHk6RTCaJxWKhsKO9neWlFTQXaqaLbpgIy0EIG/NMBN9200MIC6PRxHIIYlk2jt2a9PX1hcJ4PI6U3UCoBq5ugC3AsfCEiSsMaArwLM60GoflKqd1jcODIrIsUyqVAuHU1FQovB2/w6sPWRalOvPLVV6v6MyuarxdM5j5ojK3bjC3KVj4LjB0FdFocHJyQqVSoVarBcIXL6cv3+Hi0hpV1WH74BRpv4pcUSkrFhXVplwXHOsuVc2mrqic1tVAViwWg9FPanAwFN643sn6xjdcwLUtHMs/YhPwuBTXQdFMFL31h+VSGUVRgq3nqVQojEajSFKu1XHd877n+XgBfhzHQT8TNPzH0g2Ojo7Q/TsHhq4Is9nzki/9HV9qWxaabmI2BKqqodZVdE0Ler29vaGwMxplV5b5m2g2HKvg6A6EhyGRSFx4lGsdvJt/T07eQyrkyW8XrpDbLlDYKbDwNc/HT5/JrW6ytbuDtJVn78c+d+/fawlnb3bjMxPwgDe3/sxMMPYEndkL6788EbPrCT5G12OM2D/QdXXue34C9DToy/qkH0sAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;inspector settings&quot;
        title=&quot;inspector settings&quot;
        src=&quot;/static/512b76729b193327f4c9728da43aa224/a8417/inspector-settings.png&quot;
        srcset=&quot;/static/512b76729b193327f4c9728da43aa224/5a46d/inspector-settings.png 300w,
/static/512b76729b193327f4c9728da43aa224/0a47e/inspector-settings.png 600w,
/static/512b76729b193327f4c9728da43aa224/a8417/inspector-settings.png 941w&quot;
        sizes=&quot;(max-width: 941px) 100vw, 941px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Once you have the settings open you&apos;ll need to enable &quot;Take a screenshot of the entire page&quot; under &quot;Available Toolbox Buttons&quot;.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1180px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 54.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABrUlEQVR42n1Sy27bMBDUMejRh9hqTkFQ1HZO7Q/knuQvGhSuY8Pw49z6Yytbsi2JokQ9SEkT7Mpy4wTpAgPuLslZzoDWp4sL/Hr6gclkisnzM8bjMWM0GmE2m2G1WmE+nzOWyyUWiwX3CJQTqD+dTtHpdGB1u12IMIQpKxhj8DrqGh9GUeg3Z2sMh7ewbNvGX8eBEAJaa5RliaqqGEqlSJLkVLd7dNZ1Pd5re0op9Pv9hnC73XKjnVQfnyalhBAR0jTlS22fat8PEMcxE1LkeY7BYNAQuq6LLMveEdLFMBTwfZ/zNtI0414cJzBvCXu9HjzXRZKo07Q2okgiFIK9fT2IpO73B95vfT8jJMlBEPBUKePTa0mS5+24T5LbIHsawohz8p4UMOFn28bO8xCGISIRQSUKKs1QVTV0oZm8yIszD4nksD9ARrKBjJl8SISd3iV2+x2bT/ISGaOWEtD6wy9D8oIgZAV5URy/UYGb/ldY365u4Lnemfml1jAEY6CN4fUdSsNSCfR68vXu9juszfUTnPvf2DyusXlYw3lYN/mx/i8e/63O/R84X37iBRvv8YlIZeA9AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;take screenshot setting&quot;
        title=&quot;take screenshot setting&quot;
        src=&quot;/static/ad33a20ee81f7a173452081ea131a3af/c83ae/take-screenshot-setting.png&quot;
        srcset=&quot;/static/ad33a20ee81f7a173452081ea131a3af/5a46d/take-screenshot-setting.png 300w,
/static/ad33a20ee81f7a173452081ea131a3af/0a47e/take-screenshot-setting.png 600w,
/static/ad33a20ee81f7a173452081ea131a3af/c83ae/take-screenshot-setting.png 1180w&quot;
        sizes=&quot;(max-width: 1180px) 100vw, 1180px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;What that does is adds a Camera button to the Developer Tools Toolbox Buttons, next to the settings button you used earlier. Click on it and it will take a Full Page screenshot of whatever page you opened the Developer Tools for. It saves the files in your default Download folder with the current timestamp.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1161px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAB2UlEQVR42o2STU8TURSGZ497DTojMe70L3TRFBs0LlybQj8xtvhHqIHf49bEhRWDEkwKJkBLCy21tDO983nn4zGdmXRhRHyTJ+fce3Lem3NylTtLS2wU1ilW3lCuVKlUqlSrNUrlMrXNTeqNBm/r9TQm1OsN3m1t0Wg0EtJc0zSUFU3l+tcEWwKEQJTGOTco8rEcH2H7eK6LL0ykJ1lbe45y777KXvuSnyfXHJ4KfnQtvp/pHPYER0OX9sCJORo4HF95CUOH0XiKEALbtpkZM3RdJ5vNotxdVvnUHrN/YvDhYMzHY4PPZzatjkOr49LqunH+pevytSfZ60n2+5KxLphMDWYzgWmaeJ5HJpNBeaipWKZIZwnSkW9ThGla6MLGsd3YTEqZGKqqimXZiV0YEUZJvIm4HoRYjot0JYHvI31JGIbkcrnEcL6H+N0oWvDneUFSQDc9RoaLMdbxXC+u5fN5FE3VsCzrZoO/MNeVCOic6kSWXCwi/yyPsqw+wDbN9DcE83n/SeSHEIUMdUmnbyJHFsz7gNzqKsqTlccIgnTV/8dcE2Aagh+Bl96/evES5dujAt3X21wUdxmUdri8hUFpl4viDv1Ck/7Ge3qFJueFbc7Xmxw8rfEbr4LzuLhjc54AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;screenshot button&quot;
        title=&quot;screenshot button&quot;
        src=&quot;/static/af65b90f3e0d5ffbe9852372fe9a283c/129e9/screenshot-button.png&quot;
        srcset=&quot;/static/af65b90f3e0d5ffbe9852372fe9a283c/5a46d/screenshot-button.png 300w,
/static/af65b90f3e0d5ffbe9852372fe9a283c/0a47e/screenshot-button.png 600w,
/static/af65b90f3e0d5ffbe9852372fe9a283c/129e9/screenshot-button.png 1161w&quot;
        sizes=&quot;(max-width: 1161px) 100vw, 1161px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;{{{vert}}}&lt;/p&gt;
&lt;h2 id=&quot;bust-out-the-big-guns&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#bust-out-the-big-guns&quot; aria-label=&quot;bust out the big guns permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Bust Out The Big Guns&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Need to take some massive (&gt;2,000px wide) screenshots?&lt;/p&gt;
&lt;p&gt;Well then, &lt;em&gt;&lt;strong&gt;It&apos;s Console Time!&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hit &lt;code class=&quot;language-text&quot;&gt;Ctrl + Shift + K&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;F12&lt;/code&gt; to open up the Firefox JavaScript Console. Firefox has a decent set of commands that you can run that interact with the Browser itself instead of the webpage. &lt;code class=&quot;language-text&quot;&gt;:screenshot&lt;/code&gt; is one of them.  If you type &lt;code class=&quot;language-text&quot;&gt;:screenshot&lt;/code&gt; into the console and hit &lt;code class=&quot;language-text&quot;&gt;Enter&lt;/code&gt; it will take a snapshot of the currently visible viewpoint.&lt;/p&gt;
&lt;p&gt;If you want a higher resolution screenshot than your monitor can provide, you need to set the &lt;code class=&quot;language-text&quot;&gt;--dpr&lt;/code&gt; flag. DPR Stands for Device Pixel Ratio, so setting &lt;code class=&quot;language-text&quot;&gt;--dpr 2&lt;/code&gt; tells Firefox to capture the image at 2x the resolution of the viewport (2x your monitor resolution, basically).&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;:screenshot --dpr 2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Be careful, setting the &lt;code class=&quot;language-text&quot;&gt;--dpr&lt;/code&gt; flag to anything higher than &lt;code class=&quot;language-text&quot;&gt;3&lt;/code&gt; will generate &lt;strong&gt;MASSIVE&lt;/strong&gt; screenshots and will take a while and a lot of hard drive space.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you need to screenshot the full page, you just need to add the &lt;code class=&quot;language-text&quot;&gt;--fullpage&lt;/code&gt; flag.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;:screenshot --dpr 2 --fullpage&lt;/code&gt; will take a full page screenshot of the current page at 2x the resolution it is displayed at.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src=&quot;https://media.giphy.com/media/26DOs997h6fgsCthu/giphy.gif&quot; alt=&quot;Show Me What You Got&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go get them nice &amp;#x26; fat portfolio screenshots of your work and send me a link on BlueSky, &lt;a href=&quot;https://bsky.app/profile/jackharner.com&quot;&gt;@JackHarner&lt;/a&gt;. I&apos;d love to see what you&apos;re working on!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Auto-Generate Content Folders In Gatsby]]></title><description><![CDATA[JackHarner.com is built with Gatsby, a framework based on React that makes blazing fast websites. Gatsby Logo I have my Blog and Portfolio content setup as a couple of directories with subdirectories for the individual posts. Like so: Each of the…]]></description><link>https://jackharner.com//blog/auto-generate-content-gatsby/</link><guid isPermaLink="false">https://jackharner.com//blog/auto-generate-content-gatsby/</guid><pubDate>Sun, 22 Dec 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;JackHarner.com is built with Gatsby, a framework based on React that makes blazing fast websites.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/820ea87f3049eb9b2b311f03873a0118/gatsby-logo.svg&quot; alt=&quot;Gatsby Logo&quot;&gt;&lt;/p&gt;
&lt;p&gt;I have my Blog and Portfolio content setup as a couple of directories with subdirectories for the individual posts. Like so:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;src/
| ...
| content/
  | blog/
    | blog-post/
      | index.md
      | featuredImage.png
      | ...
    | blog-post-2/
      | index.md
      | featuredImage.png
      | ...
    | ...
  | portfolio/
    | ...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Each of the &lt;code class=&quot;language-text&quot;&gt;index.md&lt;/code&gt; files contains a block of frontmatter dsecribing attributes about the post.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;---
date: 2019-12-22T18:23:53.017Z
title: &quot;Auto-Generate Content Folders In Gatsby&quot; 
subtitle: &quot;Preformat Your Frontmatter &amp;amp; More&quot;
featuredImage: &quot;./featuredImage.png&quot;
tags: [&apos;Gatsby&apos;, &apos;Node&apos;]
externalLink: &quot;&quot;
published: true
---&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;All of these folders and files are then parsed at build time to generate the pages and the content throughout the site.&lt;/p&gt;
&lt;p&gt;As some of you may know, I&apos;m very lazy, but Lazy in the good way where I don&apos;t like doing repetitive tasks more than once or twice. I&apos;ve automated tons of simple tasks in my day to day at &lt;a href=&quot;../../portfolio/shoolu&quot;&gt;Shoolu&lt;/a&gt;. Things like Running Reports, and processing product photos are all now 1-2 click tasks, when they used to take hours out of my day every week.&lt;/p&gt;
&lt;p&gt;I wanted starting a new blog post or portfolio piece to be as simple as possible, and with this I&apos;ve gotten it down to:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=jack data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; run newBlog&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let&apos;s look at how I did it and how you can speed up a small part of updating your Gatsby site with Node.&lt;/p&gt;
&lt;h2 id=&quot;create-the-template-directory&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#create-the-template-directory&quot; aria-label=&quot;create the template directory permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Create the Template Directory&lt;/h2&gt;
&lt;p&gt;Create a new directory in your &lt;code class=&quot;language-text&quot;&gt;/src/content/&lt;/code&gt; folder called &lt;code class=&quot;language-text&quot;&gt;templates/&lt;/code&gt;. Inside your new &lt;code class=&quot;language-text&quot;&gt;templates/&lt;/code&gt; directory create a new directory for every post type you want to automate. In my case it will be &lt;code class=&quot;language-text&quot;&gt;blog/&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;portfolio/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Now your project should look a little something like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;src/
| ...
| content/
  | blog/
    | ...
  | portfolio/
    | ...
  | templates/
    | blog/
      | &amp;lt;empty folder&gt;
    | portfolio/
      | &amp;lt;empty folder&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;{{{vert}}}&lt;/p&gt;
&lt;h2 id=&quot;get-template-ing&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#get-template-ing&quot; aria-label=&quot;get template ing permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Get Template-ing&lt;/h2&gt;
&lt;p&gt;This is where you&apos;ll need to customize this tutorial to fit with your site and preexisting content. Inside your &lt;code class=&quot;language-text&quot;&gt;/src/content/templates/&amp;lt;post-type&gt;&lt;/code&gt; directory, create versions of the files you will need every time you create a post. For me, that includes an &lt;code class=&quot;language-text&quot;&gt;index.md&lt;/code&gt; file with some custom frontmatter, and a &lt;code class=&quot;language-text&quot;&gt;featuredImage.png&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Take a look at my &lt;code class=&quot;language-text&quot;&gt;templates/blog/index.md&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;markdown&quot;&gt;&lt;pre class=&quot;language-markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token front-matter-block&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;token front-matter yaml language-yaml&quot;&gt;date: $date
title: &quot;$title&quot; 
subtitle: &quot;&quot;
featuredImage: &quot;./featuredImage.png&quot;
tags: [&apos;&apos;]
externalLink: &quot;&quot;
published: false&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Notice the &lt;code class=&quot;language-text&quot;&gt;$date&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;$title&lt;/code&gt; variables in the frontmatter. We will be replacing those variables down the line.&lt;/p&gt;
&lt;p&gt;My default Featured Image is just a solid pink image to match the branding of the site:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1200px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 51%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAF0lEQVR42mN4KZf8n5qYYdTAUQOHo4EAkbziGHCgAkQAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Default Featured Image&quot;
        title=&quot;Default Featured Image&quot;
        src=&quot;/static/124be52bbf346d8c60c354150e3cbdd7/c1b63/defaultFeaturedImage.png&quot;
        srcset=&quot;/static/124be52bbf346d8c60c354150e3cbdd7/5a46d/defaultFeaturedImage.png 300w,
/static/124be52bbf346d8c60c354150e3cbdd7/0a47e/defaultFeaturedImage.png 600w,
/static/124be52bbf346d8c60c354150e3cbdd7/c1b63/defaultFeaturedImage.png 1200w,
/static/124be52bbf346d8c60c354150e3cbdd7/d61c2/defaultFeaturedImage.png 1800w,
/static/124be52bbf346d8c60c354150e3cbdd7/81ebd/defaultFeaturedImage.png 1868w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The Featured Image is pretty much always going to be changed down the line. One problem I&apos;ve run into is that Gatsby, as far as I know, doesn&apos;t allow you to set default Frontmatter values. However, having the default allows me to not have to remember &quot;featuredImage.png&quot; when saving the updated image (I can just overwrite the default).&lt;/p&gt;
&lt;h2 id=&quot;script-all-the-things&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#script-all-the-things&quot; aria-label=&quot;script all the things permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Script All The Things!&lt;/h2&gt;
&lt;p&gt;Now that we&apos;ve got our template, we&apos;re going to write a Node script that copies the folder and replaces some variables with user input.&lt;/p&gt;
&lt;p&gt;We do need a few dependencies so run this command in your projects root folder:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=jack data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; i --save-dev readline-sync ncp replace-in-file&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;readline-sync&lt;/code&gt; allows for super simple Node CLI Prompts to take in user input.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;ncp&lt;/code&gt; is a tool to help Node copy folders recursively.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;replace-in-file&lt;/code&gt; makes it really easy to substitute values for defined variables in the copied version of the file.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the root folder for the project, create a new directory called &lt;code class=&quot;language-text&quot;&gt;tools/&lt;/code&gt; and in that a new file called &lt;code class=&quot;language-text&quot;&gt;newBlog.js&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;At the top of &lt;code class=&quot;language-text&quot;&gt;newBlog.js&lt;/code&gt; declare all of the dependencies we&apos;ll need:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; readline &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;readline-sync&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; ncp &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;ncp&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ncp&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; replace &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;replace-in-file&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Next up is to define some variables we are going to use and take in the User Input for Title &amp;#x26; Slug:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; postTitle &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; readline&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;question&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;What is the title? &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; slug &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; readline&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;question&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Slug? [Default: &apos;&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;string_to_slug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;postTitle&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&apos;] &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;defaultInput&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;string_to_slug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;postTitle&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; date &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toISOString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; sourcePath &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./src/content/templates/blog/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; destPath &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./src/content/blog/&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; slug&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;By setting a default value for the Slug allows me to set the slug to something other than the default, if I want to. Otherwise it just sets it to a url-encoded version of the title.&lt;/p&gt;
&lt;p&gt;Generating the default slug from the given title is done with the following function:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;string_to_slug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    str &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; str&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;^\s+|\s+$&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// trim&lt;/span&gt;
    str &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; str&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toLowerCase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  
    &lt;span class=&quot;token comment&quot;&gt;// remove accents, swap ñ for n, etc&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; from &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;àáäâèéëêìíïîòóöôùúüûñç·/_,:;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; to   &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;aaaaeeeeiiiioooouuuunc------&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; l&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;from&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;l &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        str &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; str&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;RegExp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;from&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;charAt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;g&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; to&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;charAt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    str &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; str&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;[^a-z0-9 -]&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// remove invalid chars&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;\s+&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;-&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// collapse whitespace and replace by -&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;-+&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;-&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// collapse dashes&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; str
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It takes in a string, removes whitespace, converts non url-encoded characters, and replaces spaces with &lt;code class=&quot;language-text&quot;&gt;-&lt;/code&gt; dashes. (&quot;What&apos;s Up Fool?&quot; -&gt; &quot;whats-up-fool&quot;).&lt;/p&gt;
&lt;h2 id=&quot;time-to-copy&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#time-to-copy&quot; aria-label=&quot;time to copy permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Time To Copy&lt;/h2&gt;
&lt;p&gt;Since everything is set up, it&apos;s time to copy the directory. We use &lt;code class=&quot;language-text&quot;&gt;ncp&lt;/code&gt; which is a Node package to replicate Linux&apos;s &lt;code class=&quot;language-text&quot;&gt;cp&lt;/code&gt; command. It takes in the Source Folder, the Destination Folder, and a Callback as arguments.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ncp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sourcePath&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; destPath&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Done Copying&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// ... Do Stuff After Copying Is Done&lt;/span&gt;
   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;replace-the-template-variables&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#replace-the-template-variables&quot; aria-label=&quot;replace the template variables permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Replace The Template Variables&lt;/h2&gt;
&lt;p&gt;Remember the &lt;code class=&quot;language-text&quot;&gt;$date&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;$title&lt;/code&gt; variables from earlier? Now it&apos;s time to swap those out for real values. Using the &lt;code class=&quot;language-text&quot;&gt;replace-in-file&lt;/code&gt; Node Package makes this super simple.&lt;/p&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;replace()&lt;/code&gt; function takes in an Options Object and a callback. Here&apos;s our Options Object:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; replaceOptions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;files&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;destPath &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/index.md&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;\$title&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;\$date&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;postTitle&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; date&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Define the files to search in, the keys to search for (can be Regex or just a string), &amp;#x26; what to replace them with then &lt;code class=&quot;language-text&quot;&gt;replace-in-file&lt;/code&gt; does all the heavy lifting.  If you pass in an array to both &lt;code class=&quot;language-text&quot;&gt;from&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;to&lt;/code&gt; it will replace the first key in the &lt;code class=&quot;language-text&quot;&gt;from&lt;/code&gt; array to the first value in the &lt;code class=&quot;language-text&quot;&gt;to&lt;/code&gt; array, and so on, allowing you to replace multiple things in one go.&lt;/p&gt;
&lt;p&gt;All that&apos;s left is to pass in our options and the callback function.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;replaceOptions&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;error&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; changedFiles&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Error occurred:&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Modified files:&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; changedFiles&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;, &apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;code-comments-action&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#code-comments-action&quot; aria-label=&quot;code comments action permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Code, Comments, ACTION!&lt;/h2&gt;
&lt;p&gt;You have two options when it comes to actually running the script.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Just run the script with Node: &lt;code class=&quot;language-text&quot;&gt;$ node tools/newBlog.js&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Add &lt;code class=&quot;language-text&quot;&gt;node tools/newBlog.js&lt;/code&gt; to your &lt;code class=&quot;language-text&quot;&gt;package.json&lt;/code&gt; as a script and run it through NPM (i.e. &lt;code class=&quot;language-text&quot;&gt;$ npm run newBlog&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then enter a title, optionally pick a slug and away we go!&lt;/p&gt;
&lt;h2 id=&quot;where-to-go-from-here&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#where-to-go-from-here&quot; aria-label=&quot;where to go from here permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Where To Go From Here?&lt;/h2&gt;
&lt;p&gt;If you wanted to take this script a few steps further, here are some ideas to get you started.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Duplicate your &lt;code class=&quot;language-text&quot;&gt;tools/newBlog.js&lt;/code&gt; file for every other post type, modifying as necessary.&lt;/li&gt;
&lt;li&gt;Refactor the script to be able to handle any post type you throw at it. &lt;code class=&quot;language-text&quot;&gt;readline-sync&lt;/code&gt; has a whole lot of options for taking in user input.&lt;/li&gt;
&lt;li&gt;Create as much content as possible, and automate as many things as possible.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://bsky.app/profile/jackharner.com&quot;&gt;Hit me up on BlueSky&lt;/a&gt; if you implement this script in your Gatsby site! I&apos;d love to hear your suggestions.&lt;/p&gt;
&lt;h2 id=&quot;if-youre-lazy-heres-the-full-script&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#if-youre-lazy-heres-the-full-script&quot; aria-label=&quot;if youre lazy heres the full script permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;If You&apos;re Lazy, Here&apos;s the full script:&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; readline &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;readline-sync&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; ncp &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;ncp&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ncp&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; replace &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;replace-in-file&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; postTitle &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; readline&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;question&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;What is the title? &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; slug &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; readline&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;question&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Slug? [Default: &apos;&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;string_to_slug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;postTitle&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&apos;] &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;defaultInput&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;string_to_slug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;postTitle&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; date &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toISOString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; sourcePath &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./src/content/templates/blog/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; destPath &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./src/content/blog/&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; slug&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; replaceOptions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;files&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;destPath &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/index.md&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;\$title&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;\$date&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;postTitle&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; date&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; 


&lt;span class=&quot;token function&quot;&gt;ncp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sourcePath&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; destPath&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Done Copying&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;replaceOptions&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;error&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; changedFiles&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Error occurred:&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Modified files:&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; changedFiles&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;, &apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;



&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;string_to_slug&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    str &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; str&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;^\s+|\s+$&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// trim&lt;/span&gt;
    str &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; str&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toLowerCase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  
    &lt;span class=&quot;token comment&quot;&gt;// remove accents, swap ñ for n, etc&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; from &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;àáäâèéëêìíïîòóöôùúüûñç·/_,:;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; to   &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;aaaaeeeeiiiioooouuuunc------&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; l&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;from&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;l &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        str &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; str&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;RegExp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;from&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;charAt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;g&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; to&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;charAt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    str &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; str&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;[^a-z0-9 -]&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// remove invalid chars&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;\s+&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;-&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// collapse whitespace and replace by -&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;-+&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;-&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// collapse dashes&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; str&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[BigCommerce Developer Diary]]></title><description><![CDATA[Read My Diary 😉 I was asked to guest post on the BigCommerce Developer blog as part of their Developer Diaries series. The series looks at the general day to day of different people working in the e-commerce/BigCommerce space. I provided a look at…]]></description><link>https://jackharner.com//blog/bigcommerce-developer-diary/</link><guid isPermaLink="false">https://jackharner.com//blog/bigcommerce-developer-diary/</guid><pubDate>Fri, 22 Nov 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;read-my-diary-&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#read-my-diary-&quot; aria-label=&quot;read my diary  permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Read My Diary 😉&lt;/h2&gt;
&lt;p&gt;I was asked to guest post on the BigCommerce Developer blog as part of their Developer Diaries series. The series looks at the general day to day of different people working in the e-commerce/BigCommerce space. I provided a look at my week working at &lt;a href=&quot;/portfolio/shoolu&quot;&gt;Shoolu&lt;/a&gt; and all the various things I do (and all the coffee I drink).&lt;/p&gt;
&lt;h4 id=&quot;thanks-karen-and-laruen-for-inviting-me-on&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#thanks-karen-and-laruen-for-inviting-me-on&quot; aria-label=&quot;thanks karen and laruen for inviting me on permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Thanks Karen and Laruen for inviting me on!&lt;/h4&gt;</content:encoded></item><item><title><![CDATA[Getting Started With DigitalOcean]]></title><description><![CDATA[DigitalOcean is a cloud infrastructure company based in New York City. They have blazing fast data centers all over the world and are my personal favorite hosting provider. I point all of my clients there and anytime I need a server or any kind of…]]></description><link>https://jackharner.com//blog/getting-started-with-digital-ocean/</link><guid isPermaLink="false">https://jackharner.com//blog/getting-started-with-digital-ocean/</guid><pubDate>Wed, 20 Nov 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://m.do.co/c/66cca12b82bc&quot;&gt;DigitalOcean&lt;/a&gt; is a cloud infrastructure company based in New York City. They have blazing fast data centers all over the world and are my personal favorite hosting provider. I point all of my clients there and anytime I need a server or any kind of hosting, DigitalOcean is where I go. Spin up servers in a couple of clicks and you&apos;re on your way!&lt;/p&gt;
&lt;p&gt;Today I&apos;m going to go over how to get your DigitalOcean account setup, create a team, and grant me access to get your site setup.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On the off chance that you got here through Google or elsewhere and you&apos;re not already a client of mine, please &lt;a href=&quot;/contact&quot;&gt;Get In Touch&lt;/a&gt;. I will gladly help you get something hosted on DigitalOcean.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;setting-up-your-digitalocean-account&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#setting-up-your-digitalocean-account&quot; aria-label=&quot;setting up your digitalocean account permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Setting Up Your DigitalOcean Account&lt;/h2&gt;
&lt;p&gt;Click the button above (&lt;a href=&quot;https://m.do.co/c/66cca12b82bc&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;or Here&lt;/a&gt;) to get started signing up for DigitalOcean.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1200px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 51.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAACyElEQVR42k3RaUjTARzG8f+LjNkhlI7Nq8gjj6Z5bG3TtdzfrS2bM481N82jVWKZlll2WCBl4QstkqgMehH2pje+6EUvgqKooLTNlUclEl1SZmU6LSL4RiuoH3zePTzw8BPujn3AMzbJ63cfeTM+wcTkFK/fvufVm/GAT5+/4p+d4+u0n+mZWWb8c3/MzuGf+87nqWneTXziXv8kPb1fECyOOszOPeRXNGFyNKKz7WNFppPo1SXEZJaSondjcbWQV3YUs/MIor2ZnOIDZOc3ojTWIhbtxmSvQyysRV9Yj5BmLENlqUK9wY1xcwO2ikMsjsoiaqWByHgRrVhFZUM7rp1tNJ/o5tZ9H703HnDz7gBd564Sm2omXSwna6ObFEMpgspcgdbqRldQg62yma11rZS4dlFZvRdX+R7qD3bS2HqeLfUn6bx4jf/POzBIdJwOhX4zmjw38WobQoaxLFCYJm4hIsnC8tQ8FJpCMjQFmGw72NbUwbb9HWyqPkZL+2UmJr/x6u0M0364faeP2AQdCRo7uoJdLMswIaSKzsBk6UoRiUxFWGwOS1bokSesR1+wm43lzVhKm8gpbGB/6wV6eqHj0k/OXIbuK09I01pJzHag3LAdacI6BIXBwepcFyHLs5HIlATLlCyQr0EiV7NK68BgraGo6jAV9adoO93D7A+Y+vZn8r2HQ4TGGlgaZyRGaSdCYUJI1BWRrLezKErDvNA0gsLSmR+WTpA0A1mckVyzmzViJVbnIWobz9LVfZ3Dxy9Qs7cVa2kD8+UagqRqpPG5RKfkISSuLSJpbTEhy7RIZJkEy5UBC8JVgW+HxpiITLZiKT6AueQgamMtC8OzECSJCCEKgsNVLIrWE6UwE7kqH8E7OMpvfd4RHnqGeOQZ/sc7Qt/Acx55RvA8GcU3/BLf0Bh93mEe+57TPzDyN/cM79NR+n0v+AVfvNR/exDTigAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Sign Up Screen&quot;
        title=&quot;Sign Up Screen&quot;
        src=&quot;/static/efcebc1e51077e444ea2b33f938e1545/c1b63/sign-up-screen.png&quot;
        srcset=&quot;/static/efcebc1e51077e444ea2b33f938e1545/5a46d/sign-up-screen.png 300w,
/static/efcebc1e51077e444ea2b33f938e1545/0a47e/sign-up-screen.png 600w,
/static/efcebc1e51077e444ea2b33f938e1545/c1b63/sign-up-screen.png 1200w,
/static/efcebc1e51077e444ea2b33f938e1545/d61c2/sign-up-screen.png 1800w,
/static/efcebc1e51077e444ea2b33f938e1545/d32a0/sign-up-screen.png 1843w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Enter in &lt;em&gt;your&lt;/em&gt; name, &lt;em&gt;your&lt;/em&gt; email, and choose a strong Password. Then click on &lt;strong&gt;&quot;Sign up with email&quot;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Alternatively you can sign up with Google, or use an existing GitHub account.&lt;/p&gt;
&lt;h2 id=&quot;verify-your-email&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#verify-your-email&quot; aria-label=&quot;verify your email permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Verify Your Email&lt;/h2&gt;
&lt;p&gt;They should send you an email with a link. Open it and click on the link to verify your email.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1197px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 18.333333333333336%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAIAAAABPYjBAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAiklEQVR42p2I2w6DIBAF+f9fbGOxKmJAd1nAAHJpaNOkz53Mw5zD1lUOw+N+u3M+CrEqpQHAWkdkyXao6/rTl0OyhqzclJAbmzTOGicNo4LlMPOO047LYQSQBBJACziOnoPn6J/mNCFRvOBMIWW26d2HeJUac4m5pG/0fhtzCT+W2j7W1lirnfYXL4oK5eQYt+gJAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Confirm Your Email&quot;
        title=&quot;Confirm Your Email&quot;
        src=&quot;/static/e282e7fffe485c8468893e8562411bc0/d326d/confirm-email.png&quot;
        srcset=&quot;/static/e282e7fffe485c8468893e8562411bc0/5a46d/confirm-email.png 300w,
/static/e282e7fffe485c8468893e8562411bc0/0a47e/confirm-email.png 600w,
/static/e282e7fffe485c8468893e8562411bc0/d326d/confirm-email.png 1197w&quot;
        sizes=&quot;(max-width: 1197px) 100vw, 1197px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;add-a-payment-method&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#add-a-payment-method&quot; aria-label=&quot;add a payment method permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Add A Payment Method&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1200px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 51.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAABv0lEQVR42o2Qa2sTQRSG94/7UUhpi6aiVKxfVWhrpamtFYr4SVSyNeYqjTG72dnZWzbdmtteso/MJlpRwQ48nMM55z3zzmi3qruUGnusNfdYa1yz0dznTvsFm60DNprPWW/ss95covql+u5ydqW7/ekZJf0p2j29Qrl6zZZe4W71kPvVI7bPTwoe1l6x03hd8Kh+yvbnEx7UjovZcvWQrZWurFfQJn7MJFAkqDy+zMiuFqRRxuJ7ShJl5OMcUv46abRgvNKrOPVjNMMOUJi2jyF8bDckThOiyZzO4Ip5mjCezojGU5IsxZBBkc+TBNsLMYVPT3i8MS/oCx9N2AFCOFhyxMAe4vkReZ4zizP6zoxFnhMnKfM4KVzZw4h5kkKe4wVRoREy5NTs0LM9NDkwcIwuQjWEVzRthRPiusuoaj9x3NGvmiWHxWxLSI6NNi3LUQtNvK86br+NcmvZIZY9XPF7/m+kHNEQgorR4qw5RJPmN/zue9RiS14uncrw5tgh76weOxfnHOgBmtPv4Hc/Lt3J/zv605167stBg81anSe6RHONL4Sds2Lh8tabOVT/58oRVcvkcf8DG02d8tuAH8gGzaGi4AqKAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Add A Payment Method Screen&quot;
        title=&quot;Add A Payment Method Screen&quot;
        src=&quot;/static/691eeb9d584e3692c888b39c8f9f86c3/c1b63/add-payment-screen.png&quot;
        srcset=&quot;/static/691eeb9d584e3692c888b39c8f9f86c3/5a46d/add-payment-screen.png 300w,
/static/691eeb9d584e3692c888b39c8f9f86c3/0a47e/add-payment-screen.png 600w,
/static/691eeb9d584e3692c888b39c8f9f86c3/c1b63/add-payment-screen.png 1200w,
/static/691eeb9d584e3692c888b39c8f9f86c3/d61c2/add-payment-screen.png 1800w,
/static/691eeb9d584e3692c888b39c8f9f86c3/d32a0/add-payment-screen.png 1843w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Next you&apos;re presented with the option of adding a Credit/Debit card, or connecting a PayPal account.&lt;/p&gt;
&lt;p&gt;Pick Your Poison and follow the prompts to connect your payment method.&lt;/p&gt;
&lt;p&gt;After you&apos;re done adding a payment method it takes you to a screen to help you get your first thing setup. Ignore this for now, and just click on &lt;strong&gt;&quot;Explore Our Control Panel&quot;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1127px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 69%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB2ElEQVR42o1Su27cMBC8//+fVEGKdClSuogBG7ZFkRLFx/K1fEg6bcCTD3ZSBCEG4HCAIWeIvfDJihnk4qXyyw1ihg+MSkyWSyekm5d3iBn4ZPlkL6Mw4JJUMEngkxbSHJ8XIoVQDTjtrEdjowuZiDDXUZhudj45n4wN2gYDMaYSUymlbddjLfXwvr0O/ulNZ9K+mbgdByG2d7OFmHPNuZW85lx9QHApYV3rWiNizOCS85hLi9jvzaWBS93MuA6pEJEB/cKeiait26l8eRi/Pc5ElHPLpRHR90f241kQUcJb7IHriOV6vcaUQ0z7fm3rhrkS0dMEXAeio5Q1l7bv+6u0TDmiA/He2dioTf9tbZIy3rpkoRMNqcMGC8nYOCsAl6yNynhj4yjshXETAhIReL9oRUSlthj7l7Z5XlVXEOuZZWBMSklEMeY/OoP3Ui9n54TlszmX987DwKZp/ujcY0OUCqSJC+AsLbgUYg4xzyZMOtx4cR6lcrZPhNcQnMfzZWMhte2K1uA01nWPqTBubtAj13duRtEVdlf6hDGuz4bb26/28ysRres2CnMO4L9xGUadsLa2+oA+5j5Y286F/S/zuTFh3kY1sIVxfR67wtTLsJz8L5zRfgO3RBDwK5G9QgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;After Payment Added Screen&quot;
        title=&quot;After Payment Added Screen&quot;
        src=&quot;/static/cb2772d41ab730ddd61e1142ec840301/dcccd/after-payment-added.png&quot;
        srcset=&quot;/static/cb2772d41ab730ddd61e1142ec840301/5a46d/after-payment-added.png 300w,
/static/cb2772d41ab730ddd61e1142ec840301/0a47e/after-payment-added.png 600w,
/static/cb2772d41ab730ddd61e1142ec840301/dcccd/after-payment-added.png 1127w&quot;
        sizes=&quot;(max-width: 1127px) 100vw, 1127px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;{{{vert}}}&lt;/p&gt;
&lt;h2 id=&quot;creating-a-team&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#creating-a-team&quot; aria-label=&quot;creating a team permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Creating A Team&lt;/h2&gt;
&lt;p&gt;DigitalOcean comes with the ability to create Teams. Teams allow you to share Droplets, Domains, Images, Volumes and pretty much everything else with multiple people, all while keeping the payment info stored securely in the owner&apos;s account.&lt;/p&gt;
&lt;h3 id=&quot;lets-just-jump-into-it&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#lets-just-jump-into-it&quot; aria-label=&quot;lets just jump into it permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Let&apos;s Just Jump Into It.&lt;/h3&gt;
&lt;p&gt;In the upper right hand corner of the page, click on your little profile picture (or whatever default icon you got).&lt;/p&gt;
&lt;p&gt;Click on &lt;strong&gt;&quot;Create A Team&quot;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 442px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 59.333333333333336%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABdUlEQVR42oWRu27UQBSG/QpIEc/GE0QoL0EBHRXvEImGEKWAggooVlaiTYS0KYiWeCEsjo3HseO52HPmnD8alpC9EOUrZ/5vzmUSgQDQoX85e//8/OBFdvDs/O3UXCKAgeF4xHUlQFNHtLUAKCv5uhcgYYny5dA8/rj96NPTrc87yYcn74rxcKX10KsvY9HXnbUX8/nPPFdpijS1r/aGcRb+ygIXhjfF4e6v0es83c1H874GIzAzIr1z+uzMTib25ES+TZnBnpg5kVuwhIgwQG3nj6Zdp1VZ1rPvzjkAfJv33if/BBImEQIIcQ0CUGfC4Vfd6Uqp37VqmsYaY00k/CFZLoi+hzFwDt5L25Ix8a3AgSUEYRFegohW5bJElmE2Q57L/j5NTguHi1oqgx81nF/JbsirY5P3VaWumvhNXafXAhty3LzcyURKxVHbtvXD8JC8VpmoKIqyLLXWi5O724Us97BYCTOHEIjIe08b3Cuv8d/WbgD8jK56k0X+sgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Create A Team Menu Item&quot;
        title=&quot;Create A Team Menu Item&quot;
        src=&quot;/static/dc867cc3454cb929d64f8f025307436b/e03bf/create-a-team.png&quot;
        srcset=&quot;/static/dc867cc3454cb929d64f8f025307436b/5a46d/create-a-team.png 300w,
/static/dc867cc3454cb929d64f8f025307436b/e03bf/create-a-team.png 442w&quot;
        sizes=&quot;(max-width: 442px) 100vw, 442px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;its-all-in-the-name&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#its-all-in-the-name&quot; aria-label=&quot;its all in the name permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;It&apos;s All In The Name&lt;/h3&gt;
&lt;p&gt;Type in your team name and either change or verify the &quot;Team Contact Email&quot;. That email is where all the team related billing and alert emails will go.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 656px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 125%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAIAAAC+dZmEAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACM0lEQVR42o1U247TMBDtr/MD/Ag8ISHxgvgAViAhrfYBCdTdbbppmjh2fJvxjAc53m1ToIGjkTM+8RnbM7Y3IhKTOBBIElCIpYJZEgnnYieGuHTphdyIFI0OMjjpbQlUQVzCxVRCnBikQkIqThHnLDmzSK62xBo5+5sX6nngCZxFedFe8pJd4EK8YEt7nOTtF3n3TY72TP6HeG4/3Mrrj/Lmq9w2Z/If4uopL6/eF/Gn7/J5KxauLXv+LFkitjE3Wu4H6V2pgscrM4v32Zjltpxz+2bXtY1Wx8Ph6di1jw/3po75XUzE2613zofgvA8x1jj8bLla/iNjs1iE7+7Mzx/TZHR/tHoUppySULGLdNSKnkpbEyY5Q/cUdtu4f4x65IRVKdEHOzX7gt1u1/e9tdY5F0KoIcrMmdlP1hnjpylonWJkAAbIiAjgvXczvPfW2hACEZ3FSWk1kQLRCvBhaCZpjXS2pHq0SJSunjAB4JubYCZAAIiYMAQfvKP0d82lOCWKUalRKaW1ds51Xde2rXNOfrsTF9fj4pBwjLFMHSMippSIKKVUfUScu4TFTzRf+rrnDJibhmpevPdhBpwREGIMHiBCLD4lPIsRc9uSMVq9YBzLLoZhMJNtBjxobFU8jLhX8DTCYNNc31wfg0x0UZLq27ms2uHkz2Yc2AB8KhUzGzMZo80CWut+hh5V+aVHY06meS71ZiWl86JkLdt15isj8lrkKr6G+qSuYE1MLInXxL8AmMC4P8gO4qgAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Setting the Team Name&quot;
        title=&quot;Setting the Team Name&quot;
        src=&quot;/static/18e6edbec4d6495840f98244031ef1d3/748f4/create-a-team-1.png&quot;
        srcset=&quot;/static/18e6edbec4d6495840f98244031ef1d3/5a46d/create-a-team-1.png 300w,
/static/18e6edbec4d6495840f98244031ef1d3/0a47e/create-a-team-1.png 600w,
/static/18e6edbec4d6495840f98244031ef1d3/748f4/create-a-team-1.png 656w&quot;
        sizes=&quot;(max-width: 656px) 100vw, 656px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Selecting &quot;Convert ____ Into A Team&quot; will move over any existing Droplets, or other DigitalOcean products to the new team. If you&apos;re starting with a fresh DigitalOcean account, this is fine.&lt;/p&gt;
&lt;p&gt;Don&apos;t select this if you have existing Droplets you want to keep separate from the new Team.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you&apos;d like to require all users on the team to use 2FA or some other form of secure login, check the box under &lt;strong&gt;&quot;Secure Login&quot;&lt;/strong&gt;. (You have to setup 2FA on your own account before you&apos;re allowed to require it for the team).&lt;/p&gt;
&lt;p&gt;Click on &lt;strong&gt;&quot;Create Team&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;dolla-dolla-bills-yall&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#dolla-dolla-bills-yall&quot; aria-label=&quot;dolla dolla bills yall permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Dolla Dolla Bills Y&apos;all&lt;/h3&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1200px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 51.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAKABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQBBf/EABQBAQAAAAAAAAAAAAAAAAAAAAH/2gAMAwEAAhADEAAAAehbFehof//EABcQAAMBAAAAAAAAAAAAAAAAAAEEEDT/2gAIAQEAAQUCSzAxLNP/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAVEQEBAAAAAAAAAAAAAAAAAAABEP/aAAgBAgEBPwFn/8QAGBAAAwEBAAAAAAAAAAAAAAAAAhCBAEH/2gAIAQEABj8CG7qGv//EABsQAAEEAwAAAAAAAAAAAAAAABAAAaGxETGR/9oACAEBAAE/IZ1llfXAnWP/2gAMAwEAAgADAAAAELcP/8QAFhEBAQEAAAAAAAAAAAAAAAAAARAx/9oACAEDAQE/EDCf/8QAFhEAAwAAAAAAAAAAAAAAAAAAARAx/9oACAECAQE/EKK//8QAGhAAAQUBAAAAAAAAAAAAAAAAAQARIVHwEP/aAAgBAQABPxCeSaYQ0TZgJhS3L9//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Adding Payment Info&quot;
        title=&quot;Adding Payment Info&quot;
        src=&quot;/static/11f28e7f16d775a3b011d3694d2af24f/e5166/payment.jpg&quot;
        srcset=&quot;/static/11f28e7f16d775a3b011d3694d2af24f/f93b5/payment.jpg 300w,
/static/11f28e7f16d775a3b011d3694d2af24f/b4294/payment.jpg 600w,
/static/11f28e7f16d775a3b011d3694d2af24f/e5166/payment.jpg 1200w,
/static/11f28e7f16d775a3b011d3694d2af24f/d9c39/payment.jpg 1800w,
/static/11f28e7f16d775a3b011d3694d2af24f/d9786/payment.jpg 1852w&quot;
        sizes=&quot;(max-width: 1200px) 100vw, 1200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;On the next page select (or add) your preferred Payment Method for the Team. This payment method will be used for all charges accrued on the team, but members of the team &lt;em&gt;will NOT&lt;/em&gt; have access to your payment info.&lt;/p&gt;
&lt;h3 id=&quot;invite-time&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#invite-time&quot; aria-label=&quot;invite time permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Invite Time&lt;/h3&gt;
&lt;p&gt;The next page is where you can invite everyone you want to give access. Enter in 1 Email per line. Those emails will get an invite to either create a DigitalOcean account, or connect an existing one to the team.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 669px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 105.33333333333334%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAVCAIAAADJt1n/AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABsElEQVR42q2UzW7TQBSF/ShsUEu3SJV4CMQCKKwqgXgC9gjSFfAARaJZVOqWZ6oUGuIk4HrG8/97qhnHiZuaqBJ8OrI8594zM7I1U8QOIGmLvhN6ba1fAPABykKYJOvRYnwaMg3tVk6jUHH8ZigJqEpO0U4ZwkZ5eiQzohslnI9r+VwoNsUO77211jnnvXcZa633fqttOEwImc/ni8ViuVzWdT2bzcqyrKpqVzjGyDOMsaZpKKUkQyltmoZ3hBB2rRwjrLFSCCmlUkpKqbUeahsKcyGuJpc/J5PpdHqVKcuSEHKvsLWW8obknbcwxrTWfw1LZaqaXRNWU0G5Vtpordttiw4p5Tp2K2xdkNoq47Rx2nrrBtj6W8PbviebsAvb8j3drcb/sDIQrcf7H3j2DUdjvDxLejXG2wu8ucC7rNdjvMj+0Rmef8fxOZYsxVPYODw9xYMPODjB/gh7n/BohMMvSU++Jh2cJHN/lPyHH/H4M36RHI63T2n/uObCruoq7MNGXMc/PNYiUpmeFY/XIjYqndZ1zyp890sYl+4AYVY3RPu+vhL6FPgHBsJxSIPhG9aJs97xGThQAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Add emails to invite&quot;
        title=&quot;Add emails to invite&quot;
        src=&quot;/static/dad5d7721e1cddb4c378e112f60998a5/99272/add-me-as-a-team-member.png&quot;
        srcset=&quot;/static/dad5d7721e1cddb4c378e112f60998a5/5a46d/add-me-as-a-team-member.png 300w,
/static/dad5d7721e1cddb4c378e112f60998a5/0a47e/add-me-as-a-team-member.png 600w,
/static/dad5d7721e1cddb4c378e112f60998a5/99272/add-me-as-a-team-member.png 669w&quot;
        sizes=&quot;(max-width: 669px) 100vw, 669px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If you were sent this so I can get your hosting account setup for you, please invite &lt;code class=&quot;language-text&quot;&gt;hello@jackharner.com&lt;/code&gt; as a team member.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;REMEMBER&lt;/strong&gt; - Anybody you invite to your team can spin up and destroy servers or anything in the account. Be careful who you give access.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;thats-all-folks&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#thats-all-folks&quot; aria-label=&quot;thats all folks permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;That&apos;s All Folks&lt;/h2&gt;
&lt;p&gt;Now that you&apos;ve given me access, just sit back and relax and I&apos;ll get the rest of your account setup per our discussions.&lt;/p&gt;
&lt;p&gt;If you&apos;re not one of my clients and you need help getting something hosted online, &lt;a href=&quot;/contact&quot;&gt;Get In Touch&lt;/a&gt; and I&apos;ll gladly get you setup and hosted with DigitalOcean.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[I've Forked The Repo, Now What?]]></title><description><![CDATA[So, you want to make some changes to an Open Source Repo? Good for you. That's the beauty of Open Source, even just fixing typos in the documentation makes a difference. Today I'm going to walk you through keeping your copy of a repo up to date with…]]></description><link>https://jackharner.com//blog/sync-forked-repo/</link><guid isPermaLink="false">https://jackharner.com//blog/sync-forked-repo/</guid><pubDate>Sat, 02 Nov 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;So, you want to make some changes to an Open Source Repo? Good for you. That&apos;s the beauty of Open Source, even just fixing typos in the documentation makes a difference. Today I&apos;m going to walk you through keeping your copy of a repo up to date with changes pushed to the original repo.&lt;/p&gt;
&lt;p&gt;This tutorial assumes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You have a basic understanding of git&lt;/li&gt;
&lt;li&gt;You have a forked repo&lt;/li&gt;
&lt;li&gt;The original repo has changes that you want in your forked repo&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;setting-up-the-remote&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#setting-up-the-remote&quot; aria-label=&quot;setting up the remote permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Setting Up The Remote&lt;/h2&gt;
&lt;p&gt;The first thing you want to do is add the Original Repo as a remote of your Forked Repo. From the command line you want to move into your project directory and add the Original Repo&apos;s clone URL as the &lt;code class=&quot;language-text&quot;&gt;upstream&lt;/code&gt; remote.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=jack data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=jack data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;project_name&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; remote &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; upstream &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;original_repo_url&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The Repo URL can be found on the Repo page on Github. Click on the &lt;code class=&quot;language-text&quot;&gt;Clone or download&lt;/code&gt; button and make sure it says &quot;Clone with HTTPS&quot; since you don&apos;t have write access to the Original Repo.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1013px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAIBAwX/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAAB3JGKxxP/xAAXEAADAQAAAAAAAAAAAAAAAAABEBEg/9oACAEBAAEFAlTj/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAFhAAAwAAAAAAAAAAAAAAAAAAECAx/9oACAEBAAY/AhE//8QAGxAAAgEFAAAAAAAAAAAAAAAAAAERICFBgfD/2gAIAQEAAT8h0O2JOLo//9oADAMBAAIAAwAAABCDH//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8QP//EABwQAQABBQEBAAAAAAAAAAAAAAEAESExUWFxsf/aAAgBAQABPxA2o7Gg+0ErhfSVsesDkcs//9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Original Repo URL&quot;
        title=&quot;Original Repo URL&quot;
        src=&quot;/static/efd0463e84375998e9b0a448e26f1237/326df/remote_url.jpg&quot;
        srcset=&quot;/static/efd0463e84375998e9b0a448e26f1237/f93b5/remote_url.jpg 300w,
/static/efd0463e84375998e9b0a448e26f1237/b4294/remote_url.jpg 600w,
/static/efd0463e84375998e9b0a448e26f1237/326df/remote_url.jpg 1013w&quot;
        sizes=&quot;(max-width: 1013px) 100vw, 1013px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;You can verify your remotes with:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=jack data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; remote &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;which should output:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;origin	git@github.com:{{you}}/{{project_name}}.git (fetch)
origin	git@github.com:{{you}}/{{project_name}}.git (push)
upstream	https://github.com/{{owner}}/{{project_name}}.git (fetch)
upstream	https://github.com/{{owner}}/{{project_name}}.git (push)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;{{{vert}}}&lt;/p&gt;
&lt;h2 id=&quot;go-get-that-code&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#go-get-that-code&quot; aria-label=&quot;go get that code permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Go Get That Code!&lt;/h2&gt;
&lt;p&gt;Now that we&apos;ve associated our Original Repo with our local Forked Repo, it&apos;s time to go get the new code.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=jack data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; fetch upstream&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Running &lt;code class=&quot;language-text&quot;&gt;git fetch&lt;/code&gt; gets the changes to the remote repo without changing any of the files in your local version. It essentially lets you see what everyone else has done to the code without making any changes to yours. You should see it pull down a bunch of different branches, tags, and some file changes.&lt;/p&gt;
&lt;p&gt;To apply the new changes to your repo make sure you&apos;re on the branch you want to pull in (in our case &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;):&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=jack data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; checkout master&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;and then pull the matching branch from the &lt;code class=&quot;language-text&quot;&gt;upstream&lt;/code&gt; remote:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=jack data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; pull upstream master&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It will asks you for a message for the merge commit. You can usually just leave the default and just save with &lt;code class=&quot;language-text&quot;&gt;CTRL + X&lt;/code&gt;. Git finishes up the merge commit, and your Local Repo is now up to date with the Original.&lt;/p&gt;
&lt;h2 id=&quot;seal-the-deal&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#seal-the-deal&quot; aria-label=&quot;seal the deal permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Seal The Deal&lt;/h2&gt;
&lt;p&gt;Finish off your changes by pushing them back up to your Forked Repo&apos;s &lt;code class=&quot;language-text&quot;&gt;origin&lt;/code&gt; remote that you have write access to.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=jack data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; push origin master&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ta da! You just refreshed your forked repo. Make, test, commit and push your changes and you&apos;ll be all set to create a pull request back to the Original Repo. You&apos;re ready to start changing the world of Open Source Software one pull request at a time!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Sick Console Bro! How To Style Your console.log with CSS]]></title><description><![CDATA[Photo by Glenn Carstens-Peters on Unsplash In Chrome and Firefox (>31) you can add CSS styles to your console.log() messages. It's fairly simple and straightforward. All you need to do is include a %c string before your log message and then pass your…]]></description><link>https://jackharner.com//blog/sick-console-bro/</link><guid isPermaLink="false">https://jackharner.com//blog/sick-console-bro/</guid><pubDate>Thu, 13 Jun 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Photo by &lt;a href=&quot;https://unsplash.com/@glenncarstenspeters?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;Glenn Carstens-Peters&lt;/a&gt; on Unsplash&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://developers.google.com/web/tools/chrome-devtools/console/console-write#styling_console_output_with_css&quot;&gt;Chrome&lt;/a&gt; and Firefox (&gt;31) you can add CSS styles to your console.log() messages. It&apos;s fairly simple and straightforward.&lt;/p&gt;
&lt;p&gt;All you need to do is include a &lt;code&gt;%c&lt;/code&gt; string before your log message and then pass your CSS as a parameter to the console.log( ) function. Like so:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;js&quot;&gt;console.log(&quot;%c{{Log Message}}&quot;, &quot;{{CSS}}&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For example, this code runs on &lt;a href=&quot;https://harnerdesigns.com&quot;&gt;my portfolio&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;js&quot;&gt;console.log(&quot;%cHarner Designs&quot;, &quot;color:#233E82; font-family:&apos;Ubuntu&apos;; display: block;font-weight:bold; font-size:48px; background:#fff;&quot;);
    console.log(&quot;%cLike to dig into the meaty bits of the website?\nThanks for looking! Hit us up on BlueSky @harnerdesigns!&quot;, &quot;color:#222; font-family:&apos;Ubuntu&apos;; font-weight:100; font-size:24px; background:#fff;&quot;);
    console.log(&quot;%cDid you know you can style your console output?!&quot;, &quot;color:#333; font-family:&apos;Ubuntu&apos;; font-weight:100; font-size:18px; background:#fff;&quot;);
    console.log(&quot;%cCheck our blog to learn how: https://harnerdesigns.com/blog/style-your-console-log-with-css/&quot;, &quot;line-height: 3em; padding: 0.5em; text-align: center; border: 1px dotted #aaa; background:#fff; font-size: 14px;&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and outputs like this to the console:&lt;/p&gt;
&lt;img src=&quot;https://harnerdesigns.com/wp-content/uploads/2019/06/styled-console-update.png&quot; alt=&quot;&quot; width=&quot;1025&quot; height=&quot;347&quot; class=&quot;alignnone size-full wp-image-1140&quot;&gt;
&lt;p&gt;{{{vert}}}&lt;/p&gt;
&lt;h2&gt;Styling Multiple Strings In One Log&lt;/h2&gt;
&lt;p&gt;It&apos;s also &lt;a href=&quot;https://stackoverflow.com/a/13017382/10425698&quot;&gt;possible&lt;/a&gt; to include multiple strings in one command and style them differently. Check it out:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;js&quot;&gt;console.log(&quot;%cString1&quot; + &quot;%cString2&quot;, &quot;{{CSS for String1}}&quot;, &quot;{{CSS for String2}}&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Reusing Styles Across Log Messages&lt;/h2&gt;
&lt;p&gt;You can also store the CSS You want to apply to a variable and then pass that to multiple console.logs:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;js&quot;&gt;var consoleStyle = &quot;{{Reusable CSS}}&quot;;
console.log(&quot;%cString1&quot;, consoleStyle);
console.log(&quot;%cString2&quot;, consoleStyle);
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Do you leave any little easter eggs in your console? Could you see a use case for this in your own projects? I&apos;d love to know down in the comments! Show me some examples of cool things you&apos;ve found in console messages.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Add Logout Link To Account Menu - BigCommerce For WordPress]]></title><description><![CDATA[BigCommerce for WordPress (BC4WP) allows you to combine the power of the BigCommerce back-end with the customization of WordPress on the front-end for a truly unique E-Commerce experience. One thing that seems missing out of their integration is a…]]></description><link>https://jackharner.com//blog/add-logout-link-to-account-menu-bigcommerce-for-wordpress/</link><guid isPermaLink="false">https://jackharner.com//blog/add-logout-link-to-account-menu-bigcommerce-for-wordpress/</guid><pubDate>Thu, 18 Apr 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;BigCommerce for WordPress (BC4WP) allows you to combine the power of the BigCommerce back-end with the customization of WordPress on the front-end for a truly unique E-Commerce experience.&lt;/p&gt;
&lt;p&gt;One thing that seems missing out of their integration is a logout link on the My Account page:
&lt;img src=&quot;https://harnerdesigns.com/wp-content/uploads/2019/04/Before-Code.png&quot; alt=&quot;BC4WP Account Menu - Before&quot; width=&quot;474&quot; height=&quot;187&quot; class=&quot;alignnone size-full wp-image-1056&quot;&gt;&lt;/p&gt;
&lt;p&gt;It seemed like an easy fix and since I&apos;ve started to dabble in making pull requests to Open Source Software, I decided to take a look. The &quot;SubNav&quot; as they&apos;ve called it is populated in &lt;code&gt;bigcommerce-for-wordpress/src/BigCommerce/Accounts/Sub_Nav.php&lt;/code&gt;. It uses &lt;code&gt;get_option&lt;/code&gt; to pull the stored Account, Orders, &amp;#x26; Address pages and populates the &lt;code&gt;$links[]&lt;/code&gt; array with the associated data.&lt;/p&gt;
&lt;p&gt;Easy.&lt;/p&gt;
&lt;p&gt;Just append the logout information to the &lt;code&gt;$links[]&lt;/code&gt; array with &lt;code&gt;wp_logout_url()&lt;/code&gt; and the logout link will appear in the my accounts page.&lt;/p&gt;
&lt;p&gt;And thus, my first &lt;a href=&quot;https://github.com/bigcommerce/bigcommerce-for-wordpress/pull/150&quot;&gt;Pull Request&lt;/a&gt; to the BC4WP repo was born.&lt;/p&gt;
&lt;h2&gt;Shot Down Like A High Schooler Before Prom&lt;/h2&gt;
&lt;p&gt;My PR was rejected citing that logging out of WordPress was &quot;Out of Scope&quot; of the BigCommerce for WordPress plugin. However, Jonathan of &lt;a href=&quot;https://tri.be/&quot;&gt;Modern Tribe&lt;/a&gt; (the plugin developers) pointed out that there is a filter already applied to the links generated so that Site Admins can add anything they wish to that list of links: &lt;code&gt;bigcommerce/account/subnav/links&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;So..? How Do You Do It?&lt;/h2&gt;
&lt;p&gt;If you&apos;re like me and &lt;em&gt;want&lt;/em&gt; to add the logout link to the BigCommerce for WordPress Account Page Submenu, just add the following code to your theme&apos;s &lt;code&gt;functions.php&lt;/code&gt; file:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token function&quot;&gt;add_filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;bigcommerce/account/subnav/links&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$links&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
 &lt;span class=&quot;token variable&quot;&gt;$links&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;url&apos;&lt;/span&gt;     &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;gt&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;wp_logout_url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;label&apos;&lt;/span&gt;   &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;gt&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;Logout&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;bigcommerce&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;current&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;gt&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token constant boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
 &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
 &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$links&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And that&apos;s it! Now there will be a convenient to use Logout Link on the &quot;My Account&quot; page with BigCommerce for WordPress.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[How To Measure Angles In Illustrator]]></title><description><![CDATA[Sometimes you need to be exact in your designs. I'm definitely a little bit of a perfectionist when it comes to things like that. Maybe you need to align the rotation of something to the edge of another object. You could just eyeball it, but that's…]]></description><link>https://jackharner.com//blog/how-to-measure-angles-in-illustrator/</link><guid isPermaLink="false">https://jackharner.com//blog/how-to-measure-angles-in-illustrator/</guid><pubDate>Fri, 22 Mar 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Sometimes you need to be exact in your designs. I&apos;m definitely a little bit of a perfectionist when it comes to things like that. Maybe you need to align the rotation of something to the edge of another object. You could just eyeball it, but that&apos;s hella time consuming and frustrating because you know you&apos;re never going to be able to get it just right.&lt;/p&gt;
&lt;p&gt;Let the computer do the heavy lifting and let&apos;s learn how to measure angles in Illustrator.&lt;/p&gt;
&lt;h2&gt;Ruler To The Rescue!&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://harnerdesigns.com/blog/measure-angles-in-illustrator/find-the-ruler-tool/&quot; rel=&quot;attachment wp-att-1017&quot;&gt;&lt;img src=&quot;https://harnerdesigns.com/wp-content/uploads/2019/03/find-the-ruler-tool.png&quot; alt=&quot;The Ruler&apos;s Hiding Under The Eyedropper&quot; class=&quot;alignnone size-large wp-image-1017&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;First thing you&apos;ll need to do is find the Ruler tool. It&apos;s located underneath the Eyedropper tool in the left-hand menu. Click and hold the Eyedropper button and then without letting go of your mouse slide over to the Ruler menu item that pops up to select the ruler.&lt;/p&gt;
&lt;p&gt;{{{vert}}}&lt;/p&gt;
&lt;h2&gt;Open The Info Window If It Didn&apos;t Pop Up&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://harnerdesigns.com/blog/measure-angles-in-illustrator/draw-a-line/&quot; rel=&quot;attachment wp-att-1020&quot;&gt;&lt;img src=&quot;https://harnerdesigns.com/wp-content/uploads/2019/03/Draw-A-Line-1024x716.png&quot; alt=&quot;Make Sure The Info Box Opened Up&quot; class=&quot;alignnone size-large wp-image-1020&quot;&gt;&lt;/a&gt;
With the Ruler selected, click anywhere on the artboard and the Info window should pop up. If it doesn&apos;t, go to &lt;code&gt;Window &gt; Info&lt;/code&gt; or &lt;code&gt;Ctrl + F8&lt;/code&gt; to bring it up.&lt;/p&gt;
&lt;p&gt;Now either click on two points, or click and drag a line between two points and the Info box will update with the angle of the segment you just drew, as well as info about Width/Height and the X/Y Positions.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://harnerdesigns.com/blog/measure-angles-in-illustrator/heres-the-angle/&quot; rel=&quot;attachment wp-att-1018&quot;&gt;&lt;img src=&quot;https://harnerdesigns.com/wp-content/uploads/2019/03/heres-the-angle.png&quot; alt=&quot;Here&apos;s where the angle is.&quot; class=&quot;alignnone size-large wp-image-1018&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Use Your New Found Knowledge For Good&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://harnerdesigns.com/blog/measure-angles-in-illustrator/the-angles-match-2/&quot; rel=&quot;attachment wp-att-1025&quot;&gt;&lt;img src=&quot;https://harnerdesigns.com/wp-content/uploads/2019/03/The-Angles-Match-1.png&quot; alt=&quot;Look! They Match Up So Perfectly.&quot; width=&quot;866&quot; height=&quot;412&quot; class=&quot;alignnone size-full wp-image-1025&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After pulling the angle from the Info box with the Ruler, we can use our -19.92° angle to rotate our elements so they line up. Save yourself &lt;em&gt;hours&lt;/em&gt; of frustration trying to get elements to line up by just measuring.&lt;/p&gt;
&lt;p&gt;You know what they say:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;h3&gt;Measure Twice. Save yourself &lt;em&gt;hours&lt;/em&gt; of frustration trying to get elements to line up by just measuring.&lt;/h3&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&apos;m not sure anyone &lt;em&gt;actually&lt;/em&gt; says that, but you get my point. Happy Protracting!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[WordPress Crop Image Button Grayed Out]]></title><description><![CDATA[You probably found this post because you're trying to crop images in WordPress' Media Library Image Editor. The button's greyed out right from the start. Oh No! How Do I Crop images with WordPress? You just have to click and drag on the image, the…]]></description><link>https://jackharner.com//blog/wordpress-crop-image-button-grayed-out/</link><guid isPermaLink="false">https://jackharner.com//blog/wordpress-crop-image-button-grayed-out/</guid><pubDate>Mon, 17 Dec 2018 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://harnerdesigns.com/wp-content/uploads/2018/12/Crop-Tool-Grayed-out.png&quot; alt=&quot;&quot; width=&quot;477&quot; height=&quot;393&quot; class=&quot;alignnone size-full wp-image-896&quot;&gt;
&lt;p&gt;You probably found this post because you&apos;re trying to crop images in WordPress&apos; Media Library Image Editor. The button&apos;s greyed out right from the start. Oh No! How Do I Crop images with WordPress?&lt;/p&gt;
&lt;h2&gt;It&apos;s Real Simple.&lt;/h2&gt;
&lt;p&gt;You just have to click and drag on the image, the area you want to crop. Once you let go of the mouse the button becomes clickable again. Yay!&lt;/p&gt;
&lt;img src=&quot;https://harnerdesigns.com/wp-content/uploads/2018/12/Crop-tool-not-grayed-out.png&quot; alt=&quot;&quot; width=&quot;488&quot; height=&quot;410&quot; class=&quot;alignnone size-full wp-image-897&quot;&gt;
&lt;p&gt;After you make your first try at selecting, you can lock the aspect ratio with the fields over to the right hand side. Select the area you want cropped and click the Crop Button (now that you can).&lt;/p&gt;
&lt;p&gt;Make sure to hit save and enjoy your newly cropped photos!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Upload SVG Files To WordPress]]></title><description><![CDATA[Allowing SVG Files in WordPress so you can upload them through the Media panel is surprisingly simple. This allows you to harness the power and speed benefits of SVG Files as opposed to Raster Images. Either add the following snippet to your theme's…]]></description><link>https://jackharner.com//blog/upload-svg-files-to-wordpress/</link><guid isPermaLink="false">https://jackharner.com//blog/upload-svg-files-to-wordpress/</guid><pubDate>Wed, 28 Nov 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Allowing SVG Files in WordPress so you can upload them through the Media panel is surprisingly simple. This allows you to harness the power and speed benefits of SVG Files as opposed to Raster Images.&lt;/p&gt;
&lt;p&gt;Either add the following snippet to your theme&apos;s &lt;code&gt;functions.php&lt;/code&gt; file or create a WordPress plugin that executes the following code:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;harnerdesigns_mime_types&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$mimes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token variable&quot;&gt;$mimes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;svg&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;image/svg+xml&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$mimes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;add_filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;upload_mimes&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;harnerdesigns_mime_types&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;There are &lt;a href=&quot;https://security.stackexchange.com/questions/11384/exploits-or-other-security-risks-with-svg-upload&quot;&gt;security concerns&lt;/a&gt; to allowing SVG files to be uploaded, so make sure that only trusted contributors have access to uploading.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Pushing WordPress Theme Updates With Git]]></title><description><![CDATA[Do you frequently update WordPress themes? It's kind of a pain in the ass, right?  Typically has to be done manually through FTP or uploading a new zip through the backend. Well, today I'm going to show you how to update your site with just: Sounds…]]></description><link>https://jackharner.com//blog/pushing-wordpress-theme-updates-with-git/</link><guid isPermaLink="false">https://jackharner.com//blog/pushing-wordpress-theme-updates-with-git/</guid><pubDate>Tue, 11 Sep 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Do you frequently update WordPress themes? It&apos;s kind of a pain in the ass, right?  Typically has to be done manually through FTP or uploading a new zip through the backend.&lt;/p&gt;
&lt;p&gt;Well, today I&apos;m going to show you how to update your site with just:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ git push live&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Sounds to good to be true? It&apos;s not. Check it out:&lt;/p&gt;
&lt;h2&gt;Prerequisites&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;SSH Access to your web server&lt;/li&gt;
&lt;li&gt;Git installed on your local machine and on your web server&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This setup works best for one off customs themes (like the one on &lt;a href=&quot;https://harnerdesigns.com&quot;&gt;HarnerDesigns.com&lt;/a&gt;) and not for themes produced to be distributed.&lt;/p&gt;
&lt;h2&gt;Create Your Repo Locally&lt;/h2&gt;
&lt;p&gt;First things first, create a folder for your project and enter it:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ mkdir git-test &amp;amp;amp;&amp;amp;amp; cd git-test&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;then initialize the repo:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ git init&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Alternatively, you can just clone my &lt;a href=&quot;https://github.com/harnerdesigns/blank2&quot;&gt;Blank2 - Blank WordPress Theme&lt;/a&gt; repo to get started:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ git clone https://github.com/harnerdesigns/blank2.git git-test&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Create A Bare Repo On The Remote Server&lt;/h2&gt;
&lt;p&gt;A bare repo is a directory containing the working tree of your git project, just without storing all the files. It&apos;s essentially just a directory of all the files noramlly in your .git directory.&lt;/p&gt;
&lt;p&gt;SSH into your server:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ ssh &amp;amp;lt;user&amp;amp;gt;@&amp;amp;lt;server&amp;amp;gt;:&amp;amp;lt;sshPort&amp;amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Create a folder for the bare repo and enter it:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;amp;lt;user&amp;amp;gt;@&amp;amp;lt;server&amp;amp;gt; $ mkdir git-test.git &amp;amp;amp;&amp;amp;amp; cd git-test.git&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Remember where on the server you created this directory, you&apos;ll need that later (Doing it in your home directory works perfectly fine).&lt;/p&gt;
&lt;p&gt;Initialize the bare repo:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;amp;lt;user&amp;amp;gt;@&amp;amp;lt;server&amp;amp;gt; $ git init --bare&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;[ad]&lt;/p&gt;
&lt;h2&gt;Hook It Up&lt;/h2&gt;
&lt;p&gt;Your shiny new bare git repo has a directory &lt;code&gt;hooks&lt;/code&gt; and in it are a bunch of .sample files. We want to do something after the repo receives new data, so create a new file called &lt;code&gt;post-receive&lt;/code&gt; (no extension) and add the following to it:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;#!/bin/bash
GIT_WORK_TREE=&amp;amp;lt;pathToWordPressInstall&amp;amp;gt;/wp-content/themes/git-test git checkout -f&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;What this will do is, any time you push to this git repo, set the working tree for the repo to the theme folder in your WordPress install and then force checkout the files.&lt;/p&gt;
&lt;h2&gt;Back Down From The &quot;Cloud&quot;&lt;/h2&gt;
&lt;p&gt;Now logout of your remote server. It&apos;s time to add the new repo as a remote for your local one.&lt;/p&gt;
&lt;p&gt;Make sure you&apos;re in your project&apos;s folder:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ git remote add live ssh://&amp;amp;lt;server&amp;amp;gt;/home/&amp;amp;lt;user&amp;amp;gt;/git-test.git&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;and that&apos;s it! All you need to do to update your live theme now is add some files, commit them like normal and then run:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ git push live&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Being able to Update WordPress sites quickly allows for quicker bug fixes and less time spent wrangling files. Combine this idea with a taskrunner like Gulp and you&apos;ll be flying through updates.&lt;/p&gt;
&lt;p&gt;Let me know if you use this method or if you have any other ways to manage WordPress Themes!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Pointing A Domain to The Newest File In A Directory]]></title><description><![CDATA[I wrote a python script for Shoolu.com to use the BigCommerce API to pull the latest added products and generate an XML RSS file.  BigCommerce did have the functionality to automatically generate these RSS feeds but they have moonlighted support and…]]></description><link>https://jackharner.com//blog/pointing-a-domain-to-the-newest-file-in-a-directory/</link><guid isPermaLink="false">https://jackharner.com//blog/pointing-a-domain-to-the-newest-file-in-a-directory/</guid><pubDate>Fri, 17 Aug 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I wrote a python script for Shoolu.com to use the BigCommerce API to pull the latest added products and generate an XML RSS file.  BigCommerce did have the functionality to automatically generate these RSS feeds but they have moonlighted support and have removed it for new merchants so it didn&apos;t seem like something to rely on.&lt;/p&gt;
&lt;h2&gt;PYTHON To The Rescue&lt;/h2&gt;
&lt;p&gt;I found the BigCommerce Python API and used that to fetch all the products with a created date of at most 7 days ago. I then looped through all those products to create the nessecary items in the RSS File.&lt;/p&gt;
&lt;p&gt;This worked well and good but I was basically just overwriting the one file and losing any previous weeks worth of New Products. I knew it would be easy enough to just write to a different file with the current date in the file name so it&apos;d be new every time.&lt;/p&gt;
&lt;h2&gt;Trouble In Paradise&lt;/h2&gt;
&lt;p&gt;The plan was to use this RSS feed to generate a &quot;What&apos;s new at Shoolu&quot; email every week through MailChimp and their ability to work with RSS Feeds. The problem with the current approach of dating the files was that I was pointing Mailchimp at the one direct file so I&apos;d have to update it every week which kind of defeats the purpose of all of this.&lt;/p&gt;
&lt;p&gt;{{{vert}}}&lt;/p&gt;
&lt;h2&gt;An Unexpected Solution&lt;/h2&gt;
&lt;p&gt;I tried digging around for a way to have a root domain (&lt;a href=&quot;https://rss.shoolu.com&quot;&gt;rss.shoolu.com&lt;/a&gt;) point to the latest file in the directory. There were several suggestions including using php to fetch the latest file and redirecting and some other less than elegant solutions.&lt;/p&gt;
&lt;p&gt;None of them really tickled me the way a good solution does.&lt;/p&gt;
&lt;p&gt;I finally decided to just update the python script to just output &lt;code&gt;index.xml&lt;/code&gt; as well as &lt;code&gt;latestProducts-[date].xml&lt;/code&gt;. That way &lt;code&gt;index.xml&lt;/code&gt; would get overwritten with the currently accurate info and we&apos;d also get the dated backups to log.&lt;/p&gt;
&lt;p&gt;Then for simplicities sake I just updated the Apache Virtual Host file for the domain:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;lt;Directory /var/www/rss/public/&gt;
    ...
    DirectoryIndex index.xml
&amp;lt;/Directory&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So the root domain would point directly to the file. Might not be the most elegant solution, but it works in this specific case so I&apos;d figured I&apos;d document it.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Custom Post Type Archives Not Showing Up In WordPress Menus]]></title><description><![CDATA[Need to add Custom Post Type Archives to a WordPress menu but they're not showing up? I tore my hair out for a good while before finding the answer. For some reason, most of my custom post types were showing up just fine, but some weren't. The answer…]]></description><link>https://jackharner.com//blog/custom-post-type-archives-not-showing-up-in-wordpress-menus/</link><guid isPermaLink="false">https://jackharner.com//blog/custom-post-type-archives-not-showing-up-in-wordpress-menus/</guid><pubDate>Sat, 28 Apr 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Need to add Custom Post Type Archives to a WordPress menu but they&apos;re not showing up? I tore my hair out for a good while before finding the answer. For some reason, most of my custom post types were showing up just fine, but some weren&apos;t. The answer is surprisingly simple and shouldn&apos;t have taken me as long to figure out as it did.&lt;/p&gt;
&lt;h2&gt;Make Sure The Archive Is Turned On&lt;/h2&gt;
You can&apos;t add a CPT Archive to a menu if that archive doesn&apos;t exist. Make sure in your functions.php file that you include the following code when creating the post type:
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token function&quot;&gt;register_post_type&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;example&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
    &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;has_archive&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;gt&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token constant boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
        &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;other args&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Check Under The &quot;View All&quot; Tab&lt;/h2&gt;
Once you made sure that the archive is on, check under the View All tab for the custom post type. It should just be the plural name of your custom post type, but it could be different depending on the settings in your register_post_type() function.
&lt;img class=&quot;alignnone wp-image-433 size-full&quot; src=&quot;https://harnerdesigns.com/wp-content/uploads/2018/04/View-All-Tab.png&quot; alt=&quot;Make Sure To Check The View All Tab&quot; width=&quot;600&quot; height=&quot;400&quot;&gt;
&lt;h2&gt;Check The Screen Options&lt;/h2&gt;
If your custom post type isn&apos;t showing up at all on the Menu page, check the Screen Options. For some reason, new CPTs can possibly be unchecked and thus, not show up at all on the Menu page. Make sure everything is checked in the box and you should be all set!
&lt;img class=&quot;alignnone wp-image-434 size-full&quot; src=&quot;https://harnerdesigns.com/wp-content/uploads/2018/04/Screen-Options.png&quot; alt=&quot;Check The Screen Options And Make Sure Your Custom Post Type Is Checked&quot; width=&quot;600&quot; height=&quot;204&quot;&gt;
&lt;h2&gt;Conclusion. Working Custom Post Type Archives&lt;/h2&gt;
And That&apos;s It! You should be able to add the Custom Post Type Archives to the menus in WordPress now. Let me know in the comments down below if you have any questions! Be sure to check out the rest of our &lt;a href=&quot;https://jackharner.com/blog/tags/wordpress/&quot;&gt;WordPress Tutorials&lt;/a&gt;.</content:encoded></item><item><title><![CDATA[Using Flex Box For Responsive Design]]></title><description><![CDATA[Today I’m going to show you how to use Flex Box to create a row of buttons that turns into a responsive list of links with just CSS. This technique can be useful for having multiple large calls to action. Keep reading to learn what’s going on in the…]]></description><link>https://jackharner.com//blog/using-flex-box-for-responsive-design/</link><guid isPermaLink="false">https://jackharner.com//blog/using-flex-box-for-responsive-design/</guid><pubDate>Mon, 20 Jun 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Flex Box is Pretty Awesome&lt;/h2&gt;
&lt;p&gt;Today I’m going to show you how to use Flex Box to create a row of buttons that turns into a responsive list of links with just CSS. This technique can be useful for having multiple large calls to action. Keep reading to learn what’s going on in the code, or just jump to the bottom for the source code, it’s up to you.&lt;/p&gt;
&lt;img src=&quot;https://harnerdesigns.com/wp-content/uploads/2016/06/Flex-Grid.png&quot; alt=&quot;Flex-Grid&quot;&gt;
&lt;h2&gt;Basic HTML&lt;/h2&gt;
&lt;p&gt;We’ll start off with some initial markup:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;container&amp;gt;
    &amp;lt;div class=&quot;button&quot;&amp;gt;
        &amp;lt;p&amp;gt;Classes&amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;button&quot;&amp;gt;
        &amp;lt;p&amp;gt;Instructors&amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;button&quot;&amp;gt;
        &amp;lt;p&amp;gt;Sign&amp;amp;nbsp;Up&amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/container&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Desktop CSS&lt;/h2&gt;
&lt;p&gt;Then we’ll add some CSS to make the Desktop version:&lt;/p&gt;
&lt;img src=&quot;https://harnerdesigns.com/wp-content/uploads/2016/06/desktop-css.png&quot; alt=&quot;desktop css&quot;&gt;
&lt;pre&gt;&lt;code&gt;container {
    display: flex;
    align-items: center;
    justify-content: space-around;
    width: 70%;
    flex-wrap: wrap;
}

.button {
    background: rgba(255, 255, 255, 1);
    width: 15%;
    text-align: center;
    height: auto;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What this does is makes the container the Flex Box for all the buttons. We can then use all of the flex box properties to adjust how the buttons display. For more info on flex box and what you can do with it, check out CSS-Trick’s &lt;a href=&quot;https://css-tricks.com/snippets/css/a-guide-to-flexbox/&quot; target=&quot;_blank&quot;&gt;Comprehensive Guide&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Mobile CSS&lt;/h2&gt;
&lt;p&gt;Now for the magic. By adding the cards and the container to the mobile media query we can then manipulate the flex-direction property. As you can guess, flex direction adjusts which way the items will flow inside the container. By setting the container to flex-direction: column, and the cards to flex-direction:row; we can layout the buttons in a much more mobile friendly way.&lt;/p&gt;
&lt;img src=&quot;https://harnerdesigns.com/wp-content/uploads/2016/06/mobile-css.png&quot; alt=&quot;mobile css&quot;&gt;
&lt;pre&gt;&lt;code&gt;@media screen and (max-width: 900px) {
  container {
    flex-direction: column;
  }

  .button {
    width: 100%;
    flex-direction: row;
    align-items: center;
    justify-content: flex-start;
    margin-bottom: 0.5em;
  }
  .button p {
    padding: 0 0.5em;
  }

}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&apos;s it! With a little flex box magic and a single media query you can easily have a row of buttons for your users with more screen real estate, and a column for those on their phones and small tablets.&lt;/p&gt;
&lt;p class=&quot;codepen&quot; data-height=&quot;600&quot; data-theme-id=&quot;17675&quot; data-slug-hash=&quot;XKJBaQ&quot; data-default-tab=&quot;css,result&quot; data-user=&quot;jackharner&quot; data-embed-version=&quot;2&quot;&gt;See the Pen &lt;a href=&quot;https://codepen.io/jackharner/pen/XKJBaQ/&quot;&gt;ROW TO COLUMN&lt;/a&gt; by Jack Harner (&lt;a href=&quot;https://codepen.io/jackharner&quot;&gt;@jackharner&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;
&lt;script src=&quot;//assets.codepen.io/assets/embed/ei.js&quot; async=&quot;&quot;&gt;&lt;/script&gt;</content:encoded></item><item><title><![CDATA[Coffee Shops Cultivate Creativity]]></title><description><![CDATA[Every day we struggle as creatives to find that spark to ignite the creativity inside. I'm currently sitting in a Satellite Coffee just north of UNM while I wait for my girlfriend to get out of class and for some reason I feel compelled to write. I…]]></description><link>https://jackharner.com//blog/coffee-shops-cultivate-creativity/</link><guid isPermaLink="false">https://jackharner.com//blog/coffee-shops-cultivate-creativity/</guid><pubDate>Thu, 27 Aug 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every day we struggle as creatives to find that spark to ignite the creativity inside.&lt;/p&gt;
&lt;p&gt;I&apos;m currently sitting in a Satellite Coffee just north of UNM while I wait for my girlfriend to get out of class and for some reason I feel compelled to write. I&apos;ve been meaning to start this blog for a while. I&apos;m not entirely sure what it&apos;s going to become, but hopefully it&apos;ll be something.&lt;/p&gt;
&lt;p&gt;While I sit here, sipping on my White Chocolate Mocha, the sounds of long lost friends reuniting dance across my ears. Most of this specific coffee shop&apos;s clientele are health care workers, which makes sense seeing as it&apos;s right next to the hospital. There&apos;s a paramedic, at lest 2 nurses, a doctor who stopped in for a &quot;Greenie Breakfast Panini&quot;, and several administration workers.&lt;/p&gt;
&lt;p&gt;I&apos;m not sure what it is, but simply being here is boosting my productivity and my creativity. Maybe it&apos;s the smell of the coffee, or maybe it&apos;s the fact that I&apos;m not home. Either way, I feel like I&apos;ve been stuck in a bit of a rut lately and spending more time enjoying delicious coffee is the boost I need to get my creative juices flowing.&lt;/p&gt;</content:encoded></item></channel></rss>