<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Nick Janetakis</title>
    <description>The latest articles on DEV Community by Nick Janetakis (@nickjj).</description>
    <link>https://dev.to/nickjj</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F68035%2F985891c3-d691-4fc3-8b42-0a1de8a82f8b.jpeg</url>
      <title>DEV Community: Nick Janetakis</title>
      <link>https://dev.to/nickjj</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nickjj"/>
    <language>en</language>
    <item>
      <title>Do You Have a Web App Running in Production? Become a Guest on My New Podcast / Interview Site</title>
      <dc:creator>Nick Janetakis</dc:creator>
      <pubDate>Sat, 16 Nov 2019 18:32:05 +0000</pubDate>
      <link>https://dev.to/nickjj/do-you-have-a-web-app-running-in-production-become-a-guest-on-my-new-podcast-interview-site-27dg</link>
      <guid>https://dev.to/nickjj/do-you-have-a-web-app-running-in-production-become-a-guest-on-my-new-podcast-interview-site-27dg</guid>
      <description>&lt;p&gt;I recently started a new podcast / interview site to talk to other developers about how they've built and run their web apps in production. The goal here is to be able to see how others are building and deploying their apps so you can apply some tips back to your own projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The site is live at &lt;a href="https://runninginproduction.com"&gt;https://runninginproduction.com&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's a place where you can talk all about your tech stack in detail and anyone is welcome to become either a guest on the podcast (audio only) or do an email based interview (text).&lt;/p&gt;

&lt;p&gt;If you have a small or large web app running in production I'd love to hear your story. It's not restricted to a specific web framework either. So if you're using Flask, Phoenix, Rails, Node, Django, Laravel, Go, etc. it's all good.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you want to share your story on the site please fill out one of the below short forms:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Be a guest on the podcast by &lt;a href="https://docs.google.com/forms/d/e/1FAIpQLSdaCRorXztETX1rQxcYT67OTkF3BKb-max99RYpRPrEiO-sKw/viewform"&gt;filling out this form&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Or get interviewed over email by &lt;a href="https://docs.google.com/forms/d/e/1FAIpQLSebe-PQxxw7HmtVbMEalavpzF5ZTmrd0X2EYNcEr2-23zmOng/viewform"&gt;filling out this form instead&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Or if you want to know a little bit more about why I started the site and what the process looks like to become a guest, here's a video:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Wgvs30l3QpE"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;By the way, the TL;DR on me is I've been consistently blogging about web development topics for ~5 years on &lt;a href="https://nickjanetakis.com"&gt;my site&lt;/a&gt; and over a year on dev.to. This is something I'm in for the long haul.&lt;/p&gt;

&lt;p&gt;This is very much a community driven site since it depends on guests and folks to share their stories. So if you want to talk shop about one of your projects and have it listed there please fill out one of the above forms. Each story will be shared to tens of thousands of people.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>podcast</category>
      <category>showdev</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Configuring wsltty Which Is My Favorite Windows WSL Terminal</title>
      <dc:creator>Nick Janetakis</dc:creator>
      <pubDate>Sun, 06 Oct 2019 11:31:28 +0000</pubDate>
      <link>https://dev.to/nickjj/configuring-wsltty-which-is-my-favorite-windows-wsl-terminal-461c</link>
      <guid>https://dev.to/nickjj/configuring-wsltty-which-is-my-favorite-windows-wsl-terminal-461c</guid>
      <description>&lt;p&gt;*&lt;em&gt;This article was originally posted on September 24th, 2019 at: &lt;a href="https://nickjanetakis.com/blog/configuring-wsltty-which-is-my-favorite-windows-wsl-terminal"&gt;https://nickjanetakis.com/blog/configuring-wsltty-which-is-my-favorite-windows-wsl-terminal&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Over the years I've tried a bunch of different WSL (Windows subsystem for Linux) terminals and for 8+ months I’ve been using wsltty full time and it's been really great.&lt;/p&gt;

&lt;p&gt;It's one of the few pieces of software on my computer where I don't feel like I'm on a quest to continuously find something better. It has extremely low input latency (ie., typing feels very fast and smooth), it uses almost no system resources and it’s rock solid.&lt;/p&gt;

&lt;p&gt;In this video we're going to cover what makes it so good (in my opinion) and how I have it configured so you can replicate this set up on your end if you want to try it out. Everything we do here will work on any version of Windows 10.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/XS4j-VS3Atg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  Timestamped Table of Contents:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;0:40 -- WSL v1 vs. WSL v2&lt;/li&gt;
&lt;li&gt;1:48 -- Why did I choose wsltty over the rest of the terminals?&lt;/li&gt;
&lt;li&gt;2:23 -- 7 terminal features that make a terminal good (in my opinion)&lt;/li&gt;
&lt;li&gt;3:10 -- Low input latency is my main concern because typing should have no delay&lt;/li&gt;
&lt;li&gt;4:42 -- tmux has you covered for tabbed windows, split panes and searching buffers&lt;/li&gt;
&lt;li&gt;7:46 -- Using hotkeys to zoom in and out and copy / pasting text&lt;/li&gt;
&lt;li&gt;8:45 -- How the other terminals I tried failed my 7 feature checklist in the past&lt;/li&gt;
&lt;li&gt;12:12 -- Why I'm not using the new Windows terminal (yet)&lt;/li&gt;
&lt;li&gt;13:14 -- Installing wsltty which is open source on GitHub&lt;/li&gt;
&lt;li&gt;14:29 -- Configuring wsltty&lt;/li&gt;
&lt;li&gt;15:05 -- Adjusting the transparency of wsltty&lt;/li&gt;
&lt;li&gt;15:44 -- Block vs line vs underscore cursor styles&lt;/li&gt;
&lt;li&gt;16:23 -- Picking your terminal font, I like Consolas&lt;/li&gt;
&lt;li&gt;17:14 -- Configuring a bunch of hotkeys&lt;/li&gt;
&lt;li&gt;17:47 -- Configuring mouse support&lt;/li&gt;
&lt;li&gt;17:59 -- Configuring the window size and scrollbar&lt;/li&gt;
&lt;li&gt;19:06 -- Configuring the terminal type and removing beeps&lt;/li&gt;
&lt;li&gt;19:39 -- Previewing the default themes&lt;/li&gt;
&lt;li&gt;21:01 -- Why I use the Gruvbox theme and how to install custom themes&lt;/li&gt;
&lt;li&gt;23:55 -- wsltty is rock solid and I will continue to use it for a long time&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Reference Links
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nickjanetakis.com/blog/the-tools-i-use"&gt;https://nickjanetakis.com/blog/the-tools-i-use&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nickjanetakis.com/blog/conemu-vs-hyper-vs-terminus-vs-mobaxterm-terminator-vs-ubuntu-wsl"&gt;https://nickjanetakis.com/blog/conemu-vs-hyper-vs-terminus-vs-mobaxterm-terminator-vs-ubuntu-wsl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nickjanetakis.com/blog/using-tmux-sessions-windows-panes-and-vim-buffers-together"&gt;https://nickjanetakis.com/blog/using-tmux-sessions-windows-panes-and-vim-buffers-together&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nickjj/dotfiles"&gt;https://github.com/nickjj/dotfiles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mintty/mintty/wiki/Tips"&gt;https://github.com/mintty/mintty/wiki/Tips&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft/terminal"&gt;https://github.com/microsoft/terminal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mintty/wsltty"&gt;https://github.com/mintty/wsltty&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/morhetz/gruvbox-contrib/tree/master/mintty"&gt;https://github.com/morhetz/gruvbox-contrib/tree/master/mintty&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What's your favorite WSL terminal or wsltty feature? Let me know below.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>terminal</category>
      <category>video</category>
      <category>wsl</category>
    </item>
    <item>
      <title>Upgrading a Dockerized Flask App from Python 2.7 to Python 3.7+</title>
      <dc:creator>Nick Janetakis</dc:creator>
      <pubDate>Thu, 29 Aug 2019 20:01:06 +0000</pubDate>
      <link>https://dev.to/nickjj/upgrading-a-dockerized-flask-app-from-python-2-7-to-python-3-7-13l</link>
      <guid>https://dev.to/nickjj/upgrading-a-dockerized-flask-app-from-python-2-7-to-python-3-7-13l</guid>
      <description>&lt;p&gt;*&lt;em&gt;This article was originally posted on August 27th, 2019 at: &lt;a href="https://nickjanetakis.com/blog/upgrading-a-dockerized-flask-app-from-python-2-7-to-python-3-7"&gt;https://nickjanetakis.com/blog/upgrading-a-dockerized-flask-app-from-python-2-7-to-python-3-7&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Jan 1st 2020 is right around the corner and that's when Python 2.7.x will finally be considered end of life, so now is a great time to start upgrading to Python 3.7+ if you haven't done so already.&lt;/p&gt;

&lt;p&gt;In the video listed below, we go over updating a real Flask application from using Python 2.7.16 to 3.7.4. It covers how to do this with Docker, but the same strategy could be applied without Docker.&lt;/p&gt;

&lt;h5&gt;
  
  
  Through out the video we cover:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Picking a Python version to upgrade to&lt;/li&gt;
&lt;li&gt;Going over which 3rd party package versions only work with specific versions of Python&lt;/li&gt;
&lt;li&gt;How to perform the upgrade in a production ready (read: safe) way with Docker&lt;/li&gt;
&lt;li&gt;Encountering and fixing a bunch of errors you'll run across while doing this upgrade&lt;/li&gt;
&lt;li&gt;How to code your app to work for both versions at once until you retire Python 2.7.x&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The demo app we cover on video is the app in my &lt;a href="https://buildasaasappwithflask.com/?utm_source=nj&amp;amp;utm_medium=devto&amp;amp;utm_campaign=upgrading-flask-app"&gt;Build a SAAS App with Flask course&lt;/a&gt;. It was originally coded to work with Python 2.7.x and early versions of Python 3.x. Over time I have updated it to keep it current and will continue to update it (yay for free updates for life).&lt;/p&gt;

&lt;h3&gt;
  
  
  Updating Python from 2.7+ to 3.7+ Video
&lt;/h3&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Kq_khHWovl4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  Timestamped Table of Contents
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;0:33 -- Why bother updating from Python 2.7 to 3.7+?&lt;/li&gt;
&lt;li&gt;0:48 -- Upgrading in a production ready way&lt;/li&gt;
&lt;li&gt;1:29 -- What's going to be covered in this video?&lt;/li&gt;
&lt;li&gt;2:34 -- Downloading a sample Flask project to upgrade&lt;/li&gt;
&lt;li&gt;3:29 -- Building the project with Docker so we can run it&lt;/li&gt;
&lt;li&gt;4:46 -- Figuring out the latest Docker image for Python 2.7&lt;/li&gt;
&lt;li&gt;6:20 -- Watching Docker build Python 2.7.16&lt;/li&gt;
&lt;li&gt;6:49 -- Downgrading the pytest library to work with Python 2.7&lt;/li&gt;
&lt;li&gt;9:33 -- Watching Docker build again after we fix pytest&lt;/li&gt;
&lt;li&gt;10:08 -- Running the example Build a SAAS App with Flask project&lt;/li&gt;
&lt;li&gt;10:56 -- Ensuring our test suite passes with Python 2.7&lt;/li&gt;
&lt;li&gt;12:04 -- Benefits of using Docker to upgrade Python versions&lt;/li&gt;
&lt;li&gt;13:04 -- How to upgrade the Dockerized Flask app from Python 2.7 to 3.7+&lt;/li&gt;
&lt;li&gt;14:26 -- Watching Docker build again after upgrading to Python 3.7.4&lt;/li&gt;
&lt;li&gt;14:52 -- Running into and fixing a Celery beat schedule error&lt;/li&gt;
&lt;li&gt;15:43 -- Running into and fixing a JSON serializable TypeError after upgrading&lt;/li&gt;
&lt;li&gt;19:53 -- Another benefit of using Docker is that rolling back to 2.7 is easy&lt;/li&gt;
&lt;li&gt;21:33 -- Looking at even more Flask related packages that work in Python 3.7&lt;/li&gt;
&lt;li&gt;25:54 -- Using Flask-Limiter to rate limit specific URL endpoints&lt;/li&gt;
&lt;li&gt;26:55 -- Scrolling through all of the packages used in the main Flask project&lt;/li&gt;
&lt;li&gt;27:19 -- Coding your app to work with both Python 2.7.x and Python 3.7.x&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Reference Links
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/nickjj/build-a-saas-app-with-flask"&gt;https://github.com/nickjj/build-a-saas-app-with-flask&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://buildasaasappwithflask.com/?utm_source=nj&amp;amp;utm_medium=devto&amp;amp;utm_campaign=upgrading-flask-app"&gt;https://buildasaasappwithflask.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nickjanetakis.com/blog/"&gt;https://nickjanetakis.com/blog/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hub.docker.com/_/python"&gt;https://hub.docker.com/_/python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pypi.org/project/pytest"&gt;https://pypi.org/project/pytest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nickjj/dotfiles"&gt;https://github.com/nickjj/dotfiles&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What have you had to do to upgrade Python to 3.7+? Let me know below.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>flask</category>
      <category>python</category>
      <category>video</category>
    </item>
    <item>
      <title>Find and Replace Text in 1 or More Files Using Vim, fzf and ripgrep</title>
      <dc:creator>Nick Janetakis</dc:creator>
      <pubDate>Tue, 13 Aug 2019 16:22:46 +0000</pubDate>
      <link>https://dev.to/nickjj/find-and-replace-text-in-1-or-more-files-using-vim-fzf-and-ripgrep-2h9i</link>
      <guid>https://dev.to/nickjj/find-and-replace-text-in-1-or-more-files-using-vim-fzf-and-ripgrep-2h9i</guid>
      <description>&lt;p&gt;*&lt;em&gt;This article was originally posted on July 23rd, 2019 at: &lt;a href="https://nickjanetakis.com/blog/find-and-replace-text-in-1-or-more-files-using-vim-fzf-and-ripgrep"&gt;https://nickjanetakis.com/blog/find-and-replace-text-in-1-or-more-files-using-vim-fzf-and-ripgrep&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Vim is a great editor and over the months I've configured a number of custom mappings and plugins to help me find and replace text in a number of different ways.&lt;/p&gt;

&lt;h5&gt;
  
  
  In this video, we'll go over how to set things up so you can:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Find and jump to a word in a line&lt;/li&gt;
&lt;li&gt;Find and cycle through word matches in the current file&lt;/li&gt;
&lt;li&gt;Find and cycle through visual section matches in the current file&lt;/li&gt;
&lt;li&gt;Find and cycle through regular expression matches in the current file&lt;/li&gt;
&lt;li&gt;Find any word, visual selection or regexp match in the current &lt;em&gt;directory&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Replace a word, visual selection or regexp match in the current visual selection &lt;/li&gt;
&lt;li&gt;Replace a word, visual selection or regexp match in the current file&lt;/li&gt;
&lt;li&gt;Perform a multiple cursors style replace, but without using multiple cursors&lt;/li&gt;
&lt;li&gt;Replace a word, visual selection or regexp match in the current &lt;em&gt;directory&lt;/em&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Basically we'll cover close to every possible find / replace use case you'll encounter while doing some programming work or writing. Everything will be accessible with easy to remember mappings or short commands and searching will be lightning fast.&lt;/p&gt;

&lt;h3&gt;
  
  
  Demo Video Showing Everything
&lt;/h3&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/fP_ckZ30gbs"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  Timestamped Table of Contents
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;0:55 -- Cloning an example project to work with&lt;/li&gt;
&lt;li&gt;1:43 -- Finding or jumping to a word on a single line&lt;/li&gt;
&lt;li&gt;3:25 -- Finding a term in the current file&lt;/li&gt;
&lt;li&gt;4:57 -- Automatically clearing search highlights on cursor move&lt;/li&gt;
&lt;li&gt;6:37 -- Manually replacing text in the current file&lt;/li&gt;
&lt;li&gt;7:33 -- Using the star mapping to search a word under your cursor&lt;/li&gt;
&lt;li&gt;7:54 -- Replacing the last searched word using a custom mapping&lt;/li&gt;
&lt;li&gt;10:45 -- Using the visual star plugin to search for any selected term&lt;/li&gt;
&lt;li&gt;11:59 -- Replacing any selected term using a custom mapping&lt;/li&gt;
&lt;li&gt;13:31 -- Replacing text inside of a visual selection&lt;/li&gt;
&lt;li&gt;14:48 -- A multiple cursors alternative in Vim&lt;/li&gt;
&lt;li&gt;18:28 -- Custom key mapping to quickly replace near by text&lt;/li&gt;
&lt;li&gt;19:53 -- Finding terms in multiple files based on where you opened Vim&lt;/li&gt;
&lt;li&gt;21:33 -- Opening search results in vsplits, splits or tabs&lt;/li&gt;
&lt;li&gt;22:42 -- Opening multiple search results at once&lt;/li&gt;
&lt;li&gt;23:22 -- Seeing real time search results when finding text in multiple files&lt;/li&gt;
&lt;li&gt;24:02 -- Filtering multiple file search results by file type&lt;/li&gt;
&lt;li&gt;24:48 -- Finding files, viewing git commits and more with the fzf.vim plugin&lt;/li&gt;
&lt;li&gt;26:50 -- Installing and configuring fzf&lt;/li&gt;
&lt;li&gt;28:26 -- Installing and configuring fzf.vim&lt;/li&gt;
&lt;li&gt;30:26 -- Installing and configuring ripgrep to work with fzf and fzf.vim&lt;/li&gt;
&lt;li&gt;32:41 -- Finding and replacing text in multiple files with vim-grepper&lt;/li&gt;
&lt;li&gt;35:42 -- Finding and replacing a phrase or regexp in multiple files&lt;/li&gt;
&lt;li&gt;39:15 -- Installing and configuring the vim-grepper plugin&lt;/li&gt;
&lt;li&gt;40:48 -- Running vim-grepper manually for more complex find / replace&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Reference Links
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/nickjj/dotfiles"&gt;https://github.com/nickjj/dotfiles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/haya14busa/is.vim"&gt;https://github.com/haya14busa/is.vim&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nelstrom/vim-visual-star-search"&gt;https://github.com/nelstrom/vim-visual-star-search&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/junegunn/fzf"&gt;https://github.com/junegunn/fzf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/junegunn/fzf.vim"&gt;https://github.com/junegunn/fzf.vim&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/BurntSushi/ripgrep"&gt;https://github.com/BurntSushi/ripgrep&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mhinz/vim-grepper"&gt;https://github.com/mhinz/vim-grepper&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What do you do to solve finding and replacing text? Let me know below!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>video</category>
      <category>vim</category>
    </item>
    <item>
      <title>A Python CLI Tool to Help Diff Web Framework Versions</title>
      <dc:creator>Nick Janetakis</dc:creator>
      <pubDate>Mon, 15 Jul 2019 12:45:21 +0000</pubDate>
      <link>https://dev.to/nickjj/a-python-cli-tool-to-help-diff-web-framework-versions-2dpi</link>
      <guid>https://dev.to/nickjj/a-python-cli-tool-to-help-diff-web-framework-versions-2dpi</guid>
      <description>&lt;p&gt;*&lt;em&gt;This article was originally posted on July 2nd, 2019 at: &lt;a href="https://nickjanetakis.com/blog/a-python-cli-tool-to-help-diff-web-framework-versions"&gt;https://nickjanetakis.com/blog/a-python-cli-tool-to-help-diff-web-framework-versions&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Upgrading web framework versions is something we all deal with on a regular basis.&lt;/p&gt;

&lt;p&gt;Before this tool existed, this is what I did every time I wanted to see what changed between 2 versions of a framework so I could update my app:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Launch a Docker container for XYZ language (let's say Elixir)&lt;/li&gt;
&lt;li&gt;Install my project’s current version of Phoenix (a web framework for Elixir)&lt;/li&gt;
&lt;li&gt;Generate project A in a directory&lt;/li&gt;
&lt;li&gt;Install the version of Phoenix I want to upgrade to&lt;/li&gt;
&lt;li&gt;Generate project B in a different directory&lt;/li&gt;
&lt;li&gt;Run the diff tool to see what changed between both versions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Needless to say it was a nuisance to do that every time I upgraded. This tool automates all of that by letting you run a single command such as &lt;code&gt;verdiff --framework phoenix 1.4.4 1.4.8&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It's a ~200 line Python script and uses Docker under the hood.&lt;/p&gt;

&lt;p&gt;The first 10 minutes of the video below goes over using the tool and the last 20 or so minutes covers building a zero dependency Python CLI script that works for both Python 2.x and Python 3.x. You’ll see how to use argparse to build light weight and robust command line tools of your own.&lt;/p&gt;

&lt;h3&gt;
  
  
  Demo Video of Using and Building This Tool
&lt;/h3&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/2iGndOvl7cQ"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  Timestamped Table of Contents
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;0:34 -- Running verdiff's help menu to see what it does&lt;/li&gt;
&lt;li&gt;1:40 -- What verdiff does and why I made this CLI tool&lt;/li&gt;
&lt;li&gt;2:49 -- Running verdiff and watch it diff any 2 supported web framework versions&lt;/li&gt;
&lt;li&gt;3:55 -- Comparing what changed between 2 Phoenix projects&lt;/li&gt;
&lt;li&gt;5:28 -- Exploring the options we can use when running verdiff&lt;/li&gt;
&lt;li&gt;6:44 -- Setting a custom project name to generate new projects (useful with Docker)&lt;/li&gt;
&lt;li&gt;8:16 -- Checking out a new project and potentially diffing it with your code editor&lt;/li&gt;
&lt;li&gt;9:52 -- Looking at the other verdiff flags&lt;/li&gt;
&lt;li&gt;10:16 -- Keeping the Dockerfile around in case you want to use it&lt;/li&gt;
&lt;li&gt;10:52 -- Time stamping the Dockerfile to keep it unique&lt;/li&gt;
&lt;li&gt;11:33 -- Looking at the verdiff git repo&lt;/li&gt;
&lt;li&gt;11:54 -- The README file explains every option and example use cases&lt;/li&gt;
&lt;li&gt;12:48 -- Looking at the ~200 line Python CLI tool that makes verdiff work&lt;/li&gt;
&lt;li&gt;14:05 -- Why are we using argparse instead of the click library?&lt;/li&gt;
&lt;li&gt;15:18 -- Generating a help menu for your CLI tool&lt;/li&gt;
&lt;li&gt;17:03 -- Defining required string arguments with N number of arguments&lt;/li&gt;
&lt;li&gt;18:25 -- Writing 1 line of help text for each of your arguments&lt;/li&gt;
&lt;li&gt;18:50 -- Setting up default values for your arguments&lt;/li&gt;
&lt;li&gt;19:35 -- Creating custom types to help validate user input&lt;/li&gt;
&lt;li&gt;21:03 -- Setting default values based on variables&lt;/li&gt;
&lt;li&gt;22:28 -- Handling boolean values with defaults and 0 or 1 arguments&lt;/li&gt;
&lt;li&gt;24:40 -- Parsing the arguments to get their values&lt;/li&gt;
&lt;li&gt;25:31 -- Naming convention for argparse arguments and variable names&lt;/li&gt;
&lt;li&gt;25:53 -- How to debug your args so you can see all of their values&lt;/li&gt;
&lt;li&gt;26:49 -- Generating the Dockerfile based on the web framework name passed in&lt;/li&gt;
&lt;li&gt;33:05 -- Checking out the Docker functions for the verdiff Python script&lt;/li&gt;
&lt;li&gt;33:52 -- Running system commands with Python using subprocess&lt;/li&gt;
&lt;li&gt;34:43 -- Using the Docker container copy command to save projects locally&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Reference Links
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Verdiff tool on GitHub: &lt;a href="https://github.com/nickjj/verdiff"&gt;https://github.com/nickjj/verdiff&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Vdiff alias for Vim in my Dotfiles: &lt;a href="https://github.com/nickjj/dotfiles/blob/3081ea8adcd0e542c8d4fe8f8861f7bbccbfd1fe/.aliases#L16"&gt;https://github.com/nickjj/dotfiles/blob/3081ea8adcd0e542c8d4fe8f8861f7bbccbfd1fe/.aliases#L16&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Python argparse documentation: &lt;a href="https://docs.python.org/3/library/argparse.html"&gt;https://docs.python.org/3/library/argparse.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Python nargs documentation: &lt;a href="https://docs.python.org/3/library/argparse.html#nargs"&gt;https://docs.python.org/3/library/argparse.html#nargs&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What's your process for upgrading web framework versions?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>python</category>
      <category>video</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Using tmux Sessions, Windows, Panes and Vim Buffers Together</title>
      <dc:creator>Nick Janetakis</dc:creator>
      <pubDate>Mon, 08 Jul 2019 14:27:53 +0000</pubDate>
      <link>https://dev.to/nickjj/using-tmux-sessions-windows-panes-and-vim-buffers-together-5djk</link>
      <guid>https://dev.to/nickjj/using-tmux-sessions-windows-panes-and-vim-buffers-together-5djk</guid>
      <description>&lt;p&gt;*&lt;em&gt;This article was originally posted on June 18th, 2019 at: &lt;a href="https://nickjanetakis.com/blog/using-tmux-sessions-windows-panes-and-vim-buffers-together"&gt;https://nickjanetakis.com/blog/using-tmux-sessions-windows-panes-and-vim-buffers-together&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Now that I've been using Vim for a few months, I figured it would be a good time to share my day to day work flow on how I’m using it with tmux (something I've been using for years).&lt;/p&gt;

&lt;p&gt;While figuring all of this out, I occasionally struggled between choosing to launch multiple terminal applications, tmux sessions, windows, split panes, Vim buffers and / or tabs. This is what I came up with in the end, and it’s been working great so far.&lt;/p&gt;

&lt;p&gt;As a freelance developer, open source enthusiast and someone who likes hacking on my own projects, it’s no surprise that I have a lot of active projects.&lt;/p&gt;

&lt;p&gt;This 10 minute video shows how I manage all of these projects on the command line.&lt;/p&gt;

&lt;h3&gt;
  
  
  Demo Video Showing How It Works
&lt;/h3&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/hbs7tuwpgZA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  Timestamped Table of Contents
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;1:14 – Listing out a few tmux sessions&lt;/li&gt;
&lt;li&gt;1:43 – Having 1 tmux session per project&lt;/li&gt;
&lt;li&gt;2:22 – Attaching to a specific session&lt;/li&gt;
&lt;li&gt;2:33 – Splitting individual files with Vim buffers&lt;/li&gt;
&lt;li&gt;3:35 – Using tmux windows for separating Vim from your web server&lt;/li&gt;
&lt;li&gt;3:47 – Splitting a window in half with tmux panes&lt;/li&gt;
&lt;li&gt;4:01 – Using tabs in Vim to split up your buffers into groups&lt;/li&gt;
&lt;li&gt;5:32 – Leveraging a second tmux window for running other processes&lt;/li&gt;
&lt;li&gt;6:21 – Zooming in and out of a specific pane with tmux&lt;/li&gt;
&lt;li&gt;6:53 – Recapping the workflow for developing and deploying my blog&lt;/li&gt;
&lt;li&gt;8:03 – Switching between different projects / sessions is where tmux shines&lt;/li&gt;
&lt;li&gt;9:43 – Persist, save and restore sessions with tmux-resurrect&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Reference Links
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nickjanetakis.com/blog/who-else-wants-to-boost-their-productivity-with-tmux"&gt;Intro to tmux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tmux-plugins/tmux-resurrect"&gt;https://github.com/tmux-plugins/tmux-resurrect&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nickjj/dotfiles"&gt;https://github.com/nickjj/dotfiles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mintty/wsltty"&gt;https://github.com/mintty/wsltty&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What's your favorite tmux / Vim workflow? Let me know below!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>tmux</category>
      <category>video</category>
      <category>vim</category>
    </item>
    <item>
      <title>Design Your Web UIs Faster by Planning Out Each Different State</title>
      <dc:creator>Nick Janetakis</dc:creator>
      <pubDate>Mon, 01 Jul 2019 18:57:12 +0000</pubDate>
      <link>https://dev.to/nickjj/design-your-web-uis-faster-by-planning-out-each-different-state-2p17</link>
      <guid>https://dev.to/nickjj/design-your-web-uis-faster-by-planning-out-each-different-state-2p17</guid>
      <description>&lt;p&gt;*&lt;em&gt;This article was originally posted on May 21st, 2019 at: &lt;a href="https://nickjanetakis.com/blog/design-your-web-uis-faster-by-planning-out-each-different-state"&gt;https://nickjanetakis.com/blog/design-your-web-uis-faster-by-planning-out-each-different-state&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Recently I've moved beyond my plan to create a course hosting platform and started to code it. When it comes to laying out or designing the user interface (UI) for a page I often step back and write out each combination of what state that page can be in.&lt;/p&gt;

&lt;p&gt;This video goes over that process for a user registration / sign up workflow, setting up a user avatar and also touches on designing a checkout page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Breaking Down the UI States for 3 App Features
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/ERSprAyPQC4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  Timestamped Table of Contents
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;1:33 – Figuring out each state for user registration and authentication&lt;/li&gt;
&lt;li&gt;4:47 – Knowing what to design before you design it (which saves a ton of time)&lt;/li&gt;
&lt;li&gt;5:04 – Doing this naturally sets up your test cases&lt;/li&gt;
&lt;li&gt;5:56 – Breaking down how to handle user avatars&lt;/li&gt;
&lt;li&gt;11:07 – Going over a few different user states for a checkout page&lt;/li&gt;
&lt;li&gt;15:30 - Quick recap&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Reference Links
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nickjanetakis.com/blog/live-demo-of-planning-a-real-world-web-application-from-scratch"&gt;Planning a web application from scratch video&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Have you done this or something similar before? Let me know below.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>tutorial</category>
      <category>video</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Learning a New and Unfamiliar Code Base</title>
      <dc:creator>Nick Janetakis</dc:creator>
      <pubDate>Tue, 28 May 2019 11:45:22 +0000</pubDate>
      <link>https://dev.to/nickjj/learning-a-new-and-unfamiliar-code-base-139</link>
      <guid>https://dev.to/nickjj/learning-a-new-and-unfamiliar-code-base-139</guid>
      <description>&lt;p&gt;*&lt;em&gt;This article was originally posted on May 14th, 2019 at: &lt;a href="https://nickjanetakis.com/blog/learning-a-new-and-unfamiliar-code-base"&gt;https://nickjanetakis.com/blog/learning-a-new-and-unfamiliar-code-base&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Someone who took my Flask course recently e-mailed me asking if I could make a video on how to tackle learning a new code base and it just so happens I had to do that very recently so I made a video showing the process I use on 3 different apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gaining Insight on 3 Unfamiliar Code Bases (Video)
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/MlGAU_Gv2cA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  Timestamped Table of Contents
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;0:39 -- In the real world, documentation isn't always available&lt;/li&gt;
&lt;li&gt;1:25 -- Exploring 3 different web apps to gain insight on what they do&lt;/li&gt;
&lt;li&gt;2:15 -- Taking a look at a closed source Flask application&lt;/li&gt;
&lt;li&gt;3:55 -- Figuring out the tech stack of the application from the bottom up&lt;/li&gt;
&lt;li&gt;6:32 -- Getting an idea of what a web app does by looking at its URL routes&lt;/li&gt;
&lt;li&gt;9:30 -- Scoping out a project's size on the command line in a few seconds&lt;/li&gt;
&lt;li&gt;12:15 -- Determining how an app is designed based on lines of code for file types&lt;/li&gt;
&lt;li&gt;13:11 -- Using prior experience and our new found knowledge to find out what to edit&lt;/li&gt;
&lt;li&gt;14:05 -- Looking at an open source Phoenix app (&lt;a href="https://changelog.com"&gt;https://changelog.com&lt;/a&gt;) on GitHub&lt;/li&gt;
&lt;li&gt;14:50 -- One strategy for fixing a bug in an open source project&lt;/li&gt;
&lt;li&gt;15:24 -- Learning from open source projects to build your own web applications&lt;/li&gt;
&lt;li&gt;16:40 -- First steps to get familiar with an open source project's code base&lt;/li&gt;
&lt;li&gt;16:45 -- Using GitHub's UI to gain insights on an application's code base&lt;/li&gt;
&lt;li&gt;18:21 -- Repeating most of what we did on the command line but on GitHub instead&lt;/li&gt;
&lt;li&gt;20:21 -- Copying features from an open source project into your project&lt;/li&gt;
&lt;li&gt;21:05 -- Tracing code on a need to know basis&lt;/li&gt;
&lt;li&gt;23:08 -- Making your first pull request on an open source project&lt;/li&gt;
&lt;li&gt;25:07 -- Not every pull request needs to be Earth shattering, small is ok&lt;/li&gt;
&lt;li&gt;25:33 -- You don't need to be an expert or professional to contribute to a project&lt;/li&gt;
&lt;li&gt;25:52 -- Don't under estimate small pull requests, always test your code!&lt;/li&gt;
&lt;li&gt;27:18 -- Looking at a Ruby on Rails open source project (&lt;a href="https://dev.to"&gt;https://dev.to&lt;/a&gt;) on GitHub&lt;/li&gt;
&lt;li&gt;28:04 -- Seeing what the dev.to code base is composed of&lt;/li&gt;
&lt;li&gt;29:14 -- Getting a list of routes, just like we did for the Flask app&lt;/li&gt;
&lt;li&gt;29:51 -- Exploring the routes at the code level (some web frameworks have this)&lt;/li&gt;
&lt;li&gt;31:05 -- Repeating what we did previously to find the dev.to tech stack&lt;/li&gt;
&lt;li&gt;31:25 -- Finding hints of a linting tool being used is a very good sign for code quality&lt;/li&gt;
&lt;li&gt;32:02 -- Tests are a great way to see how things work under the hood&lt;/li&gt;
&lt;li&gt;33:09 -- Going back to dev.to's tech stack&lt;/li&gt;
&lt;li&gt;34:33 -- Use everything together and your task at hand to determine what to do next&lt;/li&gt;
&lt;li&gt;35:35 -- Oh yeah! Don't forget to check a project's list of package dependencies&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Reference Links
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Build a SAAS app with Flask course: &lt;a href="https://buildasaasappwithflask.com/?utm_source=nj&amp;amp;utm_medium=devto&amp;amp;utm_campaign=video-codebase"&gt;https://buildasaasappwithflask.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dive into Docker course: &lt;a href="https://diveintodocker.com/?utm_source=nj&amp;amp;utm_medium=devto&amp;amp;utm_campaign=video-codebase"&gt;https://diveintodocker.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Changelog Website: &lt;a href="https://changelog.com"&gt;https://changelog.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Changelog on GitHub: &lt;a href="https://github.com/thechangelog/changelog.com"&gt;https://github.com/thechangelog/changelog.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to Website: &lt;a href="https://dev.to"&gt;https://dev.to&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to on GitHub: &lt;a href="https://github.com/thepracticaldev/dev.to"&gt;https://github.com/thepracticaldev/dev.to&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How do you tackle learning a new code base? Let me know below.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>opensource</category>
      <category>video</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Live Demo of Planning a Real World Web Application from Scratch</title>
      <dc:creator>Nick Janetakis</dc:creator>
      <pubDate>Mon, 20 May 2019 13:59:23 +0000</pubDate>
      <link>https://dev.to/nickjj/live-demo-of-planning-a-real-world-web-application-from-scratch-3pje</link>
      <guid>https://dev.to/nickjj/live-demo-of-planning-a-real-world-web-application-from-scratch-3pje</guid>
      <description>&lt;p&gt;*&lt;em&gt;This article was originally posted on May 7th, 2019 at: &lt;a href="https://nickjanetakis.com/blog/live-demo-of-planning-a-real-world-web-application-from-scratch"&gt;https://nickjanetakis.com/blog/live-demo-of-planning-a-real-world-web-application-from-scratch&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Something that I've wanted to do for a while now is build my own custom course hosting platform. Right now I'm using a white label (no branding) third party platform, but that's going to change once my MVP is ready.&lt;/p&gt;

&lt;p&gt;On a whim, I thought it might be beneficial to record the process of how I go from a vague idea of "build a course hosting platform" to having a plan that I can execute to start coding the project without feeling overwhelmed.&lt;/p&gt;

&lt;p&gt;This video is about 90 minutes and it covers exactly what I do before writing the first line of code in just about every project I develop. It covers breaking down the project into components, uncovering features by exploring how users will use the application, how you can approach building your MVP when you're ready and more.&lt;/p&gt;

&lt;p&gt;This video is pretty much uncut and it's the "real" process, so you won't just see a tidy finished plan at the end. You'll get to hear my thought process for everything along way and even get to see me struggle on certain decisions in real time.&lt;/p&gt;

&lt;p&gt;After watching the video you'll be able to apply these same tactics to your own projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Live Demo Video
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/t2h64Bb_DLU"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  Timestamped Table of Contents
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;0:27 -- Importance of being able to start and finish a project&lt;/li&gt;
&lt;li&gt;0:53 -- Getting stuck in a research loop due to vague ideas&lt;/li&gt;
&lt;li&gt;1:36 -- Explaining my entire thought process to build a course hosting platform&lt;/li&gt;
&lt;li&gt;1:54 -- Figuring out the motive for developing your application&lt;/li&gt;
&lt;li&gt;2:52 -- What type of project are you building?&lt;/li&gt;
&lt;li&gt;3:06 -- An example of scratching your own itch to build an app for yourself&lt;/li&gt;
&lt;li&gt;3:52 -- Other types of motives&lt;/li&gt;
&lt;li&gt;4:54 -- The reason I'm creating a course hosting platform (finding my motive)&lt;/li&gt;
&lt;li&gt;11:35 -- Knowing your limits and not letting work consume you as an entrepreneur&lt;/li&gt;
&lt;li&gt;12:22 -- Finding a temporary solution by maybe using third party solutions&lt;/li&gt;
&lt;li&gt;14:41 -- Identifying when the timing is right to make your project&lt;/li&gt;
&lt;li&gt;17:27 -- Will your project be open or closed source?&lt;/li&gt;
&lt;li&gt;18:05 -- If it's open source, you should look at which license to use&lt;/li&gt;
&lt;li&gt;19:33 -- Fleshing out the features of your application&lt;/li&gt;
&lt;li&gt;19:46 -- Typing out the user workflow in a markdown document&lt;/li&gt;
&lt;li&gt;20:58 -- Seeing the existing course page on the third party course platform&lt;/li&gt;
&lt;li&gt;23:44 -- Writing out the user workflow&lt;/li&gt;
&lt;li&gt;25:29 -- Discovering UI possibilities by explaining the workflow&lt;/li&gt;
&lt;li&gt;29:21 -- Balancing conversion rates and potential fraud by limiting form fields&lt;/li&gt;
&lt;li&gt;31:17 -- On-boarding users but only asking for the absolute essentials&lt;/li&gt;
&lt;li&gt;36:42 -- Identifying what your users want to do after they sign up&lt;/li&gt;
&lt;li&gt;38:02 -- Taking inspiration from similar apps that you enjoy using&lt;/li&gt;
&lt;li&gt;41:05 -- Thinking of ways you can delegate out some of the work&lt;/li&gt;
&lt;li&gt;43:18 -- If you ask for information, make it obvious why you're asking for it&lt;/li&gt;
&lt;li&gt;45:10 -- Fleshing out the main features or components of the application&lt;/li&gt;
&lt;li&gt;51:12 -- Thinking about the future but not coding your app for it initially&lt;/li&gt;
&lt;li&gt;53:47 -- Further breaking down some of the main features&lt;/li&gt;
&lt;li&gt;1:00:33 -- How will you inform your users of changes or product updates?&lt;/li&gt;
&lt;li&gt;1:03:20 -- Being aware of third party services you may need to pay for&lt;/li&gt;
&lt;li&gt;1:04:17 -- Doing the bare minimum for your private admin back-end&lt;/li&gt;
&lt;li&gt;1:06:26 -- Sticking to your guns on MVP admin features, even if they sound cool&lt;/li&gt;
&lt;li&gt;1:07:22 -- Using plain text to help you plan your app out with the least resistance&lt;/li&gt;
&lt;li&gt;1:08:04 -- Another strategy for helping figure out and flesh out features&lt;/li&gt;
&lt;li&gt;1:11:08 -- Being honest with yourself on developing features based on user demand&lt;/li&gt;
&lt;li&gt;1:14:18 -- Recapping licensing and motives&lt;/li&gt;
&lt;li&gt;1:15:30 -- Go for the easy wins when it comes times to start coding&lt;/li&gt;
&lt;li&gt;1:16:09 -- Get your development environment all set up&lt;/li&gt;
&lt;li&gt;1:16:44 -- Start thinking about your tech stack for the project&lt;/li&gt;
&lt;li&gt;1:17:25 -- Maybe learn and use a new technology if it makes you happy&lt;/li&gt;
&lt;li&gt;1:20:35 -- But you should stick with technologies that make sense for your app&lt;/li&gt;
&lt;li&gt;1:21:27 -- Your plan won't be perfect, let it simmer and refine it as needed&lt;/li&gt;
&lt;li&gt;1:21:57 -- Ways to start developing your app once you're ready to write code&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Reference Links
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Flask course: &lt;a href="https://buildasaasappwithflask.com/?utm_source=nj&amp;amp;utm_medium=devto&amp;amp;utm_campaign=planning-video"&gt;https://buildasaasappwithflask.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docker course: &lt;a href="https://diveintodocker.com/?utm_source=nj&amp;amp;utm_medium=devto&amp;amp;utm_campaign=planning-video"&gt;https://diveintodocker.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Choose a license: &lt;a href="https://choosealicense.com"&gt;https://choosealicense.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What are some of your strategies for starting a new project? Let me know below.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>tutorial</category>
      <category>video</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Writing and Previewing Markdown in Real Time with Vim 8+</title>
      <dc:creator>Nick Janetakis</dc:creator>
      <pubDate>Mon, 06 May 2019 11:20:43 +0000</pubDate>
      <link>https://dev.to/nickjj/writing-and-previewing-markdown-in-real-time-with-vim-8-3icf</link>
      <guid>https://dev.to/nickjj/writing-and-previewing-markdown-in-real-time-with-vim-8-3icf</guid>
      <description>&lt;p&gt;*&lt;em&gt;This article was originally posted on April 9th 2019 at: &lt;a href="https://nickjanetakis.com/blog/writing-and-previewing-markdown-in-real-time-with-vim-8"&gt;https://nickjanetakis.com/blog/writing-and-previewing-markdown-in-real-time-with-vim-8&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;I'm about 2 months into &lt;a href="https://nickjanetakis.com/blog/getting-productive-with-vim-in-a-week-without-hating-it"&gt;using Vim&lt;/a&gt; and it's going great. In this video I'd like to cover my general Markdown writing set up with Vim.&lt;/p&gt;

&lt;p&gt;Documentation is such an important aspect of being a developer and having a Markdown set up with real time previews really helps writing README files. Especially with the preview being styled up to match GitHub's CSS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo Video Showing How It Works
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/22JAs0kNA9k"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  Timestamped Table of Contents
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;0:48 -- Going over Markdown related Vim plugins&lt;/li&gt;
&lt;li&gt;2:01 -- Limelight and Goyo for distraction free writing&lt;/li&gt;
&lt;li&gt;4:20 -- Writing Markdown to see how it all works&lt;/li&gt;
&lt;li&gt;5:37 -- Previewing Markdown in a browser&lt;/li&gt;
&lt;li&gt;6:52 -- GitHub styled CSS for the preview&lt;/li&gt;
&lt;li&gt;8:59 -- Disabling conceal with the vim-markdown plugin&lt;/li&gt;
&lt;li&gt;10:18 -- Dealing with code folding on Markdown headers&lt;/li&gt;
&lt;li&gt;12:01 -- Adding an image to the Markdown README file&lt;/li&gt;
&lt;li&gt;12:48 -- Pushing the example README file to GitHub&lt;/li&gt;
&lt;li&gt;13:17 -- Configuring Vim as an editor for git commits&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Reference Links
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Dotfiles: &lt;a href="https://github.com/nickjj/dotfiles"&gt;https://github.com/nickjj/dotfiles&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;vim-markdown: &lt;a href="https://github.com/plasticboy/vim-markdown"&gt;https://github.com/plasticboy/vim-markdown&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;markdown-preview.nvim: &lt;a href="https://github.com/iamcco/markdown-preview.nvim"&gt;https://github.com/iamcco/markdown-preview.nvim&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;github-markdown-css: &lt;a href="https://github.com/sindresorhus/github-markdown-css"&gt;https://github.com/sindresorhus/github-markdown-css&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;limelight.vim: &lt;a href="https://github.com/junegunn/limelight.vim"&gt;https://github.com/junegunn/limelight.vim&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;goyo.vim: &lt;a href="https://github.com/junegunn/goyo.vim"&gt;https://github.com/junegunn/goyo.vim&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What are some of your Markdown related tips for Vim? Let me know below.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>markdown</category>
      <category>productivity</category>
      <category>vim</category>
    </item>
    <item>
      <title>Remap and Set Global Hotkeys on Windows 10 with Auto Hotkey</title>
      <dc:creator>Nick Janetakis</dc:creator>
      <pubDate>Mon, 22 Apr 2019 13:52:14 +0000</pubDate>
      <link>https://dev.to/nickjj/remap-and-set-global-hotkeys-on-windows-10-with-auto-hotkey-4h50</link>
      <guid>https://dev.to/nickjj/remap-and-set-global-hotkeys-on-windows-10-with-auto-hotkey-4h50</guid>
      <description>&lt;p&gt;&lt;strong&gt;This article was originally posted on March 12th 2019 at: &lt;a href="https://nickjanetakis.com/blog/remap-and-set-global-hotkeys-on-windows-10-with-auto-hotkey"&gt;https://nickjanetakis.com/blog/remap-and-set-global-hotkeys-on-windows-10-with-auto-hotkey&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Windows 10 comes with over 50 global hotkey combinations assigned to the Windows key, such as being able to press &lt;code&gt;Win + e&lt;/code&gt; to open Windows file explorer, which is quite handy but personally I find most of the preassigned hotkeys to be not that useful.&lt;/p&gt;

&lt;p&gt;A global hotkey is a hotkey that works across your system, and isn't tied into a specific application. That means if you press it from anywhere, that action will trigger and in this article we're going to go over how to set our own custom global hotkeys and even be able to override the ones that come with Windows without having to reboot or touch the Registry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Downloading Auto Hotkey (AHK)
&lt;/h2&gt;

&lt;p&gt;The tool we're going to use is called &lt;a href="https://github.com/Lexikos/AutoHotkey_L"&gt;Auto Hotkey (AHK)&lt;/a&gt; which is an open source tool for Windows that lets you automate all sorts of things, but remapping keys and setting global hotkeys is something it does very well.&lt;/p&gt;

&lt;p&gt;You can &lt;a href="https://www.autohotkey.com/download/"&gt;download it from their downloads page&lt;/a&gt;. I recommend grabbing the latest stable release which is v1.1.x at the time of writing this article. Then install it after you download it.&lt;/p&gt;

&lt;p&gt;One nice thing to note is unlike most "modern" applications running the AHK script that we're going to create in this article only uses 2.5mb of RAM and doesn't use any idle CPU resources at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating the AHK Script
&lt;/h2&gt;

&lt;p&gt;AHK is driven by a scripting language and doesn't require doing anything too crazy to get it up and running. You just create your script and then run the AHK file.&lt;/p&gt;

&lt;p&gt;So, create a new file called &lt;code&gt;hotkeys.ahk&lt;/code&gt; anywhere you want on your computer. You can also choose to name it something else as long as it ends with &lt;code&gt;.ahk&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Remapping Keys and Setting Global Hotkeys
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Lines that start with &lt;code&gt;;&lt;/code&gt; are considered comments and are ignored by AHK.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;; Remap hotkeys
CapsLock::Esc
Esc::CapsLock

; Global hotkeys
#c::Run, explorer.exe D:\courses\deploying
#i::Run, C:\Program Files\GIMP 2\bin\gimp-2.10.exe
#n::Run, explorer.exe D:\src\sites\nickjanetakis
#m::Run, foobar2000.exe
#t::Run, %UserProfile%\AppData\Local\wsltty\bin\mintty.exe --WSL="Ubuntu-18.04" --configdir="%UserProfile%\AppData\Roaming\wsltty" -~
#+t::Run, *RunAs %UserProfile%\AppData\Local\wsltty\bin\mintty.exe --WSL="Ubuntu-18.04" --configdir="%UserProfile%\AppData\Roaming\wsltty" -~
#w::Run chrome.exe
#+w::Run chrome.exe -incognito
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There's a number of things that are specific to my set up, so let's break it down because chances are you're going to end up modifying most of those global hotkeys to work for you.&lt;/p&gt;

&lt;h5&gt;
  
  
  Remapping keys:
&lt;/h5&gt;

&lt;p&gt;Since I started &lt;a href="https://nickjanetakis.com/blog/vim-is-saving-me-hours-of-work-when-writing-books-and-courses"&gt;using Vim about a month ago&lt;/a&gt;, one thing I've done is remap my escape key with caps lock. I really like this change, and it only took about a day to get used to it.&lt;/p&gt;

&lt;p&gt;To remap keys with AHK, you can add lines such as: &lt;code&gt;KEY_OLD::KEY_NEW&lt;/code&gt;. You can view a &lt;a href="https://autohotkey.com/docs/KeyList.htm"&gt;full list of keys&lt;/a&gt; on the official AHK site.&lt;/p&gt;

&lt;p&gt;It's worth mentioning that you need to bind both sides of the remap. In this case, we're remapping caps lock to escape but we also need to remap escape to caps lock.&lt;/p&gt;

&lt;p&gt;The end effect is both keys will be swapped as if you switched them on your keyboard. Also, if your caps lock key has a light, pressing escape will toggle it so you won't lose that feature.&lt;/p&gt;

&lt;h5&gt;
  
  
  Setting global hotkeys:
&lt;/h5&gt;

&lt;p&gt;Let's break down the first line: &lt;code&gt;#c::Run, explorer.exe D:\courses\deploying&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The overall pattern is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;#&lt;/code&gt; Modifier keys(s) (&lt;a href="https://autohotkey.com/docs/KeyList.htm#modifier"&gt;here's a full list&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;c&lt;/code&gt; The key you want to bind it to&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;::&lt;/code&gt; Setting up a remapping (part of AHK's API)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Run&lt;/code&gt; The thing you want to do (part of AHK's API)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;explorer.exe&lt;/code&gt;The program you want to run&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;D:\courses\deploying&lt;/code&gt; Optionally set the program's arguments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You could think of this as we're binding &lt;code&gt;Win + c&lt;/code&gt; to run the Windows file explorer program and open up a specific directory.&lt;/p&gt;

&lt;h5&gt;
  
  
  Combining modifiers:
&lt;/h5&gt;

&lt;p&gt;We can see an example of that in the last line with &lt;code&gt;#+w::Run chrome.exe -incognito&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I have &lt;code&gt;Win + w&lt;/code&gt; set to open up a regular Chrome window, but &lt;code&gt;Win + Shift + w&lt;/code&gt; opens up Chrome with incognito mode. That's handy for when I want to record courses, since I don't want my personal settings coming up on video.&lt;/p&gt;

&lt;h5&gt;
  
  
  Launching programs as an administrator:
&lt;/h5&gt;

&lt;p&gt;You'll notice that I have 2 hotkeys to launch a terminal window. The second one includes &lt;code&gt;#+t::Run, *RunAs&lt;/code&gt;. The &lt;code&gt;*RunAs&lt;/code&gt; allows you to run a program as admin.&lt;/p&gt;

&lt;p&gt;Occasionally I still use Vagrant and running Vagrant on Windows requires running it as admin and since I interact with &lt;code&gt;vagrant.exe&lt;/code&gt; from inside of WSL, it requires launching a terminal as admin which is why I created this shortcut.&lt;/p&gt;

&lt;h5&gt;
  
  
  Changing the hotkeys to work for you:
&lt;/h5&gt;

&lt;p&gt;I'm launching a few directory paths and programs that you might not have, but I included them here so you can see what type of things I'm launching with global hotkeys.&lt;/p&gt;

&lt;p&gt;You should replace them with what works for you.&lt;/p&gt;

&lt;p&gt;But here's 2 tips that you might find handy when it comes to adding hotkeys.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;I like keeping my key binds in alphabetical order as it makes it easier to scan.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I like using keys to describe the type of program I'm launching, not its name. For example, I use "i" to open an image editor, which happens to be GIMP.&lt;/p&gt;

&lt;p&gt;In another example, if I switch to Fire Fox, my key bind will still be &lt;code&gt;Win + w&lt;/code&gt; to open a web browser instead of having to change it around to match the program's name.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It's also worth pointing out I prefer using &lt;code&gt;explorer.exe&lt;/code&gt; instead of &lt;code&gt;Explorer&lt;/code&gt; because it's explicit that I'm launching an app. Plus, with the &lt;code&gt;.exe&lt;/code&gt; style, you can pass in arguments (such as what I'm doing with Chrome). That wouldn't have worked if I used &lt;code&gt;Chrome -incognito&lt;/code&gt;.&lt;/p&gt;

&lt;h5&gt;
  
  
  AHK syntax highlighting in your favorite code editor:
&lt;/h5&gt;

&lt;p&gt;Chances are your code editor has support for AHK syntax highlighting, with or without a plugin. I recommend checking that out since AHK is a legit scripting language.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FiMDuDk7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nickjanetakis.com/assets/blog/autohotkey-syntax-highlight-vim-5792a95ee327c665951e7919a68d4c5f09d865459e94c1da1b8a314d87ca6709.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FiMDuDk7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nickjanetakis.com/assets/blog/autohotkey-syntax-highlight-vim-5792a95ee327c665951e7919a68d4c5f09d865459e94c1da1b8a314d87ca6709.jpg" alt="AutoHotKey syntax highlight vim"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vim supports Auto Hotkey by default.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running the AHK Script
&lt;/h2&gt;

&lt;p&gt;Now that we have the script ready to go, the only thing left to do is run it.&lt;/p&gt;

&lt;p&gt;Chances are when you installed AHK, it registered the &lt;code&gt;ahk&lt;/code&gt; file extension. If you see an "H" icon for your file, then you're good to go. All you have to do is double click it to run it.&lt;/p&gt;

&lt;p&gt;If you don't see that, then right click your file and go to "Open with" and then choose Auto Hotkey from the list of applications to use.&lt;/p&gt;

&lt;p&gt;After running it, it will appear in your system tray (by your clock). At this point you can try out your hotkeys. They should work as long as you don't have a syntax error in the script.&lt;/p&gt;

&lt;h4&gt;
  
  
  Reloading an AHK Script after Editing It
&lt;/h4&gt;

&lt;p&gt;If you decide to edit your script to add more hotkeys, you can right click the script in your system tray and choose "Reload script" from the menu. There's no need to restart it.&lt;/p&gt;

&lt;h5&gt;
  
  
  Other interesting AHK features:
&lt;/h5&gt;

&lt;p&gt;Auto hotkey is much more than a hotkey script which is why it has other useful tools such as the Window Spy which lets you find out a bunch of low level details about any window.&lt;/p&gt;

&lt;p&gt;This Window Spy is a right click menu option of your script.&lt;/p&gt;

&lt;p&gt;For example if you were wondering what the exact executable name is for an already open program, you can run the Window Spy, enable "Follow Mouse" in the top right and then mouse over the program you want to learn more about.&lt;/p&gt;

&lt;p&gt;It will show the &lt;code&gt;ahk_exe&lt;/code&gt; line in the first text box up top. That would be the name of the program you would run in your hotkey script.&lt;/p&gt;

&lt;h4&gt;
  
  
  Running Your AHK Script on Windows Startup
&lt;/h4&gt;

&lt;p&gt;Your hotkey script will only work if it's running, and by default AHK scripts don't start up when Windows boots up, so we'll have to do that ourselves.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find your &lt;code&gt;hotkeys.ahk&lt;/code&gt; file in Windows explorer and copy the file itself&lt;/li&gt;
&lt;li&gt;Hit &lt;code&gt;Win + r&lt;/code&gt; to run the Windows launcher (if you haven't already overwrote that key :D)&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;shell:startup&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Right click anywhere and choose &lt;code&gt;Paste shortcut&lt;/code&gt; to paste it into the Startup folder&lt;/li&gt;
&lt;li&gt;Rename the file to &lt;code&gt;hotkeys.ahk&lt;/code&gt; since the &lt;code&gt;- Shortcut&lt;/code&gt; part isn't useful&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you did it correctly the icon should have a little arrow in the bottom left. This is a shortcut (comparable to a symlink) to your real script.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;Start Menu &amp;gt; Programs &amp;gt; Startup&lt;/code&gt; path is a special path where anything here will automatically startup when Windows boots up.&lt;/p&gt;

&lt;p&gt;If you ever want your AHK script to no longer startup with Windows you can delete the shortcut here. It will not delete the original script file.&lt;/p&gt;

&lt;p&gt;And that's all there is to it for working with global hotkeys in Windows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What hotkeys are you going to set up with AHK? Let me know below!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>autohotkey</category>
      <category>beginners</category>
      <category>productivity</category>
      <category>windows</category>
    </item>
    <item>
      <title>Using GnuCash as a Freelancer to Track Finances and Prepare Taxes</title>
      <dc:creator>Nick Janetakis</dc:creator>
      <pubDate>Mon, 15 Apr 2019 13:35:11 +0000</pubDate>
      <link>https://dev.to/nickjj/using-gnucash-as-a-freelancer-to-track-finances-and-prepare-taxes-pen</link>
      <guid>https://dev.to/nickjj/using-gnucash-as-a-freelancer-to-track-finances-and-prepare-taxes-pen</guid>
      <description>&lt;p&gt;&lt;strong&gt;This article was originally posted on April 17th 2018 at: &lt;a href="https://nickjanetakis.com/blog/using-gnucash-as-a-freelancer-to-track-finances-and-prepare-taxes"&gt;https://nickjanetakis.com/blog/using-gnucash-as-a-freelancer-to-track-finances-and-prepare-taxes&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;I don't own a credit card (by choice), so keeping a close eye on my finances is really important, but I think whether or not you have a credit card, it's a good idea to track all of your financial transactions.&lt;/p&gt;

&lt;p&gt;It's really the only way you'll know what's coming in and what's going out. This is a great habit to do even if you don't have any problems keeping a positive balance -- and I would say it's essential to do if you struggle with debt.&lt;/p&gt;

&lt;p&gt;Luckily I have no debt but I've seen a number of people turn around their whole financial situations just by starting to keep a ledger of all of their transactions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is GnuCash and What Makes It Worth Using?
&lt;/h2&gt;

&lt;p&gt;This is how &lt;a href="https://www.gnucash.org/"&gt;GnuCash&lt;/a&gt; describes themselves:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;GnuCash is personal and small-business financial-accounting software, freely&lt;br&gt;
licensed under the GNU GPL and available for GNU/Linux, BSD, Solaris, Mac OS&lt;br&gt;
X and Microsoft Windows.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The TL;DR is it's an open source accounting tool for all major operating systems.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Unlike mint.com and other online services, you won't be asked to hook up your bank account to it. You also won't have to worry about a company harvesting your financial information because GnuCash runs natively on your OS of choice and it works offline.&lt;/p&gt;

&lt;p&gt;I am pretty decent with Excel but I found it easier to use GnuCash for creating meaningful reports and keeping things organized. If all you want to do is track transactions and create reports, it's a really great tool.&lt;/p&gt;

&lt;p&gt;You can even get it to work well across devices if you use tools like Drop Box. I don't do this, but I've heard of others doing this without issues. That's because GnuCash creates a single database file that can be easily backed up and sync'd across devices.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes GnuCash Good for Freelancers?
&lt;/h2&gt;

&lt;p&gt;Honestly, it's good for everyone but it's especially nice for people who run their own small business. I fit into this category as a freelancer who also creates online training courses.&lt;/p&gt;

&lt;p&gt;I happen to have income that comes in from a number of places. There's course sales, affiliate commissions from Amazon, a bunch of &lt;a href="https://nickjanetakis.com/blog/how-to-start-a-successful-freelance-business-as-a-software-developer"&gt;freelance clients&lt;/a&gt; with &lt;a href="https://nickjanetakis.com/blog/how-to-accept-email-based-payments-for-free-as-a-freelancer"&gt;various payment methods&lt;/a&gt; and a few investments.&lt;/p&gt;

&lt;p&gt;Also, while I do occasionally pay for contract work and various services, I don't have any employees on a pay roll. I'm just a sole proprietor living in a country with one of the most complicated tax systems on planet Earth (the US).&lt;/p&gt;

&lt;p&gt;It's important to track every penny and to be able to figure out what affects taxable income.&lt;/p&gt;

&lt;h4&gt;
  
  
  Easily Break down Your Expenses and Income
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1pW4vnAQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nickjanetakis.com/assets/blog/gnucash-categories-4a708cf66010c5c3e2db29bcdb2381f38799886b44b0718902550fe3397118a0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1pW4vnAQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nickjanetakis.com/assets/blog/gnucash-categories-4a708cf66010c5c3e2db29bcdb2381f38799886b44b0718902550fe3397118a0.jpg" alt="GnuCash categories"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It takes about 5 seconds to add, edit or delete an account. An account is GnuCash terms for a category. For example under Expenses I have a bunch of accounts. It's really easy to go in and see how much I spent this month on food or whatever I want to know about.&lt;/p&gt;

&lt;p&gt;It's also worth pointing out that you can have sub-accounts (see the triangles in the above screenshot). That means you can drill down with as much or as little detail as you want and you can get totals for each parent account automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Do Accountants like GnuCash?
&lt;/h2&gt;

&lt;p&gt;All you have to do is goto reports, create expense / income report, pick a date range you want to create a report on, and GnuCash will print out a single piece of paper that breaks down everything for you.&lt;/p&gt;

&lt;p&gt;At a glance you can see your business expenses, medical expenses, general expenses and how your income is broken up over the year.&lt;/p&gt;

&lt;p&gt;I don't know what your tax situation is like, but that along with some investment related paperwork is all my accountant needs to help me file taxes. I also bring my trusty &lt;a href="https://nickjanetakis.com/blog/transform-a-toshiba-chromebook-cb35-into-a-linux-development-environment-with-galliumos"&gt;Linux powered Chromebook&lt;/a&gt; with me in case he needs to pry into the details of a specific account.&lt;/p&gt;

&lt;h4&gt;
  
  
  Prying into the Details of a Specific Account
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iLn5cYMF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nickjanetakis.com/assets/blog/gnucash-netflix-24d1c0f6d9f58299595a8c124a8ef55ac2f7a58228d1e19015b33852b76de1e3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iLn5cYMF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nickjanetakis.com/assets/blog/gnucash-netflix-24d1c0f6d9f58299595a8c124a8ef55ac2f7a58228d1e19015b33852b76de1e3.jpg" alt="GnuCash Netflix"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is where you'll be entering in the details of each transaction. It keeps a running total for you, and it's really easy to filter by date too.&lt;/p&gt;

&lt;p&gt;The idea is, you have "assets" and your expenses and income accounts are associated to it.  In the above case, Netflix is an expense (an Entertainment expense to be specific since you can nest accounts) which is why I put down the amount under Expense.&lt;/p&gt;

&lt;h4&gt;
  
  
  Doing Your Due Diligence Makes Filing Taxes Easy
&lt;/h4&gt;

&lt;p&gt;Of course, with the above said, that means you'll be responsible for entering in the details all of your transactions manually. It's only as accurate as you are.&lt;/p&gt;

&lt;p&gt;Honestly, it's not as bad as it seems. For example if I grab some milk, I just drop the $1.99 in under the Food account shortly after I get home. I'm already on my workstation for doing work and &lt;a href="https://www.gnucash.org/"&gt;GnuCash&lt;/a&gt; is only 1 mouse click away.&lt;/p&gt;

&lt;p&gt;It's a pretty sweet set up. Doing taxes used to be really stressful for me, but now it doesn't feel too bad. I mean, sure, it frikken sucks to cut that check to the government, but at least the process is fairly painless now.&lt;/p&gt;

&lt;p&gt;The way I look at it is, even if taxes were out of the equation I would still be tracking my financials, so it's not "extra" busy work. It's just good habits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What software do you use to help manage your finances? Let me know below!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>career</category>
      <category>freelance</category>
      <category>tips</category>
    </item>
  </channel>
</rss>
