<?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"><channel><title><![CDATA[Entropy by nt3rp]]></title><description><![CDATA[Fan culture, tech, and general geekery.]]></description><link>https://nt3rp.io</link><generator>GatsbyJS</generator><lastBuildDate>Thu, 08 Jul 2021 02:55:53 GMT</lastBuildDate><item><title><![CDATA[The Zeal Archives: Audio Drama 101]]></title><description><![CDATA[What exactly goes into an audio drama, and in particular, one that I'm very proud of: the Zeal Archives? 🎤🤔💭]]></description><link>https://nt3rp.io/posts/zeal-archives-audio-drama-101</link><guid isPermaLink="false">https://nt3rp.io/posts/zeal-archives-audio-drama-101</guid><pubDate>Wed, 30 Jun 2021 13:37:42 GMT</pubDate><content:encoded>&lt;p&gt;It’s the summer, and that means two things:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;It’s &lt;em&gt;way&lt;/em&gt; too hot outside&lt;/li&gt;&lt;li&gt;It’s crunch time for the various projects I’m working on!&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I definitely intend to finish my &lt;a href=&quot;nodecg-setting-up-development-environment&quot;&gt;series of blog posts about NodeCG development&lt;/a&gt;, but a few matters are a bit more pressing than &lt;a href=&quot;https://raceagainsttime.io&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;the Race Against Time&lt;/a&gt; (though, only &lt;em&gt;slightly&lt;/em&gt;). 🤏&lt;/p&gt;&lt;p&gt;Considering that it’s almost July and the Race Against Time is in August… what could possibly be &lt;em&gt;more pressing&lt;/em&gt;?&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://zealarchives.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;The Zeal Archives!&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The Zeal Archives is a monthly podcast that I produce that’s part audio drama, part discussion about the world of Chrono Trigger that runs anywhere from twenty to fifty minutes. I’m right in the middle of the third season, so I have a pretty good sense of how much effort it is to produce each episode… or so I thought.&lt;/p&gt;&lt;p&gt;For now, I want to talk about what goes into the production of an episode.&lt;/p&gt;&lt;h2 id=&quot;the-process&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#the-process&quot; aria-label=&quot;the 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;The Process&lt;/h2&gt;&lt;p&gt;Most of my experience podcasting has been doing a &lt;em&gt;weekly&lt;/em&gt; discussion podcast, so the Zeal Archives has been quite a different beast. For podcasts like &lt;a href=&quot;https://fanthropological.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Fanthropological&lt;/a&gt;, the process is pretty lightweight:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Agree on a topic with co-hosts&lt;/li&gt;&lt;li&gt;Do research, and think about interesting discussion topics&lt;/li&gt;&lt;li&gt;Record&lt;/li&gt;&lt;li&gt;Edit&lt;/li&gt;&lt;li&gt;Release show notes + promote&lt;/li&gt;&lt;li&gt;GOTO 1&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;That process &lt;em&gt;has&lt;/em&gt; to be lightweight, because otherwise it wouldn’t be possible in a week&lt;sup id=&quot;fnref-1&quot;&gt;&lt;a href=&quot;#fn-1&quot; class=&quot;footnote-ref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;! It’s also lightweight because it’s just a few roles (i.e. host(s), dialogue editor, showrunner).&lt;/p&gt;&lt;p&gt;But with a longer release schedule and an audio drama component… the process expands quite a bit. 😅&lt;/p&gt;&lt;p&gt;I tried to think of the best way to outline &lt;em&gt;how&lt;/em&gt; the process expands, and the thing that made the most sense was to think of the podcast’s production in terms of an idealized timeline.&lt;/p&gt;&lt;h3 id=&quot;pre-production-3--6-months-to-first-episode&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#pre-production-3--6-months-to-first-episode&quot; aria-label=&quot;pre production 3  6 months to first episode permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Pre-Production (3—6 Months to first episode)&lt;/h3&gt;&lt;p&gt;Pre-production is any of the work required before an episode can be recorded; it is the domain of the &lt;strong&gt;Showrunner&lt;/strong&gt; and the &lt;strong&gt;Writers&lt;/strong&gt;. Even though the podcast is composed of audio drama and discussion podcast, the vast majority of pre-production is driven by the audio drama since it determines the characters, topics, and environments that will be required&lt;sup id=&quot;fnref-2&quot;&gt;&lt;a href=&quot;#fn-2&quot; class=&quot;footnote-ref&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&lt;p&gt;I like to establish a rough idea of how the season will conclude and then work backwards from there, or sometimes I like to think about where I want the &lt;em&gt;next&lt;/em&gt; season to end so that I can plan the current one accordingly---There’s a lot of bouncing around. In either case, ten episodes short (or twenty ‘sections’) isn’t a ton of time for plot to occur, so I use that as a constraint to outline a few things that I want to happen in each episode at a high level.&lt;/p&gt;&lt;p&gt;I also try to pick a topic or theme for each episode from the world of Chrono Trigger trying to balance between people, places, items, and so on as well as making sure that episode topics bounce around between different time periods. The topic can also be helpful to connect the discussion and audio drama sections or to spark ideas to fill in the plot! With a topic selected, that episode’s research can get started.&lt;/p&gt;&lt;p&gt;Once I have a rough outline, I can start writing the script. I wish I had any particular tips or details for this, but I don’t really have any: I’m not a professional screenwriter!&lt;/p&gt;&lt;p&gt;Because it’s just me writing, and because the outline is fairly loose, I end up writing the scripts in order so that the events of the plot are more or less consistent (or at least, consistent from episode to episode). I just use Google Docs and an Add-on called &lt;a href=&quot;https://workspace.google.com/marketplace/app/fountainize/82574770793&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Fountainize&lt;/a&gt; that formats the writing in a script-y way.&lt;sup id=&quot;fnref-3&quot;&gt;&lt;a href=&quot;#fn-3&quot; class=&quot;footnote-ref&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;p&gt;Lastly, there’s &lt;strong&gt;casting&lt;/strong&gt;. After I’ve written all the scripts, I need to think about how I want different voices to sound, and then try to find people who can perform the role. While there are sites you can check out to find free voice actors, I feel really bad asking strangers to help out a project without getting paid… so instead, I enlisted the help of friends and friends of friends 🤣&lt;/p&gt;&lt;h3 id=&quot;production-1--3-months-to-first-episode&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#production-1--3-months-to-first-episode&quot; aria-label=&quot;production 1  3 months to first episode permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Production (1—3 Months to first episode)&lt;/h3&gt;&lt;p&gt;I’d say that this is where the magic happens, but honestly it’s all pretty magical! Production is where the &lt;strong&gt;Director&lt;/strong&gt;, &lt;strong&gt;Voice Actors&lt;/strong&gt;, and &lt;strong&gt;Hosts&lt;/strong&gt; really shine. If this were a bigger budget production—or if it were not a pandemic—this &lt;em&gt;might&lt;/em&gt; be the situation where you have the talent sit in a sound-proofed room, read the script, record lines, have the director give feedback, redo lines, etc.&lt;/p&gt;&lt;p&gt;While I &lt;em&gt;mostly&lt;/em&gt; have the tools for that, it’s not feasible to get a dozen-or-so people to my home to record. 🙃&lt;/p&gt;&lt;p&gt;Instead, I do the following:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Send written instructions on how to record and how to improve the recording quality—not everyone is a streamer / podcaster / musician / voice actor, after all!&lt;/li&gt;&lt;li&gt;Send a character guide which includes a sentence or two describing the character, my directions for the character, and other pronounciation details&lt;/li&gt;&lt;li&gt;Ask them to record at least three different takes of each line. That could be different emphasis, pacing, or mood, but I leave it up to them.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I try to get the recordings as early as possible so that I can check them for audio quality (sometimes people are too quiet, or the recording upload can fail) and get them re-recorded as needed.&lt;/p&gt;&lt;p&gt;Then the directing begins! Normally this would happen in-person, but instead I create a new project in Adobe Audition for the part of the episode I’m working on, add the actor’s track, and start listening to the takes. Since there are at least three takes, and usually more, I can pick the one that best fits the scene, or select parts from different takes to frakenstein together a new take with the best parts from multiple! Going through this process also helps in case any of the lines are missing from the recording.&lt;/p&gt;&lt;p&gt;It’s not a perfect process, but it does a pretty decent job considering the constraints. 🤷‍♂️&lt;/p&gt;&lt;p&gt;Production for the discussion part is even easier: as the host, I introduce the episode, set a timer, and me and my co-host Nick G talk until the timer is up or the conversation ends—whichever is more natural—referencing the research notes and topics as needed. Sometimes there’s too much to cover, or less to cover than we expected, or we end up going in a completely different direction… but that’s part of the fun, and what helps with the chemistry of all!&lt;/p&gt;&lt;p&gt;Unlike with the audio drama, I don’t go through these recordings to decide what content to keep or throw away; I do that as part of editing in post-production, since there’s generally less editing to do.&lt;/p&gt;&lt;h3 id=&quot;post-production-the-month-before-episode-release&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#post-production-the-month-before-episode-release&quot; aria-label=&quot;post production the month before episode release permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 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-production (the month before episode release)&lt;/h3&gt;&lt;p&gt;This is the realm of the &lt;strong&gt;Sound Designer&lt;/strong&gt; and &lt;strong&gt;Dialogue Editor&lt;/strong&gt;! Where all of the random voice clips somehow get transformed into real, living worlds… or I try to do that, anyway. It’s the magic of the editing process!&lt;/p&gt;&lt;p&gt;Learning &lt;em&gt;how&lt;/em&gt; to edit audio is its own gigantic thing, with limiters, and dynamics processing, and lots of other tools and tips, so I’m mostly going to talk about high-level pieces.&lt;/p&gt;&lt;p&gt;Editing the discussion is really straightforward, and my process reflects that:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Throw the two host tracks into Audition&lt;/li&gt;&lt;li&gt;Run ‘Match Loudness’ on the tracks&lt;/li&gt;&lt;li&gt;Sync the tracks&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;I do this manually since it’s only two people, but for larger groups you’ll want a clap or something to mark when recording started for everyone to sync with during editing&lt;/li&gt;&lt;/ul&gt;&lt;ol start=&quot;4&quot;&gt;&lt;li&gt;Set playback speed to 60%&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;This just helps to cover more of the discussion more quickly while still being slow enough to understand what’s being said&lt;/li&gt;&lt;/ul&gt;&lt;ol start=&quot;5&quot;&gt;&lt;li&gt;Play through the file, trimming out particularly awkward pauses, speech idioms, topics that don’t lead anywhere, and false starts&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;I aggressively cut out segments that don’t feel like anyone other than me and the host would enjoy, and try to keep a light touch on speech idioms unless they’re distracting&lt;/li&gt;&lt;li&gt;Match Loudness does a pretty good job, but sometimes there’s too much variation so I manually adjust the gain up or down for certain clips&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For the audio drama though? I don’t even know where to begin! The above process is &lt;em&gt;similar&lt;/em&gt; but there’s a lot more fiddly bits and the audio drama has a set of “instructions” (sort of)—the script. There are lots more things to think about, for example:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Timing:&lt;/strong&gt; Even if the take was really good, would it sound &lt;em&gt;better&lt;/em&gt; if there were more space between certain words? Would adjusting the timing work better with the music? Would a pause allow for a sound effect or feeling to land better? There’s no science to this for me, it’s all laying out the track and listening to what sounds good: it doesn’t feel like the audio is dragging, nor moving too quickly.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Treating vocals:&lt;/strong&gt; Sometimes, a voice is in a great hall, or a sewer, or offscreen, or the role is monstrous, and in all those cases the voice needs to sound different. Usually this means playing around with reverb, panning, or learning other interesting effects.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Finding sound effects:&lt;/strong&gt; The script may call for the roar of a crowd, but where do you get that sound from? What if you can’t find the ‘right’ sound effect? Fortunately &lt;a href=&quot;https://www.adobe.com/products/audition/offers/AdobeAuditionDLCSFX.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Adobe offers a bunch of royalty-free sound effects&lt;/a&gt; and you can also find a bunch on &lt;a href=&quot;https://freesound.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;freesound.org&lt;/a&gt;, but oftentimes I find something that’s not quite right and have to layer it with other sound effects or pitch it down.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Finding music:&lt;/strong&gt; The one big benefit of doing a video game themed podcast is that it’s not hard to find video game themed music (and, in particular, music from Chrono Trigger). I get 99.9% of the music for the podcast from &lt;a href=&quot;https://ocremix.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;OC Remix&lt;/a&gt;, which has an &lt;a href=&quot;https://ocremix.org/info/Content_Policy&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;extremely permission content policy&lt;/a&gt; and a wide variety of styles and tracks to pick from (many of which sound like symphonic, dramatic music)!&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Building up the atmosphere:&lt;/strong&gt; Sound effects and music go a long way, especially for action, but there’s more to it than that! Droning sounds are necessary to give locations a more natural feel—think of the sound of the wind blowing and birds chirping for a first scene—and aren’t really a sound effect or music so much as they are their own ambient track.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Rolling with the punches:&lt;/strong&gt; Sometimes, when editing, the combination of my skill level, the available takes, and the script don’t line up. That’s ok! Sometimes what’s on paper is really hard to convey in audio, or the voice actor went in a different direction vocally. I usually have to make a choice to cut a section (works for small bits) or try to convey something slightly different.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Outtakes:&lt;/strong&gt; I am fortunate in that sometimes the voice actors will leave in flubs and mistakes. Sometimes, they’re just goofs, but sometimes, they’re hilarious, so I keep a separate file with the episode’s best mistakes to use later.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;…And those are just the things that come to mind! After the discussion and audio drama are done, there’s a small step to combine them into one finished product with a set of plugs at the end. I also compile all the show notes, script, and podcast file and upload to the podcast host.&lt;/p&gt;&lt;h3 id=&quot;promotion-the-month-that-the-episode-is-released&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#promotion-the-month-that-the-episode-is-released&quot; aria-label=&quot;promotion the month that the episode is released permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Promotion (the month that the episode is released)&lt;/h3&gt;&lt;p&gt;If you wanted to grow a podcast, this would be a very important part, but I definitely skimp on it 😅. Promotion is the purview of the &lt;strong&gt;Marketing Manager&lt;/strong&gt; and &lt;strong&gt;Graphic Designer&lt;/strong&gt;. Honestly, there’s not much that I do here. It’s mostly limited to:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Creating cover art for the episode (super easy once the first template is made)&lt;/li&gt;&lt;li&gt;Creating audiograms to tease the episode: I pick a short segment from the episode and then use &lt;a href=&quot;https://www.headliner.app/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Headliner&lt;/a&gt; to turn it into a video with an included transcription&lt;/li&gt;&lt;li&gt;Creating voice actor art showcasing the actor and their role (because they are amazing and should be celebrated!)&lt;/li&gt;&lt;li&gt;Scheduling posts for all of this on social media (Twitter, Facebook, and Instagram, even though reach is terrible)&lt;/li&gt;&lt;li&gt;Posting to friends’ discords about the new episode release&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;…And that’s pretty much what goes into an episode… if you repeat it ten times, I mean.&lt;/p&gt;&lt;h2 id=&quot;the-reality&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#the-reality&quot; aria-label=&quot;the reality permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 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 Reality&lt;/h2&gt;&lt;p&gt;As planned, all pre-production and production would happen before the first episode is released, but in practice it’s sort of a wheels-within-wheels situation where parts of one episode are wrapping up as parts of the next episode start up. As a good example, all of the scripts are written for the season, and I have lines recorded from voice actors for many of the episodes, but I haven’t completed research for episodes six to ten, nor have their discussions been recorded.&lt;/p&gt;&lt;p&gt;Also, while there are many different roles in the production of the podcast, in practice most of those roles are performed by me which means that some actions get blocked not because of dependencies, but just general availability!&lt;/p&gt;&lt;p&gt;And you’d think that, given this is the third season I’d have a pretty good grasp of how long that all takes… but that’s a story for the &lt;em&gt;next&lt;/em&gt; blog post. 😉&lt;/p&gt;&lt;p&gt;I hope that this was a little bit eye-opening into what goes on behind the scenes for an audio drama. I didn’t intend for it to be a guide, but I did want to paint a picture!&lt;/p&gt;&lt;div class=&quot;footnotes&quot;&gt;&lt;hr/&gt;&lt;ol&gt;&lt;li id=&quot;fn-1&quot;&gt;It might be possible in a week if you have a whole creative team &lt;em&gt;or&lt;/em&gt; have supporters of some sort, but all of the podcast I work on have a skeleton crew that are working in their free time for… well, free.&lt;a href=&quot;#fnref-1&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-2&quot;&gt;Technically the audio drama and discussion components don’t need to be linked at all, but for some sense of cohesion there’s always some tie between the two, and the two are planned concurrently.&lt;a href=&quot;#fnref-2&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-3&quot;&gt;I’ve heard good things about &lt;a href=&quot;https://www.literatureandlatte.com/scrivener/overview&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Scrivener&lt;/a&gt; and I think &lt;a href=&quot;https://www.writerduet.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;WriterDuet&lt;/a&gt; but haven’t used either.&lt;a href=&quot;#fnref-3&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Getting Started with NodeCG: Parcel Problems]]></title><description><![CDATA[Sometimes, even when you've read the documentation, and read the source code... it's just not enough. 😭💻💣]]></description><link>https://nt3rp.io/posts/nodecg-parcel-problems</link><guid isPermaLink="false">https://nt3rp.io/posts/nodecg-parcel-problems</guid><pubDate>Mon, 31 May 2021 13:37:42 GMT</pubDate><content:encoded>&lt;p&gt;To be completely honest, I haven’t been able to do a lot of NodeCG development…
and blog-wise, I haven’t even started talking about how NodeCG actually works!&lt;/p&gt;&lt;p&gt;But in the few times that I’ve been able to sit down and work, I &lt;em&gt;have&lt;/em&gt; learned a
few things about Parcel that I think are worth calling out, especially since
they seem to mostly impact NodeCG development the most. Especially since
&lt;a href=&quot;nodecg-setting-up-development-environment&quot;&gt;I first started talking about setup&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Let’s start with the fix, and then explain why it’s needed. 😎👉👉&lt;/p&gt;&lt;p&gt;(Oh yeah, and these changes will also be reflected in
&lt;a href=&quot;https://github.com/nt3rp/nodecg-parcel-ts-preact/tree/parcel-problems&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;my example repository&lt;/a&gt;)&lt;/p&gt;&lt;h2 id=&quot;the-fix&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#the-fix&quot; aria-label=&quot;the fix permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 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 Fix&lt;/h2&gt;&lt;p&gt;First, we need to install &lt;a href=&quot;https://github.com/kimmobrunfeldt/concurrently&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;concurrently&lt;/code&gt;&lt;/a&gt;&lt;sup id=&quot;fnref-1&quot;&gt;&lt;a href=&quot;#fn-1&quot; class=&quot;footnote-ref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;.&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;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; --save-dev concurrently&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;concurrently&lt;/code&gt; allows us to run multiple commands… well, concurrently!
We’ll also need to change our &lt;code class=&quot;language-text&quot;&gt;scripts&lt;/code&gt; stanza of &lt;code class=&quot;language-text&quot;&gt;package.json&lt;/code&gt;. Previously, it
looked 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 property&quot;&gt;&amp;quot;scripts&amp;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;&amp;quot;start&amp;quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;quot;parcel serve &amp;#x27;./src/**/*.html&amp;#x27; --dist-dir=.&amp;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;We’ll want to change it to 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 property&quot;&gt;&amp;quot;scripts&amp;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;&amp;quot;watch:graphics&amp;quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;quot;parcel watch &amp;#x27;src/graphics/*.html&amp;#x27; --dist-dir=&amp;#x27;graphics&amp;#x27; --public-url=&amp;#x27;.&amp;#x27;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&amp;quot;build:graphics&amp;quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;quot;parcel build &amp;#x27;src/graphics/*.html&amp;#x27; --dist-dir=&amp;#x27;graphics&amp;#x27; --public-url=&amp;#x27;.&amp;#x27;&amp;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;And lastly, instead of running &lt;code class=&quot;language-text&quot;&gt;npm start&lt;/code&gt;, we’ll want to run
&lt;code class=&quot;language-text&quot;&gt;npx concurrently &amp;#x27;npm:watch*&amp;#x27;&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;And that’s it! There are likely some changes and tweask you’ll want to make if
you also have dashboards, and I’ll probably expand on this when I start working
on NodeCG extensions, but this should fix a lot of the problems I ran into after
&lt;em&gt;actually&lt;/em&gt; working in my setup.&lt;/p&gt;&lt;h2 id=&quot;why&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#why&quot; aria-label=&quot;why permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 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?&lt;/h2&gt;&lt;p&gt;I was really confused when I actually went to work in the previous setup. It
worked fine when I had &lt;code class=&quot;language-text&quot;&gt;graphics&lt;/code&gt;, but &lt;em&gt;not&lt;/em&gt; when I also had &lt;code class=&quot;language-text&quot;&gt;dashboard&lt;/code&gt; pages.&lt;/p&gt;&lt;p&gt;More specifically, when I looked at the source code in the generated HTML, the
paths were not as I expected. Instead of something 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;&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;&amp;#x27;&lt;/span&gt;my-bundle.js&lt;span class=&quot;token punctuation&quot;&gt;&amp;#x27;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;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;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I was seeing 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;&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;&amp;#x27;&lt;/span&gt;graphics/my-bundle.js&lt;span class=&quot;token punctuation&quot;&gt;&amp;#x27;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;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;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What was the issue then 🤔💭&lt;/p&gt;&lt;p&gt;This lead me on a long path of learning about Parcel, specifically its
&lt;a href=&quot;https://v2.parceljs.org/plugin-system/overview/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;plugin system&lt;/a&gt; and
&lt;a href=&quot;https://v2.parceljs.org/getting-started/configuration/#specifying-entrypoints&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;entrypoints&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;When we run &lt;code class=&quot;language-text&quot;&gt;parcel serve &amp;#x27;./src/**/*.html&amp;#x27; --dist-dir=.&lt;/code&gt;, as in the initial
example, that tells Parcel two things:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Put the generated “bundles” in the root (&lt;code class=&quot;language-text&quot;&gt;.&lt;/code&gt;) directory&lt;/li&gt;&lt;li&gt;Specify a ‘glob’ of HTML files as entry points&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Globs are sort of like a regular expression for files and file paths. In our
case, we’re saying “give me all &lt;code class=&quot;language-text&quot;&gt;.html&lt;/code&gt; files in any directory under &lt;code class=&quot;language-text&quot;&gt;src&lt;/code&gt;“.&lt;/p&gt;&lt;p&gt;Alright, so far so good. But why did it work when there was one folder, but not
when there were two folders? Why did different paths get generated in our
bundles?&lt;/p&gt;&lt;p&gt;As I dug into the source code, &lt;a href=&quot;https://github.com/parcel-bundler/parcel/blob/ba57b6501632703d68923b214b0c0f6d47a34b1f/packages/core/core/src/resolveOptions.js#L40&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;I learned about a subtle behaviour&lt;/a&gt;
that &lt;em&gt;probably&lt;/em&gt; makes sense for other projects, but not for NodeCG.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; entryRoot &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;
  initialOptions&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;entryRoot &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&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;initialOptions&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;entryRoot&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 function&quot;&gt;getRootDir&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;entries&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;That snippet is from the code that decides the root path for bundles. As I
scanned through the codebase, I eventually discovered that, effectively, only
the &lt;code class=&quot;language-text&quot;&gt;getRootDir&lt;/code&gt; branch is ever reached.&lt;/p&gt;&lt;p&gt;And when digging into &lt;em&gt;that&lt;/em&gt; code, I learned that when generating the path for
bundles, it will use the root of &lt;em&gt;all&lt;/em&gt; the entry points.&lt;/p&gt;&lt;p&gt;Oops 🙃&lt;/p&gt;&lt;p&gt;Now, this isn’t a secret behaviour—It’s technically spelled out in
&lt;a href=&quot;https://v2.parceljs.org/features/module-resolution/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;the Module Resolution section of the documentation&lt;/a&gt;.
&lt;em&gt;But&lt;/em&gt; it wasn’t really clear to me what was happening until &lt;a href=&quot;https://github.com/parcel-bundler/parcel/discussions/6277&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;I tried a whole bunch of things&lt;/a&gt;.
In fact, &lt;a href=&quot;https://v2.parceljs.org/getting-started/configuration/#targets&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Parcel has an alternative way to handle targets&lt;/a&gt;
it just &lt;a href=&quot;https://github.com/parcel-bundler/parcel/issues/3821&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;doesn’t work with globs yet&lt;/a&gt;&lt;/p&gt;&lt;p&gt;What that all means is that if you want to have behaviour where the root path is
set to just the folder you’re working with, you need to explicitly pass it in:&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;parcel &lt;span class=&quot;token function&quot;&gt;watch&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;src/graphics/*.html&amp;#x27;&lt;/span&gt; --dist-dir&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;graphics&amp;#x27;&lt;/span&gt; --public-url&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;.&amp;#x27;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;*sigh*&lt;/em&gt; 😫&lt;/p&gt;&lt;p&gt;Anyway, I figured all this out so you don’t have to! I hope this helped out
anyone having issues, and maybe even helped to understand Parcel a bit better.&lt;/p&gt;&lt;p&gt;Personally, I’m hoping that I don’t encounter anything like this again in future
development. It took up a lot of time unexpectedly, and if I’m being honest, if
it happens again, you’ll probably see a blog post about how to get NodeCG setup
with something like &lt;a href=&quot;https://www.snowpack.dev/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Snowpack&lt;/a&gt; 🤣&lt;/p&gt;&lt;div class=&quot;footnotes&quot;&gt;&lt;hr/&gt;&lt;ol&gt;&lt;li id=&quot;fn-1&quot;&gt;You can also use something like &lt;a href=&quot;https://www.npmjs.com/package/npm-run-all&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npm-run-all&lt;/code&gt;&lt;/a&gt; if you want; Concurrently seemed just a bit easier for me to use.&lt;a href=&quot;#fnref-1&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Tool Spotlight: Eleventy]]></title><description><![CDATA[WHAT IF ... I was going to build another static website for the umpteenth time? What would I do then? 🤣💻]]></description><link>https://nt3rp.io/posts/tool-spotlight-eleventy</link><guid isPermaLink="false">https://nt3rp.io/posts/tool-spotlight-eleventy</guid><pubDate>Fri, 30 Apr 2021 13:37:42 GMT</pubDate><content:encoded>&lt;p&gt;I absolutely love how many cool tools there are out there! The other day, while
trying to figure out the new website for &lt;a href=&quot;https://raceagainsttime.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;the Race Against Time&lt;/a&gt;,
I came across &lt;a href=&quot;https://www.11ty.dev/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Eleventy&lt;/a&gt;. In a nutshell, its a JavaScript
static site generator like &lt;a href=&quot;https://www.gatsbyjs.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Gatsby&lt;/a&gt;  (which powers
this website).&lt;/p&gt;&lt;p&gt;Given how many static site genenators there are out there, you might ask, why
do we need another one? 😅&lt;/p&gt;&lt;p&gt;I don’t have an answer to that, but I can tell you about why it made sense for
rebuilding the Race Against Time’s website, and compare it to my experiences
building this blog.&lt;/p&gt;&lt;h2 id=&quot;starting-a-site-again&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#starting-a-site-again&quot; aria-label=&quot;starting a site again permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Starting a Site… Again&lt;/h2&gt;&lt;p&gt;As mentioned &lt;a href=&quot;blogging-with-2020-hindsight&quot;&gt;when I started this blog&lt;/a&gt;, I’ve
tried a lot of different tools for hosting what is essentially a basic website.
In those cases, and for the Race Against Time, there’s only a small list of
idealized requirements:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Routine things should be easy:&lt;/strong&gt; Since 99% of the site is writing text and
adding images, there should be little complexity for that.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Low maintenance:&lt;/strong&gt; I don’t want the site to be ‘down’ or require constant
updates. Again, the end product is mostly simple HTML.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Simple, not necessarily easy:&lt;/strong&gt; I’d rather have a tool that is simple than
one that hide complexity. More on that soon.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Data transformations:&lt;/strong&gt; For the Race Against Time, a lot of want I want to
present—like prizes, achievements, or guests—is just data that is iterated
over, and rendered.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;And an optional requirement: it would be nice if non-programmers could work on
it. This wasn’t super high priority as I expect that it’ll mostly still be just
me working on the project.&lt;/p&gt;&lt;p&gt;Given those requirements, what did I end up looking at?&lt;/p&gt;&lt;h3 id=&quot;wordpress&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#wordpress&quot; aria-label=&quot;wordpress permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Wordpress&lt;/h3&gt;&lt;p&gt;Wordpress checks a lot of boxes. It’s really easy to update content, themes, and
so on, has tons of existing templates and plugins, and is easy for
non-programmers. It isn’t free (though, it is inexpensive), and doesn’t require
a ton of maintenance… but generally hasn’t been my favourite.&lt;/p&gt;&lt;p&gt;I couldn’t find a way to transform data (like JSON) into rendered blocks, but
I’m sure something like that exists somewhere in Wordpress-land.&lt;/p&gt;&lt;h3 id=&quot;gatsby&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#gatsby&quot; aria-label=&quot;gatsby permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Gatsby&lt;/h3&gt;&lt;p&gt;As I said, I use this for the blog, and generally I’ve been happy with it. 99%
of what I need can be written as markdown files, and the site itself would
require no maintenance (since it’s a static site). Not entirely non-programmer
friendly, and can definitely support data transformations.&lt;/p&gt;&lt;p&gt;…But it’s a &lt;em&gt;lot&lt;/em&gt; of code for such a small project, with a lot of abstractions
that probably aren’t needed?&lt;/p&gt;&lt;h2 id=&quot;enter-eleventy&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#enter-eleventy&quot; aria-label=&quot;enter eleventy permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Enter Eleventy&lt;/h2&gt;&lt;p&gt;I’m not going to claim that 11ty is the &lt;em&gt;perfect&lt;/em&gt; tool, but I think it works
really well for what amounts to a single-page (or small number of pages) website.&lt;/p&gt;&lt;p&gt;This is the quick start guide:&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;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; -g @11ty/eleventy
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;# Page header&amp;#x27;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt; README.md
eleventy&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;…Which will generate an HTML file from a markdown file. That’s it.&lt;/p&gt;&lt;p&gt;And while that seems stupidly un-useful (spoiler alert: it is), it’s that
simplicity that makes it shine.&lt;/p&gt;&lt;p&gt;In a more realistic example, the Race Against Time’s website is generated from
a markdown file that looks like this:&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 hr punctuation&quot;&gt;---&lt;/span&gt;
title: The Race Against Time
&lt;span class=&quot;token title important&quot;&gt;layout: homepage.liquid
&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;#&lt;/span&gt; The Race Against Time VII {#overview}&lt;/span&gt;

{% floatImg &amp;quot;images/crono.png&amp;quot; &amp;quot;right&amp;quot; %}

{% comment %} The rest of the content is beyond here. {% endcomment %}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Eleventy can use that front matter to define variables that are used in template
files, define what templates to use to render the page, define the rendering
engine (I’m using liquid but
&lt;a href=&quot;https://www.11ty.dev/docs/languages/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;many others are supported&lt;/a&gt;). Heck, I’ve
even defined my own tag here, &lt;code class=&quot;language-text&quot;&gt;floatImg&lt;/code&gt;, to render an image in a particular
way. The code for &lt;em&gt;that&lt;/em&gt; is defined in &lt;code class=&quot;language-text&quot;&gt;.eleventy.js&lt;/code&gt;:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&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;eleventyConfig&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  eleventyConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addShortcode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;quot;floatImg&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; floatImg&lt;span class=&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;// ... other configuration ...&lt;/span&gt;
&lt;span class=&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; floatImg &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; styles &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;quot;left&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;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 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;&amp;lt;img src=&amp;quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;path&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;quot;
    class=&amp;quot;float-image &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;styles&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;quot;
    style=&amp;quot;shape-outside: url(&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;path&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;)&amp;quot; /&amp;gt;&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With these tools, it means I can set up all my layout and other core
functionality and just focus on writing simple markdown documents!&lt;/p&gt;&lt;p&gt;I know that markdown + a layout engine like &lt;code class=&quot;language-text&quot;&gt;liquid&lt;/code&gt; is probably possible in
other ways, but 11ty’s focus on data also means that I do things like define a
&lt;a href=&quot;https://www.11ty.dev/docs/pages-from-data/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;JSON file and generate pages&lt;/a&gt; or
even &lt;a href=&quot;https://www.11ty.dev/docs/pages-from-data/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;fetch data asynchronously at build time&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I didn’t even mention that it can handle hot-reloading which is a fantastic
developer experience.&lt;/p&gt;&lt;p&gt;As I keep learning about new plugins and aspects of 11ty, it just seems like a
neat, lightweight tool to tackle static website generation!&lt;/p&gt;&lt;p&gt;If nothing else, it’s been fun to work with and learn 💗&lt;/p&gt;&lt;p&gt;I’m hoping to publish the source code of the website publically soon, even
though there isn’t much to it, just to show what it’s like.&lt;/p&gt;&lt;p&gt;Anyway! I hope that was helpful. I’ll definitely get back to talking about
&lt;a href=&quot;https://www.nodecg.dev/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;NodeCG&lt;/a&gt;, but as the Race Against Time draws closer,
I find myself juggling projects a lot 😅&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Getting Started with NodeCG: Cleaning up the Environment]]></title><description><![CDATA[Last time, we managed to get our front-end environment setup, but I missed a few steps that help to keep your code clean. Let's dig into that now! 😀🧹💻]]></description><link>https://nt3rp.io/posts/nodecg-cleaning-up-the-environment</link><guid isPermaLink="false">https://nt3rp.io/posts/nodecg-cleaning-up-the-environment</guid><pubDate>Thu, 18 Mar 2021 13:37:42 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;nodecg-setting-up-development-environment&quot;&gt;Last time&lt;/a&gt; I talked about getting Parcel and some other tools set-up so that we can get started developing widgets with NodeCG. I’m not going to cover NodeCG widgets quite yet, but if you want to learn how you can keep your brand new development environment in a clean state… then I’ve got you covered today!&lt;/p&gt;&lt;p&gt;As I mentioned last time, you can see me apply these steps in order &lt;a href=&quot;https://github.com/nt3rp/nodecg-parcel-ts-preact/commits/setup-guide&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;in this GitHub repository&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Alright, let’s get started! 😁&lt;/p&gt;&lt;h2 id=&quot;catching-code-and-format-smells-with-eslint--prettier&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#catching-code-and-format-smells-with-eslint--prettier&quot; aria-label=&quot;catching code and format smells with eslint  prettier permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Catching code and format smells with ESLint + Prettier&lt;/h2&gt;&lt;p&gt;Our dev environment is setup—why go further? Well, sometimes we write code that is innocuous now but could be problematic in the future, or we might have other people working with us and it’s useful to have a consistent style or format.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://eslint.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;ESLint&lt;/a&gt; can help us with part of this. We can use it to find and fix JavaScript (or in our case, TypeScript) problems&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://prettier.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Prettier&lt;/a&gt; is an opinionated code formatter so that we don’t have to think about how we format our code&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Let’s set those up!&lt;/p&gt;&lt;h3 id=&quot;eslint&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#eslint&quot; aria-label=&quot;eslint permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;ESLint&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://eslint.org/docs/user-guide/getting-started&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Installing ESLint is straightforward&lt;/a&gt;, but depends a lot on how you want to configure it. All you need to do is &lt;code class=&quot;language-text&quot;&gt;npm install --save-dev eslint&lt;/code&gt; then &lt;code class=&quot;language-text&quot;&gt;npx eslint --init&lt;/code&gt; to go through the wizard. I opted to pick the &lt;a href=&quot;https://standardjs.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;standard JS style&lt;/a&gt; but there are other styles available.&lt;/p&gt;&lt;p&gt;If you run &lt;code class=&quot;language-text&quot;&gt;eslint&lt;/code&gt; now (&lt;code class=&quot;language-text&quot;&gt;npx eslint &amp;quot;src/**&amp;quot;&lt;/code&gt;), it may warn you about some potential problems in the code we’ve written (oh no!). Some of these problems are self-imposed, but others might feel unfixable, for example:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;React must be in scope.&lt;/p&gt;&lt;p&gt;h is defined but never used.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;How do we handle these?! 😲&lt;/p&gt;&lt;p&gt;While our bundling process is aware of these variables, &lt;code class=&quot;language-text&quot;&gt;eslint&lt;/code&gt; is not. To fix this, we’re going to &lt;code class=&quot;language-text&quot;&gt;npm install --save-dev eslint-config-standard-preact&lt;/code&gt;&lt;sup id=&quot;fnref-1&quot;&gt;&lt;a href=&quot;#fn-1&quot; class=&quot;footnote-ref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; and make a small changes to our &lt;code class=&quot;language-text&quot;&gt;.eslintrc&lt;/code&gt; file.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&amp;quot;extends&amp;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;&amp;quot;plugin:react/recommended&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&amp;quot;standard&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&amp;quot;standard-preact&amp;quot;&lt;/span&gt;          &lt;span class=&quot;token comment&quot;&gt;// No need to add prefix; eslint is smart like that&lt;/span&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 if you run &lt;code class=&quot;language-text&quot;&gt;eslint&lt;/code&gt; again, the errors should hopefully go away. If they don’t, it’s possible that we missed something. Hopefully there’s enough information to resolve the issues if so 🤞&lt;/p&gt;&lt;h3 id=&quot;prettier&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#prettier&quot; aria-label=&quot;prettier permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Prettier&lt;/h3&gt;&lt;p&gt;That leaves Prettier. Honestly, if it’s just one person working on the project, adding this might be a bit of overkill, but it’s easy to add and leaves code in a consistent style so I’d still recommend it (and it works for multiple different file types).&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://prettier.io/docs/en/install.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Installation is pretty easy&lt;/a&gt;, and once you’ve done that, you can run &lt;code class=&quot;language-text&quot;&gt;npx prettier --write .&lt;/code&gt; to format all support files in your project!&lt;/p&gt;&lt;p&gt;…But don’t do that just yet! Prettier and ESLint may not agree on formatting—running Prettier could create style-based linting errors 😱&lt;/p&gt;&lt;p&gt;So we’ll need to fix that! Fortunately, &lt;a href=&quot;https://prettier.io/docs/en/integrating-with-linters.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Prettier has some documentation&lt;/a&gt; on a few different ways you can resolve this depending on your setup. In our case, we can go the recommended route and &lt;code class=&quot;language-text&quot;&gt;npm install --save-dev eslint-config-prettier&lt;/code&gt; and add it to the end of our &lt;code class=&quot;language-text&quot;&gt;.eslintrc&lt;/code&gt; “extends” as before:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&amp;quot;extends&amp;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;&amp;quot;plugin:react/recommended&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&amp;quot;standard&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&amp;quot;standard-preact&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&amp;quot;prettier&amp;quot;&lt;/span&gt;                 &lt;span class=&quot;token comment&quot;&gt;// Again, no prefix necessary&lt;/span&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;a href=&quot;https://github.com/prettier/eslint-config-prettier&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;More details on the &lt;code class=&quot;language-text&quot;&gt;eslint-config-prettier&lt;/code&gt; plugin are here&lt;/a&gt;. It will disable several rules but that’s worth it to make sure that the two programs don’t fight.&lt;/p&gt;&lt;p&gt;And voila, we’ve made our environment a little bit cleaner! ✨&lt;/p&gt;&lt;p&gt;…But can we do &lt;em&gt;more&lt;/em&gt;? 🤔💭&lt;/p&gt;&lt;h2 id=&quot;optional-integrating-with-atom&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#optional-integrating-with-atom&quot; aria-label=&quot;optional integrating with atom permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 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: Integrating with Atom&lt;/h2&gt;&lt;p&gt;It’s great that we have these tools, but running them manually still kind of sucks. Manual tools are tools that are not run very often.&lt;/p&gt;&lt;p&gt;There are a few different ways to fix this.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Git hooks&lt;/a&gt;: automatically run our tools before committing. &lt;a href=&quot;https://prettier.io/docs/en/precommit.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Prettier even has some documentation&lt;/a&gt; on a few different ways of doing this including a tool called &lt;a href=&quot;https://github.com/typicode/husky&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Husky&lt;/a&gt; which is intended to make git hooks easier.&lt;/li&gt;&lt;li&gt;Automatically run tools in your IDE: As long as you aren’t running notepad, you can probably set this up&lt;/li&gt;&lt;li&gt;Build toolkits (e.g. Gulp, Grunt, possibly even webpack or Parcel, CI): Have the tools run as part of the build process!&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Heck, you can probably implement a bunch of these simultaneously—which also reduces the likelihood of it being missed—but we’re going to focus on setting it up in the IDE for now. 🔍&lt;/p&gt;&lt;p&gt;I use &lt;a href=&quot;https://atom.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Atom&lt;/a&gt;, so most of the following steps will be specific to it, but I’m sure similar plugins or settings are available in most IDEs.&lt;/p&gt;&lt;p&gt;A quick rundown of the packages I installed, and the settings I had to change:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://atom.io/packages/linter&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;linter&lt;/code&gt;&lt;/a&gt;: This allows any sort of linting in the Atom UI. However, it needs specific linters installed to work…&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://atom.io/packages/linter-eslint&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;linter-eslint&lt;/code&gt;&lt;/a&gt;: Allows us to use &lt;code class=&quot;language-text&quot;&gt;eslint&lt;/code&gt; with linter! Atom will look for a version of &lt;code class=&quot;language-text&quot;&gt;eslint&lt;/code&gt; in the project, and if it can’t find one, will use a version that it is prepackeged with.&lt;ul&gt;&lt;li&gt;By default, it doesn’t know to lint &lt;code class=&quot;language-text&quot;&gt;.ts&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;.tsx&lt;/code&gt; files. To fix that, you’ll need to go into Atom’s settings &amp;gt; Packages &amp;gt; linter-eslint, and under it’s settings add &lt;code class=&quot;language-text&quot;&gt;source.ts, source.tsx&lt;/code&gt; to the list of scopes.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/prettier/prettier-atom&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;prettier-atom&lt;/code&gt;&lt;/a&gt;: Surprise! This will allow Atom to run Prettier.&lt;ul&gt;&lt;li&gt;Most settings you can leave as is, but I’d strongly suggest setting it to “Format on save” and also “Only format if a Prettier config is found”. This avoids the issue of formatting other files in Atom unexpectedly for projects not using Prettier.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://atom.io/packages/atom-typescript&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;atom-typescript&lt;/code&gt;&lt;/a&gt;: This lets Atom know about Typescript files so it can syntax highlight correctly and provide other useful typing hints&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;There’s also one last one which is super unnecessary for an individual project, but I’m including for completeness because I think it’s a cool idea to avoid arguments in groups: &lt;a href=&quot;https://editorconfig.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;EditorConfig&lt;/a&gt;. 🤓&lt;/p&gt;&lt;p&gt;In a nutshell, EditorConfig is another way of maintaining consistent code styles, but instead of doing it after the fact, like Prettier, it does so while you’re coding. It’s mostly for things like indentation amounts and type (tabs vs spaces), character sets, and line endings. It’s a little less necessary since we’re using Prettier, but a useful tool to add to your toolkit (and is supported by many IDEs).&lt;/p&gt;&lt;p&gt;To get it to work in Atom, we just need to install &lt;a href=&quot;https://atom.io/packages/editorconfig&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;editorconfig&lt;/code&gt;&lt;/a&gt; and add a basic file to our project at the root. I picked these settings fairly arbitrarily based on my preferences:&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;[*]
end_of_line = lf
charset = utf-8
indent_style = space
indent_size = 2
max_line_length = 80&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And that’s it! We now have a really tidy setup for our NodeCG development! I hope it won’t be too long before I can talk more about how to actually develop widgets, but I wanted to show you all how you can set things up cleanly for… well, most front end projects! 🥳&lt;/p&gt;&lt;div class=&quot;footnotes&quot;&gt;&lt;hr/&gt;&lt;ol&gt;&lt;li id=&quot;fn-1&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;eslint-config-standard-preact&lt;/code&gt; is quite old at this point (~4 years since a new version was published), so there may be better fixes for this problem… I’m just not aware of better alternatives at the moment.&lt;a href=&quot;#fnref-1&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Getting Started with NodeCG: Setting Up Your Development Environment]]></title><description><![CDATA[It's been a little while, and I want to get back into NodeCG development. Let's talk frontend development setup, for your benefit... and mine 😅💻👨‍💻]]></description><link>https://nt3rp.io/posts/nodecg-setting-up-development-environment</link><guid isPermaLink="false">https://nt3rp.io/posts/nodecg-setting-up-development-environment</guid><pubDate>Thu, 25 Feb 2021 13:37:42 GMT</pubDate><content:encoded>&lt;p&gt;As the next edition of &lt;a href=&quot;https://raceagainsttime.io&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;The Race Against Time&lt;/a&gt; draws nearer, I’m reminded that there’s always &lt;em&gt;so&lt;/em&gt; much work to be done. There are lots of different responsibilities to running the event, but the one that’s most familiar to me is overlay development 😅&lt;/p&gt;&lt;p&gt;I’ve talked a little bit &lt;a href=&quot;tale-of-two-overlays&quot;&gt;about overlay development before&lt;/a&gt;, and today I’m going to dig into the details of how you can develop your own overlay—or at least how to get started.&lt;/p&gt;&lt;p&gt;A neat thing about the development setup is that it should mostly be the same for other frontend development!&lt;/p&gt;&lt;p&gt;A few things before I get started:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;I’ve committed &lt;a href=&quot;https://github.com/nt3rp/nodecg-parcel-ts-preact/tree/setup-guide&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;all these changes to GitHub&lt;/a&gt; if you want to see the steps in order&lt;/li&gt;&lt;li&gt;I’m assuming that you’re familiar with &lt;code class=&quot;language-text&quot;&gt;yarn&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;npm&lt;/code&gt; for package management; I’ll be using &lt;code class=&quot;language-text&quot;&gt;npm&lt;/code&gt; but the steps I list should also work for &lt;code class=&quot;language-text&quot;&gt;yarn&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Most of the work today sets up a general front-end development environment. I’ll be talking about the NodeCG-specific bits later, but you can also checkout more details on getting an environment setup in &lt;a href=&quot;https://www.nodecg.dev/docs/frameworks/using-bundlers/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;the NodeCG docs&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Some of the libraries I use in my setup aren’t quite ready for primetime (i.e. they’re nightly releases). As a result, I had to do some non-standard things to get the libraries to cooperate. I’ll try to call these out as I go.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;With that being said, let’s get everything started by going to whatever folder you’re going to start developing in and &lt;code class=&quot;language-text&quot;&gt;npm init&lt;/code&gt;.&lt;/p&gt;&lt;h2 id=&quot;parcel-2&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#parcel-2&quot; aria-label=&quot;parcel 2 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Parcel (2)&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://parceljs.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Parcel&lt;/a&gt; is a web application bundler which is intended to be fast and have zero-configuration. We’ll be using it to collect all and bundle our overlay dependencies, and to serve our dependency files during development. It supports hot module replacement (HMR) which will really help us as we make changes iteratively.&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;npm install --save-dev parcel@nightly&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;At the time of writing, Parcel 2 hasn’t been released yet, and in testing the beta version had some issues for our particular cases, so we’ll be installing the nightlies.&lt;sup id=&quot;fnref-1&quot;&gt;&lt;a href=&quot;#fn-1&quot; class=&quot;footnote-ref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;p&gt;NodeCG packages are also called bundles and expect there to be top-level folders for &lt;code class=&quot;language-text&quot;&gt;graphics&lt;/code&gt; (Interactive elements that will appear on screen), &lt;code class=&quot;language-text&quot;&gt;dashboard&lt;/code&gt; (Controls for our interactive elements for an internal dashboard) and &lt;code class=&quot;language-text&quot;&gt;extensions&lt;/code&gt; (for backend code). For now, we won’t worry about &lt;code class=&quot;language-text&quot;&gt;extensions&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;dashboard&lt;/code&gt; and we’ll set up our system for &lt;code class=&quot;language-text&quot;&gt;graphics&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;We’ll start by creating some dummy files in our project at &lt;code class=&quot;language-text&quot;&gt;src/graphics&lt;/code&gt;:&lt;/p&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;src/graphics/index.html&lt;/code&gt;:&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;&lt;span class=&quot;token doctype&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;token doctype-tag&quot;&gt;DOCTYPE&lt;/span&gt; &lt;span class=&quot;token name&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;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 attr-name&quot;&gt;lang&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;&amp;quot;&lt;/span&gt;en&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;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;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;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;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;charset&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;&amp;quot;&lt;/span&gt;UTF-8&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;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;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Index&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;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;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;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;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;&amp;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;&amp;quot;&lt;/span&gt;container&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Nothing here&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;&amp;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;&amp;quot;&lt;/span&gt;./index.tsx&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;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;&amp;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;&amp;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;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;src/graphics/index.tsx&lt;/code&gt;:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;User&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  id&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&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; user&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; User &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  id&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;
  name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;quot;Guardian&amp;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;p&gt;Lastly, we need to make a small change to our &lt;code class=&quot;language-text&quot;&gt;package.json&lt;/code&gt; to make it easier to run our Parcel example:&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 property&quot;&gt;&amp;quot;scripts&amp;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;&amp;quot;start&amp;quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;quot;parcel serve &amp;#x27;./src/**/*.html&amp;#x27; --dist-dir=.&amp;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;This will tell parcel to bundle and serve any HTML files in whatever folder they were in at the project root. That means that our file will be served at &lt;code class=&quot;language-text&quot;&gt;localhost:1234/graphics/index.html&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Let’s try it out by running &lt;code class=&quot;language-text&quot;&gt;npm run start&lt;/code&gt;. Eventually, the output should say something like this&lt;sup id=&quot;fnref-2&quot;&gt;&lt;a href=&quot;#fn-2&quot; class=&quot;footnote-ref&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;:&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;ℹ️ Server running at http://localhost:1234
✨ Built in XXXms&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And if you check out your graphic, it should render (in all it’s underwhelming glory)! 🤣&lt;/p&gt;&lt;p&gt;You’ll also notice that even though we didn’t configure anything, Parcel automatically converted our TypeScript to JavaScript. Magical~ ✨&lt;/p&gt;&lt;p&gt;Auto-magic conversion is good, but what if we want to do more with TypeScript?&lt;/p&gt;&lt;h2 id=&quot;getting-serious-about-typescript&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#getting-serious-about-typescript&quot; aria-label=&quot;getting serious about typescript permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 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 Serious About TypeScript&lt;/h2&gt;&lt;p&gt;By default, Parcel uses babel to convert TypeScript to JavaScript. I don’t have strong feelings about using or avoiding Babel, but &lt;a href=&quot;https://v2.parceljs.org/languages/typescript/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;in the Parcel documentation&lt;/a&gt; you can see that with the initial setup, Parcel won’t do any typechecking &lt;em&gt;and that sucks&lt;/em&gt;. Why bother with types if they aren’t going to be checked?! 🙃&lt;/p&gt;&lt;p&gt;So, we’re going to fix that (and thankfully, the same doc has details on how to make changes). We need to do a few different things:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Install &lt;code class=&quot;language-text&quot;&gt;typescript&lt;/code&gt; and use it for Parcel transpilation**&lt;/li&gt;&lt;li&gt;Install the TypeScript validator so Parcel validates types (and, if needed, fails) after bundles are generated&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Let’s start by installing our packages:&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;npm install --save-dev typescript@^4.2.0 @parcel/transformer-typescript-tsc@nightly @parcel/validator-typescript@nightly&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We’re specifically installing &lt;code class=&quot;language-text&quot;&gt;typescript&lt;/code&gt; 4.2+ to help us with some steps later. If &lt;code class=&quot;language-text&quot;&gt;npm&lt;/code&gt; starts complaining about unmet peer dependencies, you can ignore them via &lt;code class=&quot;language-text&quot;&gt;--legacy-peer-deps&lt;/code&gt;&lt;sup id=&quot;fnref-3&quot;&gt;&lt;a href=&quot;#fn-3&quot; class=&quot;footnote-ref&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;p&gt;Next we need to tell Parcel to use TypeScript. In &lt;code class=&quot;language-text&quot;&gt;.parcelrc&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;&amp;quot;extends&amp;quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;quot;@parcel/config-default&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&amp;quot;transformers&amp;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;&amp;quot;*.{ts,tsx}&amp;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;&amp;quot;@parcel/transformer-typescript-tsc&amp;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;&amp;quot;validators&amp;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;&amp;quot;*.{ts,tsx}&amp;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;&amp;quot;@parcel/validator-typescript&amp;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;p&gt;…And we need to tell the TypeScript compiler which files to include in transpilation. In &lt;code class=&quot;language-text&quot;&gt;tsconfig.json&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;&amp;quot;include&amp;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;&amp;quot;src/**/*&amp;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 we run Parcel again, we probably won’t notice any difference… &lt;em&gt;unless&lt;/em&gt; we purposely make some invalid TypeScript, so let’s do that!&lt;/p&gt;&lt;p&gt;In &lt;code class=&quot;language-text&quot;&gt;index.tsx&lt;/code&gt;, let’s change our &lt;code class=&quot;language-text&quot;&gt;user&lt;/code&gt;:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; user&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; User &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 operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;quot;Guardian&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  id&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;
  banana&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;quot;true&amp;quot;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// Not a real property!&lt;/span&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 we try to run Parcel now (or validate via &lt;code class=&quot;language-text&quot;&gt;npx tsc --noEmit&lt;/code&gt;) then our TypeScript transpilation will fail!&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;error TS2322: Type ’{ id: number; name: string; banana: string; }’ is not assignable to type ‘User’.
Object literal may only specify known properties, and ‘banana’ does not exist in type ‘User’&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Fantastic! We’ve got TypeScript running, what else would be useful? Maybe some UI library, since we’re going to be making graphics?&lt;/p&gt;&lt;h2 id=&quot;preact&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#preact&quot; aria-label=&quot;preact permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;(P)react&lt;/h2&gt;&lt;p&gt;You can pick whatever tools you like, but I decided to use (P)react because I’m familiar with React. &lt;a href=&quot;https://preactjs.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Preact&lt;/a&gt; is an API compatible alternative to React which will help us to write graphics for our overlay. If you’re curious about the differences between React and Preact &lt;a href=&quot;https://preactjs.com/guide/v10/differences-to-react&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;there are more details here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Fortunately, setting up Preact is fairly straightforward and we can &lt;a href=&quot;https://preactjs.com/guide/v10/getting-started#getting-ready-for-development&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;follow their documentation&lt;/a&gt;! 👍&lt;/p&gt;&lt;p&gt;…But since you’re here, let’s list all the steps.&lt;/p&gt;&lt;p&gt;Install &lt;code class=&quot;language-text&quot;&gt;preact&lt;/code&gt;: &lt;code class=&quot;language-text&quot;&gt;npm install --save-dev preact@^10.0.0&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Add an alias for &lt;code class=&quot;language-text&quot;&gt;preact&lt;/code&gt; in &lt;code class=&quot;language-text&quot;&gt;package.json&lt;/code&gt; so that libraries will use &lt;code class=&quot;language-text&quot;&gt;preact&lt;/code&gt; as a dependency instead of &lt;code class=&quot;language-text&quot;&gt;react&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 property&quot;&gt;&amp;quot;alias&amp;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;&amp;quot;react&amp;quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;quot;preact/compat&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&amp;quot;react-dom/test-utils&amp;quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;quot;preact/test-utils&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&amp;quot;react-dom&amp;quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;quot;preact/compat&amp;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;And lastly, we’ll write a really simple component in &lt;code class=&quot;language-text&quot;&gt;index.tsx&lt;/code&gt; to verify everything is working:&lt;sup id=&quot;fnref-4&quot;&gt;&lt;a href=&quot;#fn-4&quot; class=&quot;footnote-ref&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Previous code above&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; h&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; render &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;quot;preact&amp;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; container &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;quot;container&amp;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 function&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;user&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 constant&quot;&gt;ID&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;user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id&lt;span class=&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;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;div&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  container
&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’m using JSX syntax here (which is effectively HTML in JavaScript), but if you don’t want to use it &lt;a href=&quot;https://preactjs.com/guide/v10/getting-started#alternatives-to-jsx&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Preact outlines some alternatives here&lt;/a&gt;. If you do decide to use it, you’ll likely see the following error:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;error TS17004: Cannot use JSX unless the ‘—jsx’ flag is provided&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Fortunately, the &lt;a href=&quot;https://preactjs.com/guide/v10/typescript/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;documentation has us covered again&lt;/a&gt; and we just need to tell TypeScript to use JSX syntax in out &lt;code class=&quot;language-text&quot;&gt;tsconfig.json&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 property&quot;&gt;&amp;quot;compilerOptions&amp;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;&amp;quot;jsx&amp;quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;quot;react-jsx&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&amp;quot;jsxImportSource&amp;quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;quot;preact&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&amp;quot;skipLibCheck&amp;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;p&gt;And voila! Our tools are cooperating again, and if we run Parcel again we should see our new, slightly-less-underwhelming graphic.&lt;/p&gt;&lt;p&gt;…But can we do &lt;em&gt;more&lt;/em&gt;? 🤔💭&lt;/p&gt;&lt;p&gt;Probably! Even aside from getting into NodeCG, there’re still some useful steps that I ran out of time to cover in terms of setting up an environment. Hopefully this was helpful for you and I’ll try to get to those parts in a follow-up post! 😅&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2021-03-18:&lt;/strong&gt; The next step is now covered in &lt;a href=&quot;nodecg-cleaning-up-the-environment&quot;&gt;“Cleaning up the environment”&lt;/a&gt;!
&lt;strong&gt;2021-05-31:&lt;/strong&gt; I’ve learned a few things about Parcel so it’s worth following this up with &lt;a href=&quot;nodecg-parcel-problems&quot;&gt;“Parcel Problems”&lt;/a&gt;!&lt;/p&gt;&lt;div class=&quot;footnotes&quot;&gt;&lt;hr/&gt;&lt;ol&gt;&lt;li id=&quot;fn-1&quot;&gt;Why use Parcel 2 instead of Parcel 1? I honestly don’t remember. Parcel 1 can’t serve different globs to different directories, but I don’t think that was the only reason.&lt;a href=&quot;#fnref-1&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-2&quot;&gt;Parcel may also automatically install some dependencies, or try to install them and fail. If you don’t want this behaviour, you can add &lt;a href=&quot;https://v2.parceljs.org/features/cli/#parameters-related-to-the-dev-server%2Fwatch-mode-(serve-and-watch)&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;--no-autoinstall&lt;/code&gt;&lt;/a&gt; to the end of the line in your &lt;code class=&quot;language-text&quot;&gt;start&lt;/code&gt; stanza and explicitly install the dependencies it mentions.&lt;a href=&quot;#fnref-2&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-3&quot;&gt;Generally, you should always ensure that peer dependencies are met, but from what I’ve observed the peer-dependencies for Parcel’s typescript tools are really far behind, and newer versions definitely worked for me.&lt;a href=&quot;#fnref-3&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Despite everything, it's still you.]]></title><description><![CDATA[How do you wrap up a hellscape of a year, one that hangs over 2021 like a shadow? You don't! But you can reflect at least 🙃💭]]></description><link>https://nt3rp.io/posts/despite-everything-its-still-you</link><guid isPermaLink="false">https://nt3rp.io/posts/despite-everything-its-still-you</guid><pubDate>Fri, 01 Jan 2021 13:37:42 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;2020 was just… hard&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;As much as I’d like to say something profound or thoughtful about it, the reality is that I spent most of it just trying to survive😖&lt;sup id=&quot;fnref-1&quot;&gt;&lt;a href=&quot;#fn-1&quot; class=&quot;footnote-ref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;h2 id=&quot;hard-times&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#hard-times&quot; aria-label=&quot;hard 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;Hard times&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:749px&quot;&gt;
      &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/3e67ad831795564ffc74ad67d1fbb82f/29177/risk-bird.jpg&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom:58.75%;position:relative;bottom:0;left:0;background-image:url(&amp;#x27;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAMABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEA//EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAG5FiLzMj//xAAcEAACAAcAAAAAAAAAAAAAAAABAgADEBESIjH/2gAIAQEAAQUCvBdaPyaNFGI//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFREBAQAAAAAAAAAAAAAAAAAAARD/2gAIAQIBAT8BCf/EABgQAAMBAQAAAAAAAAAAAAAAAAABEQIg/9oACAEBAAY/AiPXER//xAAaEAEAAgMBAAAAAAAAAAAAAAABACERMVFB/9oACAEBAAE/IRQTgDyV2JKew9KuCOif/9oADAMBAAIAAwAAABDrz//EABcRAQADAAAAAAAAAAAAAAAAAAEQESH/2gAIAQMBAT8QNaj/xAAWEQEBAQAAAAAAAAAAAAAAAAABERD/2gAIAQIBAT8QqVz/xAAcEAACAgIDAAAAAAAAAAAAAAAAAREhMUFxgbH/2gAIAQEAAT8QQ4JaZVh3qfQlJo2FaKaCLHBLLb9P/9k=&amp;#x27;);background-size:cover;display:block&quot;&gt;&lt;/span&gt;
  &lt;picture&gt;
        &lt;source srcSet=&quot;/static/3e67ad831795564ffc74ad67d1fbb82f/8ac56/risk-bird.webp 240w,/static/3e67ad831795564ffc74ad67d1fbb82f/d3be9/risk-bird.webp 480w,/static/3e67ad831795564ffc74ad67d1fbb82f/71afc/risk-bird.webp 749w&quot; sizes=&quot;(max-width: 749px) 100vw, 749px&quot; type=&quot;image/webp&quot;/&gt;
        &lt;source srcSet=&quot;/static/3e67ad831795564ffc74ad67d1fbb82f/09b79/risk-bird.jpg 240w,/static/3e67ad831795564ffc74ad67d1fbb82f/7cc5e/risk-bird.jpg 480w,/static/3e67ad831795564ffc74ad67d1fbb82f/29177/risk-bird.jpg 749w&quot; sizes=&quot;(max-width: 749px) 100vw, 749px&quot; type=&quot;image/jpeg&quot;/&gt;
        &lt;img class=&quot;gatsby-resp-image-image&quot; src=&quot;/static/3e67ad831795564ffc74ad67d1fbb82f/29177/risk-bird.jpg&quot; alt=&quot;The risk I took was calculated, but man, am I bad at math.&quot; title=&quot;The risk I took was calculated, but man, am I bad at math.&quot; loading=&quot;lazy&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot;/&gt;
      &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;
&lt;em&gt;I drastically underestimated 2020&lt;/em&gt;&lt;/p&gt;&lt;p&gt;I had &lt;em&gt;designs&lt;/em&gt; for 2020. I was going to take what I’d learned setting—and &lt;em&gt;mostly&lt;/em&gt; achieving—goals from 2019 and roll that forward. The short version was &lt;em&gt;to make 2020 a more focused year&lt;/em&gt; 👍&lt;/p&gt;&lt;p&gt;But when the pandemic reached Canada, that changed… well, quite a lot of different things. Big plans? &lt;strong&gt;Not happening&lt;/strong&gt;. It was the &lt;del&gt;Winter&lt;/del&gt; &lt;del&gt;Spring&lt;/del&gt; &lt;del&gt;Summer&lt;/del&gt; &lt;del&gt;Fall&lt;/del&gt; year of &lt;del&gt;deferred&lt;/del&gt; cancelled plans.&lt;/p&gt;&lt;p&gt;Conventions—huge geek-centric spaces that, for me, sit somewhere between hobby, personal energizer, and coping mechanism—were &lt;em&gt;understandably cancelled&lt;/em&gt;. In 2019 I made it to seven different conventions, and in 2020 just two before the beginning of lockdown(s). This was a particularly harsh blow because conventions are a place where I meet new friends, see &lt;em&gt;lots&lt;/em&gt; of existing friends, and grow a little bit by learning about other areas of fandom and by running discussion panels and presentations.&lt;/p&gt;&lt;p&gt;Working from home was an adjustment, but not &lt;em&gt;unfamiliar&lt;/em&gt;. I’d worked from home for about a year at a previous company. The advice I’d been given, at that time, was that it’s workable so long as you make social time outside of work hours: &lt;em&gt;that was a bit of a problem for 2020&lt;/em&gt;. Also, while my part of the organization is distributed &lt;em&gt;on paper&lt;/em&gt;, not having an office really highlighted the difference between on paper and reality.&lt;/p&gt;&lt;p&gt;Oh yeah, and &lt;del&gt;&lt;a href=&quot;https://www.ontario.ca/page/framework-reopening-our-province&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Phase 1&lt;/a&gt;&lt;/del&gt; &lt;del&gt;&lt;a href=&quot;https://www.ontario.ca/page/framework-reopening-our-province-stage-1#section-0&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Stage 1&lt;/a&gt;&lt;/del&gt; &lt;del&gt;&lt;a href=&quot;https://www.ontario.ca/page/framework-reopening-our-province-stage-1#section-5&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Stage 2&lt;/a&gt;&lt;/del&gt; &lt;del&gt;&lt;a href=&quot;https://www.ontario.ca/page/covid-19-response-framework-keeping-ontario-safe-and-open&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;COVID-19 Zones?&lt;/a&gt;&lt;/del&gt; &lt;del&gt;&lt;a href=&quot;https://www.ontario.ca/page/covid-19-provincewide-shutdown&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;PROVINCE-WIDE?!&lt;/a&gt;&lt;/del&gt; VARIOUS lockdown stages&lt;sup id=&quot;fnref-2&quot;&gt;&lt;a href=&quot;#fn-2&quot; class=&quot;footnote-ref&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; and changing rules probably didn’t help.&lt;/p&gt;&lt;p&gt;The big theme for me, and I imagine for many others, &lt;strong&gt;was a year of social isolation&lt;/strong&gt; 🙃&lt;/p&gt;&lt;h2 id=&quot;bright-spots&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#bright-spots&quot; aria-label=&quot;bright spots permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Bright spots&lt;/h2&gt;&lt;p&gt;For such a crappy year, some good did come of it all, though, the ‘good’ didn’t always come from where I would’ve expected… or &lt;em&gt;how&lt;/em&gt; I would have expected. To bastardize a quote from &lt;a href=&quot;https://en.wikiquote.org/wiki/William_Gibson&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;William Gibson&lt;/a&gt;:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“The [bright spots are] already here — [they’re] just not very evenly distributed”&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;streaming-and-being-very-online&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#streaming-and-being-very-online&quot; aria-label=&quot;streaming and being very online permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Streaming and being VERY online&lt;/h3&gt;&lt;p&gt;There were a lot of folks that I’d hoped to hang out with more—folks that I ordinarily would’ve ran into at cons, but couldn’t—and streaming became the outlet to hang out virtually. I’d gotten ‘Zoom fatigue’ pretty early on in the pandemic, so I was surprised at how effective streaming was at helping with the isolation 📺&lt;/p&gt;&lt;p&gt;I think it’s because it’s a combination of something new—usually a game I’ve never played before—and being part of the audience, but also part of the experience and sharing that experience with other folks… who are also usually friends of the streamer. For me, it was like a little group mixer except most people had to communicate through the chat.&lt;/p&gt;&lt;p&gt;Except for the &lt;em&gt;other&lt;/em&gt; times. Like the times where I was &lt;a href=&quot;https://twitter.com/DanVideoNinja/status/1331737860240797699&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;a voice&lt;/a&gt; or &lt;a href=&quot;https://youtu.be/XVal0jQowFo?t=687&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;even a face on stream&lt;/a&gt;. Or the times where &lt;a href=&quot;https://clips.twitch.tv/PrettyThoughtfulAlligatorPeanutButterJellyTime&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;folks were on my stream&lt;/a&gt;.
Even just sharing and leaving positive comments on friends and acquaintances content on social media felt like &lt;em&gt;something&lt;/em&gt;, and helped to create small connections.&lt;/p&gt;&lt;h3 id=&quot;understanding-myself-better&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#understanding-myself-better&quot; aria-label=&quot;understanding myself better permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Understanding myself better&lt;/h3&gt;&lt;p&gt;Even with the expectation of social isolation, I think I underestimated exactly &lt;em&gt;how much&lt;/em&gt; time I’d actually be spending alone, and when you’re by yourself, it’s hard to ignore… yourself? At the very least, you begin to notice some things 🤔&lt;/p&gt;&lt;p&gt;For example:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Feeling down around the end of August—when summer, conventions, and the Race Against Time all wrap up&lt;/li&gt;&lt;li&gt;Being unable to &lt;em&gt;just relax&lt;/em&gt;, so I take on new hobbies, or throw myself into projects&lt;/li&gt;&lt;li&gt;Loving routines, but only being able to manage them for a few weeks before losing the rhythm&lt;/li&gt;&lt;li&gt;Feeling like quitting my job, regardless of the job, a few times a year&lt;sup id=&quot;fnref-3&quot;&gt;&lt;a href=&quot;#fn-3&quot; class=&quot;footnote-ref&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;You also notice your limitations: certain times that you’re more productive, or what kinds of things wear down your energy levels and willpower. In my case, I started to notice how I can get &lt;em&gt;really&lt;/em&gt; overwhelmed by the gap between what I want to do and what I have the time and energy to do! Gonna save that tip for 2021 😉&lt;/p&gt;&lt;p&gt;Which is to say the thing about myself that I understood most is that I’d been neglecting my mental health! The pandemic likely exacerbated that, but the more I researched online the more I realized that a lot of problems I’d encountered this year, and possibly for years before, might all be linked.&lt;/p&gt;&lt;p&gt;I’m not sure what specifically—Some variety of ADHD or one of its comorbidities seems likely—but at least I’ve started working with my doctor to start the diagnostic process, and I’m also going to start therapy… as soon as I can figure out a particular issue to dig into 😅&lt;/p&gt;&lt;h3 id=&quot;looking-after-myself&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#looking-after-myself&quot; aria-label=&quot;looking after myself permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Looking after myself&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:960px&quot;&gt;
      &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/1ee0dc4832a222df969d7e9e67dbcad4/a878e/fitbit-progress.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom:49.583333333333336%;position:relative;bottom:0;left:0;background-image:url(&amp;#x27;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABtElEQVQoz5WOzU8aURTF33/Sj8RUW21ilTRNat1U3aEQLZTETQvdGTGmC000rca66X8habF+RD4GZgYQHGYGChHQqO1/c3reYySa1IWLX86559773hVDuzmM7hkY/qXDt2/g+W4eD3ZSeLiTpqaVDvzUlD75kUUfeZRI41lSU3Mye5zIYDCZU7tCDj9lMZCU6nlmt0hqd2b9ZJBHjR0VMX5Ugnh1WMAIL3y5b8J3YGKUV/oO7ofcebGnY5iI8VQJr+XrhyX1w1iqqH67N3znDRFvs2VMkKlsBf6UhalMBZMaYdZD1R7af7gxK0JFFwHDJlUEdRv+jIUZ+oB5jY0ZvdpD9gM5ejKdteAncvcaMVtwEC65ivfkneEglHcQMV2lcySkOwhqtiJcYG5256SfzduYo48c19QbYrN1iU9WE1GrgehJA7FqE7EK/TGhfig3uj05c9LsqkdMZQ3Mm3XMG3V85Lz4fv4XS7U2Ft1WTxep8Tp9rYW49F6u9Kb3NO62seB0vVhguHZ6gQ1eKoe/UtdZL9U7KltpnuPz7zNsd/5gmZmst9pXqv+ldaGQ/lvnCqvs/QPvrioDy2XlXAAAAABJRU5ErkJggg==&amp;#x27;);background-size:cover;display:block&quot;&gt;&lt;/span&gt;
  &lt;picture&gt;
        &lt;source srcSet=&quot;/static/1ee0dc4832a222df969d7e9e67dbcad4/8ac56/fitbit-progress.webp 240w,/static/1ee0dc4832a222df969d7e9e67dbcad4/d3be9/fitbit-progress.webp 480w,/static/1ee0dc4832a222df969d7e9e67dbcad4/e46b2/fitbit-progress.webp 960w,/static/1ee0dc4832a222df969d7e9e67dbcad4/f992d/fitbit-progress.webp 1440w,/static/1ee0dc4832a222df969d7e9e67dbcad4/882b9/fitbit-progress.webp 1920w,/static/1ee0dc4832a222df969d7e9e67dbcad4/8df42/fitbit-progress.webp 2048w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot; type=&quot;image/webp&quot;/&gt;
        &lt;source srcSet=&quot;/static/1ee0dc4832a222df969d7e9e67dbcad4/8ff5a/fitbit-progress.png 240w,/static/1ee0dc4832a222df969d7e9e67dbcad4/e85cb/fitbit-progress.png 480w,/static/1ee0dc4832a222df969d7e9e67dbcad4/d9199/fitbit-progress.png 960w,/static/1ee0dc4832a222df969d7e9e67dbcad4/07a9c/fitbit-progress.png 1440w,/static/1ee0dc4832a222df969d7e9e67dbcad4/29114/fitbit-progress.png 1920w,/static/1ee0dc4832a222df969d7e9e67dbcad4/a878e/fitbit-progress.png 2048w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot; type=&quot;image/png&quot;/&gt;
        &lt;img class=&quot;gatsby-resp-image-image&quot; src=&quot;/static/1ee0dc4832a222df969d7e9e67dbcad4/d9199/fitbit-progress.png&quot; alt=&quot;In 2020, there was a dramatic change in weight caused by several different factors&quot; title=&quot;In 2020, there was a dramatic change in weight caused by several different factors&quot; loading=&quot;lazy&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot;/&gt;
      &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;
&lt;em&gt;2020 definitely lead to some, uh, changes&lt;/em&gt;&lt;/p&gt;&lt;p&gt;In 2020, of all years, I finally made progress in an area that I’d stalled on previously: regular exercise.&lt;/p&gt;&lt;p&gt;For years, I’d tried to get more exercise and generally watch my weight without a lot of success: In that chart above you can see a big dip early on—coinciding with a period of diet change (vegetarianism) and a lot more exercise via running and playing recreation league ultimate—and then a gradual rise as life goes back to a more sedentary setup.&lt;/p&gt;&lt;p&gt;As it turns out, when you and your partner both work from home, it’s a lot easier to exercise? We’d go on lunch walks together, then I’d do some simple bodyweight exercises. I’d set a timer and that would be it!&lt;/p&gt;&lt;p&gt;Well, that plus &lt;a href=&quot;https://en.wikipedia.org/wiki/Ring_Fit_Adventure&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Ring Fit Adventure&lt;/a&gt; 🕹&lt;/p&gt;&lt;p&gt;Doing a little bit every day, even if it wasn’t consistent, even if it wasn’t perfect, all made a difference.&lt;/p&gt;&lt;p&gt;Plus, I often forget that &lt;em&gt;exercise impacts mental health&lt;/em&gt;, so this was a double-win.&lt;/p&gt;&lt;h3 id=&quot;helping-others&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#helping-others&quot; aria-label=&quot;helping others permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Helping others&lt;/h3&gt;&lt;p&gt;In 2019, through charities, causes, GoFundMe, Patreon, Fundraisers, Paypal and… whatever other means I’ve forgotten, I managed to help folks out to the tune of about three thousand dollars. That felt good at the time.&lt;/p&gt;&lt;p&gt;In 2020, despite being a disaster year, I managed to somehow do almost &lt;em&gt;twenty-five thousand!&lt;/em&gt; That’s almost ten times the previous year! I don’t think I’ll be able to keep that up every year, but in the middle of a pandemic, it felt good to help even if it is just cash.&lt;/p&gt;&lt;h3 id=&quot;family&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#family&quot; aria-label=&quot;family permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Family&lt;/h3&gt;&lt;p&gt;Even though there weren’t a lot of opportunities to see friends, there were a &lt;em&gt;few&lt;/em&gt; opportunities to see immediate family by choosing to have them in our ‘social bubble’ during the pandemic. Even that small connection was a bright spot.&lt;/p&gt;&lt;p&gt;…And I can’t understate how beneficial it was to have my partner Lulu here too! Even though it was hard on both of us as we learned to cope with all the different things going on, I think overall it made our relationship stronger 💖&lt;/p&gt;&lt;h2 id=&quot;despite-everything-its-still-you&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#despite-everything-its-still-you&quot; aria-label=&quot;despite everything its still 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;Despite everything, it’s still you&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:960px&quot;&gt;
      &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/cbd89d80e2cf61376ec22542f431213b/eea4a/despite-everything.jpg&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom:56.25%;position:relative;bottom:0;left:0;background-image:url(&amp;#x27;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEEAgP/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAABh1Co5DK//8QAGxAAAgEFAAAAAAAAAAAAAAAAAgMAAQQRMUL/2gAIAQEAAQUCSgDWy3WITnErv//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABkQAQEBAAMAAAAAAAAAAAAAAAECEAAREv/aAAgBAQAGPwL1VJykp7MN/8QAGhABAAIDAQAAAAAAAAAAAAAAAQARECExUf/aAAgBAQABPyE8gVOkUFDWzeBavLlJ3n//2gAMAwEAAgADAAAAEMvP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBABAAICAwEAAAAAAAAAAAAAAQARIYExcZGh/9oACAEBAAE/EK/RQAo7l3QAWFqIijhI5Tig9GKci7Z9LP/Z&amp;#x27;);background-size:cover;display:block&quot;&gt;&lt;/span&gt;
  &lt;picture&gt;
        &lt;source srcSet=&quot;/static/cbd89d80e2cf61376ec22542f431213b/8ac56/despite-everything.webp 240w,/static/cbd89d80e2cf61376ec22542f431213b/d3be9/despite-everything.webp 480w,/static/cbd89d80e2cf61376ec22542f431213b/e46b2/despite-everything.webp 960w,/static/cbd89d80e2cf61376ec22542f431213b/af3f0/despite-everything.webp 1280w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot; type=&quot;image/webp&quot;/&gt;
        &lt;source srcSet=&quot;/static/cbd89d80e2cf61376ec22542f431213b/09b79/despite-everything.jpg 240w,/static/cbd89d80e2cf61376ec22542f431213b/7cc5e/despite-everything.jpg 480w,/static/cbd89d80e2cf61376ec22542f431213b/6a068/despite-everything.jpg 960w,/static/cbd89d80e2cf61376ec22542f431213b/eea4a/despite-everything.jpg 1280w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot; type=&quot;image/jpeg&quot;/&gt;
        &lt;img class=&quot;gatsby-resp-image-image&quot; src=&quot;/static/cbd89d80e2cf61376ec22542f431213b/6a068/despite-everything.jpg&quot; alt=&quot;Despite everything, it&amp;#x27;s still you&quot; title=&quot;Despite everything, it&amp;#x27;s still you&quot; loading=&quot;lazy&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot;/&gt;
      &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Honestly, I’m so tired.&lt;/strong&gt; 😫&lt;/p&gt;&lt;p&gt;2020 feels like the year that wouldn’t end and that wouldn’t get any better. Lots of really awful things happened.&lt;/p&gt;&lt;p&gt;And this isn’t over just yet: The pandemic still casts a shadow over the year. I’m still probably going to miss people. I’m still going to be isolated. I’m still going to be hard on myself.&lt;/p&gt;&lt;p&gt;But there’s hope (there’s a vaccine), and while I can’t change everything, I can change myself, or at least try.&lt;/p&gt;&lt;p&gt;I can still celebrate accomplishments from 2020, even if I choose not to focus on accomplish&lt;em&gt;ing&lt;/em&gt; in 2021:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;First time running an Extra Life event (solo) and raising almost $500 USD&lt;/li&gt;&lt;li&gt;Starting (and maintaining) a weekly stream&lt;/li&gt;&lt;li&gt;Staying at the same company for almost three years—a new record!&lt;/li&gt;&lt;li&gt;9/12 blog posts (if you count this one)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I can still learn from the 2020 that was and try to aim for a better 2021 for me. I know that I’ll probably try to set small goals, quarterly goals, SMART goals… I’ll probably try to do too much, to be completely honest!&lt;/p&gt;&lt;p&gt;But I know that I want to be better, and I know that 2021 will be a year of &lt;em&gt;just trying to survive&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;And that’s fine by me&lt;sup id=&quot;fnref-4&quot;&gt;&lt;a href=&quot;#fn-4&quot; class=&quot;footnote-ref&quot;&gt;4&lt;/a&gt;&lt;/sup&gt; 🤷‍♂️&lt;/p&gt;&lt;p&gt;Here’s to a 2021 of surviving!&lt;/p&gt;&lt;hr/&gt;&lt;p&gt;&lt;em&gt;Special thanks to so many people for helping me to survive in 2020—and for helping me to be a better person. In no particular order (and apologies to anyone I missed): My fellow Nickscasters, &lt;a href=&quot;https://fragileair.bandcamp.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Fragile Air&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/NickSCZach&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;NickSCZach&lt;/a&gt;; &lt;a href=&quot;https://twitter.com/smzeldarules&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;SMZeldaRules&lt;/a&gt;; &lt;a href=&quot;https://twitter.com/danvideoninja&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Dan the Video Ninja&lt;/a&gt; and the collection (&lt;a href=&quot;http://instagram.com/RagzCosplay&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;RagzCosplay&lt;/a&gt;, &lt;a href=&quot;https://www.twitch.tv/manpans&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;manpans&lt;/a&gt;, rindescribable); &lt;a href=&quot;https://twitter.com/Artimage84&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;ArtImage84&lt;/a&gt; and Pup; &lt;a href=&quot;https://twitter.com/zabka_zee&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;zabka_zee&lt;/a&gt;; &lt;a href=&quot;https://twitter.com/valkyrjacosplay&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Valkyrja Cosplay&lt;/a&gt;; &lt;a href=&quot;https://twitter.com/bwongdraws&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;bwongdraws&lt;/a&gt;; &lt;a href=&quot;https://www.twitch.tv/notablynerdy&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Notably Nerdy&lt;/a&gt;; &lt;a href=&quot;https://www.instagram.com/slothcore/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Slothcore&lt;/a&gt; and &lt;a href=&quot;https://www.instagram.com/starkrealitycos/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Stark Reality Cosplay&lt;/a&gt;; &lt;a href=&quot;https://twitter.com/NikolisKitchen&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Nikoli’s Kitchen&lt;/a&gt;; &lt;a href=&quot;https://www.twitch.tv/pantstresbien&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;PantsTresBien&lt;/a&gt;; &lt;a href=&quot;https://twitter.com/zeekayart&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Zeekayart&lt;/a&gt;; my partner, Lulu (💖💖💖); Stephanie and Britton; My buns, Pumpernickel and Biscuit (🐇—actually, all bunnies, and cute animals really); Supergiant Games (for making Hades); Nintendo (for making Animal Crossing); and to anyone else I missed because I wrote this list at like 2am and forgot… THANK YOU&lt;/em&gt;&lt;/p&gt;&lt;div class=&quot;footnotes&quot;&gt;&lt;hr/&gt;&lt;ol&gt;&lt;li id=&quot;fn-1&quot;&gt;Survival not in the “fight to live” sense, but in the &lt;a href=&quot;https://www.youtube.com/watch?v=snAhsXyO3Ck&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Spaceship You&lt;/a&gt; sense&lt;a href=&quot;#fnref-1&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-2&quot;&gt;For the record, I am pro-lockdown—generally, they’re very effective! Unfortunately the provincial government really dropped the ball reducing the effectiveness of all lockdowns outside of the first one.&lt;a href=&quot;#fnref-2&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-3&quot;&gt;This is multi-factoral but I imagine the nature of work in capitalism is not insignificant.&lt;a href=&quot;#fnref-3&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-4&quot;&gt;And after more than 6 hours of writing and re-writing this post… yeah, surviving is fine.&lt;a href=&quot;#fnref-4&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Retro Redux: Bringing the Present to the Past of Gaming]]></title><description><![CDATA[It is truly impressive what fans, especially video game fans, have managed to do to preserve nostalgic experiences... and to, somehow, create new experiences, bringing a bit of the present into the past! 🎮🔜⏱]]></description><link>https://nt3rp.io/posts/retro-redux-bringing-the-present-to-the-past-of-gaming</link><guid isPermaLink="false">https://nt3rp.io/posts/retro-redux-bringing-the-present-to-the-past-of-gaming</guid><pubDate>Thu, 05 Nov 2020 13:37:42 GMT</pubDate><content:encoded>&lt;p&gt;I’m consistently impressed by just how determined fans are. Take, for example, fans of retrogaming.&lt;sup id=&quot;fnref-1&quot;&gt;&lt;a href=&quot;#fn-1&quot; class=&quot;footnote-ref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; 😲&lt;/p&gt;&lt;p&gt;Gradius III is a game that was originally released in 1989 to arcades and was ported to the Super Nintendo for release in 1990. If you’d played both versions of the game, you may have noticed something unusual. While gameplay is fairly fast-paced in the arcade version, in the Super Nintendo version, the game tended to slow down when lots of enemies were on the screen; an unfortunate bug.&lt;/p&gt;&lt;p&gt;Bugs are fairly common when writing software, and especially when porting from one platform to another. Unlike most software we run today though there wasn’t really any way for these problems to be fixed once they were out in the wild. There were no software patches, no web updates, no new releases of cartridge-based games.&lt;sup id=&quot;fnref-2&quot;&gt;&lt;a href=&quot;#fn-2&quot; class=&quot;footnote-ref&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;p&gt;And if there were no fans, that might be the end of this particular story, but almost 30 years later, &lt;a href=&quot;https://arstechnica.com/gaming/2019/05/28-years-later-hacker-fixes-rampant-slowdown-on-snes-gradius-iii/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;a fan decided to fix that&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The breakthrough that fan Vitor Vilela discovered was that by leveraging the SA-1 chip found in later Super Nintendo cartridges and using that chip’s improved graphics and parallel processing, it was possible to speed up gameplay and keep a consistent frame rate in the game.&lt;sup id=&quot;fnref-3&quot;&gt;&lt;a href=&quot;#fn-3&quot; class=&quot;footnote-ref&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;p&gt;Vitor isn’t the only determined fan, of course. Other fans have &lt;a href=&quot;https://arstechnica.com/gaming/2019/04/hd-emulation-mod-makes-mode-7-snes-games-look-like-new/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;managed to increase the resolution of the Super Nintendo’s Mode 7 style graphics&lt;/a&gt; to breathe new life into games like Super Mario Kart, &lt;a href=&quot;https://www.youtube.com/watch?v=YE1gp6BWilg&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;added widescreen functionality to emulators&lt;/a&gt; in some cases, &lt;a href=&quot;https://en.wikipedia.org/wiki/2020_Nintendo_data_leak&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;analyzed old game data leaks&lt;/a&gt;, and developed a huge number of projects and &lt;a href=&quot;https://www.analogue.co/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;products to upscale older games&lt;/a&gt;.&lt;sup id=&quot;fnref-4&quot;&gt;&lt;a href=&quot;#fn-4&quot; class=&quot;footnote-ref&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;p&gt;While there’s definitely a need for new games and new experiences, it’s fascinating to see the way these fans have breathed new life into old games. Well, that and &lt;a href=&quot;https://gamesdonequick.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;speedrunners&lt;/a&gt;. 🤣&lt;/p&gt;&lt;p&gt;These kinds of developments help people familiar with the original material to experience that material in a new way, or potentially help to make the material more accessible or palatable to new audiences. You see this happen in a different when a game is remastered.&lt;/p&gt;&lt;p&gt;In an example that I’m excited to share with folks soon, I had the chance to bring the present back to the past when I was learning about the &lt;a href=&quot;http://helmet.kafuka.org/msu1.htm&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;MSU1 chip for the Super Nintendo&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;All you need to know is that the MSU1 is an expansion chip for Super Nintendo games that would give those games up to &lt;em&gt;four gigabytes of storage&lt;/em&gt; (for reference, the largest SNES cartridges were six &lt;em&gt;mega&lt;/em&gt; bytes) 🤯&lt;/p&gt;&lt;p&gt;Why have you not heard of this before? Because it’s not a real chip!&lt;sup id=&quot;fnref-5&quot;&gt;&lt;a href=&quot;#fn-5&quot; class=&quot;footnote-ref&quot;&gt;5&lt;/a&gt;&lt;/sup&gt; Thanks to enterprising emulator developers and the ability to patch old game ROMs with new data, it means that you can do neat things like add CD quality sound to your favourite games, or even include full-motion video (FMV)!&lt;/p&gt;&lt;p&gt;Yes, that’s right, &lt;strong&gt;on the Super Nintendo!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;I tried it out with Chrono Trigger, and after a few missteps, I was getting chills listening to some of my favourite music and watching the anime-style cutscenes but otherwise still playing the same game from 25 years ago.&lt;/p&gt;&lt;p&gt;It’s incredible!&lt;/p&gt;&lt;p&gt;Anyway, I wanted to share some of these neat discoveries with you that wouldn’t be possible without fans. If you want to experience some of the changes with me (or maybe even help out a good cause), I’ll be streaming Chrono Trigger on November 28 from approximately noon to midnight (Eastern Standard Time) for my &lt;a href=&quot;http://extra-life.org/participant/thenickscast&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Extra Life Game weekend&lt;/a&gt;&lt;/p&gt;&lt;p&gt;…And if you want to know how I did it, read on!&lt;/p&gt;&lt;hr/&gt;&lt;p&gt;I went through a bunch of trial and error to get the MSU1 patch to work for Chrono Trigger, but I’ve done my best to include the steps I took here. A couple things to keep in mind before I dig into specifics:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Given the gray legal area of ROMs and remix culture in general, you’ll have to find your own copy of the game&lt;/li&gt;&lt;li&gt;… And its possible that the patch and related files may disappear. If so, sorry 😞&lt;/li&gt;&lt;li&gt;The steps to follow may vary slightly depending on your emulator of choice. I learned, for example, that SNES9X will not automatically apply &lt;code class=&quot;language-text&quot;&gt;.bps&lt;/code&gt; patch files, but bsnes does!&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If you want to try it yourself:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Visit the main ROM hack page &lt;a href=&quot;https://www.romhacking.net/forum/index.php?topic=23115.0&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;here&lt;/a&gt; and download the game patch, intro video, intro audio, and the free audio pack&lt;/li&gt;&lt;li&gt;Verify that your ROM is the correct ROM. A few different &lt;a href=&quot;https://security.stackexchange.com/questions/189000/how-to-verify-the-checksum-of-a-downloaded-file-pgp-sha-etc&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;checksums&lt;/a&gt; are provided on the ROM hack page.&lt;/li&gt;&lt;li&gt;Make a folder to put all the related files, and copied the files you’ve downloaded to that folder&lt;/li&gt;&lt;li&gt;Move your Chrono Trigger ROM to this folder, and rename it to match the pattern of the music and patch files&lt;ul&gt;&lt;li&gt;Most emulators handle MSU1 audio and video files via looking for files with the same prefix&lt;/li&gt;&lt;li&gt;In my case, the prefix was &lt;code class=&quot;language-text&quot;&gt;chrono_msu&lt;/code&gt; and the folder looked like this:&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&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;gt; Chrono Trigger ++
\-- chrono_msu.sfc    // the ROM file
\-- chrono_msu.msu    // MSU instructions
\-- chrono_msu.bps    // patch for the ROM file; automatically applied for bsnes
\-- chrono_msu-XX.pcm // a bunch of different audio and video files&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&quot;5&quot;&gt;&lt;li&gt;Depending on your emulator, you may need to create a manifest file. &lt;a href=&quot;https://www.zeldix.net/t1607-msu1-getting-started-guide&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;I found some instructions here&lt;/a&gt; but they are somewhat incomplete. You’re probably better off going to &lt;a href=&quot;https://github.com/qwertymodo/ChronoTrigger-MSU1&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;this repository&lt;/a&gt; that contains many of the same files and, more importantly, a manifest file (&lt;code class=&quot;language-text&quot;&gt;manifest.bml&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;You may need to apply the patch if your emulator doesn’t support patching-on-the-fly (you can tell if you start the game and still hear the regular audio). I found some information on using &lt;a href=&quot;https://www.smwcentral.net/?p=viewthread&amp;amp;t=88029&amp;amp;page=1&amp;amp;pid=1399053#p1399053&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;FLIPS for patching ROMs&lt;/a&gt; and it was pretty straightforward. I’d suggest deleting the patch file &lt;code class=&quot;language-text&quot;&gt;.bps&lt;/code&gt; if you go this route, to avoid any emulators trying (and failing) to re-patch the ROM.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;I’m a big fan of the &lt;a href=&quot;https://www.syntheticorchestra.com/store/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Blake Robinson Synthetic Orchestra’s&lt;/a&gt; rendition of the Chrono Trigger music, so here are the extra steps you’ll need to do if you want to get them working instead of the free pack. Depending on where you are in the world, it might be hard to purchase the music to get the &lt;code class=&quot;language-text&quot;&gt;.flac&lt;/code&gt; files 😥&lt;/p&gt;&lt;p&gt;You can also follow the video instructions from the ROM hack page, but this might be quicker.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Get and download the &lt;code class=&quot;language-text&quot;&gt;.flac&lt;/code&gt; files&lt;/li&gt;&lt;li&gt;Download &lt;a href=&quot;https://github.com/qwertymodo/msupcmplusplus/blob/master/configs/chrono_symphony.json&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;the track listing / mapping file&lt;/a&gt;&lt;ul&gt;&lt;li&gt;If you’re missing &lt;code class=&quot;language-text&quot;&gt;LavosScream.wav&lt;/code&gt;, you can get it &lt;a href=&quot;https://github.com/qwertymodo/ChronoTrigger-MSU1&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;from the same repository I mentioned earlier&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Download &lt;a href=&quot;https://github.com/qwertymodo/msupcmplusplus/releases&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;MSUPCMplusplus.exe&lt;/code&gt;&lt;/a&gt; and move it to the same folder that the music and &lt;code class=&quot;language-text&quot;&gt;LavosScream.wav&lt;/code&gt; are located&lt;/li&gt;&lt;li&gt;Make sure that the files you’ve downloaded and the folder structure match the file patterns in the mapping file. If they don’t match, they won’t get converted.&lt;/li&gt;&lt;li&gt;Either drag-and-drop the track listing file onto &lt;code class=&quot;language-text&quot;&gt;MSUPCMplusplus.exe&lt;/code&gt;, or run it from the command line (and provide the listing file as an argument)&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;That should be it!&lt;/p&gt;&lt;div class=&quot;footnotes&quot;&gt;&lt;hr/&gt;&lt;ol&gt;&lt;li id=&quot;fn-1&quot;&gt;Retrogaming is very poorly defined; while some groups draw a line based on how far back in time from the present, others, &lt;a href=&quot;https://www.reddit.com/r/retrogaming/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;like the retrogaming subreddit&lt;/a&gt; have chosen to pick a fixed point in time / fixed generation.&lt;a href=&quot;#fnref-1&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-2&quot;&gt;Sometimes console games would receive reprints or have updated versions released—not that a consumer would have any way of knowing 🙃&lt;a href=&quot;#fnref-2&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-3&quot;&gt;This is a &lt;em&gt;gross&lt;/em&gt; understatement on the &lt;em&gt;months&lt;/em&gt; of effort required to accomplish this. I’d highly recommend reading &lt;a href=&quot;https://arstechnica.com/gaming/2019/05/28-years-later-hacker-fixes-rampant-slowdown-on-snes-gradius-iii/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;the linked article&lt;/a&gt;.&lt;a href=&quot;#fnref-3&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-4&quot;&gt;Not to mention the huge efforts by folks doing &lt;a href=&quot;https://kotaku.com/why-some-video-games-are-in-danger-of-disappearing-fore-1789609791&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;games preservation&lt;/a&gt; and &lt;a href=&quot;https://archive.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;archiving the internet&lt;/a&gt;&lt;a href=&quot;#fnref-4&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-5&quot;&gt;Also, you, like me, probably don’t care about real fake computer chips for old video game consoles&lt;a href=&quot;#fnref-5&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[A Tale of Two Overlays]]></title><description><![CDATA[What can you do with HTML/CSS in terms of streaming! A lot, as it turns out, and I've got a few examples from my own streaming to give some idea what is possible! 🎥📺🎮]]></description><link>https://nt3rp.io/posts/tale-of-two-overlays</link><guid isPermaLink="false">https://nt3rp.io/posts/tale-of-two-overlays</guid><pubDate>Thu, 29 Oct 2020 13:37:42 GMT</pubDate><content:encoded>&lt;p&gt;One of the elements that sets streams apart, like YouTube channels or Podcasts, is production value&lt;sup id=&quot;fnref-1&quot;&gt;&lt;a href=&quot;#fn-1&quot; class=&quot;footnote-ref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;. Things don’t have to look or sound perfect, but the level of care impacts how people &lt;em&gt;perceive&lt;/em&gt; the work that you make, regardless of the quality of the content.&lt;/p&gt;&lt;p&gt;Most of the time, like many streamers on Twitch, my audience is just me… but during the Race Against Time, there are lots of folks watching, and I want it to look &lt;em&gt;good&lt;/em&gt; 👨‍🍳👌&lt;/p&gt;&lt;p&gt;In terms of customizing your overlay, there is no shortage of ways you can do that: &lt;a href=&quot;https://streamlabs.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Streamlabs&lt;/a&gt;, &lt;a href=&quot;https://streamelements.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;StreamElements&lt;/a&gt;, &lt;a href=&quot;https://nerdordie.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Nerd Or Die&lt;/a&gt; and many, &lt;em&gt;many&lt;/em&gt; other services can provide you with a complete overlay, alerts, and other widgets (often for free) that you can mix and match.&lt;/p&gt;&lt;p&gt;…And I’m definitely no expert on how to make your stream look great, but I can tell you &lt;strong&gt;a tale of two overlays&lt;/strong&gt; 😎&lt;/p&gt;&lt;h2 id=&quot;the-event-overlay&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#the-event-overlay&quot; aria-label=&quot;the event overlay permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 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 Event Overlay&lt;/h2&gt;&lt;p&gt;The main event, the 24h Chrono Trigger marathon, uses an overlay developed using &lt;a href=&quot;https://nodecg.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;NodeCG&lt;/a&gt;.&lt;sup id=&quot;fnref-2&quot;&gt;&lt;a href=&quot;#fn-2&quot; class=&quot;footnote-ref&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; NodeCG is a sort of toolkit that enables you to create broadcast graphics… but it doesn’t do too much ‘heavy lifting’. It allows you to create dashboards, graphics, cue sound effects and generally keep a bunch of different data in sync, but it does that via code… that you write.&lt;/p&gt;&lt;p&gt;Effectively, it’s the really DIY route for making your own super-customizable HTML overlay! 😅&lt;/p&gt;&lt;p&gt;To put that into perspective, it means that I coded a variety of components that allowed the overlay to receive updates from myself, Twitch, Tiltify (the donation service), and whatever else I felt like cobbling together.&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:960px&quot;&gt;
      &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/4d0a2a919567e03bd4253be6580c2f9d/1843f/race-against-time-dashboard.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom:97.08333333333334%;position:relative;bottom:0;left:0;background-image:url(&amp;#x27;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAAA7DAAAOwwHHb6hkAAADs0lEQVQ4y21UaVPbVhTlZ3SaQgAHA95t2ZbkRZK1eZPkfccLXjCmNMAkhCR0pv3QmfRfn973iAO0/XDnPek9nXvOufdqR1tcQtBdhAwPYauGiGggKBRwElMQiGsIJF7HaVxFKKkjlavA0DxoVgvl+hh6uQdRcbATd6dIayPEzAlC+oRA6ohKNaTUFiIyJRIdhFlILqIZj+9lvQO1NERSbVK0EMt6iGdchDMEmI53Max8Q6/4JxrKHxiV/kLBXsAb/oZK51fYjTWKzUtY9QsolXNI5gDu2UdUBrdQvQtYtSWCqSL2/CJ84Tx2InIVhjdDrjhEjrLePzxA1Jr0PEK5tYJaPoPbu0RjeA3TmUC2R3jjPmKveo/98i0ct4mThIGDYA7HMQ07iZwL051BUBpIKnQolBEnCRmzzyUKSgtnq09ojq5xvvmMxuAKzuAG/eVXeKM7tKcfcCpYOAhkcRRRsMM2e8cihcTjLe1PBZuAmpDNHiS9T4AP6E5vsbx+RLW9IukzVDtXpGwJk6w4SZgckDMMi2Xk7CFSWpuK0+GrZPRJ8pizPokbSGQdMr2KmFxBKF3ihWAJWaHiuTr8Mf0ZMKk20J19hO4uUKDQnDnU6owXg1nwy1EKu36Rq9j1p3EYylOFR0Sij0S+gaw1IKAXgCyj21mRtC4HSBfavGV0KkDG7KLcXqMxuiF5C+RLU6hUabU6h2wNyTOVKqvAR0kOt0U5SjqI2BvkbWpMkioZPR5aZQKBGDDGukMglSm06pR8HaJACkqNBbHKcaBXgIF0GZnSDCJj9t1D5o9BlWdeifYUCknUqxMUiDV7x1po/f4Rb08zHOwVoJD30J/dciCZWiVjPYVWGXPDa+MPmK4/oT1+j+7kBj26e/flG+5//xu7xzLehf8FGKPGtmpzPmIMIJFvcrPZPiw5cNpLtIYbvnrdC1Rbc3qmyXHPsP9/DJPUGsPVFzJ/A91bkWcLWpcwaisUWxuanhmyxSkvRIHOo7KDnw4EYif9AHoFGKYq2/UF70Hmm0wFYQyLjSXJu+NW5GkMWaHcLmM2pvaReIW3YD8Ao+pzY9sk267PIVL7CCS7Pb7BZP2AUpOk9q9oDGs8gdte4GdfirxTOMh/GLJJiNHlWLZGzJ58i0hsvqeU5Jy3ToL8DKTKMNlPxOpwhltmLxn62Sz7Qjne/S+zsWCdv09xGHz2ib1j4Xtxn5/xlX2Xoz6kv/BxlD1k8C7EAOTnCDwFO/MFn2L7/uD72fYuu+OPZPEPra6fYg7DxQwAAAAASUVORK5CYII=&amp;#x27;);background-size:cover;display:block&quot;&gt;&lt;/span&gt;
  &lt;picture&gt;
        &lt;source srcSet=&quot;/static/4d0a2a919567e03bd4253be6580c2f9d/8ac56/race-against-time-dashboard.webp 240w,/static/4d0a2a919567e03bd4253be6580c2f9d/d3be9/race-against-time-dashboard.webp 480w,/static/4d0a2a919567e03bd4253be6580c2f9d/e46b2/race-against-time-dashboard.webp 960w,/static/4d0a2a919567e03bd4253be6580c2f9d/f52fe/race-against-time-dashboard.webp 1186w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot; type=&quot;image/webp&quot;/&gt;
        &lt;source srcSet=&quot;/static/4d0a2a919567e03bd4253be6580c2f9d/8ff5a/race-against-time-dashboard.png 240w,/static/4d0a2a919567e03bd4253be6580c2f9d/e85cb/race-against-time-dashboard.png 480w,/static/4d0a2a919567e03bd4253be6580c2f9d/d9199/race-against-time-dashboard.png 960w,/static/4d0a2a919567e03bd4253be6580c2f9d/1843f/race-against-time-dashboard.png 1186w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot; type=&quot;image/png&quot;/&gt;
        &lt;img class=&quot;gatsby-resp-image-image&quot; src=&quot;/static/4d0a2a919567e03bd4253be6580c2f9d/d9199/race-against-time-dashboard.png&quot; alt=&quot;The dashboard for the Race Against Time&quot; title=&quot;The dashboard for the Race Against Time&quot; loading=&quot;lazy&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot;/&gt;
      &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;
&lt;em&gt;The dashboard for the main event&lt;/em&gt;&lt;/p&gt;&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom:56.25%;position:relative;height:0;overflow:hidden;margin-bottom:1.0725rem&quot;&gt; &lt;iframe src=&quot;https://clips.twitch.tv/embed?clip=AdventurousSucculentPeanut4Head&amp;amp;parent=netlify.app&amp;amp;parent=nt3rp.io&amp;amp;parent=localhost&quot; frameBorder=&quot;0&quot; scrolling=&quot;false&quot; allowfullscreen=&quot;&quot; autoplay=&quot;&quot; muted=&quot;&quot; style=&quot;position:absolute;top:0;left:0;width:100%;height:100%&quot;&gt; &lt;/iframe&gt; &lt;/div&gt;&lt;p&gt;&lt;em&gt;One of the screens for the main event&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Although I’m fascinated with &lt;a href=&quot;https://desertbus.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Desert Bus&lt;/a&gt; and how they handle their stream setup, using NodeCG was inspired by &lt;a href=&quot;https://github.com/GamesDoneQuick/agdq17-layouts&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Support Class’s Awesome Games Done Quick layout&lt;/a&gt;.&lt;sup id=&quot;fnref-3&quot;&gt;&lt;a href=&quot;#fn-3&quot; class=&quot;footnote-ref&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;p&gt;Using NodeCG means you have ABSOLUTE POWER over how your different widgets look, and how they appear… but it also means that you’re probably writing them from scratch (styling, receiving events, etc.) 🤷‍♂️&lt;/p&gt;&lt;h2 id=&quot;the-weekly-stream-overlay&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#the-weekly-stream-overlay&quot; aria-label=&quot;the weekly stream overlay permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 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 Weekly Stream Overlay&lt;/h2&gt;&lt;p&gt;For &lt;a href=&quot;https://twitch.tv/theraceagainsttime&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;that same Twitch channel&lt;/a&gt;, I do a weekly stream, and it has a different design heavily inspired by &lt;a href=&quot;https://www.platinumgames.com/official-blog/article/9624&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;the user interface from Nier: Automata&lt;/a&gt;.&lt;/p&gt;&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom:56.25%;position:relative;height:0;overflow:hidden;margin-bottom:1.0725rem&quot;&gt; &lt;iframe src=&quot;https://clips.twitch.tv/embed?clip=HedonisticPatientDonutPanicVis&amp;amp;parent=nt3rp.io&amp;amp;parent=netlify.app&amp;amp;parent=localhost&quot; frameBorder=&quot;0&quot; scrolling=&quot;false&quot; allowfullscreen=&quot;&quot; autoplay=&quot;&quot; muted=&quot;&quot; style=&quot;position:absolute;top:0;left:0;width:100%;height:100%&quot;&gt; &lt;/iframe&gt; &lt;/div&gt;&lt;p&gt;&lt;em&gt;The “Loading” screen&lt;/em&gt;&lt;/p&gt;&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom:56.25%;position:relative;height:0;overflow:hidden;margin-bottom:1.0725rem&quot;&gt; &lt;iframe src=&quot;https://clips.twitch.tv/embed?clip=ArtisticCaringPineappleThisIsSparta&amp;amp;parent=nt3rp.io&amp;amp;parent=netlify.app&amp;amp;parent=localhost&quot; frameBorder=&quot;0&quot; scrolling=&quot;false&quot; allowfullscreen=&quot;&quot; autoplay=&quot;&quot; muted=&quot;&quot; style=&quot;position:absolute;top:0;left:0;width:100%;height:100%&quot;&gt; &lt;/iframe&gt; &lt;/div&gt;&lt;p&gt;&lt;em&gt;The main screen&lt;/em&gt;&lt;/p&gt;&lt;p&gt;By comparison, this layout is built using Streamlabs widgets… mostly. I had to provide some custom CSS and animations for the chat and typing effect, and the loading screen is a plain HTML and CSS combined in OBS.&lt;/p&gt;&lt;h2 id=&quot;learnings&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#learnings&quot; aria-label=&quot;learnings permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Learnings&lt;/h2&gt;&lt;p&gt;Is there a reason to take one approach over the other? Should you even bother writing your own widgets?!&lt;/p&gt;&lt;p&gt;For the latter—unless you’re a huge nerd, like me—it’s probably not worth the effort of taking &lt;em&gt;either&lt;/em&gt; approach. I mean, you get a ton of flexibility and can do so much cool stuff, but you could also invest all that time into the rest of your stream 😂&lt;/p&gt;&lt;p&gt;&lt;em&gt;But&lt;/em&gt; if you do decide write your own widgets, there are some advantages.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Writing your own widgets in Streamlabs makes it easy to iterate and test a new widget—with the caveat that custom HTML, CSS, and javascript aren’t exactly documented&lt;/li&gt;&lt;li&gt;While you &lt;em&gt;do&lt;/em&gt; have to write your own extensions to connect NodeCG to Twitch and other services, there are libraries to help with this&lt;/li&gt;&lt;li&gt;You can create your own custom dashboard to put everything you want to see during a stream in one place… although this is now a lot easier in OBS via custom browser docks&lt;/li&gt;&lt;li&gt;You can migrate the HTML and CSS into NodeCG if you decide to take that route&lt;/li&gt;&lt;li&gt;You can learn a lot about server and web development 😅&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In any case, the sky is the limit &lt;strong&gt;because it’s all HTML, CSS, and Javascript!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Also, since the web continues to get better and more impressive, that means that with some programming knowledge, you can do even more impressive things. For example, if you’re into gaming, you might have heard of &lt;em&gt;shaders&lt;/em&gt;. I don’t know a ton about shaders&lt;sup id=&quot;fnref-4&quot;&gt;&lt;a href=&quot;#fn-4&quot; class=&quot;footnote-ref&quot;&gt;4&lt;/a&gt;&lt;/sup&gt; but I do know that a &lt;em&gt;fragment&lt;/em&gt; shader can be applied to every pixel in an image… and since you can use shaders via WebGL, it means you can do all sorts of fancy things &lt;a href=&quot;https://www.shadertoy.com/view/ldcXDr&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;like this Gameboy Pixelizer&lt;/a&gt;! &lt;sup id=&quot;fnref-5&quot;&gt;&lt;a href=&quot;#fn-5&quot; class=&quot;footnote-ref&quot;&gt;5&lt;/a&gt;&lt;/sup&gt; &lt;sup id=&quot;fnref-6&quot;&gt;&lt;a href=&quot;#fn-6&quot; class=&quot;footnote-ref&quot;&gt;6&lt;/a&gt;&lt;/sup&gt; 😲&lt;/p&gt;&lt;p&gt;Anyway, I mostly wanted to show off some of the cool things you can do with HTML and CSS and Twitch streams!&lt;sup id=&quot;fnref-7&quot;&gt;&lt;a href=&quot;#fn-7&quot; class=&quot;footnote-ref&quot;&gt;7&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;div class=&quot;footnotes&quot;&gt;&lt;hr/&gt;&lt;ol&gt;&lt;li id=&quot;fn-1&quot;&gt;I’ve never actually looked up what ‘production value’ &lt;em&gt;means&lt;/em&gt;; I’ve just intuited it. Turns out &lt;a href=&quot;https://en.wiktionary.org/wiki/production_values#English&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;it comes from the performing arts&lt;/a&gt;!&lt;a href=&quot;#fnref-1&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-2&quot;&gt;…Technically, it was made using NodeCG, Preact, Parcel, NodeJS, and a variety of other small libraries 🤣&lt;a href=&quot;#fnref-2&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-3&quot;&gt;They used to have a video series explaining how it all worked, but it seems like those videos are &lt;a href=&quot;https://www.youtube.com/watch?v=vBAZXchbI3U&amp;amp;list=PLTEhlYdONYxv1wk2FsIpEz92X3x2E7bSx&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;no longer available&lt;/a&gt;😢&lt;a href=&quot;#fnref-3&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-4&quot;&gt;What little I’ve learned has been heavily inspired by &lt;a href=&quot;https://jvns.ca/blog/2020/03/15/writing-shaders-with-signed-distance-functions/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Julia Evans’ blog post&lt;/a&gt; and thinking about what I could do on stream.&lt;a href=&quot;#fnref-4&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-5&quot;&gt;Earlier this week I’d also come across &lt;a href=&quot;https://maple.pet/webgbcam/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;this online Gameboy Camera example&lt;/a&gt; and I &lt;em&gt;thought&lt;/em&gt; it was using WebGl too… &lt;a href=&quot;https://github.com/Lana-chan/webgbcam/blob/main/app.js&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;but nope, just regular ol’ Javascript&lt;/a&gt;!&lt;a href=&quot;#fnref-5&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-6&quot;&gt;Also, through the use of OBS shader extensions and technologies like this tool &lt;a href=&quot;https://alain.xyz/libraries/crossshader&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;which can convert GLSL shaders to HLSL shaders&lt;/a&gt;, you can even write shaders that you can just use in OBS!&lt;a href=&quot;#fnref-6&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-7&quot;&gt;I wanted to go more in-depth on NodeCG &lt;em&gt;or&lt;/em&gt; the Race Against Time but I still need to collect my thoughts 😅&lt;a href=&quot;#fnref-7&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[A Summer of Learning: The Race Against Time]]></title><description><![CDATA[What a summer! After being busy for so long, it's about time to pause and reflect. Let's see what I learned running an annual video game charity event, and maybe it can help you too? 📺🎮]]></description><link>https://nt3rp.io/posts/summer-of-learning-the-race-against-time</link><guid isPermaLink="false">https://nt3rp.io/posts/summer-of-learning-the-race-against-time</guid><pubDate>Thu, 10 Sep 2020 13:37:42 GMT</pubDate><content:encoded>&lt;p&gt;As it &lt;em&gt;rapidly&lt;/em&gt;&lt;sup id=&quot;fnref-1&quot;&gt;&lt;a href=&quot;#fn-1&quot; class=&quot;footnote-ref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; transitions from summer to fall, I’m reminded of just how &lt;em&gt;busy&lt;/em&gt; a summer I had 😅&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://zealarchives.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;The Zeal Archives&lt;/a&gt; wrapped up its second season—almost &lt;strong&gt;3x&lt;/strong&gt; more work than the first&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://twitch.tv/theraceagainsttime&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;The Race Against Time&lt;/a&gt; ran for its 6th iteration &lt;em&gt;nearly&lt;/em&gt; exceeding every metric set for it&lt;/li&gt;&lt;li&gt;…and &lt;a href=&quot;https://fanthropological.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Fanthropological&lt;/a&gt; continued into it’s 5th year, now at more than 150 episodes of fandom goodness&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;And while that may seem like I’m just tooting my own horn&lt;sup id=&quot;fnref-2&quot;&gt;&lt;a href=&quot;#fn-2&quot; class=&quot;footnote-ref&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;, I bring up these projects to raise a point about &lt;em&gt;growth&lt;/em&gt; and &lt;em&gt;improvement&lt;/em&gt;&lt;sup id=&quot;fnref-3&quot;&gt;&lt;a href=&quot;#fn-3&quot; class=&quot;footnote-ref&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&lt;p&gt;Let’s focus on one example, &lt;em&gt;the Race Against Time&lt;/em&gt;&lt;sup id=&quot;fnref-4&quot;&gt;&lt;a href=&quot;#fn-4&quot; class=&quot;footnote-ref&quot;&gt;4&lt;/a&gt;&lt;/sup&gt; ⏱&lt;/p&gt;&lt;p&gt;&lt;em&gt;The Race Against Time&lt;/em&gt; is a livestreamed video game marathon to&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Raise money for charity; and&lt;/li&gt;&lt;li&gt;Beat &lt;a href=&quot;https://en.wikipedia.org/wiki/Chrono_Trigger&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Chrono Trigger&lt;/a&gt; and all of its endings in under 24 hours&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The inception of the event &lt;em&gt;and&lt;/em&gt; that we continued to run the event after the first year are, by all accounts, a sort of happy accident because, by almost every measure, &lt;strong&gt;we sucked!&lt;/strong&gt;&lt;/p&gt;&lt;h2 id=&quot;the-past&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#the-past&quot; aria-label=&quot;the past permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 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 Past&lt;/h2&gt;&lt;p&gt;Flashback to 2015. A friend of ours had gotten really into streaming and in particular using the power of &lt;a href=&quot;https://twitch.tv&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;twitch.tv&lt;/a&gt; for good. He had been streaming regularly and had successfully done a number of different 24-hour charity streams with admittedly some &lt;em&gt;questionable&lt;/em&gt; donation incentives 🤔&lt;/p&gt;&lt;p&gt;Regardless, he asked &lt;a href=&quot;https://thenickscast.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;us&lt;/a&gt; to join him for one of these streams and, the good friend that he is, offered to let us pick the game &lt;em&gt;and&lt;/em&gt; the charity. With not a ton of forethought, or any experience with streaming, we decided on &lt;a href=&quot;https://alzheimer.ca/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;the Alzheimer Society of Canada&lt;/a&gt; for the charity—my grandfather had passed some years earlier due to complications of Alzheimer’s—and Chrono Trigger for the game—a game very familiar from our collective youth.&lt;/p&gt;&lt;p&gt;And as you might expect with no experience streaming, no practice, no particular following of our own—and no experience staying up for 24 hours straight—it went… not entirely according to plan 😰&lt;/p&gt;&lt;p&gt;We &lt;em&gt;did&lt;/em&gt; have a lot of fun, and raised &lt;em&gt;some&lt;/em&gt; money, but it was also a bit of a disappointment…&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Most of the money we’d raised came from our friend, the host (🤣)&lt;/li&gt;&lt;li&gt;We only managed to get the &lt;em&gt;bad&lt;/em&gt; ending of the game (out of 13 endings)&lt;/li&gt;&lt;li&gt;We got stuck for a &lt;em&gt;long&lt;/em&gt; time in one particular spot&lt;/li&gt;&lt;li&gt;There weren’t a lot of folks watching (especially in late-night parts)&lt;/li&gt;&lt;li&gt;…We were all super tired, even though we did some shifts to avoid staying up for 24 hours straight 😩&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;But&lt;/em&gt;, even though it didn’t go great, we did a couple unrelated streams with him and decided to try it again&lt;sup id=&quot;fnref-5&quot;&gt;&lt;a href=&quot;#fn-5&quot; class=&quot;footnote-ref&quot;&gt;5&lt;/a&gt;&lt;/sup&gt; a year later.&lt;/p&gt;&lt;p&gt;And the year after &lt;em&gt;that&lt;/em&gt; we tried again. And &lt;em&gt;again&lt;/em&gt; the year after. And so on.&lt;/p&gt;&lt;p&gt;Each year trying &lt;em&gt;new&lt;/em&gt; things, failing, learning, and &lt;em&gt;growing&lt;/em&gt; 🌱&lt;/p&gt;&lt;h2 id=&quot;the-present&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#the-present&quot; aria-label=&quot;the present permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 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 Present&lt;/h2&gt;&lt;p&gt;Let’s dig into the actual &lt;em&gt;learning and growing bits&lt;/em&gt; with all the data I have to date&lt;sup id=&quot;fnref-6&quot;&gt;&lt;a href=&quot;#fn-6&quot; class=&quot;footnote-ref&quot;&gt;6&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;center&quot;&gt;Year&lt;/th&gt;&lt;th align=&quot;center&quot;&gt;Endings&lt;/th&gt;&lt;th align=&quot;center&quot;&gt;Average Viewers&lt;/th&gt;&lt;th align=&quot;center&quot;&gt;Followers&lt;/th&gt;&lt;th align=&quot;right&quot;&gt;Funds Raised (CAD)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;2015&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;1&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;?&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;?&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;$  940.65&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;2016&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;5&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;?&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;?&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;$ 1065.85&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;2017&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;8&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;?&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;?&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;$  820.72&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;2018&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;9&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;15&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;61&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;$ 1212.03&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;2019&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;13&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;16&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;95&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;$ 1950.02&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;2020&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;12&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;23&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;142&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;$ 3327.78&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Across the board, there &lt;em&gt;is&lt;/em&gt; growth going on here; It’s not all consistent, but it &lt;em&gt;is&lt;/em&gt; happening!&lt;/p&gt;&lt;h3 id=&quot;endings&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#endings&quot; aria-label=&quot;endings permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Endings&lt;/h3&gt;&lt;p&gt;This was probably the easiest area for improvement because it’s something that &lt;em&gt;we can control&lt;/em&gt;: while there is a small amount of randomness involved &lt;em&gt;it is mostly a fixed sequence of events and decisions&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;In 2016, the obvious improvement was to just &lt;em&gt;play the game beforehand to remember what to do&lt;/em&gt;. Shocking 🙃&lt;/p&gt;&lt;p&gt;In 2017, we’d realized that the various endings in the game happen depending on when you face the final boss&lt;sup id=&quot;fnref-7&quot;&gt;&lt;a href=&quot;#fn-7&quot; class=&quot;footnote-ref&quot;&gt;7&lt;/a&gt;&lt;/sup&gt;, and if you save before facing the final boss, you can load the save file after completing an ending and continue the story to the next ending.&lt;/p&gt;&lt;p&gt;Put differently, our sequence of events before this realization looked like this (with rough times):&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;  Game Start &amp;gt; Ending 1 &amp;gt; Game Start &amp;gt; Ending 2 &amp;gt; Game Start &amp;gt; Ending 3 ...&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And after, looked 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;  Game Start &amp;gt; Ending 1 &amp;gt; Ending 2 &amp;gt; Ending 3 ...&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;… Being able to pick up from the previous ending instead of &lt;em&gt;the beginning of the game&lt;/em&gt; was an absolute win.&lt;/p&gt;&lt;p&gt;In 2019, &lt;a href=&quot;https://twitter.com/victorylime&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Nick G&lt;/a&gt; and I started &lt;a href=&quot;https://zealarchives.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;the Zeal Archives&lt;/a&gt;, an audio drama / discussion podcast about the world of Chrono Trigger. As we did research for the podcast, we also learned more about the intricacies of the game. This knowledge of small ways to speed up the game—like how to run away from most fights instantly—along with remembering boss weaknesses, plot details, and combining with our previous iterations meant it was the first year we managed to get all endings! 🥳&lt;/p&gt;&lt;h3 id=&quot;audience&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#audience&quot; aria-label=&quot;audience permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Audience&lt;/h3&gt;&lt;p&gt;I can’t speak for the rest of the crew, but speaking for myself &lt;strong&gt;I’m a bit of a coward&lt;/strong&gt;. I &lt;em&gt;want&lt;/em&gt; to be vulnerable around new folks and make friends, but I tend to close off and avoid meeting new people.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;That’s not a great place to start in person or online&lt;/strong&gt;, especially when trying to grow an event. You need to feel comfortable talking about the event in-person, and online, and work with other folks to promote it. &lt;strong&gt;You’ve got to build a community&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Heck, it wasn’t until the 3rd event when &lt;a href=&quot;https://smzeldarules.carrd.co/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;someone&lt;/a&gt; reached out to &lt;em&gt;us&lt;/em&gt; that I really felt comfortable starting to build a community!&lt;/p&gt;&lt;p&gt;And while I’m definitely not an expert at social media, community building, &lt;em&gt;or&lt;/em&gt; marketing, I’d like to think I learned &lt;em&gt;something&lt;/em&gt; about building an audience considering that the fourth year of our event—and the first time as our own twitch channel—&lt;a href=&quot;https://twitchtracker.com/theraceagainsttime/statistics&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;we had an average of 15 concurrent viewers&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;For context, &lt;a href=&quot;https://kotaku.com/lonelystreams-shows-you-what-happens-in-twitch-streams-1826960841&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;a lot&lt;/a&gt; &lt;a href=&quot;https://www.theverge.com/2018/7/16/17569520/twitch-streamers-zero-viewers-motivation-community&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;has been said&lt;/a&gt; of how many streams have 0 viewers. I tried to find percentile or ranking data but the best I managed to find was TwitchTracker &lt;a href=&quot;https://twitchtracker.com/theraceagainsttime&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;which ranked us in the top 100k of Twitch streamers&lt;/a&gt; (top 1.5% percentile)&lt;sup id=&quot;fnref-8&quot;&gt;&lt;a href=&quot;#fn-8&quot; class=&quot;footnote-ref&quot;&gt;8&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&lt;figure class=&quot;float-right&quot; style=&quot;width:240px&quot;&gt;&lt;img src=&quot;/media/small-improvements.jpg&quot; alt=&quot;(1.00)^365 = 1.00, doing nothing at all versus (1.01)^365 = 37.7, small consistent effort&quot;/&gt;&lt;figcaption&gt;Doing nothing at all versus small consistent effort&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;How we got there was &lt;em&gt;probably&lt;/em&gt; a lot of luck, and &lt;em&gt;definitely&lt;/em&gt; an application of small, consistent efforts:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Talking about the event on our podcast, on discussion panels at conventions, and in small communities like on discord&lt;/li&gt;&lt;li&gt;Reaching out to potential guests to join us during the event (in-person or remotely)&lt;/li&gt;&lt;li&gt;Streaming (mostly) weekly, and participating in other folks streams&lt;/li&gt;&lt;li&gt;Buying prizes for the event, and crediting the creator whenever we share prize details&lt;/li&gt;&lt;li&gt;Reaching out to folks for prizes or other assistance, even though they had no obligation to help&lt;/li&gt;&lt;li&gt;Having some amazing cheerleaders and help via friends like &lt;a href=&quot;https://twitch.tv/smzeldarules&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;SMZeldaRules&lt;/a&gt; and &lt;a href=&quot;https://epicfilmguys.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Epic Film Guys&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;All of those things helped to build our own community, which was especially useful since we effectively built a Twitch following from scratch 😬&lt;/p&gt;&lt;h3 id=&quot;fundraising&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#fundraising&quot; aria-label=&quot;fundraising permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Fundraising&lt;/h3&gt;&lt;p&gt;Where gameplay is dependent on &lt;em&gt;personal&lt;/em&gt; performance, fundraising is a result of a &lt;em&gt;lot&lt;/em&gt; of external factors: audience size, generosity, incentives, and motivation… to name a few.&lt;/p&gt;&lt;p&gt;Or a different example: timing! ⏱💨&lt;/p&gt;&lt;p&gt;The first three years we ran the event, it was 24 hours &lt;em&gt;in a row&lt;/em&gt;. Even though most of our audience was in North America—and even moreso in our &lt;em&gt;same timezone&lt;/em&gt;—we ran the event into the wee hours of the night. &lt;em&gt;Sure&lt;/em&gt; there are night owls, but late streams means a smaller audience, and a smaller audience means less donations.&lt;/p&gt;&lt;p&gt;On top of that, there’s the small logistical problem of &lt;em&gt;sleep&lt;/em&gt;. However you do it, some folks need to rest and recover, and even folks who are on stream aren’t at their best after being up for so long 😪&lt;/p&gt;&lt;p&gt;Addressing the audience size and sleep problem was easy: run the event for the same length of time (24 hours) but break it up (2x noon to midnight).&lt;/p&gt;&lt;p&gt;…But without a lot of promotion or fundraising experience, the &lt;em&gt;convincing people to donate&lt;/em&gt; part was the harder of the two problems to solve. We tried:&lt;sup id=&quot;fnref-9&quot;&gt;&lt;a href=&quot;#fn-9&quot; class=&quot;footnote-ref&quot;&gt;9&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Donation incentives, like karaoke requests or, uh… masochism??&lt;/li&gt;&lt;li&gt;Auctions for big ticket items, like a Super Famicom with Chrono Trigger&lt;/li&gt;&lt;li&gt;Guests, like &lt;a href=&quot;https://bossfightbooks.com/products/chrono-trigger-by-michael-p-williams&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;the guy who little wrote &lt;del&gt;the&lt;/del&gt; a book about Chrono Trigger&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Activities on stream, like a short Pathfinder game with &lt;a href=&quot;https://highergroundsgamingblog.wordpress.com/2017/04/21/super-special-series-chrono-trigger/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Chrono Trigger characters&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Giveaways, like Chrono Trigger merchandise or uh… well…&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;…Early attempts at prize selection were very &lt;em&gt;experimental&lt;/em&gt; due to our prize budget ($0) and discomfort reaching out to potential prize donors. One year we managed to get the assistance of &lt;a href=&quot;https://en.wikipedia.org/wiki/Christian_Potenza&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Christian Potenza&lt;/a&gt; and some other voice actors who all generously donated memorabilia related to the shows they worked on… which unfortunately didn’t have a lot to do with Chrono Trigger 😰&lt;/p&gt;&lt;p&gt;Honestly, we made a &lt;em&gt;lot&lt;/em&gt; of little changes to try to encourage more donations, and I don’t think it was any one factor. I think growing our audience, changing the timing, and offering more relevant giveaway prizes probably helped a lot.&lt;/p&gt;&lt;h2 id=&quot;the-future&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#the-future&quot; aria-label=&quot;the future permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 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 Future&lt;/h2&gt;&lt;p&gt;So there’s been growth, and we have a better understand of how, but what does that mean as far as future improvements.&lt;/p&gt;&lt;p&gt;In the broadest sense, all I can say is to &lt;strong&gt;focus on the things that worked and don’t worry about what didn’t.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;For example, things that worked and helped us to grow:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Making small improvements and iterating&lt;/li&gt;&lt;li&gt;Trying lots of different things and running experiments&lt;/li&gt;&lt;li&gt;Failing a lot, and in different ways (but never the same way more than once)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;There were also a lot of things that I enjoyed, and took up a fair amount of time, but probably didn’t matter too much as far as our success goes:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Equipment:&lt;/strong&gt; Each year we stepped up our game as far as the tools to run the stream starting with tools almost exclusively on the computer (emulator, Yeti microphone, a headphone splitter and a ton of tangled headphones) to tools outside the computer (USB mixer, multiple cameras, fancy XLR microphones). Lots of people stream with worse and have no problems growing an audience or fundraising&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fancy Overlay:&lt;/strong&gt; I really like programming so it’s no surprise that I couldn’t just use a basic image for an overlay, and instead had to make widgets for the current on-stream party, giveaways, and so on. Again, lots of people have really simple overlays (many have just the facecam and some alerts) without any growth issues&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I also didn’t get the chance to mention our choice of charity. I don’t think the choice of charity particularly helped or hindered our growth of the stream, but what it does do is make it easier to talk sincerely about the stream.&lt;/p&gt;&lt;p&gt;Up until 2020, we chose the Alzheimer Society of Canada, and while it’s a worthy cause (as many are), it just didn’t resonate in the same way as when we started. Given all the things going on in the world, it was important to all of us that we pick a charity that really feels like it is doing good in the world &lt;em&gt;right now&lt;/em&gt;. That’s why this year we picked &lt;a href=&quot;https://www.translifeline.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Trans Lifeline&lt;/a&gt;—a crisis line run for trans folks, by trans folks. 🏳‍🌈&lt;/p&gt;&lt;p&gt;Changing the charity allowed us to be more in tune with our values and help us to feel like we’re making a difference, regardless of our performance. Put differently, &lt;strong&gt;the choice of charity gave us more intrinsic motivation!&lt;/strong&gt;  😄💖&lt;/p&gt;&lt;p&gt;…&lt;/p&gt;&lt;p&gt;Wow, I had a lot to say about the Race Against Time!&lt;/p&gt;&lt;p&gt;All of that is to say that the future of the event is looking bright, and that all sort of projects can give an opportunity for growth… even if it’s over a long span of time!&lt;/p&gt;&lt;p&gt;I still have more to say about some of my other summer learnings but that is definitely a post for another time. 🤔💭&lt;/p&gt;&lt;div class=&quot;footnotes&quot;&gt;&lt;hr/&gt;&lt;ol&gt;&lt;li id=&quot;fn-1&quot;&gt;Locally there’s been a drastic shift from &lt;a href=&quot;https://www.reddit.com/r/waterloo/comments/if9z5k/with_a_3pm_high_of_313c_today_is_waterloos/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;hot&lt;/a&gt; to &lt;a href=&quot;https://www.reddit.com/r/waterloo/comments/ipebgy/with_a_high_of_148c_yesterday_was_waterloos/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;cold&lt;/a&gt; in a very short span of time.&lt;a href=&quot;#fnref-1&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-2&quot;&gt;Something I don’t do often enough 🥺&lt;a href=&quot;#fnref-2&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-3&quot;&gt;One could also make the point that folks &lt;em&gt;need not be defined by their productivity&lt;/em&gt; and can just &lt;em&gt;be&lt;/em&gt;… but I kind of &lt;em&gt;also&lt;/em&gt; want to toot my own horn.&lt;a href=&quot;#fnref-3&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-4&quot;&gt;I have plans to talk more about the Zeal Archives in a follow up blog post which will be more podcast-centric.&lt;a href=&quot;#fnref-4&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-5&quot;&gt;I’d like to think that it was at least partly out of spite, which is a &lt;em&gt;powerful&lt;/em&gt; motivator that should not be underestimated.&lt;a href=&quot;#fnref-5&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-6&quot;&gt;The first three years we ran the event under our friend’s channel before creating our own. While I believe I have data from those early years, it’s not exactly an apples-to-apples comparison.&lt;a href=&quot;#fnref-6&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-7&quot;&gt;Technically, you can beat the game at almost any point, but on your first playthrough, you probably lack the necessary equipment and strength to beat the final boss. Completing the story once reveals a ‘New Game+’ mode where you can carry over your character’s levels and equipment, and—once you’ve passed a certain point in the story—face the final boss at any time.&lt;a href=&quot;#fnref-7&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-8&quot;&gt;…When I wrote this article. At least once since this article was published, the ranking / percentile just didn’t display, probably because of the account’s temporary inactivity.&lt;a href=&quot;#fnref-8&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-9&quot;&gt;Honestly, I take a lot of inspiration from the amazing &lt;a href=&quot;https://desertbus.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Desert Bus for Hope&lt;/a&gt; (for the children!)&lt;a href=&quot;#fnref-9&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Being Derivative]]></title><description><![CDATA[Not all talents are distributed equally, and in creating things it can feel like you're just copying other people's work. I'm going to talk about my past, and feeling derivative 😰]]></description><link>https://nt3rp.io/posts/being-derivative</link><guid isPermaLink="false">https://nt3rp.io/posts/being-derivative</guid><pubDate>Thu, 13 Aug 2020 13:37:42 GMT</pubDate><content:encoded>&lt;p&gt;Growing up, I didn’t have the most solid sense of self-esteem. I was definitely a people pleaser and a lot of my motivations were around external factors: Winning this, beating that, being the “best” at sports, or grades, or getting into the “best” school.&lt;/p&gt;&lt;p&gt;And even though I had lots of different hobbies, my creative efforts always felt a bit &lt;em&gt;derivative&lt;/em&gt;&lt;sup id=&quot;fnref-1&quot;&gt;&lt;a href=&quot;#fn-1&quot; class=&quot;footnote-ref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;. While other folks had amassed this raw, natural talent to draw, perform, act… my skills always felt less than that. It was like I had some sort of ‘second order’ skills, approximate skills. QUASI-skills.&lt;/p&gt;&lt;p&gt;I loved making things, but &lt;em&gt;it felt like I was borrowing other people’s skills&lt;/em&gt; and talents rather than my own 😖&lt;/p&gt;&lt;p&gt;I remember being in elementary school, writing a short story about me and my friends collecting Pokemon (or was it becoming Pokemon?). Or another time composing an “original” piece of music for an assignment where I’d &lt;em&gt;really&lt;/em&gt; just transcribed the Pokemon theme. … Pokemon was a really popular game, ok?!&lt;/p&gt;&lt;p&gt;I kept doing more of that as I got older&lt;sup id=&quot;fnref-2&quot;&gt;&lt;a href=&quot;#fn-2&quot; class=&quot;footnote-ref&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;—taking a love of a piece of media and cramming it into whatever I was making at the time. That meant making a lot of fan sites (often incomplete) for video games and anime as I learned the magic of HTML and CSS, and making pixel art of me and my friends by mashing up whatever video game sprites I could get my hands on in Photoshop&lt;sup id=&quot;fnref-3&quot;&gt;&lt;a href=&quot;#fn-3&quot; class=&quot;footnote-ref&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;. I also got into making Anime Music Videos via a friend—something that helped me to learn about Adobe Premiere&lt;sup id=&quot;fnref-4&quot;&gt;&lt;a href=&quot;#fn-4&quot; class=&quot;footnote-ref&quot;&gt;4&lt;/a&gt;&lt;/sup&gt; and video editing in general, and something that I carried into University—largely inspired by them winning &lt;a href=&quot;https://www.animenorth.com/event/index.php/programming/amvcontest&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;a local competition&lt;/a&gt;&lt;sup id=&quot;fnref-5&quot;&gt;&lt;a href=&quot;#fn-5&quot; class=&quot;footnote-ref&quot;&gt;5&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&lt;p&gt;(Fortunately, I grew up in an age without a lot of social media, so my cringy videos for the morning announcements&lt;sup id=&quot;fnref-6&quot;&gt;&lt;a href=&quot;#fn-6&quot; class=&quot;footnote-ref&quot;&gt;6&lt;/a&gt;&lt;/sup&gt; and fan-dubbing of clips from Gravitation and Steel Angel Kurumi have &lt;em&gt;narrowly&lt;/em&gt; avoided being cast out to the world at large 😰)&lt;/p&gt;&lt;p&gt;But even though I was learning different skills, and doing thigns I enjoyed, it never felt like the right skills. Programming didn’t feel the same as making an impressive sketch. Videos weren’t the same as performing.&lt;/p&gt;&lt;p&gt;I felt like some sort of copycat (or perhaps, &lt;a href=&quot;./impostor-syndrome-fighting-it-in-fandom&quot;&gt;an impostor&lt;/a&gt; 😏)&lt;/p&gt;&lt;p&gt;But as it turns out, &lt;strong&gt;none of that matters&lt;/strong&gt;! 🙃&lt;/p&gt;&lt;p&gt;…Or more accurately, that as I got older (and started going to therapy) I learned that all sorts of different skills are valuable, &lt;em&gt;and&lt;/em&gt; that people have value outside of the things that they produce.&lt;sup id=&quot;fnref-7&quot;&gt;&lt;a href=&quot;#fn-7&quot; class=&quot;footnote-ref&quot;&gt;7&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;p&gt;Plus, in the current internet landscape, all those different skills that I thought were derivative are actually &lt;em&gt;incredibly useful&lt;/em&gt;, &lt;em&gt;and&lt;/em&gt; there are so many folks out there that are leveraging their love of different media to make their &lt;em&gt;own&lt;/em&gt; amazing derivative works.&lt;/p&gt;&lt;p&gt;If you take a small snapshot of the web, you’ve got:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;…&lt;a href=&quot;https://critrole.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;fans of Tabletop Roleplaying&lt;/a&gt; making graphic novels and TV shows&lt;/li&gt;&lt;li&gt;&lt;em&gt;huge&lt;/em&gt; numbers of people making careers out of cosplay&lt;/li&gt;&lt;li&gt;musicians making music out of other video game music or straight-up making albums &lt;a href=&quot;https://bigbadbosses.bandcamp.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;heavily inspired&lt;/a&gt; by &lt;a href=&quot;https://starbomb.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;games that the artists love&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/channel/UClt01z1wHHT7c5lKcU8pxRQ&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;YouTubers&lt;/a&gt; and &lt;a href=&quot;https://www.animefeminist.com/category/podcast/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Podcasters&lt;/a&gt; talking all about media&lt;/li&gt;&lt;li&gt;People playing video games professionally, or for charity&lt;/li&gt;&lt;li&gt;FANART&lt;/li&gt;&lt;li&gt;Podcasts. So many podcasts.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;And there are &lt;em&gt;tons&lt;/em&gt; of people doing this (and there are people who are fans of this kind of work). It’s so inspiring to see the kinds of things people are making today 😲&lt;/p&gt;&lt;p&gt;Honestly, I don’t know why it bothered me so much that I created new art out of other people’s work. That’s effectively modern remix culture, and even when I was growing up, tons of famous works were clearly made up of or influenced by other works (though, in a different way).&lt;/p&gt;&lt;p&gt;Or put differently, &lt;strong&gt;there’s nothing wrong with being derivative&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;People learn skills by trying to reproduce works they love! Everyone has different skills that can be shown off in so many different ways, to share their love of what they love!&lt;/p&gt;&lt;p&gt;…And I don’t know why it took me this long to understand that 😳&lt;/p&gt;&lt;div class=&quot;footnotes&quot;&gt;&lt;hr/&gt;&lt;ol&gt;&lt;li id=&quot;fn-1&quot;&gt;Untangling the mess of thoughts and feelings around self-esteem can definitely be solved by… Therapy. It’s a work in progress 😅&lt;a href=&quot;#fnref-1&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-2&quot;&gt;…Not Pokemon. After Gen 2 I wasn’t back in the game until Gen 6.&lt;a href=&quot;#fnref-2&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-3&quot;&gt;Though I never played the game, I loved the sprites from &lt;em&gt;SNK vs Capcom: Card Fighters Clash&lt;/em&gt;. I used a lot of sprites from that, as well as &lt;em&gt;Ogre Battle: The March of the Black Queen&lt;/em&gt;.&lt;a href=&quot;#fnref-3&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-4&quot;&gt;Let’s be honest: it wasn’t Adobe Premiere, it was Windows Movie Maker 🙃&lt;a href=&quot;#fnref-4&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-5&quot;&gt;I say “inspired by” loosely. &lt;em&gt;Envious&lt;/em&gt; is a better word; I entered the same competition for I &lt;em&gt;think&lt;/em&gt; the larger part of a decade, and though I received an honourable mention a few different times, I never won 😬&lt;a href=&quot;#fnref-5&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-6&quot;&gt;We’re talking green screen with a bed sheet, background half-blurred into the subject, bad photoshop and terrible Scottish / English / Japanese accents 🙅‍♂️&lt;a href=&quot;#fnref-6&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-7&quot;&gt;This is not particularly revelatory, but it took a lot for me to get here.&lt;a href=&quot;#fnref-7&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Impostor Syndrome: Fighting it in Fandom]]></title><description><![CDATA[Whether as fan, content creator, or even in your career, you can often feel 'less than' other folks. Like an impostor faking it to get where you are. Let's fix that. 🚧🏗‍🛠]]></description><link>https://nt3rp.io/posts/impostor-syndrome-fighting-it-in-fandom</link><guid isPermaLink="false">https://nt3rp.io/posts/impostor-syndrome-fighting-it-in-fandom</guid><pubDate>Thu, 30 Apr 2020 20:42:42 GMT</pubDate><content:encoded>&lt;p&gt;I’m no stranger to mental health issues—Like many, I’ve struggled on-and-off with depression and varying levels of anxiety. Fortunately, through the support of friends, family, and therapists, I’ve been able to work towards a point where these issues are manageable… &lt;em&gt;but&lt;/em&gt; the brain is a funny thing.&lt;/p&gt;&lt;p&gt;For example, despite &lt;a href=&quot;https://raceagainsttime.io&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;numerous&lt;/a&gt; &lt;a href=&quot;https://fanthropological.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;successful&lt;/a&gt; &lt;a href=&quot;https://zealarchives.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;side projects&lt;/a&gt; (including being &lt;a href=&quot;https://www.packtpub.com/web-development/highcharts-cookbook&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;paid to write a book&lt;/a&gt;) and working as a software engineer for &lt;a href=&quot;https://www.linkedin.com/in/nt3rp&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;more than a decade&lt;/a&gt;, my brain &lt;em&gt;somehow&lt;/em&gt; reaches a point where I doubt my accomplishments and believe that I am a fraud: that I have deceived others into thinking I’m more intelligent than I am, and that most of what I’ve done is by luck.&lt;sup id=&quot;fnref-1&quot;&gt;&lt;a href=&quot;#fn-1&quot; class=&quot;footnote-ref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; 🙃&lt;/p&gt;&lt;p&gt;Fortunately, this phenomenon has a name, &lt;a href=&quot;https://en.wikipedia.org/wiki/Impostor_syndrome&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;impostor syndrome&lt;/a&gt;, and while it isn’t a mental disorder, it definitely lies somewhere in the realm of mental health. Even better—and if this experience sounds familiar to you—studies show that more than 70% of people experience it at some point in their career!&lt;/p&gt;&lt;p&gt;If you’ve never experienced impostor syndrome (congratulations!) or if you need a refresher, &lt;a href=&quot;https://squinky.me/2013/11/16/impostor-syndrome/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Dietrich Squinkifier has developed a browser game&lt;/a&gt; so that you can get a taste of what it’s like. It’s a short game, and I’d recommend giving it a shot. I’ll wait. 😉&lt;/p&gt;&lt;p&gt;…&lt;/p&gt;&lt;p&gt;Welcome back! I’m hoping that gives a bit more context (and possibly a wider perspective on other important issues).&lt;/p&gt;&lt;p&gt;What’s interesting to me is that, while a lot of literature around impostor syndrome is focused on careers (and competency in careers), I think it applies to a lot of fan activity and hobbies as well, especially as fan work and hobbies continue to be commodified.&lt;sup id=&quot;fnref-2&quot;&gt;&lt;a href=&quot;#fn-2&quot; class=&quot;footnote-ref&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; There’s definitely a lot of discourse about folks’ feelings of not being a ‘true fan’ (whatever that means) because they don’t participate enough, or because they don’t do as much in their hobby compared to their friends and peers.&lt;/p&gt;&lt;p&gt;Honestly, impostor syndrome is fascinating, but if you’ve ever read advice on how to deal with it, the suggestions can be a bit &lt;em&gt;underwhelming&lt;/em&gt;. Take for example &lt;a href=&quot;https://time.com/5312483/how-to-deal-with-impostor-syndrome/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;this article from Time.com&lt;/a&gt;&lt;sup id=&quot;fnref-3&quot;&gt;&lt;a href=&quot;#fn-3&quot; class=&quot;footnote-ref&quot;&gt;3&lt;/a&gt;&lt;/sup&gt; whose advice can be reduced to:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Put things into perspective, and critically examine your thoughts&lt;/li&gt;&lt;li&gt;Reframe your thoughts&lt;/li&gt;&lt;li&gt;Share how you’re feeling with others&lt;/li&gt;&lt;li&gt;Accept that feeling doubt from time to time is normal&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;…Which is all true and useful advice, but maybe not practical enough to be helpful if you’re experiencing impostor syndrome? 🤦‍♂️&lt;/p&gt;&lt;p&gt;I’m hoping that I can provide some &lt;em&gt;specific&lt;/em&gt; tips to dispel some of the feelings of inadequacy around impostor syndrome!&lt;/p&gt;&lt;h2 id=&quot;hype-yourself-up&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#hype-yourself-up&quot; aria-label=&quot;hype yourself 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;Hype Yourself Up&lt;/h2&gt;&lt;p&gt;If you’ve ever sought counselling, you may have heard of something called &lt;a href=&quot;https://en.wikipedia.org/wiki/Cognitive_behavioral_therapy&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;cognitive behavioural therapy (CBT)&lt;/a&gt;. Broadly, it is a problem-oriented form of therapy that focuses on challenging and changing unhelpful cognitive patterns. How? Largely by self-reflection to identify problematic thoughts and behaviours, and then building up bodies of evidence to either support or dispel the beliefs.&lt;sup id=&quot;fnref-4&quot;&gt;&lt;a href=&quot;#fn-4&quot; class=&quot;footnote-ref&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;p&gt;What does that have to do with impostor syndrome? &lt;em&gt;It’s hard to think you’re a fraud when you have evidence that shows you are not!&lt;sup id=&quot;fnref-5&quot;&gt;&lt;a href=&quot;#fn-5&quot; class=&quot;footnote-ref&quot;&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/em&gt; 😏&lt;/p&gt;&lt;p&gt;Still, that’s easier said than done, right?&lt;/p&gt;&lt;p&gt;Enter &lt;a href=&quot;https://aashni.me/blog/hype-yourself-youre-worth-it/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;the hype doc&lt;/a&gt;: a collection of your achievements, accolades, projects… all of the cool stuff you’ve done! No one knows the work you’ve done better than you, and no one can hype it up more than you. Update it regularly, and put it in whatever format works best for you, whether that be a spreadsheet, a doc, a journal or notebook, just write down all the things!&lt;/p&gt;&lt;p&gt;Important detail: this isn’t a resume! &lt;em&gt;This is something just for you&lt;/em&gt;. It doesn’t have to be career-related, or even have significance to other folks; it just has to mean something to you. My personal hype doc includes things like:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Blog posts I’ve written&lt;/li&gt;&lt;li&gt;Podcast episodes I’ve published&lt;/li&gt;&lt;li&gt;Paneling at conventions&lt;/li&gt;&lt;li&gt;Successfully running charity livestreams&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://twitch.tv/theraceagainsttime&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Reaching affiliate status on Twitch.tv&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;It doesn’t have to be earth-shattering things like “published a best-seller” or “cured cancer”. Just having a list of things that you’ve completed provides evidence to dispel the idea that you haven’t earned your achievements. 📃&lt;/p&gt;&lt;h2 id=&quot;take-chances-get-messy-make-mistakes&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#take-chances-get-messy-make-mistakes&quot; aria-label=&quot;take chances get messy make mistakes permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 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 Chances, Get Messy, Make Mistakes!&lt;/h2&gt;&lt;p&gt;Would it surprise you to learn that failure &lt;em&gt;is&lt;/em&gt; an option? 🤔&lt;/p&gt;&lt;p&gt;A somewhat paradoxical way to shake out those fake feelings is to take on a new challenge and allow yourself to fail.&lt;/p&gt;&lt;p&gt;This works for a few different reasons:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Taking a risk requires courage, and that you face the fear that you might fall short of your or others’ expectations&lt;/li&gt;&lt;li&gt;Failure provides an opportunity for learning and growth; not only do you learn what not to do, but you have a clearer idea of how things work&lt;/li&gt;&lt;li&gt;Failing normalizes failure! Though it might feel bad, it helps to put into context that most failures aren’t the end of the world and are in fact necessary to progress!&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Are there circumstances where failure is not an option? Absolutely! But for most of our personal hobbies, and even a lot of our work lives, it’s totally ok to make mistakes.&lt;/p&gt;&lt;p&gt;Failure is how we advance; it is a necessary step to free us from thinking we are impostors! 🗽&lt;/p&gt;&lt;p&gt;If you think you’re a fake and you fail, &lt;em&gt;but&lt;/em&gt; then everything still works out fine, the only outcomes are that you’re ok with being an impostor, or perhaps your thoughts on being a fraud were misplaced.&lt;/p&gt;&lt;h2 id=&quot;you-can-only-control-yourself&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#you-can-only-control-yourself&quot; aria-label=&quot;you can only control yourself permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;You Can Only Control Yourself&lt;/h2&gt;&lt;p&gt;Absent of evidence, what makes impostor syndrome challenging to deal with is that so much of it isn’t quantifiable. There is this complex Gordian knot of feelings around personal expectations, expectations of others, and expectations &lt;em&gt;from&lt;/em&gt; others (of self) that are a mess to untangle. What’s key to note in all of this is that all of these feelings center on one thing, your perceptions.&lt;/p&gt;&lt;p&gt;And it might seem impossible, but you can change your perceptions… at least, with practice. That’s because the human brain is surprisingly capable of learning, and because you control your brain, you control your thoughts! 😲&lt;/p&gt;&lt;p&gt;Let’s look at some examples, and I’ve touched on some of these ideas &lt;a href=&quot;posts/working-nine-to-five-to-ten&quot;&gt;in my previous post&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;You feel like you aren’t meeting your own standards&lt;/strong&gt; 😥&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Lower your standards! You don’t need to be perfect to be worthy of achieving things. If the bar is too high… you’ll always be disappointed.&lt;/li&gt;&lt;li&gt;Is the problem that you’re making mistakes? Everyone makes mistakes! If the mistakes are only impacting you… go easy on yourself.&lt;/li&gt;&lt;li&gt;No one is great at everything! Think about and focus on the things that you are uniquely good at.&lt;/li&gt;&lt;li&gt;Perfection is the enemy of done, so finish what you’re doing and move on.&lt;sup id=&quot;fnref-5&quot;&gt;&lt;a href=&quot;#fn-5&quot; class=&quot;footnote-ref&quot;&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;&lt;li&gt;Failure counts as done, and failure is ok.&lt;sup id=&quot;fnref-5&quot;&gt;&lt;a href=&quot;#fn-5&quot; class=&quot;footnote-ref&quot;&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;You feel like you aren’t living up to others expectations&lt;/strong&gt; 😖&lt;/p&gt;&lt;ul&gt;&lt;li&gt;You can find out if the problem is a problem! Talk to the people whose expectations you feel you aren’t living up to! Then you have evidence, or better yet, you can set expectations. These can be hard conversations but are immensely liberating.&lt;/li&gt;&lt;li&gt;“Pretending you know what you’re doing is almost the same as knowing what you are doing, so just accept that you know what you’re doing even if you don’t and do it.” &lt;sup id=&quot;fnref-5&quot;&gt;&lt;a href=&quot;#fn-5&quot; class=&quot;footnote-ref&quot;&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;&lt;li&gt;If there isn’t a mismatch of expectations, remind yourself that you get to set what’s important in your life. You don’t need to live according to others’ expectations.&lt;/li&gt;&lt;li&gt;It could be that you actually aren’t living up to expectations. If that’s the case, congratulations! You are no longer an imposter. Remind yourself that progress and learning take time, and ask for constructive criticism from others (assuming you aren’t getting it already).&lt;/li&gt;&lt;/ul&gt;&lt;figure class=&quot;float-right&quot; style=&quot;width:240px&quot;&gt;&lt;img src=&quot;/media/done-manifesto.png&quot; alt=&quot;Depiction of the Done Manifesto&quot;/&gt;&lt;figcaption&gt;A depiction of the &lt;a href=&quot;https://lifehacker.com/the-done-manifesto-lays-out-13-ground-rules-for-getting-5864004&quot;&gt;Done Manifesto&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;You feel less than others&lt;/strong&gt; 😭&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Don’t compare your life / self / work to others! You generally only see others’ best sides, and that’s weighed against your own self-doubt—guess which one will win out? You don’t know others’ lives or struggles, and things may not be as easy for them as it seems.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I highly recommend taking a minute or two to read &lt;a href=&quot;https://lifehacker.com/the-done-manifesto-lays-out-13-ground-rules-for-getting-5864004&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;the Done Manifesto&lt;/a&gt;. It’s 13 ideas (sentences) that have helped me to reframe work, which has been helpful when I feel like an impostor.&lt;/p&gt;&lt;h2 id=&quot;seek-help&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#seek-help&quot; aria-label=&quot;seek help permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Seek Help&lt;/h2&gt;&lt;p&gt;I’m definitely not an expert on this, though I’ve experienced it a lot, and the person who knows about your struggles best is you.&lt;/p&gt;&lt;p&gt;There are lots of resources out there, but not all of them are accessible to everyone:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;A therapist: this has by far been the most helpful resource for me, but is also likely the least accessible for many&lt;/li&gt;&lt;li&gt;Build a personal support network: Practice vulnerability and really open up to close friends, family, and co-workers; let them know about your struggles, and you might be surprised how many others also struggle&lt;/li&gt;&lt;li&gt;Self-reflection: Better understanding yourself is always helpful, but sometimes requires some outside help and guidance.&lt;/li&gt;&lt;li&gt;Learn about existing tools and strategies: There are tons of resources on mental health and impostor syndrome. I had a lot of help for this post from &lt;a href=&quot;https://www.takethis.org/2017/03/what-to-do-if-you-feel-like-an-imposter/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;TakeThis.org&lt;/a&gt;—a non-profit whose mission is “to decrease the stigma, and increase the support for, mental health in the game enthusiast community and inside the game industry”—and &lt;a href=&quot;https://www.goodtherapy.org/blog/seven-ways-to-start-overcoming-impostor-syndrome-052914&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Good Therapy&lt;/a&gt;, but many other resources exist&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Dealing with any mental health issue is hard on your own, and its important to remember that we’re &lt;em&gt;not&lt;/em&gt; in this alone. We’re all in this together. 😃&lt;/p&gt;&lt;div class=&quot;footnotes&quot;&gt;&lt;hr/&gt;&lt;ol&gt;&lt;li id=&quot;fn-1&quot;&gt;There’s definitely a &lt;em&gt;whole&lt;/em&gt; conversation about luck, wealth, and privilege in software development but that’s not the point I’m trying to make today.&lt;a href=&quot;#fnref-1&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-2&quot;&gt;Elizabeth Minkel and Flourish Klink know &lt;em&gt;way&lt;/em&gt; more about this than I do, and I’d highly recommend following their podcast, &lt;a href=&quot;https://www.fansplaining.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Fansplaining&lt;/a&gt; for more on the commodification of fandom—especially &lt;a href=&quot;https://www.fansplaining.com/episodes/65-fandom-and-capitalism&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;their episode on fandom and capitalism&lt;/a&gt; or Henry Jenkins’ (a media scholar) &lt;a href=&quot;http://henryjenkins.org/blog/2017/11/29/an-interview-with-fansplainings-flourish-klink-and-elizabeth-minkel-part-two&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;interview with them&lt;/a&gt;&lt;a href=&quot;#fnref-2&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-3&quot;&gt;I’m aware there are better resources than Time.com for impostor syndrome. This is purely for illustrative purposes.&lt;a href=&quot;#fnref-3&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-4&quot;&gt;I am not a therapist.&lt;a href=&quot;#fnref-4&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-5&quot;&gt;Just read &lt;a href=&quot;https://lifehacker.com/the-done-manifesto-lays-out-13-ground-rules-for-getting-5864004&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;the Done Manifesto&lt;/a&gt; already!&lt;a href=&quot;#fnref-5&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Working 9-5-10: Making Content with a Day Job]]></title><description><![CDATA[Being a smash online personality sounds great... unless it doesn't pay the bills. How do you manage to create content, get it out there, and still work a 9-5 without killing yourself? 😫]]></description><link>https://nt3rp.io/posts/working-nine-to-five-to-ten</link><guid isPermaLink="false">https://nt3rp.io/posts/working-nine-to-five-to-ten</guid><pubDate>Fri, 13 Mar 2020 16:49:42 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;I really enjoy making things!&lt;/strong&gt; Whether it’s code, podcasts, graphics (mostly in relation to the other two), photography, streaming, or very occasionally, costumes, I find the process of making content rewarding and fulfilling. 🤩&lt;/p&gt;&lt;p&gt;And it must be, just at a little bit, right? Why else would &lt;a href=&quot;https://www.businessinsider.com/american-kids-youtube-star-astronauts-survey-2019-7&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;so many kids in the US want to grow up to be a YouTuber / Vlogger&lt;/a&gt;, or why do so many folks make podcasts even &lt;a href=&quot;https://lime.link/blog/how-much-money-do-podcasters-make/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;though 99% of them don’t make any money&lt;/a&gt;&lt;sup id=&quot;fnref-1&quot;&gt;&lt;a href=&quot;#fn-1&quot; class=&quot;footnote-ref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;?&lt;/p&gt;&lt;p&gt;For me, it helps to feel like making a small impression on the world, and to move away from the gargantuan unending stream of consumption of media… by creating more media, of course! But for you, your motivation could be something completely different. Maybe you want to turn your hobby into a hustle, but haven’t quite made it—&lt;a href=&quot;https://www.manrepeller.com/2019/02/trap-of-turning-hobbies-into-hustles.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;I may have some news for you&lt;/a&gt;—or you see the joy that content creation brings to other people in terms of the &lt;a href=&quot;https://en.wikipedia.org/wiki/Parasocial_relationships&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;parasocial relationships&lt;/a&gt; your work can create.&lt;/p&gt;&lt;p&gt;Whatever your motivations, making content—an undertaking unto itself—can be hard to do on top of all the other responsibilities you may have: long shifts, irregular schedules, kids, classes, bad clients, rude customers, rough co-workers, health… the list goes on! &lt;em&gt;So for those of you working on a side-hustle, making art, or just putting your creative talents out there, keep up the amazing work&lt;/em&gt;. 👏&lt;/p&gt;&lt;figure class=&quot;float-right&quot; style=&quot;width:240px&quot;&gt;&lt;img src=&quot;/media/the-nickscast.png&quot; alt=&quot;The Nickscast, illustrated by ThinkNu&quot;/&gt;&lt;figcaption&gt;&lt;a href=&quot;https://thenickscast.com&quot;&gt;The Nickscast&lt;/a&gt;, illustrated by &lt;a href=&quot;https://www.thinknuofficial.com/&quot;&gt;ThinkNu&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;I’m definitely not an expert, but since 2015 I’ve been making content as part of &lt;a href=&quot;https://thenickscast.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;the Nickscast&lt;/a&gt;—Podcasts, YouTube videos, streaming + an annual charity event, and more—on top of my day-to-day responsibilities as a human and 9-5 software developer. While that definitely bestows upon me some privilege, I’m hoping that some of what I’ve learned is useful to you, if only to help avoid burning out. 😬&lt;/p&gt;&lt;p&gt;Most of the things that I’ve learned fall into three big categories:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Ruthless prioritization&lt;/li&gt;&lt;li&gt;Preparing for uncertainty&lt;/li&gt;&lt;li&gt;Accepting limitations&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;ruthless-prioritization&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#ruthless-prioritization&quot; aria-label=&quot;ruthless prioritization permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Ruthless Prioritization&lt;/h2&gt;&lt;p&gt;This idea has been embedded in my skull from other content creators, and also from working in startups &lt;sup id=&quot;fnref-2&quot;&gt;&lt;a href=&quot;#fn-2&quot; class=&quot;footnote-ref&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;, and it sounds cooler than it is. &lt;em&gt;You should know what’s important to you, and focus on those things.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Since that’s easier said than done, let’s break it down.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Do one thing and do it well&lt;/strong&gt;. This is probably the most important thing—and the thing I am least proficient at—We’re all creative folks, and we all have limited time to do things. Not counting work or sleep, you probably only have eight hours a day, give or take, but life also has to fit in there somehow (e.g. eating, chores, friends, family, etc.). 😫&lt;/p&gt;&lt;p&gt;A direct (and probably obvious) consequence of this is that if you spend time on multiple projects, you have less time to spend on individual projects. The not so obvious part is that moving from one project to another project can often incur a time cost as well for switching contexts as your brain starts getting up-to-speed with the next project. If you had three hours to work on three projects, you’d actually end up working &lt;em&gt;less&lt;/em&gt; than an hour on each of them.&lt;/p&gt;&lt;p&gt;If you want to work on many different kinds of things, you’re welcome to do that! There’s nothing stopping you, and nothing wrong with that… But if your goal is to become internet famous or make money, it means you’ll have less time to work on that thing.&lt;/p&gt;&lt;p&gt;It’s hard to get good at multiple things (especially simultaneously), so if you want to improve, focus on doing one thing well. 🤔💭&lt;/p&gt;&lt;figure class=&quot;float-left&quot; style=&quot;width:240px&quot;&gt;&lt;img src=&quot;/media/done-manifesto.png&quot; alt=&quot;Depiction of the Done Manifesto&quot;/&gt;&lt;figcaption&gt;A depiction of the &lt;a href=&quot;https://lifehacker.com/the-done-manifesto-lays-out-13-ground-rules-for-getting-5864004&quot;&gt;Done Manifesto&lt;/a&gt;. Destruction is a variant of done.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;A fun corollary to all this, when you start prioritizing things, is that you don’t have to keep doing things just because you’d been doing them previously (commonly known as the &lt;a href=&quot;https://youarenotsosmart.com/2011/03/25/the-sunk-cost-fallacy/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;sunk cost fallacy&lt;/a&gt;). You can just stop, and voila, more free time for whatever you really want to do!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Make time to make stuff&lt;/strong&gt;. Speaking of time, things don’t happen in a vacuum; your next book, track, whatever you’re working on, won’t magically happen if you don’t make time to work on it. I’ve heard lots of stories from content creators who started working on something in college and had a hard time when they graduated, and a lot of this, I think, has to do with the fact that you’ve got less ‘free’ time as a busy adult with many important things to do.&lt;/p&gt;&lt;p&gt;It’s hard, but carving out any amount of time on a regular basis, be it 15 minutes everyday, an hour a week, whatever works for you… that means you’re dedicating time to work on something, and deliberately prioritizing it!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Have a regular schedule&lt;/strong&gt;. Yes, schedules are boring, and not always realistic or possible, but schedules are predictable, and predictable things are easy to expect. Put a different way, instead of a scheduled thing being boring and predictable, a scheduled event is &lt;em&gt;something to look forward to&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;It’s also helpful as a tool for avoiding overstressing. If there’s something I want to work on, I can add it to a list, and get to it when I’ve said aside time. It helps to avoid the challenge of ‘I need to work on this &lt;em&gt;right now&lt;/em&gt;‘.&lt;/p&gt;&lt;p&gt;Regular schedules aren’t for everyone—you might be more spontaneous in your creation, or have obligations, like kids, that make it hard to carve out time—but even if you can manage a day a month, or a floating appointment to work on things… it helps! 😌&lt;/p&gt;&lt;p&gt;I try to limit my content creation to 1-2 weeknights, or occasionally a weekend morning, because, for me, overscheduling can be a real problem too!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Use small moments&lt;/strong&gt;. I used to think that, to get something done, I needed a certain minimum amount of time, and a clean environment, or I had to be at my desk at home… I would effectively create blockers for myself. But there are many small, imperfect moments where something can get done wherever I am. If I’m on a bus or train, I can send emails or take notes, if I’m idly watching TV, I can open my laptop and half-work on something. &lt;em&gt;Small efforts build to bigger ones&lt;/em&gt; and are way better than no effort.&lt;/p&gt;&lt;p&gt;Is this about cramming more into less time? No. It’s about recognizing there are lots of idle moments that aren’t satisfying (i.e. flipping between social media apps) into meaningful ones. It’s about ‘perfection is the enemy of done’. It’s about less putting off and more doing!&lt;/p&gt;&lt;h2 id=&quot;preparing-for-uncertainty&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#preparing-for-uncertainty&quot; aria-label=&quot;preparing for uncertainty permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Preparing for uncertainty&lt;/h2&gt;&lt;p&gt;&lt;img src=&quot;/844c1c429b5fa922c38dfda41e11c715/ferris-bueller.gif&quot; alt=&quot;Ferris Bueller: &amp;quot;Life moves pretty fast. If you don&amp;#x27;t stop and look around, you could miss it.&amp;quot;&quot;/&gt;&lt;/p&gt;&lt;p&gt;Life is unpredictable. It’s a constant balancing act between life, work, family, friends, hobbies… It’s a lot! While it all ebbs and flows, there are things you can do to even it all out for yourself, and your audience.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Batch work together&lt;/strong&gt;. Some tasks take a lot of setup. If you’re a photographer, you may need to set up a screen, lighting, the camera, organize a shoot with a subject, and more, and that takes time. If you’re fortunate, you can set things up and leave it be, but you might not be so lucky. Wouldn’t it be great if you could line up a bunch of shoots all at once? &lt;em&gt;That’s the power of batching.&lt;/em&gt; 😎&lt;/p&gt;&lt;p&gt;Sometimes tasks don’t require setting up physical materials, but just mental effort. Personally, it’s easier for me to edit a whole bunch of podcast episodes than just one. It’s easier to get in the zone because I’m using the same skills and not thinking about other things.&lt;/p&gt;&lt;p&gt;Plus, if you batch together something like social media work, you can potentially squish all of your content creation into, say, one day, and then schedule the work over the course of a week or more. &lt;em&gt;You get to reap the benefit of one day’s work over multiple days!&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Have a consistent release schedule.&lt;/strong&gt; I’m assuming you push your work out into the world for others to see, and if you do, you’re doing yourself a favour to pick a schedule and stick to it. Why? Because it sets good expectations for you, and for folks who want to see more of your work! You don’t need to pressure yourself into doing any more than what you’ve set out to do, and other folks shouldn’t expect more than what you’ve said you’d do.&lt;/p&gt;&lt;p&gt;How often is often enough to put out content? Focus on what’s reasonable for you, and not any algorithm or what people say you should do. There’s a bit of guesswork here, and if you’re worried, I’d suggest erring on the side of releasing content less frequently than more frequently—You can always decide to create more often, later, but it’s hard (and stressful) to do the reverse! 😬&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Build a backlog&lt;/strong&gt;. When something unexpected comes up at work, you forgot about an appointment or meeting with a friend, or you just aren’t feeling up to it… are you prepared? If you can build up a backlog, you are! Even having one or two pieces of work ready to be released can help maintain a regular schedule and can give you a bit of extra time when you need it.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Repost (and reuse) your work&lt;/strong&gt;. Posting something online is only the beginning, and odds are, whether it’s due to algorithms or timing, &lt;em&gt;folks won’t see your work&lt;/em&gt;. &lt;a href=&quot;https://moz.com/blog/when-is-my-tweets-prime-of-life&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;The half-life of a tweet is only 18 minutes&lt;/a&gt; for goodness sake! There’s nothing shameful about reposting your work throughout the day, week, or even resurfacing old work months after the fact!&lt;/p&gt;&lt;p&gt;Plus, it turns out there’s tons of meta-work that you put into things that you can post about, or that you can use when you repost things. A photo that was goofy or didn’t quite turn out? That’s a post! Behind-the-scenes? That’s a post! Podcast clip or quote? You better believe that’s a post.&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:640px&quot;&gt;
      &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/9ccceba1bb071327f1fb8cf71eeec30e/c08c5/simpsons-post.jpg&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom:75%;position:relative;bottom:0;left:0;background-image:url(&amp;#x27;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAQFA//EABYBAQEBAAAAAAAAAAAAAAAAAAACA//aAAwDAQACEAMQAAABmatmdzhwP//EABsQAQACAgMAAAAAAAAAAAAAAAECAwATERIi/9oACAEBAAEFApVq2UAaJYcdtcVsfX//xAAXEQEAAwAAAAAAAAAAAAAAAAAAARES/9oACAEDAQE/AaZh/8QAFhEBAQEAAAAAAAAAAAAAAAAAABIB/9oACAECAQE/AbXr/8QAGxAAAgIDAQAAAAAAAAAAAAAAABICIRAxQXH/2gAIAQEABj8CarIrL04MuNH/xAAcEAEBAQACAwEAAAAAAAAAAAABEQAhMUFRYZH/2gAIAQEAAT8hZhjkV0MLO3vI+f1rGCrI9YI5e9Bjf27/2gAMAwEAAgADAAAAECPv/8QAFxEBAAMAAAAAAAAAAAAAAAAAARBBcf/aAAgBAwEBPxBLWw//xAAaEQACAgMAAAAAAAAAAAAAAAABEQAxQaHw/9oACAECAQE/EGt9mAga3P/EABsQAQEAAwEBAQAAAAAAAAAAAAERACExYVFx/9oACAEBAAE/EO1HkGfmODEQLvjzFI4hpyHYCb1gvCBgcLzEQI0CaX5n/9k=&amp;#x27;);background-size:cover;display:block&quot;&gt;&lt;/span&gt;
  &lt;picture&gt;
        &lt;source srcSet=&quot;/static/9ccceba1bb071327f1fb8cf71eeec30e/8ac56/simpsons-post.webp 240w,/static/9ccceba1bb071327f1fb8cf71eeec30e/d3be9/simpsons-post.webp 480w,/static/9ccceba1bb071327f1fb8cf71eeec30e/0ba47/simpsons-post.webp 640w&quot; sizes=&quot;(max-width: 640px) 100vw, 640px&quot; type=&quot;image/webp&quot;/&gt;
        &lt;source srcSet=&quot;/static/9ccceba1bb071327f1fb8cf71eeec30e/09b79/simpsons-post.jpg 240w,/static/9ccceba1bb071327f1fb8cf71eeec30e/7cc5e/simpsons-post.jpg 480w,/static/9ccceba1bb071327f1fb8cf71eeec30e/c08c5/simpsons-post.jpg 640w&quot; sizes=&quot;(max-width: 640px) 100vw, 640px&quot; type=&quot;image/jpeg&quot;/&gt;
        &lt;img class=&quot;gatsby-resp-image-image&quot; src=&quot;/static/9ccceba1bb071327f1fb8cf71eeec30e/c08c5/simpsons-post.jpg&quot; alt=&quot;&amp;quot;You better believe that&amp;#x27;s a post&amp;quot;&quot; title=&quot;&amp;quot;You better believe that&amp;#x27;s a post&amp;quot;&quot; loading=&quot;lazy&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot;/&gt;
      &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;&lt;p&gt;Don’t 👏 feel 👏 ashamed 👏 to 👏 repost 👏 and 👏 reuse 👏 your 👏 content!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Automate all the things!&lt;/strong&gt; I haven’t got time to be online all the time, and I imagine neither do you. For social media, you can usually schedule posts either directly through a platform, or via sites like &lt;a href=&quot;later.com&quot;&gt;Later&lt;/a&gt; (Free for 1 social account per platform with 30 posts per platform) or &lt;a href=&quot;buffer.com&quot;&gt;Buffer&lt;/a&gt; (Free for 3 social accounts with 10 scheduled posts each). You can also get fancy and post at the ‘right’ times per network, but that’s its own blog post I’m sure. You can also use sites like &lt;a href=&quot;https://ifttt.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;IFTTT&lt;/a&gt; to setup triggers for certain actions, like &lt;a href=&quot;https://ifttt.com/applets/103249p-tweet-your-instagrams-as-native-photos-on-twitter&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;tweeting Instagram photos as native Twitter photos&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;And then there’s likely a million ways you can optimize your own individual processes. My suggestion there would be to take some time, if you can, to learn about ways to be better at what you do 🤷‍♂️&lt;/p&gt;&lt;h2 id=&quot;accepting-limitations&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#accepting-limitations&quot; aria-label=&quot;accepting limitations permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Accepting Limitations&lt;/h2&gt;&lt;p&gt;Eventually, it can get tiring to work on effectively two (or more) jobs at once. Hopefully that feeling doesn’t last forever! If it does, I’m hoping these suggestions help.&lt;/p&gt;&lt;figure class=&quot;float-right&quot; style=&quot;width:240px&quot;&gt;&lt;img src=&quot;/media/here-comes-a-thought.png&quot; alt=&quot;Picture of Garnet and Stevonnie meditating&quot;/&gt;&lt;figcaption&gt;Look after yourself.&lt;br/&gt;You&amp;#x27;re all you&amp;#x27;ve got.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Take a break.&lt;/strong&gt; Take a day, a week, a month. Let people know you’re taking a break! Will this slow whatever progress you’re making? It might, but burning out will definitely slow you down. Folks are pretty understanding. Your life is multifaceted and interconnected; you can compartmentalize how you feel, but it has a tendency to leak into other areas of your life so just take a break to feel better. You’re the most important person in all this; look after yourself!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Work with what you’ve got.&lt;/strong&gt; There are folks who have the best equipment, the best tools, and oodles of free time, living their dream. That ain’t you &lt;em&gt;and that’s ok&lt;/em&gt;. You have a different schedule, different duties, and a different life. It’s ok to not be where you want to be. Recognize that, and work towards where you want to be, but plan for where you are and what you’ve got!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Focus on high leverage work.&lt;/strong&gt; Taking &lt;a href=&quot;zealarchives.com&quot;&gt;my podcast&lt;/a&gt; as an example, there are a ton of things to be done: episode scripting, artwork, editing, recording… and all of that has to fit into the time I have, but not all of it is equally important. Some of the work I do unblocks other people’s work—when I finish a script, the other voice actors can record independently—or makes it easier for me to do other work—creating a work schedule lets me know how much time I actually have to work.&lt;/p&gt;&lt;p&gt;Whether it’s work that unblocks others or makes development easier, high leverage work is work where you’re focused on what’s important. Some parts of the podcast, for example, just don’t matter as much. It’s not critical to have individual episode artwork, and certainly not if my choices are that or finish editing another episode!&lt;/p&gt;&lt;p&gt;If you’re thinking about social media, focus on the platforms that you use, and don’t put as much effort (or automate) the ones that you don’t use.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Promote as much as you’re comfortable.&lt;/strong&gt; I tend to be more introverted, and promoting work is hard for me because I just don’t generally talk as much (or as loudly) as other folks. That makes it hard to grow any of my work because I’m afraid to speak up. While I’ve worked on this (and continue) to work on this, it’s ok to do only what you can! Maybe you could grow more or grow faster if you did more promotion, but then you’d be stressed out, and honestly, just keeping at something is a big win.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Take it easy on yourself.&lt;/strong&gt; There’s only one you! There’s no recipe for success, otherwise we’d all just follow it. Different folks will make different stuff, and some will succeed or fail without rhyme or reason. Be kind to yourself, keep at it, and try to grow where you can. You can always look back at where you started and how far you’ve come! Define success for yourself.&lt;/p&gt;&lt;hr/&gt;&lt;p&gt;It’s easy to be reductive and to say “oh, it’s mostly time management and priorities”, so I don’t want to give the impression that what I’ve presented is all there is; life is so much more complex than that!&lt;/p&gt;&lt;p&gt;What I do hope is that at least some of this is helpful in helping you to make more of what you love, and that it helps to reach folks out there! Good luck!&lt;/p&gt;&lt;p&gt;Also, special thanks to &lt;a href=&quot;http://youtube.com/mashacosplays&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;MashaCosplays&lt;/a&gt; who inspired me to write this post after seeing her panel at &lt;a href=&quot;katsucon.org&quot;&gt;KatsuCon&lt;/a&gt;!&lt;/p&gt;&lt;p&gt;Also also, hopefully this ends up as a slide deck for an upcoming convention appearance 🤞&lt;/p&gt;&lt;div class=&quot;footnotes&quot;&gt;&lt;hr/&gt;&lt;ol&gt;&lt;li id=&quot;fn-1&quot;&gt;This is the source linked from &lt;a href=&quot;https://twocents.lifehacker.com/youll-never-make-money-podcasting-1838640571&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;this article on Lifehacker about why you’ll probably never make money podcasting&lt;/a&gt;. &lt;a href=&quot;https://www.amplifimedia.com/blogstein/2018/1/21/thinking-of-starting-a-podcast-dont&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;This is another good post&lt;/a&gt; with more financials, and from an industry insider.&lt;a href=&quot;#fnref-1&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-2&quot;&gt;If you want more about product development and ruthless prioritization, would definitely recommend &lt;a href=&quot;https://blackboxofpm.com/ruthless-prioritization-e4256e3520a9&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Brandon Chu’s medium post&lt;/a&gt; on this from a Product Manager’s perspective.&lt;a href=&quot;#fnref-2&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Hyper-powered Windows]]></title><description><![CDATA[I like to tinker. But when I switched from Arch Linux to Windows, tinkering in software became a lot harder. While lots of options exist for running *nix tools in Windows, the easiest solution for me was to create a Hyper-powered Windows💻💨🌈]]></description><link>https://nt3rp.io/posts/hyper-powered-windows</link><guid isPermaLink="false">https://nt3rp.io/posts/hyper-powered-windows</guid><pubDate>Sun, 02 Feb 2020 16:20:42 GMT</pubDate><content:encoded>&lt;p&gt;I like to tinker. I have a wide array of electronics (e.g. camera lenses, microphones, electrical components) that &lt;em&gt;honestly&lt;/em&gt; should get a lot more use than they do. And as a software developer, there is an increasingly large set of things that I would like to tinker with (and definitely &lt;em&gt;do not&lt;/em&gt; have time to dig into).&lt;/p&gt;&lt;p&gt;When I switched from Arch Linux to Windows, tinkering became &lt;em&gt;harder&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;The switch had some great upsides, for example, &lt;strong&gt;no longer being a sysadmin&lt;/strong&gt;. On the other hand, even basic development tasks were a bit hampered by the lack of a decent, or at least, familiar command line (and related tools).&lt;/p&gt;&lt;p&gt;And while solutions exist to that problem, like running a virtual machine or virtualized operating system… I’m not having any of that. That ain’t me 😤&lt;/p&gt;&lt;p&gt;Fortunately, Windows developers have learned that a lot of folks are in a similar situation and have made it very easy to run Linux in Windows via &lt;a href=&quot;https://docs.microsoft.com/en-us/windows/wsl/install-win10&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Windows Subsystem for Linux (WSL)&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;To be honest, that change alone got me 90% of the way there to having a much better developer experience 🥳&lt;/p&gt;&lt;p&gt;However, I work in different environments; at work I have a Mac, and at home, Windows, and I like having tools that are similar-ish across different environments.&lt;/p&gt;&lt;p&gt;At some point in time, I discovered &lt;a href=&quot;https://hyper.is/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Hyper&lt;/a&gt;: Hyper is a terminal, like &lt;a href=&quot;https://iterm2.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;iTerm2&lt;/a&gt; on Mac, but a big difference is that it’s an &lt;a href=&quot;https://www.electronjs.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Electron&lt;/a&gt; app. Electron allows folks to write cross-platform applications with HTML, CSS, and Javascript, which (often) also means being able to write plugins or extensions for them.&lt;sup id=&quot;fnref-1&quot;&gt;&lt;a href=&quot;#fn-1&quot; class=&quot;footnote-ref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;p&gt;Getting Hyper installed was easy, but by default, it runs the Windows command prompt. To get it to run WSL, I need to make a change to the &lt;code class=&quot;language-text&quot;&gt;.hyper&lt;/code&gt; file (it’s configuration file, also found via &lt;code class=&quot;language-text&quot;&gt;Edit&lt;/code&gt; &amp;gt; &lt;code class=&quot;language-text&quot;&gt;Preferences&lt;/code&gt;)&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// the shell to run when spawning a new session (i.e. /usr/local/bin/fish)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// if left empty, your system&amp;#x27;s login shell will be used by default&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Windows&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// - Make sure to use a full path if the binary name doesn&amp;#x27;t work&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// - Remove `--login` in shellArgs&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Bash on Windows&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// - Example: `C:\\Windows\\System32\\bash.exe`&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// PowerShell on Windows&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// - Example: `C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`&lt;/span&gt;
shell&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;C:\\Windows\\System32\\bash.exe&amp;#x27;&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;Since I also run the &lt;a href=&quot;https://fishshell.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;fish shell&lt;/a&gt;, I needed to make some changes to support that. Fortunately, I found a tip &lt;a href=&quot;https://www.kennethreitz.org/essays/fish-as-default-shell-on-windows-10&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;in this blog&lt;/a&gt; and added the following changes to the end of my &lt;code class=&quot;language-text&quot;&gt;~/.bashrc&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;token comment&quot;&gt;# Launch Fish&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; -t &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;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
  &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; fish
&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;…And that’s it! Or it &lt;em&gt;would&lt;/em&gt; have been, if I wasn’t done tinkering.&lt;/p&gt;&lt;p&gt;I’ve tried mucking around with terminal colours previously, and one of the nice things about using Hyper is avoiding that completely. By adding a new Hyper plugin, &lt;a href=&quot;https://www.npmjs.com/package/hyper-solarized-dark&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;hyper-solarized-dark&lt;/code&gt;&lt;/a&gt;, I was able to add one of my favourite colour schemes easily.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// In .hyper&lt;/span&gt;
plugins&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;&amp;#x27;hyper-solarized-dark&amp;#x27;&lt;/span&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 the terminal reloads almost instantly after seeing the change, and installing the new plugin!&lt;/p&gt;&lt;p&gt;I didn’t feel the need to add more plugins but the fact is that there are &lt;a href=&quot;https://github.com/bnb/awesome-hyper&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;lots available&lt;/a&gt; and you can &lt;a href=&quot;https://github.com/zeit/hyper/blob/master/PLUGINS.md&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;develop your own&lt;/a&gt;! Plus, they’re not all for work; some &lt;a href=&quot;https://www.npmjs.com/package/hyperpower&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;make you feel powerful&lt;/a&gt; or even &lt;a href=&quot;https://www.npmjs.com/package/hyper-john&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;surprise you&lt;/a&gt; 😏&lt;/p&gt;&lt;p&gt;It may not seem like much, but these small changes make a big impact for my work: WSL lets me use great *nix tools in Windows, &lt;code class=&quot;language-text&quot;&gt;fish&lt;/code&gt; makes for an easier time in the command line, and &lt;code class=&quot;language-text&quot;&gt;Hyper&lt;/code&gt; powers it all and allows me to customize things easily.&lt;/p&gt;&lt;p&gt;The combination of these tools has helped me to create my own &lt;strong&gt;Hyper-powered Windows&lt;/strong&gt;… what might you combine to become a better tinkerer?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; If you’re looking for some other great tools to try out, I’d recommend &lt;a href=&quot;https://github.com/oh-my-fish/oh-my-fish&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;oh-my-fish&lt;/code&gt;&lt;/a&gt; (if you’re already using &lt;code class=&quot;language-text&quot;&gt;fish&lt;/code&gt;)&lt;sup id=&quot;fnref-2&quot;&gt;&lt;a href=&quot;#fn-2&quot; class=&quot;footnote-ref&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; and &lt;a href=&quot;https://github.com/so-fancy/diff-so-fancy&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;diff-so-fancy&lt;/code&gt;&lt;/a&gt; (much better &lt;code class=&quot;language-text&quot;&gt;diff&lt;/code&gt; tool for &lt;code class=&quot;language-text&quot;&gt;git&lt;/code&gt; users)&lt;sup id=&quot;fnref-3&quot;&gt;&lt;a href=&quot;#fn-3&quot; class=&quot;footnote-ref&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;. I use the &lt;code class=&quot;language-text&quot;&gt;plain&lt;/code&gt; theme which looks like 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:561px&quot;&gt;
      &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/897106b40591fc66cfa6d6d9636b1ece/410f3/hyper-screenshot.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom:33.75%;position:relative;bottom:0;left:0;background-image:url(&amp;#x27;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA8UlEQVQY06WOwU4CMRCG/23duHjhrlHcg7JlS3fp0pY2IQgaQEFPctCjd30GT97gAQgPS93dxIMxITH5DpOZ+Wc+BMyh7cAMOhpMU27Oxvetu2U8fbyYPLjn1Wa3ff9aI1F+IUg1SXWYOdIdEG5gLVuN4lMpSVdHojgSNlLThpmfmFnDPTVfN/Hb+nyypEJR0SeZgRwGmfVX4Lkdtl9uWpe6iHqqKeVx7tCblcxRLLD4xPjDPwlzHeaS5gb9EYRFFUZiS239rd3x8l6vqGESVwmu07JZTXVZqzpMuKJcVRq1TGp+4BZ8UK/+5s/BIfwnvAcxZz6CYL9VdgAAAABJRU5ErkJggg==&amp;#x27;);background-size:cover;display:block&quot;&gt;&lt;/span&gt;
  &lt;picture&gt;
        &lt;source srcSet=&quot;/static/897106b40591fc66cfa6d6d9636b1ece/8ac56/hyper-screenshot.webp 240w,/static/897106b40591fc66cfa6d6d9636b1ece/d3be9/hyper-screenshot.webp 480w,/static/897106b40591fc66cfa6d6d9636b1ece/6c067/hyper-screenshot.webp 561w&quot; sizes=&quot;(max-width: 561px) 100vw, 561px&quot; type=&quot;image/webp&quot;/&gt;
        &lt;source srcSet=&quot;/static/897106b40591fc66cfa6d6d9636b1ece/8ff5a/hyper-screenshot.png 240w,/static/897106b40591fc66cfa6d6d9636b1ece/e85cb/hyper-screenshot.png 480w,/static/897106b40591fc66cfa6d6d9636b1ece/410f3/hyper-screenshot.png 561w&quot; sizes=&quot;(max-width: 561px) 100vw, 561px&quot; type=&quot;image/png&quot;/&gt;
        &lt;img class=&quot;gatsby-resp-image-image&quot; src=&quot;/static/897106b40591fc66cfa6d6d9636b1ece/410f3/hyper-screenshot.png&quot; alt=&quot;Screenshot of the Hyper terminal with `oh-my-fish` running the `plain` theme&quot; title=&quot;Screenshot of the Hyper terminal with `oh-my-fish` running the `plain` theme&quot; loading=&quot;lazy&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot;/&gt;
      &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;footnotes&quot;&gt;&lt;hr/&gt;&lt;ol&gt;&lt;li id=&quot;fn-1&quot;&gt;I’ve never written an extension before so I don’t know why this is so appealing to me as a feature. I just really like the &lt;em&gt;idea&lt;/em&gt; of it 💭&lt;a href=&quot;#fnref-1&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-2&quot;&gt;Unsurprisingly, I used to use &lt;code class=&quot;language-text&quot;&gt;zsh&lt;/code&gt; and was a huge fan of &lt;a href=&quot;https://github.com/ohmyzsh/ohmyzsh&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;oh-my-zsh&lt;/code&gt;&lt;/a&gt;. In particular, the &lt;a href=&quot;https://github.com/ohmyzsh/ohmyzsh/wiki/Themes#bureau&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;bureau&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://github.com/ohmyzsh/ohmyzsh/wiki/Themes#blinks&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;blinks&lt;/code&gt;&lt;/a&gt; themes, which are sadly not available in &lt;code class=&quot;language-text&quot;&gt;oh-my-fish&lt;/code&gt;&lt;a href=&quot;#fnref-2&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-3&quot;&gt;If you use the &lt;code class=&quot;language-text&quot;&gt;--patch&lt;/code&gt; flag in &lt;code class=&quot;language-text&quot;&gt;git&lt;/code&gt;, you may need to make some additional changes. See &lt;a href=&quot;https://github.com/so-fancy/diff-so-fancy/issues/35&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;this thread&lt;/a&gt;&lt;a href=&quot;#fnref-3&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Blogging with 2020 Hindsight]]></title><description><![CDATA[2010 was a heck of a decade. I learned a lot about myself, and am hoping to learn more via continued blogging. This isn't my first kick at the can, as far as blogs go... so how did it go the last few times, anyway? 🤔💭]]></description><link>https://nt3rp.io/posts/blogging-with-2020-hindsight</link><guid isPermaLink="false">https://nt3rp.io/posts/blogging-with-2020-hindsight</guid><pubDate>Sun, 02 Feb 2020 13:37:42 GMT</pubDate><content:encoded>&lt;p&gt;It’s &lt;em&gt;2020&lt;/em&gt;! A new year, a new decade, and a new blog 🥳🎉🎈&lt;/p&gt;&lt;p&gt;The changeover of a year isn’t a significant event, &lt;em&gt;but&lt;/em&gt; it’s as good a time as any to reflect on the year past (or in a milestone year, &lt;em&gt;years&lt;/em&gt; past) and try to make new changes.&lt;/p&gt;&lt;p&gt;I’ve spent &lt;em&gt;most&lt;/em&gt; of my adult life intentionally or unintentionally focusing on my professional work; defining my identity and worth by that work. To say that has been harmful… would be a gross understatement.&lt;/p&gt;&lt;p&gt;I’ve come to appreciate the importance and necessity of living in a more authentic, integrated way. Even as a small example, moving emphasis from &lt;em&gt;work that I do at company X&lt;/em&gt; to just &lt;em&gt;work that I do&lt;/em&gt;. If I put in 100 hours on a podcast series, is that any less important to me just because it is something I do in my free time? (No)&lt;/p&gt;&lt;p&gt;At the beginning of this new decade, I’m hoping to make a change that I started in the last one, and that is to live more authentically. I’m hoping that &lt;em&gt;blogging&lt;/em&gt; is one way that I can do that: &lt;em&gt;sharing openly about my experiences and feelings.&lt;/em&gt; 🥰&lt;/p&gt;&lt;h2 id=&quot;a-tldr-of-my-history-with-blogging&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#a-tldr-of-my-history-with-blogging&quot; aria-label=&quot;a tldr of my history with blogging permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 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 tl;dr of my history with blogging&lt;/h2&gt;&lt;p&gt;My past experiences with blogging have been… &lt;em&gt;inconsistent&lt;/em&gt;. A brief timeline looks something like this:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Livejournal / Deadjournal (Hosted) — ~2001-2005&lt;/li&gt;&lt;li&gt;Wordpress (Hosted) — ???&lt;/li&gt;&lt;li&gt;Octopress (Self-hosted, Ruby) — 2012-2013&lt;/li&gt;&lt;li&gt;Pelican (Self-hosted, Python) — 2013-2014&lt;/li&gt;&lt;li&gt;Hexo (Self-hosted, Node.js) — 2014-2017&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Over this timeline, my blog served different purposes: A day-to-day record of my life (LJ/DJ era), an exploration of new jobs (Octopress era), learning new technologies (Pelican era), and even a brief exploration of grief after an important loss (Hexo era).&lt;/p&gt;&lt;p&gt;Despite this multitude of uses, the timeline itself can be misleading: while I was using LJ/DJ, I was blogging almost &lt;em&gt;daily&lt;/em&gt;, but over the last four platforms I wrote just over forty posts, &lt;em&gt;combined&lt;/em&gt;! I didn’t use some of these platforms enough to write much more than &lt;em&gt;a single blog post!&lt;/em&gt; 😰 &lt;sup id=&quot;fnref-1&quot;&gt;&lt;a href=&quot;#fn-1&quot; class=&quot;footnote-ref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;p&gt;And as best I recall, all of these attempts turned out the same way: a big push at the outset, configuration, development, possibly even a period of regular updates, then … nothing. No updates, no changes. Nothing. &lt;sup id=&quot;fnref-2&quot;&gt;&lt;a href=&quot;#fn-2&quot; class=&quot;footnote-ref&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;p&gt;In a word, &lt;em&gt;inconsistent&lt;/em&gt;.&lt;/p&gt;&lt;h2 id=&quot;why&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#why&quot; aria-label=&quot;why permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 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?&lt;/h2&gt;&lt;p&gt;Given that, one might ask, “Why bother?” And the answer to this is &lt;strong&gt;I want to grow&lt;/strong&gt; 🌻&lt;/p&gt;&lt;p&gt;Since my first, or even the latest attempt at blogging, I’m not the person I was then. I’ve made choices about how I want to live my life, the people I want in my life, the priorities and balance I want in my life.&lt;/p&gt;&lt;p&gt;I know things now that I didn’t know then.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;I know that it’s not reasonable to expect to post once a week (especially if I don’t plan for it), and setting unreasonable expectations does a lot more harm than setting no expectations.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I know that getting something done &lt;em&gt;at all&lt;/em&gt; is better than doing it perfectly, because then something &lt;em&gt;actually gets done&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I know that doing 1% of something, even if that feels like it is not enough, is 100% better than doing 0% because over time that 1% grows, and 0% does not.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I know more about myself. That I tend to close myself off, which leads to feeling isolated and alone. That as an introvert I do a lot of thinking in my head and not by speaking. I know the combination of these two things… is not good for me! 😬&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;… And I know that I’ve grown and want to continue to grow. There are no guarantees that this time will work out any differently, and that’s ok! My goal is to write once a month, and right now that sounds eminently reasonable.&lt;/p&gt;&lt;p&gt;It’s ok for me to give up on blogging for now, or forever. &lt;em&gt;That’s fine.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Because it’s 2020, and that’s what I can see in hindsight 😊&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:960px&quot;&gt;
      &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/298b1dac0569438eaf5c523ae7633d52/e5166/small-improvements.jpg&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom:52.5%;position:relative;bottom:0;left:0;background-image:url(&amp;#x27;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAQAE/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAP/2gAMAwEAAhADEAAAAda04kx//8QAFRABAQAAAAAAAAAAAAAAAAAAESD/2gAIAQEAAQUCa//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABcQAAMBAAAAAAAAAAAAAAAAAAARMSD/2gAIAQEAAT8hqDz/AP/aAAwDAQACAAMAAAAQDw//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/ED//xAAYEAEAAwEAAAAAAAAAAAAAAAABACAhQf/aAAgBAQABPxBQjiGDIbT/2Q==&amp;#x27;);background-size:cover;display:block&quot;&gt;&lt;/span&gt;
  &lt;picture&gt;
        &lt;source srcSet=&quot;/static/298b1dac0569438eaf5c523ae7633d52/8ac56/small-improvements.webp 240w,/static/298b1dac0569438eaf5c523ae7633d52/d3be9/small-improvements.webp 480w,/static/298b1dac0569438eaf5c523ae7633d52/e46b2/small-improvements.webp 960w,/static/298b1dac0569438eaf5c523ae7633d52/92f8c/small-improvements.webp 1200w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot; type=&quot;image/webp&quot;/&gt;
        &lt;source srcSet=&quot;/static/298b1dac0569438eaf5c523ae7633d52/09b79/small-improvements.jpg 240w,/static/298b1dac0569438eaf5c523ae7633d52/7cc5e/small-improvements.jpg 480w,/static/298b1dac0569438eaf5c523ae7633d52/6a068/small-improvements.jpg 960w,/static/298b1dac0569438eaf5c523ae7633d52/e5166/small-improvements.jpg 1200w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot; type=&quot;image/jpeg&quot;/&gt;
        &lt;img class=&quot;gatsby-resp-image-image&quot; src=&quot;/static/298b1dac0569438eaf5c523ae7633d52/6a068/small-improvements.jpg&quot; alt=&quot;(1.00)^365 = 1.00, doing nothing at all versus (1.01)^365 = 37.7, small consistent effort&quot; title=&quot;(1.00)^365 = 1.00, doing nothing at all versus (1.01)^365 = 37.7, small consistent effort&quot; loading=&quot;lazy&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot;/&gt;
      &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;sup id=&quot;fnref-3&quot;&gt;&lt;a href=&quot;#fn-3&quot; class=&quot;footnote-ref&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;div class=&quot;footnotes&quot;&gt;&lt;hr/&gt;&lt;ol&gt;&lt;li id=&quot;fn-1&quot;&gt;It’s worth noting that I was in high school and early university when writing on LJ/DJ—I had a lot more free time.&lt;a href=&quot;#fnref-1&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-2&quot;&gt;I’m sure that switching jobs and learning new programming languages were also a motivating factor for moving from Octopress to Pelican to Hexo, and a partial reason of why there weren’t a lot of updates in this period.&lt;a href=&quot;#fnref-2&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-3&quot;&gt;Image modified from &lt;a href=&quot;https://www.reddit.com/r/GetMotivated/comments/cyc9t3/image_small_consistent_effort/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Reddit -[IMAGE] SMALL CONSISTENT EFFORT&lt;/a&gt;&lt;a href=&quot;#fnref-3&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</content:encoded></item></channel></rss>